MCP Server
MCP Server
Используйте FourA из любого клиента Model Context Protocol (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) в виде трех нативных инструментов и пяти prompts для рабочих процессов. Без кода интеграции, без кастомного HTTP-клиента.
Быстрый старт: локальный 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 при первом запуске (около 10 секунд) и запускает его как подпроцесс вашего 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 в переменных окружения) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code (MCP-расширение) | .vscode/mcp.json |
Перезапустите клиент. Инструменты (foura_single, foura_proxy, foura_browser) и пять prompts появятся в вашем списке инструментов.
Быстрый старт: хостинг (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-ответы) |
| Аутентификация | Authorization: Bearer pk_live_... для каждого запроса |
| 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) сервер проверяет header Host (должен быть mcp.foura.ai или localhost) и header Origin, если он присутствует (разрешенные значения: mcp.foura.ai, claude.ai, app.cursor.sh, app.cursor.com). Клиенты, работающие по схеме сервер-сервер (curl, MCP-клиенты в режиме моста stdio), не отправляют Origin и проходят проверку беспрепятственно.
Инструменты
Все три инструмента помечены аннотациями readOnlyHint: true и openWorldHint: true согласно спецификации MCP 2025-06-18. Клиенты, которые автоматически одобряют доверенные инструменты только для чтения, вызывают их без модального окна подтверждения для каждого запроса.
foura_single
Один HTTP-request, получение response. От 200 мс до 2 с. Полностью повторяет POST /api/single/ один к одному.
Используйте для статических страниц, JSON API, HTML с серверным рендерингом.
foura_proxy
HTTP-request, маршрутизируемый через пул ротируемых proxy с автоматическим повтором. От 1 до 5 с. Повторяет POST /api/proxy/.
Используйте, когда foura_single возвращает 403, CAPTCHA или заблокированный по геопозиции контент. Response содержит ID успешного proxy (proxy) и общее астрономическое время выполнения в секундах (total, float).
foura_browser
Полноценная сессия браузера. Выполняется JavaScript, рендерится DOM, возвращаются cookies. От 2 до 10 с. Повторяет POST /api/browser/.
Используйте для одностраничных приложений (SPA), лениво загружаемого контента или страниц с защитой от ботов, для прохождения которой требуется реальный браузер.
Структуру входных данных, значения по умолчанию и правила валидации для каждого инструмента можно найти в справочнике REST-endpoints. Схемы инструментов полностью совпадают с полями REST API, за исключением параметра offload_large, доступного только в MCP (см. ниже).
Типизированные ответы
Каждый 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может быть строкой или объектом в зависимости от content-type)
Клиенты с поддержкой structuredContent (Claude Desktop, Cursor, Windsurf по состоянию на 2026 год) передают типизированный объект напрямую в LLM, минуя повторную токенизацию JSON как строки. Это позволяет экономить 30-40% токенов на типичных ответах.
Многозначные заголовки ответов
Заголовки, которые появляются несколько раз (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 сессии, отслеживания и согласия в одном ответе (большинство интернет-магазинов).
Большие ответы: offload_large (по умолчанию: inline)
По умолчанию (начиная с версии v0.2.0) полные тела ответов возвращаются inline в structuredContent независимо от их размера. Это работает во всех MCP-клиентах из коробки.
Если ваш клиент поддерживает MCP resources/read И вы хотите сэкономить токены на больших страницах, передавайте offload_large: true при каждом вызове инструмента. В этом случае ответы размером ≥ 50 КБ записываются на диск, возвращаются в виде 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 extension | поддерживается |
Изоляция на уровне арендатора (tenant-isolated): каждый API-ключ получает собственное пространство имен (sha256(apiKey)[:16]). Только тот ключ, который сохранил данные, может прочитать их обратно. Попытки межклиентского чтения возвращают ошибку Payload not found без утечки информации о существовании данных.
Встроенные Prompts
Пять шаблонов рабочих процессов доступны по пути /prompts в любом MCP-клиенте. Каждый из них принимает именованные аргументы и возвращает шаблонное сообщение пользователя, координирующее работу одного или нескольких инструментов.
| Prompt | Аргументы | Что делает |
|---|---|---|
scrape_product_page |
url |
Загрузка через браузер, затем извлечение названия продукта, цены, изображения, наличия и SKU в формате JSON |
extract_article |
url |
Загрузка через single с переключением на proxy при сбое, затем очистка от навигации/рекламы и возврат чистого JSON статьи |
monitor_pricing |
url, необязательный target_price |
Загрузка через proxy, извлечение текущей цены, сравнение с целевой |
check_endpoint_health |
url, необязательный expected_text |
Загрузка через single со строгой валидацией, возврат доступности и времени отклика |
bulk_fetch_urls |
urls (разделенные запятыми) |
Параллельный single, автоматическое переключение на proxy для каждого URL при сбое, возврат только метаданных |
В режиме ожидания prompts не расходуют токены. В контекст LLM попадают только вызванные prompts.
Полный текст и резервные prompts для ручной настройки: MCP Recipes.
Структура ошибок
Каждая ошибка (isError: true) содержит структуру structuredContent. Минимальный набор полей для любой ошибки:
{
"service": "single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
При ошибках вышестоящего сервиса с HTTP-статусом также присутствует поле status. При ошибках лимитов запросов и емкости вышестоящая структура добавляет поля retryAfter, current.{concurrency, rpm} и limits.{maxConcurrency, maxRpm}. См. раздел Ошибки API для ознакомления с базовой структурой REST.
Стабильные значения code:
| Code | HTTP | Значение | Безопасно для повтора? |
|---|---|---|---|
ssrf_blocked |
n/a | Целевой IP находится в приватном или зарезервированном диапазоне (RFC 5735, 6598, зарезервированные IPv6) | Нет, измените URL |
upstream_non_json |
варьируется | Вышестоящий сервис вернул некорректное тело ответа | Возможно, изучите проблему |
output_validation_failed |
n/a | Схема outputSchema MCP-сервера отклонила ответ вышестоящего сервиса (ошибка сервера или неожиданная структура ответа) |
Возможно, сообщите об ошибке |
bad_request |
400 | Некорректная структура входных данных | Нет, исправьте аргументы |
auth_failed |
401 | Ключ отсутствует, недействителен или деактивирован | Нет, исправьте ключ |
forbidden |
403 | Аутентификация пройдена, но доступ запрещен | Нет, либо переключитесь на foura_proxy |
not_found |
404 | Целевой ресурс или endpoint не найден | Нет |
rate_limited |
429 | Превышен лимит запросов в минуту (RPM) | Да, подождите retryAfter |
at_capacity |
503 | Превышен лимит параллельных запросов | Да, подождите retryAfter |
service_disabled |
503 | Технические работы или ваш тарифный план не включает этот инструмент | Обратитесь в поддержку |
service_unavailable |
503 | Общая ошибка 503 | Да, с небольшой задержкой |
upstream_error |
500+ | Ошибка вышестоящего сервиса 5xx | Да, с экспоненциальной задержкой |
upstream_client_error |
4xx | Другая ошибка вышестоящего сервиса 4xx | Обычно нет |
upstream_unknown |
другое | Защитный код, на практике возникать не должен | Изучите проблему |
Агенты LLM могут считывать code напрямую для логики повторных попыток без парсинга текста. Руководство по аутентификации: Authentication.
Лимиты
- Тело ответа по умолчанию передается inline. При
offload_large: trueответы размером ≥ 50 КБ сохраняются на диск и возвращаетсяresource_link(для каждого арендатора отдельно, TTL 1 час). - Запросы к приватным хостам отклоняются (RFC 5735, RFC 6598, зарезервированные блоки IPv6) на уровне MCP. Перенаправляются только публичные хосты.
- Ограничение на размер тела входящих запросов
/mcpсоставляет 256 КБ (реальные полезные нагрузки MCP составляют < 4 КБ). - Лимиты запросов (rate limits) применяются FourA API для каждого сервиса. См. Rate Limits.
Self-Hosting
Каждый инстанс запускается в одном контейнере без сохранения состояния (statelessly). Публичное зеркало на GitHub появится с выходом версии v1.0. До этого момента исходный код находится в приватном репозитории, а образ контейнера предоставляется по запросу. Для получения раннего доступа свяжитесь с support@foura.ai.
Настраиваемое окружение:
| Переменная | По умолчанию | Назначение |
|---|---|
| PORT | 3076 | Порт прослушивания HTTP |
| FOURA_API_BASE | https://api.foura.ai/api | Базовый URL для REST API вышестоящего FourA |
| FOURA_MCP_PAYLOADS_DIR | /data/payloads | Директория на диске для кэширования ответов размером ≥ 50 КБ (при offload_large: true) |
| FOURA_MCP_ALLOWED_HOSTS | mcp.foura.ai,localhost,127.0.0.1,[::1] | Список разрешенных хостов для заголовка Host (защита от DNS-rebinding) |
| FOURA_MCP_ALLOWED_ORIGINS | https://mcp.foura.ai,https://claude.ai,https://app.cursor.sh,https://app.cursor.com | Список разрешенных Origin для браузерных клиентов |
| FOURA_MCP_RESOURCE_METADATA_URL | https://foura.ai/docs/mcp/server#auth | URL, возвращаемый в заголовке WWW-Authenticate при ошибке 401 |
Запускается от имени uid 1001 (не root) в официальном контейнере. Точка монтирования /data/payloads на хосте должна быть доступна для записи этому uid.
Масштабируйте горизонтально за любым балансировщиком нагрузки. Клиенты передают свой ключ при каждом запросе, поэтому липкие сессии (sticky sessions) не требуются.