solvegate-mcp
Officialsolvegate-mcp
Un servidor MCP que le permite a un agente resolver Cloudflare Turnstile: comprobar si una página tiene uno y, si lo tiene, resolverlo.
Tres herramientas. Una de ellas no necesita clave.
Herramienta | Qué hace | Necesita clave |
| Obtiene una URL e informa de si Cloudflare Turnstile está presente, su sitekey, cómo se renderiza, su configuración | No |
| Resuelve un desafío Turnstile o WAF de Turnstile y devuelve un token. | Sí |
| Obtiene una resolución por su id: gratis, nunca vuelve a cobrar. | Sí |
Instalación
npx solvegate-mcpClaude Desktop / cualquier cliente MCP, en tu configuración:
{
"mcpServers": {
"solvegate": {
"command": "npx",
"args": ["-y", "solvegate-mcp"],
"env": { "SOLVEGATE_API_KEY": "sk_test_…" }
}
}
}Deja fuera SOLVEGATE_API_KEY y inspect_page seguirá funcionando. Es una decisión deliberada: deberías poder ver qué hace el servidor antes de decidir si registrarte en algo.
Obtén una clave en solvegate.io. Una clave de sandbox sk_test_ gratuita no requiere tarjeta y devuelve un token determinista al instante: ideal para configurar esto, y nunca resuelve una barrera real.
Related MCP server: cloudscraper-mcp
Por qué existe inspect_page
El error más habitual con un servicio de resolución es llamarlo cuando deberías haber mirado antes. Tres casos cubren la mayoría de las ocasiones:
La página contiene reCAPTCHA o hCaptcha, no Turnstile. Son productos distintos de proveedores diferentes. Este servidor no los resuelve, y SolveGate tampoco.
inspect_pagelo dice claramente en lugar de descubrirlo tú a través de un422.Es un desafío WAF, no un widget. Una página de verificación intersticial de Cloudflare no tiene
data-sitekey, porque el desafío pertenece a una regla de zona y no a un widget que tú insertes. No hay nada que leer de la página, y la barrera eswaf, en lugar deturnstile.El sitekey se renderiza mediante script con la carga. En ese caso no está en el HTML entregado, y la herramienta lo indica en lugar de adivinar.
La inspección es gratuita, tarda alrededor de un segundo y, con frecuencia, es toda la repuesta necessaria.
Lo que no te dirá
El modo del widget. Los modos administrado, no interactivo e invisible se guardan en la configuración de la cuenta de Cloudflare que posee el sitekey. La página solo tiene la clave, así que ninguna herramienta puede leer el modo a partir del código fuente, incluida esta y cualquier cosa que diga lo contrario.
No influye la resolución: los tres modos desembocan en la misma solicitud. Un sitekey, una URL de página y un token como respuesta.
La única excepción son los cinco sitekeys de demostración documentados de Cloudflare, de quellos el propio Cloudflare publica el modo de widget. inspect_page los detecta, y encontrar uno en una página te dice algo útil: estás ante un entorno de staging, no de producción.
Configuración
La clave se lee del entorno y no es un argumento de herramienta; un argumento de herramienta es visible para el modelo y queda en las transcripciones.
Variable | Valor por defecto | Qué hace |
| — | Tún clave. |
|
| Base de la URL de la API. |
|
| Fichero / URL desde la que se ejecuta |
|
| Tiempo de espera por petición. |
|
| Tiempo máximo que |
Notas sobre el comportamiento
La resolución es asíncrona por debajo. solve_turnstile crea la resolución con async: true y la consulta, en lugar de mantener una conexión abierta durante todo el intento. Una llamada de herramienta de un agente tiene un tiempo de espera que no está bajo su control, y una resolución síncrona haría que una barrera lenta pareciera una herramienta sin respuesta. También implica que un tiempo de espera aquí te deja con un id de resolución: el error señala ese id, y get_solve lo o recupera en lugar de perder una resolución que ya se ha cobrado.
Los errores son resultados, no excepciones. Cada fallo vuelve como resultado isError que incluye el error.code de SolveGate: balance_empty, unknown_sitekey, rate_limited y forbidden_target. Un modelo puede trabajar con estos códigos. No puede sacar nada útil de una stack trace.
Los tokens son de un solo uso y de corta validez. expiresAt es una marca Unix en segundos. Una vez ver acumulado, Cloudflare deja de aceptar el token y el registro de la resolución es solo un registro. Solicita un token en el momento de querer usarlo.
Comprueba mode antes de confiar en un token. Una clave sk_test_ devuelve mode: "sandbox", y un token de sandbox no supera una barrera real. Este campo existe para que una clave de prueba en una configuración de producción falle en lugar de silenciosamente.
Uso aceptable
Resuelve solo contra las propiedades que poseas o que estén autorizadas para probar. Esto está pensado para pruebas de extremo a extremo que siguen fallando por un desafío, CI contra tu propio entorno de staging y supervisión sintética de tu producción. La política de uso aceptable es la versión vinculantes, y los objetivos de la lista de bloqueo devuelven 403 forbidden_target independientemente de lo que pide un agente.
Desarrollo
npm install
npm run build
npm test # spawns the built server and speaks MCP to it
OFFLINE=1 npm test # skips the two tests that reach the networkLas pruebas se ejecutan sobre un transporte stdio real en lugar de llamar directamente a las devoluciones de llamada de las herramientas. Es a propósito: un esquemagrama de datos que rechaza el SDK al registrar, o una escritura inesperada en stdout, que corrompe el transporte, ya que stdout es el transporte, solo aparece cuando aprovechable argumento que de verdad habla el protocolo con él.
Enlaces
Comprobador de Turnstile : la misma inspección que expone este servidor, en el navegador
MIT.
Available Tools
3 toolsget_solveRetrieve a solve by idARead-only
Fetch a solve created earlier. Free — reading never re-bills. Use this when solve_turnstile timed out while still pending: the solve may have finished after the tool gave up, and the id is in that error message. A 404 means no such solve for this API key's workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The solve id, e.g. slv_8Kd2aF9 |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| mode | Yes | |
| token | Yes | |
| billed | Yes | |
| status | Yes | |
| summary | Yes | |
| errorCode | Yes | |
| expiresAt | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and open-world, but the description adds valuable behavioral context: it is free and never re-bills, and a 404 is scoped to the current API key's workspace. This goes beyond structured metadata without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no filler. The main purpose is front-loaded, followed by a concrete use case and an error interpretation; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter retrieval tool with an output schema and safety annotations, the description fully covers when to call it, what the id means, cost implications, and error semantics. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, id, is already clearly described with a format example. The description adds the useful hint that the id may come from a timeout error, but does not need to elaborate further since the schema carries the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a solve... by id') and distinguishes itself from siblings by describing exactly when it is the right tool. The mention of solve_turnstile and 404 behavior makes its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use this tool: after solve_turnstile times out while the solve is pending, with the id coming from that error message. It also interprets a 404 response, giving clear operational context beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_pageInspect a page for Cloudflare TurnstileARead-only
Fetch a URL and report what its HTML says about Cloudflare Turnstile: whether a widget is present, its sitekey, whether it renders implicitly or via turnstile.render(), the widget's data-* configuration, whether the sitekey is one of Cloudflare's documented test keys, and whether the page is a full-page WAF challenge rather than a widget. Free, no API key required. Use this before solving when the sitekey is unknown. It CANNOT determine the widget's mode (managed / non-interactive / invisible) — that is stored in the Cloudflare account that owns the sitekey and is not in the page at all.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The page URL to inspect, e.g. https://example.com/login |
Output Schema
| Name | Required | Description |
|---|---|---|
| present | Yes | Turnstile was found on the page |
| summary | Yes | One line a human can read |
| finalUrl | Yes | |
| sitekeys | Yes | Sitekeys found, in document order |
| rendering | Yes | |
| httpStatus | Yes | |
| otherCaptcha | Yes | Other CAPTCHA products on the page — we do not solve these |
| wafChallenge | Yes | The response is a Cloudflare WAF challenge interstitial |
| responseFieldPresent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, it adds meaningful behavioral specifics: it performs an HTML inspection rather than solving a challenge, requires no API key, is free, and has a specific hard limitation around widget mode. These details substantially describe side effects and boundaries beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is long, each clause delivers a distinct, useful fact: what is fetched, what is reported, cost/auth requirements, usage timing, and a critical limitation. The most important action and resource are front-loaded, and no sentence is slack.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter, an output schema, and annotations, the description covers everything an agent needs: when to call it, what it returns, its constraints, and what it cannot infer. The mitigation of return format details is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes the single 'url' parameter with an example, so parameter documentation coverage is 100%. The description does not add much beyond the schema, but the schema already carries the necessary semantic weight. This aligns with the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and a concrete result ('report what its HTML says about Cloudflare Turnstile') and enumerates exact outputs: widget presence, sitekey, render method, data-* configuration, test keys, and full-page WAF challenge. This clearly separates it from sibling solving/result-retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this before solving when the sitekey is unknown,' giving a direct invocation condition. It also provides an exclusion: it cannot determine the widget's mode because that data is not in the page, so agents know when this tool is not sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
solve_turnstileSolve a Cloudflare Turnstile or WAF challengeA
Clear a Cloudflare challenge and return a token. gate is "turnstile" for an embedded widget (there is a data-sitekey in the page) or "waf" for a full-page Cloudflare interstitial. sitekey and url are both required; the url must be the page the challenge actually renders on, because a sitekey is bound to its configured hostnames. Tokens are single-use and expire in minutes — request one at the moment you submit. Failed solves are never billed. Requires SOLVEGATE_API_KEY.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The page URL the challenge renders on | |
| gate | Yes | Which challenge type to clear | |
| proxy | No | Optional egress proxy URL to solve through | |
| action | No | Optional Turnstile action label, if the widget sets one | |
| sitekey | Yes | The target's sitekey, e.g. 0x4AAAAAAA… |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| mode | Yes | sandbox tokens NEVER clear a real gate |
| token | Yes | Submit this as the cf-turnstile-response field |
| billed | Yes | |
| status | Yes | |
| solveMs | Yes | |
| summary | Yes | |
| errorCode | Yes | |
| expiresAt | Yes | Unix seconds after which the token is worthless |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-read-only and non-idempotent behavior, and the description adds meaningful operational context: tokens are single-use and expire in minutes, failed solves are never billed, SOLVEGATE_API_KEY is required, and sitekeys are bound to hostnames. This goes well beyond the annotations and clarifies important side effects and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with no filler: purpose is front-loaded, then parameter guidance, then token lifecycle and error/cost behavior. Every sentence adds useful information and the structure is easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and useful annotations present, the description supplies the critical missing context: token expiry timing, no-billing on failed solves, API key requirement, and hostname binding. Nothing an agent needs to invoke this tool correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra semantic value by explaining the `gate` enum values, reinforcing that `sitekey` and `url` are both required, and explaining why `url` must be the actual rendering page. Some parameters like `proxy` and `action` receive no additional description, but the schema already documents them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Clear a Cloudflare challenge and return a token') and then defines the two `gate` modes, clearly distinguishing an embedded widget from a full-page interstitial. This makes the tool's purpose immediately understandable and separates it from generic 'solve' tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable selection guidance: it explains when to use 'turnstile' versus 'waf', and instructs the agent to request tokens at submission time due to expiry. It does not explicitly name sibling tools as alternatives or state when not to use this tool, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.2- Changed
get_solve6 fields changed- removed
Output schema / properties / errorCode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / errorCode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / expiresAt / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / expiresAt / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / token / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / token / typeAdded value: +[ + "string", + "null" +]
- Changed
solve_turnstile8 fields changed- removed
Output schema / properties / errorCode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / errorCode / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / expiresAt / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / expiresAt / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / solveMs / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / solveMs / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / token / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / token / typeAdded value: +[ + "string", + "null" +]
3 tool updates
v0.1.1- First observed
get_solve - First observed
inspect_page - First observed
solve_turnstile
TDQS
Scored across 3 tools
Each tool serves a distinct purpose: inspect_page reads page HTML, solve_turnstile solves the challenge, and get_solve retrieves a previous result. There is no functional overlap between them, and their descriptions clearly differentiate when to use each.
All tool names follow the verb_noun pattern in snake_case: inspect_page, solve_turnstile, get_solve. The pattern is consistent and predictable, making it easy to infer tool behavior from the name.
With only 3 tools, the server remains tightly focused on the Turnstile solving workflow. Each tool is essential and there is no bloat or redundancy, so the count is perfectly matched to the scope.
The tool surface covers the full lifecycle: pre-flight inspection (inspect_page), actual solving (solve_turnstile), and post-hoc retrieval (get_solve). This is a complete workflow with no obvious dead ends or missing operations for the stated purpose.
Maintenance
Related MCP Connectors
Cloudflare Solver: Scraping API designed to bypass Cloudflare protection.
Solve reCAPTCHA v2/v3, hCaptcha, Cloudflare Turnstile and image captchas. Platform-hosted, no creden
Solve reCAPTCHA image grids, text captchas, GeeTest and FunCAPTCHA for AI agents. Free tier.
Hands CAPTCHAs, 2FA codes and approvals from your agent to your human with one tap.
Related MCP Servers
AlicenseAqualityDmaintenanceEnables AI agents to scrape websites protected by Cloudflare, DataDome, and Akamai, bypassing anti-bot measures to retrieve page content.2MIT- FlicenseNot gradedqualityDmaintenanceEnables AI agents to bypass Cloudflare protection and scrape web content, returning clean Markdown with smart chunking and file export.1-

disasm.dev MCP serverofficial
AlicenseAqualityDmaintenanceEnables AI assistants to generate DataDome and Incapsula clearance tokens without a headless browser, for development and prototyping.6MIT- AlicenseNot gradedqualityCmaintenanceEnables agents to take screenshots and extract text from web pages using a persistent Chrome browser via CDP, with built-in SSRF protection.9 npmMIT