callable

API for AI agents to delegate tasks to real humans.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,036Tokens (tool definitions)
~3.1 KBTypical response size
Moderate attention impact (0.81% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "callable": {
      "url": "https://getcallable.dev/api/mcp"
    }
  }
}

Remote endpoints

https://getcallable.dev/api/mcpstreamable-http

What it can do

Tool inventory

Tools (3)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡submit_task(task_type, instructions, deadline_minutes, callback_url, payment_credential)

Submit an account verification task to a real human operator. Use this when your agent is blocked on something only a real person can complete — a KYC check, a platform sign-in or 2FA prompt, a CAPTCHA, an identity confirmation, or any verification step that requires a human. The task is charged automatically via Stripe ($39). A vetted operator claims it, performs the verification on real hardware, and returns the result (with optional screenshot) to your callback_url or via get_task_status. Typical completion: 30 minutes.

Input Schema

{
  "type": "object",
  "properties": {
    "task_type": {
      "type": "string",
      "enum": [
        "account_verification"
      ],
      "description": "account_verification — a real human verifies an account, KYC check, sign-in, or CAPTCHA on real hardware and returns structured proof ($39)."
    },
    "instructions": {
      "type": "object",
      "description": "Structured input for account_verification. Required fields: platform (e.g. 'gmail', 'stripe'), url (where to perform the verification), credentials (login info or how to obtain the code), what_to_verify (what the operator must confirm). Optional: screenshot_required (boolean, default true), additional_notes."
    },
    "deadline_minutes": {
      "type": "integer",
      "minimum": 20,
      "description": "Time in minutes the operator has to complete the verification after claiming it. Minimum 20. Recommended: 30."
    },
    "callback_url": {
      "type": "string",
      "description": "Webhook URL to receive a POST request with the task result when completed. Recommended for async agent workflows. If omitted, poll get_task_status instead."
    },
    "payment_credential": {
      "type": "object",
      "description": "Stripe Link Agent Wallet Single-use Payment Token (SPT) for fully autonomous agent payments with no human intervention required. Omit if the developer account has a saved card on file."
    }
  },
  "required": [
    "task_type",
    "instructions",
    "deadline_minutes"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "string",
      "description": "Unique identifier for the submitted task"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "in_progress",
        "pending_review",
        "completed",
        "disputed"
      ],
      "description": "Current task status"
    },
    "message": {
      "type": "string",
      "description": "Confirmation or error message"
    },
    "estimated_completion": {
      "type": "string",
      "description": "Estimated completion time based on deadline_minutes"
    }
  },
  "required": [
    "task_id",
    "status"
  ]
}
🟢get_task_status(task_id)

Poll the status and retrieve the result of a previously submitted task. Returns the current status (pending, in_progress, pending_review, completed, disputed), the result payload, and any output URLs (video, screenshot). Use this in a polling loop after submit_task if no callback_url was provided.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "string",
      "description": "The task ID returned when the task was submitted"
    }
  },
  "required": [
    "task_id"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "in_progress",
        "pending_review",
        "completed",
        "disputed"
      ]
    },
    "result": {
      "type": "object",
      "description": "Task result payload when completed"
    },
    "output_url": {
      "type": "string",
      "description": "URL to download output file (video, screenshot, etc.)"
    },
    "completed_at": {
      "type": "string",
      "description": "ISO timestamp of completion"
    },
    "operator": {
      "type": "string",
      "description": "Name of the operator who completed the task"
    }
  },
  "required": [
    "task_id",
    "status"
  ]
}
🟢review_task(task_id, decision, dispute_reason, what_is_needed)

Optional. Approve or dispute a task that is in `pending_review` status. Use this after get_task_status reports the operator has completed the work. Approving releases the operator payout. Disputing requires a reason and a description of what is needed for acceptance; the operator is then allowed to resubmit. If you never call review_task, tasks are auto-approved after the review window expires.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "string",
      "description": "The task ID returned by submit_task."
    },
    "decision": {
      "type": "string",
      "enum": [
        "approve",
        "dispute"
      ],
      "description": "approve to accept the result and release payment; dispute to reject it and request a resubmission."
    },
    "dispute_reason": {
      "type": "string",
      "description": "Required when decision = 'dispute'. What went wrong with the submission."
    },
    "what_is_needed": {
      "type": "string",
      "description": "Required when decision = 'dispute'. What the operator must do for the submission to be accepted."
    }
  },
  "required": [
    "task_id",
    "decision"
  ]
}

Output Schema

{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "enum": [
        "completed",
        "disputed"
      ]
    }
  },
  "required": [
    "success",
    "status"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded3 tools
verifiedversion not recorded3 tools
verifiedversion not recorded3 tools