Skip to main content
Glama

solvegate-mcp

Ein MCP-Server, der einem Agenten den Umgang mit Cloudflare Turnstile ermöglicht: prüfen, ob eine Seite ein Turnstile hat, und es lösen, wenn das der Fall ist.

Drei Werkzeuge. Eines davon benötigt kein Konto.

Tool

Was es tut

Schlüssel nötig

inspect_page

Ruft eine URL ab und meldet, ob Cloudflare Turnstile darauf ist, den Sitekey, wie es dargestellt wird, die data-*-Konfiguration und ob die Seite eine ganzseitige WAF-Challenge statt eines Widgets ist

Nein

solve_turnstile

Löst eine Turnstile- oder Turnstile-WAF-Challenge und gibt ein Token zurück

Ja

get_solve

Ruft einen Solve per ID ab – kostenlos, wird nie erneut abgerechnet

Ja

Installation

npx solvegate-mcp

Claude Desktop / jeder MCP-Client, in Ihrer Konfiguration:

{
  "mcpServers": {
    "solvegate": {
      "command": "npx",
      "args": ["-y", "solvegate-mcp"],
      "env": { "SOLVEGATE_API_KEY": "sk_test_…" }
    }
  }
}

Lassen Sie SOLVEGATE_API_KEY weg, und inspect_page funktioniert trotzdem. Das ist Absicht: Sie sollen sehen können, was der Server tut, bevor Sie sich entscheiden, ob Sie sich irgendwo anmelden.

Holen Sie sich einen Schlüssel auf solvegate.io. Ein kostenloser sk_test_-Sandbox-Schlüssel braucht keine Karte und liefert sofort ein deterministisches Token – ideal, um das Ganze anzubinden, und er löst nie ein echtes.

Related MCP server: cloudscraper-mcp

Warum es inspect_page gibt

Der häufigste Fehler mit einem Solver ist, ihn anzurufen, wenn man zuerst hätte nachsehen sollen. Drei Fälle machen den größten Teil davon aus:

  • Die Seite trägt reCAPTCHA oder hCaptcha, nicht Turnstile. Das sind unterschiedliche Produkte verschiedener Anbieter. Dieser Server löst sie nicht, und SolveGate lösst sie ebenso nicht – inspect_page sagst das namentlich, stattdass Sie es aus einem 422 erfahren müssen.

  • Es ist eine WAF-Gateallenge, kein Second. a generative Cloudflare-Zwischenseite hat kein data-sitekey, weil die Challenge zu einer Zonenregel gehört und nicht zu einem "widget"das Sie einbetten. Es gibt nichts des abzulegen, und das Gate ist waf statt turnstile.

  • Der "Sitekey" wird nach dem Laden per Skript rendert. Dann ist er gar nicht im zulieferten HTML enthalten, und das "Tool" sagt das, stattd zu ratten.

Das Prüfen ist kostenlos, dafür ca. eine Sekunde und it nicht selten die komplette Antwort.

Was esnicht sagen wird

Die Widget-Art. Managed, nicht-interaktiv and unsichtbar sind in the object inside Cloudflare-Account, to dem der Sitekey gehört, gespeichert. Die Seite enthält nur den Schlüssel, also kann kein Tool die Art aus denen Quelltext lesen – auch dieses nicht, and auch its, was anderes behicht.

Für das Lösen ist das egal: Alle drei Modi anführen zur ganz selnen Anforderung. Ein Sitekey, eine Seiten-URL und ein Token conseguently kommen zurück.

Die einzige Ausnahme sind Cloudflares fünf dokumentierte Dummy-Sitekeys, dessen Widget-Art Cloudflare selbst veröffentlicht. inspect_page meldet diese. Finden auf ent einer Seit on eine davon, sagt das etwas Nützliches aus – ein Build, anstatt der Produktionvon Staging.

Konfiguration

Variable

Standard

Bedeutung

SOLVEGATE_API_KEY

—

Ihr Schlüssel. sk_test_ für die Sandbox, sk_live_ für echte Gates.

SOLVEGATE_BASE_URL

https://api.solvegate.io

API-Basis URL.

SOLVEGATE_SITE_URL

https://solvegate.io

Wo inspect_page läuft.

SOLVE_TIMEOT_MS

30000

Timeout pro Anforderung.

SOLVEGATE_MAX_WAIT_MS

60000

Wie lange solve_turnstile auf einen ausstehenden Solve wartet.

Der Schlüssel wird aus der Umgebung lesen gelesen und ist nie ein Tool-Argument. Ein Tool-Argument ist für das Modell sichtbar und landet in Transkripten.

Hinweise zum Verhalten

