MCP-Server
MCP-Server
Nutze FourA von jedem Model Context Protocol-Client (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) aus als drei native Tools und fünf Workflow-Prompts. Kein Integrationscode, kein benutzerdefinierter HTTP-Client.
Schnellstart: lokales stdio (empfohlen für Claude Desktop)
Hole dir einen Key unter foura.ai/dashboard#api-keys (ein Klick, wird bei der Erstellung einmalig angezeigt, Format pk_live_...). Füge diesen in die Konfiguration deines MCP-Clients ein:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "@fouradata/mcp"],
"env": { "FOURA_API_KEY": "pk_live_..." }
}
}
}
Claude Desktop Fallstrick: Beende Claude Desktop vollständig (
Cmd+Qunter macOS), bevor du die Konfigurationsdatei bearbeitest. Wenn die App noch läuft, überschreibt sie deine Änderungen beim Beenden mit ihrer In-Memory-Konfiguration.
Der npx-Befehl lädt @fouradata/mcp beim ersten Start herunter (~10s) und führt es als Subprozess deines MCP-Clients aus. Keine globale Installation erforderlich.
| Client | Speicherort der Konfiguration |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Claude Code | claude mcp add foura -- npx -y @fouradata/mcp (setze zuerst FOURA_API_KEY in env) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code (MCP-Erweiterung) | .vscode/mcp.json |
Starte den Client neu. Die Tools (foura_single, foura_proxy, foura_browser) und fünf Prompts erscheinen in deiner Tool-Liste.
Schnellstart: gehostet (Streamable HTTP)
Für Clients, die den Streamable-HTTP-Transport unterstützen (Cursor, Windsurf, VS Code, Claude Code mit --transport http), verweise auf den gehosteten Endpoint, anstatt einen lokalen Subprozess auszuführen:
{
"mcpServers": {
"foura": {
"url": "https://mcp.foura.ai/mcp",
"headers": {
"Authorization": "Bearer pk_live_..."
}
}
}
}
Aktuelle Claude Desktop-Builds lehnen die reine url-Form ab. Verwende die obige stdio-Konfiguration für Claude Desktop oder schalte mcp-remote dazwischen:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
}
}
}
Referenz des gehosteten Endpoints
| Eigenschaft | Wert |
|---|---|
| URL | https://mcp.foura.ai/mcp |
| Transport | Streamable HTTP (POST /mcp, SSE-Responses) |
| Authentifizierung | Authorization: Bearer pk_live_... pro Request |
| MCP-Protocol-Version | Laut @modelcontextprotocol/sdk (aktuell 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07) |
| 401-Challenge | WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth" |
Der gehostete Server ist zustandslos. Jeder Request bringt seinen eigenen Key mit, den der Server als X-API-Key an die FourA-API weiterleitet. Ein Key öffnet alle drei Tools.
Zum Schutz vor DNS-Rebinding (CVE-2025-66414) validiert der Server den Host-Header (muss mcp.foura.ai oder localhost sein) und den Origin-Header, falls vorhanden (erlaubt: mcp.foura.ai, claude.ai, app.cursor.sh, app.cursor.com). Server-zu-Server-Aufrufer (curl, MCP-Clients im stdio-Bridge-Modus) senden keinen Origin-Header und werden durchgelassen.
Tools
Alle drei Tools sind gemäß der MCP-Spezifikation 2025-06-18 mit readOnlyHint: true und openWorldHint: true annotiert. Clients, die vertrauenswürdige Read-only-Tools automatisch genehmigen, rufen diese ohne Bestätigungs-Modal pro Request auf.
foura_single
Ein HTTP-Request, Response zurück. 200 ms bis 2 s. Spiegelt POST /api/single/ eins zu eins wider.
Verwende dies für statische Seiten, JSON-APIs, serverseitig gerendertes HTML.
foura_proxy
HTTP-Request, geroutet über einen rotierenden Proxy-Pool mit automatischem Retry. 1 bis 5 s. Spiegelt POST /api/proxy/ wider.
Verwende dies, wenn foura_single 403, CAPTCHA oder geoblockierte Inhalte zurückgibt. Die Response enthält die erfolgreiche Proxy-ID (proxy) und die gesamte reale Laufzeit in Sekunden (total, Float).
foura_browser
Vollständige Browser-Session. JavaScript wird ausgeführt, das DOM gerendert, Cookies werden zurückgegeben. 2 bis 10 s. Spiegelt POST /api/browser/ wider.
Verwende dies für Single-Page-Apps, Lazy-Loading-Inhalte oder Seiten hinter Anti-Bot-Challenges, die einen echten Browser zur Lösung erfordern.
Informationen zu Input-Strukturen, Standardwerten und Validierungsregeln für jedes Tool findest du in der REST-Endpoint-Referenz. Die Tool-Schemas entsprechen Feld für Feld der REST-API, zuzüglich des MCP-exklusiven offload_large-Opt-ins (siehe unten).
Typisierte Responses
Jede Tool-Response enthält sowohl content (menschenlesbare Textzusammenfassung) als auch structuredContent (typisiertes JSON, validiert gegen das outputSchema des Tools). Jedes Tool hat seine eigene Struktur:
foura_single:{ status, headers, data, total_time, ... }(headersist ein Array, ein Eintrag pro Redirect-Hop)foura_proxy: wie Single, plus{ proxy, total }(wobeitotalFloat-Sekunden sind, Gesamtlaufzeit inklusive Retries)foura_browser: eigene Struktur{ status, headers: object, body, cookies, userAgent }(Hinweis:bodykann je nach Content-Type ein String oder ein Objekt sein)
Clients, die structuredContent unterstützen (Claude Desktop, Cursor, Windsurf ab 2026), übergeben das typisierte Objekt direkt an das LLM und überspringen die JSON-zu-String-Re-Tokenisierung. Erwarte 30-40 % Token-Ersparnis bei typischen Responses.
Mehrwertige Response-Header
Header, die mehrfach vorkommen (Set-Cookie, Link, WWW-Authenticate), werden als Arrays zurückgegeben:
{
"headers": [
{
"result": { "version": "HTTP/2", "code": 200, "reason": "" },
"content-type": "text/html",
"set-cookie": ["a=1; Path=/", "b=2; Path=/"]
}
]
}
Dies ist wichtig für Websites, die Session-, Tracking- und Consent-Cookies in einer einzigen Response setzen (gilt für die meisten E-Commerce-Seiten).
Große Responses: offload_large (Standard: inline)
Standardmäßig (seit v0.2.0) werden vollständige Response-Bodys unabhängig von der Größe inline in structuredContent zurückgegeben. Dies funktioniert in jedem MCP-Client direkt ab Werk.
Wenn dein Client MCP-resources/read unterstützt UND du Token bei großen Seiten sparen möchtest, übergib offload_large: true pro Tool-Aufruf. Responses ≥ 50 KB werden dann auf die Festplatte geschrieben, als resource_link zurückgegeben und dein Client ruft den Body erst ab, wenn er ihn tatsächlich benötigt. Gecachte Payloads laufen nach 1 Stunde ab.
{
"method": "GET",
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"offload_large": true
}
| Client | offload_large: true |
|---|---|
| Claude Desktop | noch nicht, belasse Standard auf false |
| Claude Code, Cursor, Windsurf | unterstützt |
| VS Code MCP-Erweiterung | unterstützt |
Mandantenisoliert: Jeder API-Key erhält seinen eigenen Namespace (sha256(apiKey)[:16]). Nur der Key, der eine Payload gespeichert hat, kann diese wieder auslesen. Mandantenübergreifende Lesezugriffe geben Payload not found zurück, ohne die Existenz der Daten preiszugeben.
Integrierte Prompts
Fünf Workflow-Vorlagen erscheinen unter /prompts in jedem MCP-Client. Jede nimmt benannte Argumente entgegen und gibt eine vorlagenbasierte User-Message zurück, die ein oder mehrere Tools orchestriert.
| Prompt | Argumente | Funktion |
|---|---|---|
scrape_product_page |
url |
Browser-Abruf, extrahiert dann Produkttitel, Preis, Bild, Lagerbestand, SKU als JSON |
extract_article |
url |
Single mit Proxy-Fallback, entfernt dann Navigation/Werbung und gibt sauberes Artikel-JSON zurück |
monitor_pricing |
url, optional target_price |
Proxy-Abruf, extrahiert aktuellen Preis, vergleicht mit Zielpreis |
check_endpoint_health |
url, optional expected_text |
Single mit strikter Validierung, gibt Erreichbarkeit und Timing zurück |
bulk_fetch_urls |
urls (kommagetrennt) |
Paralleles Single, automatisches Fallback auf Proxy pro URL, gibt nur Metadaten zurück |
Prompts kosten im Leerlauf keine Token. Nur aufgerufene Prompts gelangen in den LLM-Kontext.
Vollständiger Text plus manuelle Fallback-Prompts: MCP Recipes.
Error-Envelope
Jeder Fehler (isError: true) enthält ein structuredContent-Envelope. Mindestfelder bei jedem Fehler:
{
"service": "single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
Bei Upstream-Fehlern mit HTTP-Status ist auch status vorhanden. Bei Rate-Limit- und Kapazitätsfehlern fügt das Upstream-Envelope retryAfter, current.{concurrency, rpm} und limits.{maxConcurrency, maxRpm} hinzu. Siehe API Errors für die zugrunde liegende REST-Struktur.
Stabile code-Werte:
| Code | HTTP | Bedeutung | Retry-sicher? |
|---|---|---|---|
ssrf_blocked |
n/a | Ziel-IP in einem privaten oder reservierten Bereich (RFC 5735, 6598, IPv6 reserviert) | Nein, URL ändern |
upstream_non_json |
variiert | Upstream gab fehlerhaften Body zurück | Eventuell, untersuchen |
output_validation_failed |
n/a | Das outputSchema des MCP-Servers hat die Upstream-Response abgelehnt (Server-Bug oder unerwartete Upstream-Struktur) |
Eventuell, melden |
bad_request |
400 | Input-Struktur abgelehnt | Nein, Argumente korrigieren |
auth_failed |
401 | Key fehlt, ungültig oder deaktiviert | Nein, Key korrigieren |
forbidden |
403 | Authentifiziert, aber nicht erlaubt | Nein, oder zu foura_proxy wechseln |
not_found |
404 | Ziel oder Endpoint fehlt | Nein |
rate_limited |
429 | RPM-Limit erreicht | Ja, warte retryAfter |
at_capacity |
503 | Concurrency-Limit erreicht | Ja, warte retryAfter |
service_disabled |
503 | Wartungsfenster oder dein Tarif enthält dieses Tool nicht | Support kontaktieren |
service_unavailable |
503 | Generischer 503 | Ja, kurzer Backoff |
upstream_error |
500+ | Upstream 5xx | Ja, exponentieller Backoff |
upstream_client_error |
4xx | Anderer 4xx | Meistens nein |
upstream_unknown |
andere | Defensiv, sollte in der Praxis nicht auftreten | Untersuchen |
LLM-Agents können code direkt für die Retry-Logik auslesen, ohne Fließtext parsen zu müssen. Anleitung zur Authentifizierung: Authentication.
Limits
- Standardmäßig Inline-Body. Mit
offload_large: truegehen Responses ≥ 50 KB auf die Festplatte +resource_link(pro Mandant, 1 Stunde TTL). - Private Ziele werden auf der MCP-Ebene abgelehnt (RFC 5735, RFC 6598, reservierte IPv6-Blöcke). Nur öffentliche Hosts werden weitergeleitet.
- Request-Body-Limit von 256 KB bei eingehenden
/mcp-Requests (reale MCP-Payloads sind < 4 KB). - Rate-Limits werden von der FourA-API pro Service erzwungen. Siehe Rate Limits.
Self-Hosting
Jede Instanz läuft zustandslos in einem Container. Ein öffentlicher GitHub-Mirror erscheint mit v1.0. Bis dahin befindet sich der Quellcode in einem privaten Repository und das Container-Image ist auf Anfrage erhältlich. Kontaktiere support@foura.ai für vorzeitigen Zugang.
Konfigurierbare Umgebung:
| Variable | Standard | Zweck |
|---|---|---|
PORT |
3076 |
HTTP-Listen-Port |
FOURA_API_BASE |
https://api.foura.ai/api |
Upstream FourA REST-Basis-URL |
FOURA_MCP_PAYLOADS_DIR |
/data/payloads |
Speicherort, an dem Responses ≥ 50 KB auf der Festplatte gecacht werden (mit offload_large: true) |
FOURA_MCP_ALLOWED_HOSTS |
mcp.foura.ai,localhost,127.0.0.1,[::1] |
Hostname-Allowlist für den Host-Header (Schutz vor DNS-Rebinding) |
FOURA_MCP_ALLOWED_ORIGINS |
https://mcp.foura.ai,https://claude.ai,https://app.cursor.sh,https://app.cursor.com |
Origin-Allowlist für Browser-Aufrufer |
FOURA_MCP_RESOURCE_METADATA_URL |
https://foura.ai/docs/mcp/server#auth |
URL, die bei 401 im WWW-Authenticate-Header zurückgegeben wird |
Läuft als uid 1001 (Non-Root) im offiziellen Container. Der /data/payloads-Host-Bind-Mount muss für diese UID beschreibbar sein.
Skaliere horizontal hinter jedem beliebigen Load-Balancer. Clients übergeben ihren Key bei jedem Request, sodass keine Sticky-Session erforderlich ist.