CaptchaNo MCP Server
Provides captcha solving for Cloudflare Turnstile challenges, returning the token needed to proceed on pages protected by Turnstile.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@CaptchaNo MCP ServerOpen the signup page, solve the captcha, and submit the form."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CaptchaNo MCP server
The official Model Context Protocol server for CaptchaNo. It lets AI agents (Claude, Cursor, VS Code Copilot and any other MCP client) solve reCAPTCHA v2 / v3 / Enterprise, Cloudflare Turnstile, DataDome and image captchas while running a browser or HTTP automation.
Solves run on CaptchaNo's own solving infrastructure and are billed to your CaptchaNo balance. Failed solves are never billed.
Use it only for authorised automation. Solve captchas only on sites you own, sites you have permission to automate, or sites whose terms allow it (QA of your own forms, accessibility, monitoring your own properties, research with permission). You are responsible for how you use it.
Website: https://captchano.com
API docs: https://captchano.com/captcha-solver-api
Agent guide: https://captchano.com/agents/mcp
Support: support@captchano.com
Quick start
Create an API key at https://captchano.com/dashboard. Keys start with
cn-.Add the server to your MCP client (snippets below). It runs with
npx -y captchano-mcp. Node.js 20.3 or newer is required.Ask your agent something like "Open the signup page, solve the captcha and submit the form."
Claude Code
claude mcp add captchano -e CAPTCHANO_API_KEY=cn-... -- npx -y captchano-mcpAdd --scope user to make it available in every project.
Claude Desktop
Edit claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"captchano": {
"command": "npx",
"args": ["-y", "captchano-mcp"],
"env": {
"CAPTCHANO_API_KEY": "cn-...",
"CAPTCHANO_MAX_SPEND_USD": "1.00"
}
}
}
}Cursor
~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"captchano": {
"command": "npx",
"args": ["-y", "captchano-mcp"],
"env": { "CAPTCHANO_API_KEY": "cn-..." }
}
}
}VS Code (GitHub Copilot agent mode)
.vscode/mcp.json. VS Code asks for the key the first time and stores it securely:
{
"inputs": [
{
"type": "promptString",
"id": "captchano-api-key",
"description": "CaptchaNo API key (cn-...)",
"password": true
}
],
"servers": {
"captchano": {
"type": "stdio",
"command": "npx",
"args": ["-y", "captchano-mcp"],
"env": { "CAPTCHANO_API_KEY": "${input:captchano-api-key}" }
}
}
}Windsurf, Cline, Zed and other clients
Use the same command / args / env as above: command npx, args ["-y", "captchano-mcp"],
env CAPTCHANO_API_KEY.
Docker
docker build -t captchano-mcp .
docker run -i --rm -e CAPTCHANO_API_KEY=cn-... captchano-mcpRelated MCP server: captchaflow
Configuration
All configuration is read from environment variables. The API key is never accepted as a tool argument.
Variable | Required | Default | Description |
| yes | – | Your API key ( |
| no | unlimited | Spend ceiling for this server process, in USD. See Budget. |
| no |
| Seconds the API blocks on each solve request ( |
| no |
| Max seconds one |
| no |
| API base URL. |
| no | – | In |
| no |
|
|
Tools
solve_captcha
Solves a captcha and returns the value the page needs. Billed per successful solve.
Argument | Types | Notes |
| all |
|
| all except | Full URL of the page that shows the captcha |
| recaptcha_*, turnstile | From |
| recaptcha_v3, recaptcha_enterprise, turnstile | The action name the page uses |
| recaptcha_v3 | 0.1–0.9 |
| recaptcha_v2, recaptcha_enterprise |
|
| turnstile |
|
| datadome (required) | Full captcha URL from the blocked response |
| datadome (required), optional for token types |
|
| image (required) | Base64 image. A |
| all except image | The User-Agent of the client that will use the solution |
How a call runs: the server sends POST /v1/solve?wait=N. If the API answers 202 (still
solving), the server polls GET /v1/task/{id} every 5 seconds, for up to 50 seconds in total by default (CAPTCHANO_TOOL_TIMEOUT).
If the task is still solving after that, the result has status: "solving" and the task id, and
the agent should call get_task with that id rather than solving again.
The result comes back as text (token, cookie or text, userAgent, cost, solveTime and the next step)
and as structuredContent:
{
"id": "…",
"type": "recaptcha_v2",
"status": "ready",
"token": "03AFcWeA…",
"cost": "…",
"solveTime": "…",
"sessionSpend": { "spentUsd": "…", "limitUsd": "1.0000", "remainingUsd": "…" }
}get_task
{ id } → the same object. Use it to resume a solve that is still solving, or to read a result
again. Solutions are kept for 10 minutes. Read-only and free.
get_balance
Returns { balance, currency, sessionSpend }. Read-only and free.
list_captcha_types
A static list of every supported type: its required and optional fields, which solution field it returns, and a one-line hint on where to find the sitekey (or other inputs) on the page. It makes no network call.
Errors
API errors come back as tool results with isError: true. Each one includes the error code, the
API's message and a hint for what to do next. For example:
Error insufficient_balance: Insufficient balance
Hint: The CaptchaNo account has no balance left. Ask the user to top up at https://captchano.com/dashboard/topup, then retry. Failed solves are never billed.API codes: invalid_api_key, insufficient_balance, unsupported_type, invalid_sitekey,
proxy_required, proxy_unreachable, score_not_met, unsolvable, capacity_unavailable,
rate_limited, task_not_found, upstream_error.
Codes from this server: invalid_arguments (caught before any request is sent),
budget_exhausted, network_error, timeout, cancelled, http_error.
Budget
Set CAPTCHANO_MAX_SPEND_USD to cap what one server process can spend. The server adds up the
cost the API returns for every task it submitted, counting each task once. Once the total reaches
the limit, solve_captcha returns budget_exhausted without contacting the API. get_task,
get_balance and list_captcha_types keep working.
Notes:
The cap applies to each process. Restarting the server or the MCP client resets it. For a hard account-wide cap, keep only a small balance on the key.
The cap is checked before each solve. A solve that starts just under the limit can finish slightly over it, by at most the cost of the solves already in flight.
HTTP mode
CAPTCHANO_API_KEY=cn-... CAPTCHANO_MCP_HTTP_TOKEN=$(openssl rand -hex 24) \
npx -y captchano-mcp --http --port 8080 # serves http://127.0.0.1:8080/mcpStateless Streamable HTTP at
/mcp, plusGET /healthz.Binds to
127.0.0.1by default. Use--host 0.0.0.0only behind TLS and withCAPTCHANO_MCP_HTTP_TOKENset: anyone who can reach the endpoint can spend your balance.The key always comes from the server's environment, never from callers.
Security
Keys:
CAPTCHANO_API_KEYis read from the environment only. It is never a tool argument, never included in tool results, and never logged. Log lines are also scrubbed of anything that looks like acn-key, a bearer token or proxy credentials.stdout is the protocol channel. All logging goes to stderr.
Spending: every successful
solve_captchais billed. UseCAPTCHANO_MAX_SPEND_USDand a dedicated key with a small balance for autonomous agents. The tool is annotated as a non-read-only, open-world tool, so clients that ask for confirmation will ask before it runs.Proxies: proxy credentials are sent to the CaptchaNo API only, over HTTPS, and are never repeated in results or logs.
Prompt injection: a page an agent visits can try to make it solve captchas on other sites. Keep a human in the loop for solve calls you did not expect, and use the spend cap.
Report vulnerabilities to support@captchano.com.
Development
npm install
npm test # unit tests (node:test, mocked fetch)
npm run e2e # builds, then drives dist/ over stdio and HTTP with the official MCP client
npm run check # typecheck + tests + buildnpm run e2e calls get_balance against the real API with a dummy key and expects a clean
invalid_api_key result. If CAPTCHANO_TEST_API_KEY is set, it also runs one live solve of the
public reCAPTCHA v2 demo, with a $0.05 cap.
License
MIT © DishIs Technologies LLC
Available Tools
4 toolsget_balanceGet CaptchaNo balanceARead-onlyIdempotent
Return the CaptchaNo account balance (USD) and how much this MCP server has spent in the current session against its optional CAPTCHANO_MAX_SPEND_USD limit. Use before a large batch of solves, or after an insufficient_balance error. Free and read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| balance | Yes | Account balance as a decimal string. |
| currency | Yes | |
| sessionSpend | Yes |
get_taskGet a captcha taskARead-onlyIdempotent
Fetch the current status and solution of a task created by solve_captcha. Use when solve_captcha returned status "solving" (call again every ~5 s), or to re-read a solution you already received. Results are kept for 10 minutes. Free and read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task id returned by solve_captcha. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Task id; pass to get_task to fetch the result again (kept 10 minutes). |
| cost | No | Amount billed in USD (decimal string). |
| text | No | Recognised text for image captchas. |
| type | Yes | |
| error | No | |
| token | No | Token for recaptcha_* / turnstile. |
| cookie | No | Cookie for datadome. |
| status | Yes | |
| createdAt | No | |
| solveTime | No | |
| userAgent | No | User-Agent the solution is bound to; reuse it when present. |
| billedFrom | No | |
| sessionSpend | No | Spend tracked by this MCP server process (CAPTCHANO_MAX_SPEND_USD). |
list_captcha_typesList supported captcha typesARead-onlyIdempotent
List every captcha type solve_captcha supports, with its required and optional fields, which solution field it returns, and how to find the sitekey (or other inputs) on the page. Use when you are unsure which type a page uses or which arguments to pass. Static, free, no network call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| types | Yes |
solve_captchaSolve a captchaA
Solve a captcha on a web page and return the token / cookie / text needed to pass it. Use when an authorised browser or HTTP automation is blocked by reCAPTCHA (v2, v3, Enterprise), Cloudflare Turnstile, DataDome or an image captcha. Before calling: identify the type and read the sitekey from the page (call list_captcha_types for where to find it and which fields each type needs). Required: recaptcha_* and turnstile → url + sitekey; datadome → url + challengeUrl + proxy; image → body (base64). Waits for the result (up to ~50 s by default, polling automatically). If it is still solving at the end, it returns the task id: call get_task with it instead of solving again. Each successful solve is billed to the CaptchaNo balance (cost is returned); failed solves are free. Do not call repeatedly for the same captcha: one token is valid for one submission and expires in about 2 minutes, so use it right away.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Full URL of the page that shows the captcha. Required for every type except image. | |
| body | No | image only (required): the captcha image, base64-encoded (a data:image/...;base64, prefix is accepted). | |
| type | Yes | Captcha kind: recaptcha_v2 (checkbox / invisible), recaptcha_v3 (score, no widget), recaptcha_enterprise, turnstile (Cloudflare), datadome, image (OCR). | |
| cData | No | Turnstile only: value of data-cdata / the cData render option, if present. | |
| proxy | No | Proxy the solve should run through: "http://user:pass@host:port" (schemes http, socks4, socks5) or an object. Required for datadome; optional otherwise. | |
| action | No | Action name for recaptcha_v3 / recaptcha_enterprise (from grecaptcha.execute) or Turnstile data-action. | |
| sitekey | No | Site key from the page (data-sitekey / k= / render= parameter). Required for recaptcha_* and turnstile. | |
| minScore | No | recaptcha_v3 only: minimum score the token must reach, 0.1-0.9. | |
| pageData | No | Turnstile only: chlPageData value when the captcha is a Cloudflare challenge page rather than a widget. | |
| invisible | No | recaptcha_v2 / recaptcha_enterprise: true when the widget is invisible (no checkbox). | |
| userAgent | No | User-Agent of the browser/HTTP client that will use the solution. Recommended so the solution matches your client. | |
| challengeUrl | No | DataDome only (required): the full captcha URL from the blocked response (iframe src / redirect), including its query string. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Task id; pass to get_task to fetch the result again (kept 10 minutes). |
| cost | No | Amount billed in USD (decimal string). |
| text | No | Recognised text for image captchas. |
| type | Yes | |
| error | No | |
| token | No | Token for recaptcha_* / turnstile. |
| cookie | No | Cookie for datadome. |
| status | Yes | |
| createdAt | No | |
| solveTime | No | |
| userAgent | No | User-Agent the solution is bound to; reuse it when present. |
| billedFrom | No | |
| sessionSpend | No | Spend tracked by this MCP server process (CAPTCHANO_MAX_SPEND_USD). |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v1.0.0- First observed
get_balance - First observed
get_task - First observed
list_captcha_types - First observed
solve_captcha
TDQS
Scored across 4 tools
Each tool has a clearly distinct purpose: solve_captcha performs solving, get_task polls task status, get_balance reads account funds, and list_captcha_types enumerates supported types. The descriptions explicitly delineate when to use each and how they chain together, leaving no room for misselection.
All four names follow a strict verb_noun snake_case pattern (solve_captcha, get_task, get_balance, list_captcha_types). The convention is uniform and predictable throughout.
Four tools is a tight, well-scoped set for a focused captcha-solving service, and each earns its place in the solve/poll/balance/discover workflow. It is slightly lean, with no dedicated cancel or error-report tool, but nothing is redundant.
The surface covers the full lifecycle: discovering supported types and required fields, solving, polling asynchronous tasks, and checking balance/spend limits. Minor gaps exist (no explicit task cancellation or failure-report operation), but these are handled by expiry and free-failed-solve semantics.
Maintenance
Related MCP Connectors
Solve reCAPTCHA image grids, text captchas, GeeTest and FunCAPTCHA for AI agents. Free tier.
Solve reCAPTCHA v2/v3, hCaptcha, Cloudflare Turnstile and image captchas. Platform-hosted, no creden
Web search, browser automation, scraping, crawling and CAPTCHA solving for AI agents.
Human-in-the-loop API for AI agents. CAPTCHA, OTP, KYC, and approvals by real humans.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables PraisonAI agents to solve authorized CAPTCHA challenges with a bounded one-attempt budget, structured result validation, and a human-review stop for denied, unsupported, exhausted, or malformed requests.-
- FlicenseNot gradedqualityBmaintenanceEnables solving captchas through the createTask/getTaskResult protocol, supporting 19 task types with real browser rendering and anti-bot handling.-
- AlicenseNot gradedqualityDmaintenanceEnables solving reCAPTCHA v2/v3, hCaptcha, Cloudflare Turnstile, and image captchas through MCP tools. Users pay per solve with prepaid credit and can retrieve results asynchronously.MIT
- AlicenseAqualityBmaintenanceSolve hCaptcha, Enterprise included, from Claude, Cursor or any MCP client: returns a valid hCaptcha token through one API.6680 npm241MIT