Serwer MCP
Serwer MCP
Używaj FourA w dowolnym kliencie Model Context Protocol (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) jako trzech natywnych narzędzi i pięciu promptów przepływu pracy. Bez kodu integracyjnego, bez własnego klienta HTTP.
Szybki start: lokalne stdio (zalecane dla Claude Desktop)
Pobierz klucz na stronie foura.ai/dashboard#api-keys (jedno kliknięcie, widoczny tylko raz przy tworzeniu, format pk_live_...). Wklej go do konfiguracji swojego klienta MCP:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "@fouradata/mcp"],
"env": { "FOURA_API_KEY": "pk_live_..." }
}
}
}
Haczyk w Claude Desktop: wyłącz całkowicie Claude Desktop (
Cmd+Qna macOS) przed edycją pliku konfiguracyjnego. Jeśli aplikacja nadal działa, przy wyjściu nadpisze Twoje zmiany swoją konfiguracją z pamięci.
Polecenie npx pobiera @fouradata/mcp przy pierwszym uruchomieniu (~10 s) i uruchamia go jako podproces klienta MCP. Globalna instalacja nie jest wymagana.
| Klient | Gdzie znajduje się konfiguracja |
|---|---|
| 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 (najpierw ustaw FOURA_API_KEY w env) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code (rozszerzenie MCP) | .vscode/mcp.json |
Uruchom ponownie klienta. Narzędzia (foura_single, foura_proxy, foura_browser) oraz pięć promptów pojawią się na Twojej liście narzędzi.
Szybki start: hostowany (Streamable HTTP)
W przypadku klientów obsługujących transport Streamable HTTP (Cursor, Windsurf, VS Code, Claude Code z --transport http), skieruj je na hostowany endpoint zamiast uruchamiać lokalny podproces:
{
"mcpServers": {
"foura": {
"url": "https://mcp.foura.ai/mcp",
"headers": {
"Authorization": "Bearer pk_live_..."
}
}
}
}
Obecne wersje Claude Desktop odrzucają samą formę url. Użyj powyższej konfiguracji stdio dla Claude Desktop lub prześlij ruch przez mcp-remote:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
}
}
}
Specyfikacja hostowanego endpointu
| Właściwość | Wartość |
|---|---|
| URL | https://mcp.foura.ai/mcp |
| Transport | Streamable HTTP (POST /mcp, responses SSE) |
| Uwierzytelnianie | Authorization: Bearer pk_live_... na request |
| MCP-Protocol-Version | Zgodnie z @modelcontextprotocol/sdk (obecnie 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07) |
| Wyzwanie 401 | WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth" |
Hostowany serwer jest bezstanowy. Każdy request zawiera własny klucz, który serwer przekazuje do FourA API jako X-API-Key. Jeden klucz otwiera wszystkie trzy narzędzia.
W ramach ochrony przed DNS-rebinding (CVE-2025-66414) serwer weryfikuje header Host (musi to być mcp.foura.ai lub localhost) oraz header Origin, jeśli jest obecny (dozwolone: mcp.foura.ai, claude.ai, app.cursor.sh, app.cursor.com). Wywołania server-to-server (curl, klienci MCP w trybie mostka stdio) nie wysyłają headera Origin i przechodzą bez przeszkód.
Narzędzia
Wszystkie trzy narzędzia mają adnotacje readOnlyHint: true oraz openWorldHint: true zgodnie ze specyfikacją MCP 2025-06-18. Klienci, którzy automatycznie zatwierdzają zaufane narzędzia tylko do odczytu, wywołują je bez okna potwierdzenia przy każdym requeście.
foura_single
Jeden request HTTP, response zwrotny. Od 200 ms do 2 s. Odzwierciedla POST /api/single/ jeden do jednego.
Używaj do stron statycznych, API JSON, HTML renderowanego po stronie serwera.
foura_proxy
Request HTTP kierowany przez rotacyjną pulę proxy z automatycznym ponawianiem. Od 1 do 5 s. Odzwierciedla POST /api/proxy/.
Używaj, gdy foura_single zwraca 403, captcha lub treści z blokadą geograficzną. Response zawiera identyfikator proxy, które zadziałało (proxy), oraz całkowity czas rzeczywisty w sekundach (total, float).
foura_browser
Pełna sesja przeglądarki. Uruchamia się JavaScript, renderuje się DOM, wracają cookies. Od 2 do 10 s. Odzwierciedla POST /api/browser/.
Używaj do aplikacji typu single-page app, treści ładowanych leniwie (lazy-loaded) lub stron zabezpieczonych systemami antybotowymi, które wymagają prawdziwej przeglądarki do przejścia.
Strukturę wejściową, domyślne wartości i reguły walidacji dla każdego narzędzia znajdziesz w dokumentacji endpointów REST. Schematy narzędzi odpowiadają API REST pole do pola, plus opcjonalny parametr offload_large dostępny tylko w MCP (patrz poniżej).
Typowane odpowiedzi
Każdy response narzędzia zawiera zarówno content (czytelne dla człowieka podsumowanie tekstowe), jak i structuredContent (typowany JSON zweryfikowany pod kątem outputSchema narzędzia). Każde narzędzie ma swój unikalny format:
foura_single:{ status, headers, data, total_time, ... }(headers to tablica, jeden wpis na każdy krok przekierowania)foura_proxy: tak samo jak single plus{ proxy, total }(gdzietotalto sekundy jako float, całkowity czas uwzględniający ponowne próby)foura_browser: odrębny format{ status, headers: object, body, cookies, userAgent }(uwaga:bodymoże być ciągiem znaków lub obiektem w zależności od typu zawartości)
Klienci obsługujący structuredContent (Claude Desktop, Cursor, Windsurf od roku 2026) przekazują typowany obiekt bezpośrednio do LLM, pomijając ponowną tokenizację JSON-a jako ciągu znaków. Możesz spodziewać się 30-40% oszczędności tokenów przy typowych responses.
Wielowartościowe nagłówki odpowiedzi
Headers, które pojawiają się wielokrotnie (Set-Cookie, Link, WWW-Authenticate), są zwracane jako tablice:
{
"headers": [
{
"result": { "version": "HTTP/2", "code": 200, "reason": "" },
"content-type": "text/html",
"set-cookie": ["a=1; Path=/", "b=2; Path=/"]
}
]
}
Ma to znaczenie w przypadku witryn, które ustawiają cookies sesji, śledzenia i zgód w jednym response (większość e-commerce).
Duże odpowiedzi: offload_large (domyślnie: inline)
Domyślnie (od wersji v0.2.0) pełne body responses są zwracane inline w structuredContent bez względu na rozmiar. Działa to od razu w każdym kliencie MCP.
Jeśli Twój klient obsługuje MCP resources/read ORAZ chcesz zaoszczędzić tokeny na dużych stronach, przekaż offload_large: true przy wywołaniu narzędzia. Responses ≥ 50 KB są wtedy zapisywane na dysku, zwracane jako resource_link, a Twój klient pobiera body tylko wtedy, gdy faktycznie go potrzebuje. Zapisane w pamięci podręcznej dane wygasają po 1 godzinie.
{
"method": "GET",
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"offload_large": true
}
| Klient | offload_large: true |
|---|---|
| Claude Desktop | jeszcze nie, pozostaw domyślne false |
| Claude Code, Cursor, Windsurf | obsługiwane |
| VS Code rozszerzenie MCP | obsługiwane |
Izolacja na poziomie tenanta: każdy klucz API otrzymuje własną przestrzeń nazw (sha256(apiKey)[:16]). Tylko klucz, który zapisał dane, może je odczytać. Próby odczytu między tenantami zwracają Payload not found bez ujawniania informacji o istnieniu danych.
Wbudowane prompty
Pięć szablonów przepływu pracy pojawia się w sekcji /prompts w dowolnym kliencie MCP. Każdy z nich przyjmuje nazwane argumenty i zwraca szablonową wiadomość użytkownika, która zarządza jednym lub kilkoma narzędziami.
| Prompt | Argumenty | Co robi |
|---|---|---|
scrape_product_page |
url |
Pobranie przez przeglądarkę, a następnie wyodrębnienie tytułu produktu, ceny, zdjęcia, stanu magazynowego i SKU jako JSON |
extract_article |
url |
Pobranie przez single z fallbackiem na proxy, a następnie usunięcie nawigacji/reklam i zwrócenie czystego JSON-a z artykułem |
monitor_pricing |
url, opcjonalnie target_price |
Pobranie przez proxy, wyodrębnienie aktualnej ceny, porównanie z ceną docelową |
check_endpoint_health |
url, opcjonalnie expected_text |
Pobranie przez single z rygorystyczną walidacją, zwrócenie dostępności i czasu odpowiedzi |
bulk_fetch_urls |
urls (rozdzielone przecinkami) |
Równoległe pobieranie przez single, automatyczny fallback na proxy dla każdego URL, zwraca tylko metadane |
Prompty nie zużywają tokenów w stanie bezczynności. Tylko wywołane prompty trafiają do kontekstu LLM.
Pełny tekst oraz ręczne prompty awaryjne (fallback): MCP Recipes.
Format błędu
Każdy błąd (isError: true) zawiera strukturę structuredContent. Minimalne pola dla każdego błędu:
{
"service": "single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
W przypadku błędów upstream ze statusem HTTP, obecne jest również pole status. Przy błędach rate limit i wydajnościowych, struktura upstream dodaje pola retryAfter, current.{concurrency, rpm} oraz limits.{maxConcurrency, maxRpm}. Zobacz API Errors, aby poznać bazową strukturę REST.
Stabilne wartości code:
| Kod | HTTP | Znaczenie | Bezpieczne ponowienie? |
|---|---|
| ssrf_blocked | n/a | Docelowy adres IP znajduje się w prywatnym lub zarezerwowanym zakresie (RFC 5735, 6598, zarezerwowane IPv6) | Nie, zmień URL |
| upstream_non_json | różne | Upstream zwrócił nieprawidłowe body | Może, zbadaj sprawę |
| output_validation_failed | n/a | Schemat outputSchema serwera MCP odrzucił response z upstreamu (błąd serwera lub nieoczekiwana struktura upstream) | Może, zgłoś błąd |
| bad_request | 400 | Odrzucono strukturę wejściową | Nie, popraw argumenty |
| auth_failed | 401 | Brak klucza, jest nieprawidłowy lub został dezaktywowany | Nie, popraw klucz |
| forbidden | 403 | Uwierzytelniono, ale brak uprawnień | Nie, lub przełącz się na foura_proxy |
| not_found | 404 | Brak celu lub endpointu | Nie |
| rate_limited | 429 | Osiągnięto limit RPM | Tak, odczekaj retryAfter |
| at_capacity | 503 | Osiągnięto limit współbieżności | Tak, odczekaj retryAfter |
| service_disabled | 503 | Przerwa techniczna lub Twój plan nie obejmuje tego narzędzia | Skontaktuj się ze wsparciem |
| service_unavailable | 503 | Ogólny błąd 503 | Tak, krótki backoff |
| upstream_error | 500+ | Błąd 5xx z upstreamu | Tak, wykładniczy backoff |
| upstream_client_error | 4xx | Inny błąd 4xx | Zazwyczaj nie |
| upstream_unknown | inne | Zabezpieczenie, nie powinno występować w praktyce | Zbadaj sprawę |
Agenci LLM mogą odczytywać code bezpośrednio na potrzeby logiki ponawiania prób, bez konieczności analizowania tekstu. Przewodnik po uwierzytelnianiu: Authentication.
Limity
- Domyślnie body inline. Przy
offload_large: trueresponses ≥ 50 KB trafiają na dysk +resource_link(na poziomie tenanta, TTL 1 godzina). - Prywatne cele są odrzucane (RFC 5735, RFC 6598, bloki zarezerwowane IPv6) na warstwie MCP. Przekazywane są wyłącznie publiczne hosty.
- Limit rozmiaru body requestu wynosi 256 KB dla przychodzących requestów
/mcp(rzeczywiste dane MCP mają < 4 KB). - Limity rate limit są wymuszane przez FourA API dla każdej usługi. Zobacz Rate Limits.
Self-Hosting
Każda instancja działa bezstanowo w jednym kontenerze. Publiczne repozytorium na GitHubie pojawi się wraz z wersją v1.0. Do tego czasu kod źródłowy znajduje się w prywatnym repozytorium, a obraz kontenera jest dostępny na żądanie. Skontaktuj się z support@foura.ai, aby uzyskać wczesny dostęp.
Konfigurowalne środowisko:
| Zmienna | Domyślnie | Przeznaczenie |
|---|---|
| PORT | 3076 | Port nasłuchiwania HTTP |
| FOURA_API_BASE | https://api.foura.ai/api | Bazowy URL REST dla upstreamu FourA |
| FOURA_MCP_PAYLOADS_DIR | /data/payloads | Miejsce zapisu responses ≥ 50 KB na dysku (przy offload_large: true) |
| FOURA_MCP_ALLOWED_HOSTS | mcp.foura.ai,localhost,127.0.0.1,[::1] | Lista dozwolonych nazw hostów dla headera Host (ochrona przed DNS-rebinding) |
| FOURA_MCP_ALLOWED_ORIGINS | https://mcp.foura.ai,https://claude.ai,https://app.cursor.sh,https://app.cursor.com | Lista dozwolonych źródeł (Origin) dla wywołań z przeglądarki |
| FOURA_MCP_RESOURCE_METADATA_URL | https://foura.ai/docs/mcp/server#auth | URL zwracany w headerze WWW-Authenticate przy błędzie 401 |
Działa jako uid 1001 (non-root) w oficjalnym kontenerze. Podmontowany katalog hosta /data/payloads musi być zapisywalny dla tego uid.
Skaluj poziomo za dowolnym load balancerem. Klienci przekazują swój klucz w każdym requeście, więc nie ma potrzeby stosowania sticky session.