Serwer MCP
Serwer MCP
Używaj FourA z dowolnego klienta Model Context Protocol (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) jako czterech natywnych narzędzi i sześciu promptów do workflow. Brak kodu integracyjnego, brak niestandardowego klienta HTTP.
Open source na GitHub; na npm jako @fouradata/mcp. Aktualne wydanie: 0.5.0.
Szybki start: lokalne stdio (zalecane dla Claude Desktop)
Pobierz klucz na stronie foura.ai/dashboard#api-keys (jedno kliknięcie, pokazywany raz przy tworzeniu, format pk_live_...). Wklej to do konfiguracji swojego klienta MCP:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "@fouradata/mcp"],
"env": { "FOURA_API_KEY": "pk_live_..." }
}
}
}
Uwaga dotycząca Claude Desktop: zamknij całkowicie Claude Desktop (
Cmd+Qna macOS) przed edycją pliku konfiguracyjnego. Jeśli aplikacja jest nadal uruchomiona, podczas zamykania nadpisze Twoje zmiany konfiguracją z pamięci.
Polecenie npx pobiera @fouradata/mcp przy pierwszym uruchomieniu i uruchamia je jako podproces klienta MCP. Nie jest wymagana globalna instalacja.
| Klient | Lokalizacja konfiguracji |
|---|---|
| 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 |
Zrestartuj klienta. Narzędzia (foura_auto, foura_single, foura_proxy, foura_browser) i sześć promptów pojawi się na liście narzędzi.
Szybki start: wersja hostowana (Streamable HTTP)
Dla klientów obsługujących transport Streamable HTTP (Cursor, Windsurf, VS Code, Claude Code z --transport http), skieruj ich na hostowany endpoint zamiast uruchamiać lokalny podproces:
{
"mcpServers": {
"foura": {
"url": "https://mcp.foura.ai/mcp",
"headers": {
"Authorization": "Bearer pk_live_..."
}
}
}
}
W przypadku Claude Desktop użyj powyższej konfiguracji stdio lub połącz hostowany endpoint przez mcp-remote:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
}
}
}
Dokumentacja hostowanego endpointu
| Właściwość | Wartość |
|---|---|
| URL | https://mcp.foura.ai/mcp |
| Transport | Strumieniowe HTTP (POST /mcp, odpowiedzi SSE) |
| Uwierzytelnianie | Authorization: Bearer pk_live_... na każdy request |
| Wersja protokołu MCP | 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 API FourA jako X-API-Key. Jeden klucz otwiera wszystkie cztery narzędzia.
W celu ochrony przed atakami DNS rebinding (CVE-2025-66414), serwer weryfikuje header Host (musi to być mcp.foura.ai lub localhost) oraz header Origin, jeśli występuje (dozwolone wartości: mcp.foura.ai, claude.ai, app.cursor.sh, app.cursor.com). Klienci typu server-to-server (curl, klienci MCP w trybie bridge stdio) nie wysyłają Origin i przechodzą bez weryfikacji.
Narzędzia
Wszystkie cztery narzędzia są oznaczone jako readOnlyHint: true oraz openWorldHint: true zgodnie z specyfikacją MCP 2025-06-18. Klienci, którzy automatycznie zatwierdzają zaufane narzędzia read-only, wywołują je bez wyświetlania okna potwierdzenia dla każdego requestu.
foura_auto to inteligentne ustawienie domyślne: podaj URL, a narzędzie zwróci treść, automatycznie dobierając metodę pobierania. Pozostałe trzy to prymitywy niższego poziomu, którymi zarządza, użyj ich, gdy potrzebujesz jawnej kontroli.
foura_auto
Podaj URL, jeśli chcesz, aby FourA wybrało metodę dla requestu. Narzędzie wykonuje ograniczoną liczbę prób przy użyciu dostępnych ścieżek HTTP, proxy oraz przeglądarki. Przekaż validate w przypadku chronionych celów, aby response musiał zawierać treść identyfikującą rzeczywistą stronę. Jeśli żadna próba nie przejdzie walidacji pomyślnie, narzędzie zwraca błąd, zamiast prezentować stronę typu challenge jako sukces.
Response zawiera szczegóły wykonania w meta oraz, domyślnie, obiekt wielokrotnego użytku session z proxy, cookies i userAgent. W przypadku zwykłego wywołania następczego, wywołaj foura_single z session.proxy jako proxy, zserializuj cookies jako header Cookie i wyślij session.userAgent jako header User-Agent. W celu renderowania JavaScript, przekaż wartości sesji do pasujących pól foura_browser.
foura_single
Jeden request HTTP, jeden response. Odzwierciedla POST /api/single/ w stosunku jeden do jednego.
Używaj do stron statycznych, API JSON i HTML renderowanego po stronie serwera.
Wybór prezentowanej przeglądarki
Domyślnie request przedstawia się jako najnowsza wersja Google Chrome. Jeśli cel akceptuje jedną przeglądarkę, a odrzuca inną, ustaw browser (Chrome, Edge, Safari, Firefox lub Tor), os (Windows, macOS, Android lub iOS) albo version, lub przekaż dokładny identyfikator profile:
{
"method": "GET",
"url": "https://example.com",
"browser": "Firefox",
"os": "Windows"
}
Gdy pasuje kilka profili, wygrywa najnowsza wersja. Nieistniejąca kombinacja zwraca błąd z listą dostępnych opcji, dlatego request nigdy nie jest wysyłany jako przeglądarka, której nie wybrano. Wybór wymaga unblocker, które jest domyślnie włączone. Katalog jest opublikowany pod GET /api/profiles i nie wymaga klucza API.
Te same cztery pola znajdują się w obiekcie request w foura_proxy.
foura_proxy
Przekieruj jeden request HTTP przez rotujące proxy z automatycznym ponawianiem. Użyj tego, gdy foura_single jest zablokowane lub cel wymaga określonego kraju wyjściowego.
Ustaw exitCountries na ścisłą listę dozwolonych dwuliterowych kodów krajów widocznych dla celu, dostarczonych przez użytkownika lub wynikających z wymagań celu:
{
"maxTries": 5,
"exitCountries": ["CZ", "GB"],
"request": {
"method": "GET",
"url": "https://example.com/pricing",
"browser": "Chrome",
"os": "Windows"
}
}
Wartości są przycinane, zamieniane na wielkie litery i deduplikowane. Proxy z nieznanymi węzłami wyjściowymi są wykluczane, a request nigdy nie przechodzi na kraj, o który nie proszono. Wybór korzysta z najnowszych dostępnych metadanych kraju widocznych dla celu, zazwyczaj aktualizowanych w ciągu dziesięciu minut; nie jest to wyszukiwanie geolokalizacji na żywo podczas requestu. Nie wnioskuj o kraju obsługującym na podstawie adresu hosta proxy.
Zakończony sukcesem request z zakresem zwraca exitCountry oraz identyfikator proxy do ponownego użycia. Sprawdź, czy exitCountry należy do żądanej allowlisty. Jeśli w obecnej puli nie ma dopasowania, narzędzie zwraca code: "no_eligible_proxy" ze znormalizowanym zakresem w details.exitCountries. Zachowaj ten zakres i ponów próbę później. Zmieniaj lub rozszerzaj go tylko wtedy, gdy użytkownik wyraźnie zmieni wymaganie.
Jeśli wybrana strona będzie później wymagać JavaScriptu, przekaż zwrócony ID proxy do foura_browser.proxy, aby przeglądarka użyła tego samego wyjścia.
foura_browser
Pełna sesja przeglądarki. JavaScript jest uruchamiany, DOM jest renderowany, a cookie wracają. Odzwierciedla POST /api/browser/.
Używaj do aplikacji single-page, leniwie ładowanej treści lub stron za zabezpieczeniami anti-bot, które wymagają prawdziwej przeglądarki do rozwiązania.
Informacje o strukturach wejściowych, wartościach domyślnych i regułach walidacji dla każdego narzędzia znajdziesz w dokumentacji endpointów REST. Schematy narzędzi odpowiadają API REST pole po polu, z dodatkiem opcji offload_large dostępnej tylko dla MCP (zobacz poniżej).
Gdy cel uruchamia weryfikację bota
foura_single oraz foura_proxy zwracają defense, gdy cel wykonał weryfikację bota w drodze do body. defense.solved: true oznacza, że weryfikacja przebiegła pomyślnie, a data to prawdziwa strona; false oznacza, że body może być stroną wyzwania. Ponów próbę z inną przeglądarką, systemem operacyjnym lub wersją, albo przejdź na foura_proxy lub foura_browser, zamiast traktować stronę wyzwania jako treść.
Typowane response
Każdy response narzędzia zawiera zarówno content (czytelne dla człowieka podsumowanie tekstowe), jak i structuredContent (typowany JSON zweryfikowany ze schematem outputSchema narzędzia). Każde narzędzie ma swoją unikalną strukturę:
foura_auto: pojedyncza struktura{ status, headers, data }plusmeta({ rung, solved, attempts, credits }, zawsze obecne, gdzierungto jedno zcache,probe,proxy,browser,fail) oraz domyślniesession({ proxy, cookies, userAgent }) do powtórzenia przez narzędzia niższego poziomu. Braktotal_time.foura_single:{ status, headers, data, total_time, ... }(header to tablica, jeden wpis na każdy przeskok przekierowania)foura_proxy: to samo co single plus{ proxy, total }; sukces zakresowy obejmuje równieżexitCountryfoura_browser: odrębna struktura{ status, headers: object, body, cookies, userAgent }(uwaga:bodymoże być ciągiem znaków lub obiektem w zależności od content-type)
Klienci obsługujący structuredContent mogą przekazać typowany obiekt bezpośrednio do LLM zamiast wymagać od niego parsowania JSON z tekstu.
Wielowartościowe header w response
Header, które pojawiają się wielokrotnie (Set-Cookie, Link, WWW-Authenticate) wracają 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 dla witryn, które ustawiają cookie sesyjne, śledzące i dotyczące zgody w jednym response (większość e-commerce).
Duże response: offload_large (domyślnie: inline)
Domyślnie (od wersji 0.2.0), pełne ciała response są zwracane jako inline w structuredContent niezależnie od rozmiaru. Działa to w każdym kliencie MCP od ręki.
Jeśli twój klient obsługuje MCP resources/read ORAZ chcesz zaoszczędzić token na dużych stronach, przekaż offload_large: true przy każdym wywołaniu narzędzia. Response >= 50 KB są wtedy zapisywane na dysku, zwracane jako resource_link, a twój klient pobiera ciało tylko wtedy, gdy faktycznie go potrzebuje. Zbuforowane 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 |
| Rozszerzenie VS Code MCP | obsługiwane |
Izolacja dzierżawców: każdy klucz API otrzymuje własną przestrzeń nazw (sha256(apiKey)[:16]). Tylko klucz, który zapisał dane, może je odczytać. Odczyty między dzierżawcami zwracają Payload not found bez wycieku informacji o istnieniu.
Wbudowane Prompty
Sześć szablonów przepływu pracy pojawia się jako /prompts w każdym kliencie MCP. Każdy przyjmuje nazwane argumenty i zwraca ustandaryzowaną wiadomość użytkownika koordynującą jedno lub więcej narzędzi.
| Prompt | Argumenty | Działanie |
|---|---|---|
smart_fetch |
url, opcjonalnie must_contain, extract |
Automatyczne pobieranie (wybiera metodę, obsługuje ochronę przed botami), następnie zwraca lub wyodrębnia zawartość |
scrape_product_page |
url |
Pobieranie w przeglądarce, następnie wyodrębnienie tytułu produktu, ceny, obrazu, zapasu, SKU w formacie JSON |
extract_article |
url |
Tryb pojedynczy z zastępczym proxy, następnie usunięcie nawigacji/reklam i zwrócenie czystego artykułu JSON |
monitor_pricing |
url, opcjonalnie target_price |
Pobranie proxy, wyodrębnienie obecnej ceny, porównanie z docelową |
check_endpoint_health |
url, opcjonalnie expected_text |
Tryb pojedynczy ze ścisłą walidacją, zwrócenie osiągalności i czasu |
bulk_fetch_urls |
urls (oddzielone przecinkami) |
Równoległy tryb pojedynczy, automatyczne zastępcze proxy dla każdego URL, zwrócenie tylko metadanych |
Nieużywane prompty kosztują zero tokenów. Tylko wywołane prompty wchodzą do kontekstu LLM.
Pełny tekst i ręczne prompty zastępcze: MCP Recipes.
Opakowanie błędu
Każdy błąd (isError: true) zawiera opakowanie structuredContent. Minimalne pola dla każdego błędu:
{
"service": "auto | single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
W przypadku błędów upstream ze statusem HTTP obecne jest również status. W przypadku błędów rate-limit i błędów pojemności do koperty upstream dodawane są retryAfter, current.{concurrency, rpm} i limits.{maxConcurrency, maxRpm}. Kształt REST znajduje się w Błędy API.
Stabilne wartości code:
| Kod | HTTP | Znaczenie | Bezpieczne ponowienie? |
|---|---|---|---|
ssrf_blocked |
brak | Docelowy adres IP w zakresie prywatnym lub zarezerwowanym (RFC 5735, 6598, IPv6 zarezerwowane) | Nie, zmień URL |
upstream_non_json |
zależy | Upstream zwrócił zniekształcone ciało | Może, zbadaj |
output_validation_failed |
brak | outputSchema serwera MCP odrzuciło odpowiedź upstream (błąd serwera lub nieoczekiwany kształt upstream) |
Może, zgłoś |
bad_request |
400 | Odrzucono kształt wejścia | Nie, popraw argumenty |
auth_failed |
401 | Brak klucza, klucz nieważny lub zdezaktywowany | Nie, popraw klucz |
forbidden |
403 | Uwierzytelniono, ale nie zezwolono | Nie, lub przełącz na foura_proxy |
not_found |
404 | Brak celu lub endpointu | Nie |
rate_limited |
429 | Osiągnięto limit RPM | Tak, poczekaj retryAfter |
at_capacity |
503 | Osiągnięto limit współbieżności | Tak, poczekaj retryAfter |
service_disabled |
503 | Okno konserwacyjne lub twój plan nie obejmuje tego narzędzia | Skontaktuj się z obsługą klienta |
service_unavailable |
503 | Ogólne 503 | Tak, krótkie opóźnienie |
upstream_error |
500+ | Upstream 5xx | Tak, wykładnicze opóźnienie |
upstream_client_error |
4xx | Inne 4xx | Zazwyczaj nie |
upstream_unknown |
inne | Defensywne, w praktyce nie powinno wystąpić | Zbadaj |
no_eligible_proxy |
brak | Żaden proxy nie pasuje do ścisłego zakresu exitCountries |
Ponów później; zmieniaj zakres tylko jawnie |
Agenci LLM mogą bezpośrednio odczytywać code w celu logiki ponawiania bez parsowania tekstu. Instrukcja uwierzytelniania: Uwierzytelnianie.
Limity
- Domyślnie wstawione ciało. Przy
offload_large: true, odpowiedzi >= 50 KB trafiają na dysk +resource_link(na dzierżawcę, 1 godzina TTL). - Prywatne cele są odrzucane (RFC 5735, RFC 6598, bloki zarezerwowane IPv6) w warstwie MCP. Forwardowane są tylko publiczne hosty.
- Limit ciała żądania wynosi 256 KB dla przychodzących żądań
/mcp(prawdziwe payloady MCP to < 4 KB). - Limity zapytań (rate limits) są egzekwowane przez API FourA per usługa. Zobacz Limity Zapytań.
Self-Hosting
Pełny kod źródłowy serwera jest publicznie dostępny w GitHub na licencji @fouradata/mcp. Sklonuj repozytorium, npm install, npm run build i uruchom node dist/http.js, aby postawić własną instancję. Działa w trybie stateless w pojedynczym kontenerze za dowolnym load balancerem.
Konfigurowalne środowisko:
| Zmienna | Wartość domyślna | Cel |
|---|---|---|
PORT |
3076 |
Port nasłuchu HTTP |
FOURA_API_BASE |
https://api.foura.ai/api |
Bazowy URL nadrzędnego API REST FourA |
FOURA_MCP_PAYLOADS_DIR |
/data/payloads |
Gdzie odpowiedzi >= 50 KB są zapisywane w pamięci podręcznej na dysku (z offload_large: true) |
FOURA_MCP_ALLOWED_HOSTS |
mcp.foura.ai,localhost,127.0.0.1,[::1] |
Lista dozwolonych hostów dla nagłówka 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 Origin dla wywołań z przeglądarki |
FOURA_MCP_RESOURCE_METADATA_URL |
https://foura.ai/docs/mcp/server#auth |
URL zwracany w WWW-Authenticate przy błędzie 401 |
Oficjalny kontener działa jako uid 1001 (nie jako root). Podmontowany katalog hosta /data/payloads musi mieć uprawnienia do zapisu dla tego uid.
Skaluj poziomo za dowolnym load balancerem. Klienci przekazują swój klucz w każdym żądaniu, więc nie ma trwałych sesji (sticky sessions).