MCP Server
MCP Server
Използвайте FourA от всеки Model Context Protocol клиент (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) като три native инструмента и пет workflow prompts. Без код за интеграция, без персонализиран HTTP клиент.
Quick Start: локален stdio (препоръчително за Claude Desktop)
Вземете ключ от foura.ai/dashboard#api-keys (с едно кликване, показва се веднъж при създаване, формат pk_live_...). Добавете го в конфигурацията на вашия MCP клиент:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "@fouradata/mcp"],
"env": { "FOURA_API_KEY": "pk_live_..." }
}
}
}
Особеност при Claude Desktop: затворете напълно Claude Desktop (
Cmd+Qна macOS) преди да редактирате конфигурационния файл. Ако приложението все още работи, то ще презапише вашите промени със своята конфигурация в паметта при излизане.
Командата npx изтегля @fouradata/mcp при първото стартиране (~10s) и го изпълнява като подпроцес на вашия MCP клиент. Не е необходима глобална инсталация.
| Клиент | Къде се намира конфигурацията |
|---|---|
| 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 (първо задайте FOURA_API_KEY в env) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code (MCP разширение) | .vscode/mcp.json |
Рестартирайте клиента. Инструментите (foura_single, foura_proxy, foura_browser) и петте prompts ще се появят във вашия списък с инструменти.
Quick Start: хостван (Streamable HTTP)
За клиенти, които поддържат Streamable HTTP транспорт (Cursor, Windsurf, VS Code, Claude Code с --transport http), ги насочете към хоствания endpoint, вместо да стартирате локален подпроцес:
{
"mcpServers": {
"foura": {
"url": "https://mcp.foura.ai/mcp",
"headers": {
"Authorization": "Bearer pk_live_..."
}
}
}
}
Текущите версии на Claude Desktop отхвърлят чистия url формат. Използвайте stdio конфигурацията по-горе за Claude Desktop или направете мост чрез mcp-remote:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
}
}
}
Справка за хоствания endpoint
| Свойство | Стойност |
|---|---|
| URL | https://mcp.foura.ai/mcp |
| Транспорт | Streamable HTTP (POST /mcp, SSE responses) |
| Authentication | Authorization: Bearer pk_live_... за всяка request |
| MCP-Protocol-Version | Според @modelcontextprotocol/sdk (в момента 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" |
Хостваният сървър е stateless. Всяка request носи собствен ключ, който сървърът препраща към FourA API като X-API-Key. Един ключ отваря и трите инструмента.
За защита срещу DNS-rebinding (CVE-2025-66414), сървърът валидира Host header (трябва да бъде mcp.foura.ai или localhost) и Origin header, когато е наличен (разрешени: mcp.foura.ai, claude.ai, app.cursor.sh, app.cursor.com). Потребителите от тип сървър-към-сървър (curl, MCP клиенти в stdio bridge режим) не изпращат Origin и преминават директно.
Инструменти
И трите инструмента са анотирани с readOnlyHint: true и openWorldHint: true съгласно MCP 2025-06-18 spec. Клиентите, които автоматично одобряват доверени инструменти само за четене (read-only), ги извикват без прозорец за потвърждение за всяка request.
foura_single
Една HTTP request, response обратно. 200ms до 2s. Съответства напълно (one-to-one) на POST /api/single/.
Използвайте за статични страници, JSON APIs, server-rendered HTML.
foura_proxy
HTTP request, рутирана през пул от ротиращи proxy сървъри с автоматичен повторен опит. 1 до 5s. Съответства на POST /api/proxy/.
Използвайте, когато foura_single върне 403, captcha или гео-блокирано съдържание. Върнатият response включва proxy ID-то, което е усерило (proxy), и общото реално време в секунди (total, float).
foura_browser
Пълна браузърна сесия. Изпълнява се JavaScript, рендерира се DOM, връщат се cookies. 2 до 10s. Съответства на POST /api/browser/.
Използвайте за single-page приложения, lazy-loaded съдържание или страници зад защити срещу ботове (anti-bot), които изискват реален браузър за преминаване.
За входящите структури, стойностите по подразбиране и правилата за валидация на всеки инструмент, вижте REST endpoint reference. Схемите на инструментите съвпадат напълно с REST API поле по поле, плюс опцията offload_large, налична само за MCP (вижте по-долу).
Типизирани responses
Всеки tool response включва както content (четим за хора текстов обобщен вид) и structuredContent (типизиран JSON, валидиран спрямо outputSchema на инструмента). Всеки инструмент има своя собствена уникална структура:
foura_single:{ status, headers, data, total_time, ... }(headers е масив, по един запис за всяка стъпка от пренасочването)foura_proxy: същото като single плюс{ proxy, total }(къдетоtotalе float секунди, общо време, включително повторните опити)foura_browser: различна структура{ status, headers: object, body, cookies, userAgent }(забележка:bodyможе да бъде string или обект в зависимост от content-type)
Клиентите, които поддържат structuredContent (Claude Desktop, Cursor, Windsurf от 2026 г.), подават типизирания обект директно към LLM, избягвайки повторното токенизиране на JSON като string. Очаквайте 30-40% спестяване на tokens при типичните responses.
Multi-value response headers
Headers, които се появяват няколко пъти (Set-Cookie, Link, WWW-Authenticate), се връщат като масиви:
{
"headers": [
{
"result": { "version": "HTTP/2", "code": 200, "reason": "" },
"content-type": "text/html",
"set-cookie": ["a=1; Path=/", "b=2; Path=/"]
}
]
}
Това е важно за сайтове, които задават сесийни cookies + cookies за проследяване + cookies за съгласие в един response (повечето сайтове за електронна търговия).
Големи responses: offload_large (по подразбиране: inline)
По подразбиране (от v0.2.0 насам), пълните тела на responses се връщат inline в structuredContent независимо от размера им. Това работи във всеки MCP клиент директно.
Ако вашият клиент поддържа MCP resources/read И искате да спестите tokens при големи страници, подайте offload_large: true при всяко извикване на инструмент. Тогава responses ≥ 50 KB се записват на диска, връщат се като resource_link и вашият клиент изтегля тялото само когато действително му е необходимо. Кешираните данни изтичат след 1 час.
{
"method": "GET",
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"offload_large": true
}
| Клиент | offload_large: true |
|---|---|
| Claude Desktop | все още не, оставете по подразбиране false |
| Claude Code, Cursor, Windsurf | поддържа се |
| VS Code MCP разширение | поддържа се |
Tenant-isolated: всеки API key получава собствено пространство от имена (sha256(apiKey)[:16]). Само ключът, който е съхранил данните, може да ги прочете обратно. Опитите за четене между различни tenants връщат Payload not found без изтичане на информация за съществуването им.
Вградени Prompts
Пет шаблона за работни процеси се появяват под /prompts във всеки MCP клиент. Всеки от тях приема именовани аргументи и връща шаблонизирано потребителско съобщение, оркестриращо един или повече инструменти.
| Prompt | Аргументи | Какво прави |
|---|---|---|
scrape_product_page |
url |
Извличане чрез браузър, след което извличане на заглавие на продукт, цена, изображение, наличност, SKU като JSON |
extract_article |
url |
Single с резервен вариант (fallback) към proxy, след което премахване на навигация/реклами и връщане на чист JSON на статията |
monitor_pricing |
url, опционално target_price |
Извличане чрез proxy, извличане на текуща цена, сравнение с целевата |
check_endpoint_health |
url, опционално expected_text |
Single със строга валидация, връщане на достъпност и време за реакция |
bulk_fetch_urls |
urls (разделени със запетая) |
Паралелен single, автоматичен fallback към proxy за всеки URL, връщане само на метаданни |
Prompts не консумират tokens, когато не се използват. Само извиканите prompts влизат в контекста на LLM.
Пълен текст плюс ръчни fallback prompts: MCP Recipes.
Структура на грешките (Error envelope)
Всяка грешка (isError: true) носи structuredContent обвивка. Минималните полета за всяка грешка са:
{
"service": "single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
При грешки от страна на upstream сървъра с HTTP статус, status също присъства. При грешки за rate limit и капацитет, upstream обвивката добавя retryAfter, current.{concurrency, rpm} и limits.{maxConcurrency, maxRpm}. Вижте API Errors за базовата REST структура.
Стабилни стойности на code:
| Code | HTTP | Значение | Безопасно за повторен опит? |
| --- | --- |
|---|---|
ssrf_blocked |
n/a |
upstream_non_json |
варира |
output_validation_failed |
n/a |
bad_request |
400 |
auth_failed |
401 |
forbidden |
403 |
not_found |
404 |
rate_limited |
429 |
at_capacity |
503 |
service_disabled |
503 |
service_unavailable |
503 |
upstream_error |
500+ |
upstream_client_error |
4xx |
upstream_unknown |
друго |
LLM агентите могат да четат code директно за логика на повторен опит, без да анализират свободен текст. Ръководство за автентификация: Authentication.
Лимити
- Inline body по подразбиране. При
offload_large: true, responses ≥ 50 KB отиват на диска +resource_link(за всеки tenant, 1 час TTL). - Частните цели се отхвърлят (RFC 5735, RFC 6598, IPv6 reserved блокове) на MCP ниво. Препращат се само публични хостове.
- Лимит на тялото на request от 256 KB за входящи
/mcprequests (реалните MCP payloads са < 4 KB). - Rate limits се налагат от FourA API за всяка услуга. Вижте Rate Limits.
Self-Hosting
Всеки инстанс работи в един контейнер без състояние (statelessly). Публично огледално копие в GitHub ще се появи с v1.0. Дотогава изходният код е в частно хранилище, а контейнерното изображение е достъпно при поискване. Свържете се с support@foura.ai за ранен достъп.
Конфигурируема среда:
| Променлива | По подразбиране | Предназначение |
|---|---|---|
PORT |
3076 |
HTTP listen port |
FOURA_API_BASE |
https://api.foura.ai/api |
Upstream FourA REST base URL |
FOURA_MCP_PAYLOADS_DIR |
/data/payloads |
Къде се кешират на диска responses ≥ 50 KB (при offload_large: true) |
FOURA_MCP_ALLOWED_HOSTS |
mcp.foura.ai,localhost,127.0.0.1,[::1] |
Списък с разрешени хостове за Host header (защита срещу DNS-rebinding) |
FOURA_MCP_ALLOWED_ORIGINS |
https://mcp.foura.ai,https://claude.ai,https://app.cursor.sh,https://app.cursor.com |
Списък с разрешени origins за браузърни клиенти |
FOURA_MCP_RESOURCE_METADATA_URL |
https://foura.ai/docs/mcp/server#auth |
URL, върнат в WWW-Authenticate при 401 |
Работи като uid 1001 (non-root) в официалния контейнер. Споделената папка (host bind mount) /data/payloads трябва да бъде достъпна за запис от този uid.
Мащабирайте хоризонтално зад всеки load balancer. Клиентите предоставят своя ключ при всяка request, така че няма нужда от sticky session.