Das Lösen ist im Hintergrund asynchron. solve_turnstile erstellt den Solve mit async: true und pollt ihn, statt für den Attempt eine Verbindung offen zu halten. Ein Toolaufruf eines Agenten hat ein Timeout, das der Agent nicht kontrollieren kann, und ein synchroner Solve lässt ein langsames Gate wie ein totes Tool wirken. Das bedeutet auch, dass ein Timeout eine Solve-ID hinterlässt: Der Fehler nennt sie, und get_solve nimmt sie auf, statt einen bereits abgerechneten Solve zu verlieren.

Fehler sind Ergebnisse, keine Ausnahmen. Jeder Fehler kommt als isError-Ergebnis zurück, das SolveGates eigenen error.code trägt – balance_empty, unknown_sitekey, rate_limited, forbidden_target. Ein Modell kann darauf reagierern. Mit einem Stack Trace kann es nichts anfangen.

Token sind einmalig und kurzlebig. expiresAt ist Unix-Zeit in Sekunden; danach akzeptiert Cloudflare das Token nicht mehr aufrechte, und der Solve-Datensatz ist nur noch ein Datensatz. Fordern Sie ein Token erst in dem Moment an, in dem Sie es einreichen.

Prüfen Sie mode, bevor Sie ein Token benutzen. Ein sk_test_-Schlüssel gibt mode: "sandbox" zurück, und ein Sandbox-Token öffnet keine echtes Gate. Das Feld existiert, damit ein Testschlüssel in einer Produktionskonfiguration laut scheitert. Statt still zu scheitern.

Zulässige Nutzung

Lösen Sie nur gegen Websites, die Ihnen gehören oder die Sie testen dürfen. Es ist für Ende-zu-Ende-Tests gedacht, die immer wieder an einer Challenge scheitern, für CI gegen Sie Test Staging und für synthetisches Monitoring Ihrer eigenen Produktionsumgebung. Die Richtlinien zur zulässigen Nutzung sind die bindende Version, und Ziele auf der Denylist, zurück 403 unabhängig davon, was ein Agent was verlangt.

Entwicklung

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 network

Die Tests steuern einen echten stdio-Transport, statt Tool-Callbacks direkt aufzurufen. Das ist Absicht: ein Schema, das das SDK bei der Registrierung ablehnt, oder eine thematische Ausgabe auf stdout – die den Transport beschädigt, denn stdout ist der Transport – fällt nur auf, wenn jemand das tatsächlich Protokoll über ihn spricht.

MIT.

Available Tools

3 tools
get_solveRetrieve a solve by idA
Read-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.

NameRequiredDescriptionDefault
idYesThe solve id, e.g. slv_8Kd2aF9

Output Schema

NameRequiredDescription
idYes
modeYes
tokenYes
billedYes
statusYes
summaryYes
errorCodeYes
expiresAtYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 TurnstileA
Read-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.

NameRequiredDescriptionDefault
urlYesThe page URL to inspect, e.g. https://example.com/login

Output Schema

NameRequiredDescription
presentYesTurnstile was found on the page
summaryYesOne line a human can read
finalUrlYes
sitekeysYesSitekeys found, in document order
renderingYes
httpStatusYes
otherCaptchaYesOther CAPTCHA products on the page — we do not solve these
wafChallengeYesThe response is a Cloudflare WAF challenge interstitial
responseFieldPresentYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
urlYesThe page URL the challenge renders on
gateYesWhich challenge type to clear
proxyNoOptional egress proxy URL to solve through
actionNoOptional Turnstile action label, if the widget sets one
sitekeyYesThe target's sitekey, e.g. 0x4AAAAAAA…

Output Schema

NameRequiredDescription
idYes
modeYessandbox tokens NEVER clear a real gate
tokenYesSubmit this as the cf-turnstile-response field
billedYes
statusYes
solveMsYes
summaryYes
errorCodeYes
expiresAtYesUnix seconds after which the token is worthless

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv0.1.2
    • Changedget_solve6 fields changed
      • removedOutput schema / properties / errorCode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / errorCode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / expiresAt / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / expiresAt / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / token / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedsolve_turnstile8 fields changed
      • removedOutput schema / properties / errorCode / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / errorCode / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / expiresAt / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / expiresAt / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / solveMs / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / solveMs / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / token / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / token / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  2. 3 tool updatesv0.1.1
    • First observedget_solve
    • First observedinspect_page
    • First observedsolve_turnstile

TDQS

A4.8/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to scrape websites protected by Cloudflare, DataDome, and Akamai, bypassing anti-bot measures to retrieve page content.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to take screenshots and extract text from web pages using a persistent Chrome browser via CDP, with built-in SSRF protection.
    9 npm
    MIT