Servidor MCP
Servidor MCP
Use o FourA a partir de qualquer cliente Model Context Protocol (Claude Desktop, Claude Code, Cursor, Windsurf, VS Code) como três ferramentas nativas e cinco prompts de fluxo de trabalho. Sem código de integração, sem cliente HTTP personalizado.
Início Rápido: stdio local (recomendado para o Claude Desktop)
Obtenha uma chave em foura.ai/dashboard#api-keys (um clique, exibida apenas uma vez na criação, formato pk_live_...). Insira-a na configuração do seu cliente MCP:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "@fouradata/mcp"],
"env": { "FOURA_API_KEY": "pk_live_..." }
}
}
}
Atenção com o Claude Desktop: feche completamente o Claude Desktop (
Cmd+Qno macOS) antes de editar o arquivo de configuração. Se o aplicativo ainda estiver em execução, ele substituirá suas edições com a configuração em memória ao sair.
O comando npx baixa o @fouradata/mcp na primeira inicialização (~10s) e o executa como um subprocesso do seu cliente MCP. Não é necessária uma instalação global.
| Cliente | Onde a configuração fica |
|---|---|
| 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 (defina FOURA_API_KEY no env primeiro) |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| VS Code (extensão MCP) | .vscode/mcp.json |
Reinicie o cliente. As ferramentas (foura_single, foura_proxy, foura_browser) e cinco prompts aparecerão na sua lista de ferramentas.
Início Rápido: hospedado (HTTP Streamable)
Para clientes que suportam o transporte HTTP Streamable (Cursor, Windsurf, VS Code, Claude Code com --transport http), aponte-os para o endpoint hospedado em vez de executar um subprocesso local:
{
"mcpServers": {
"foura": {
"url": "https://mcp.foura.ai/mcp",
"headers": {
"Authorization": "Bearer pk_live_..."
}
}
}
}
As compilações atuais do Claude Desktop rejeitam o formato de url simples. Use a configuração stdio acima para o Claude Desktop ou faça a ponte através do mcp-remote:
{
"mcpServers": {
"foura": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
}
}
}
Referência do endpoint hospedado
| Propriedade | Valor |
|---|---|
| URL | https://mcp.foura.ai/mcp |
| Transporte | HTTP Streamable (POST /mcp, SSE responses) |
| Autenticação | Authorization: Bearer pk_live_... por request |
| MCP-Protocol-Version | Por @modelcontextprotocol/sdk (atualmente 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07) |
| Desafio 401 | WWW-Authenticate: Bearer realm="foura-mcp", resource_metadata="https://foura.ai/docs/mcp/server#auth" |
O servidor hospedado é stateless. Cada request traz sua própria chave, que o servidor encaminha para a API do FourA como X-API-Key. Uma única chave libera todas as três ferramentas.
Para proteção contra DNS-rebinding (CVE-2025-66414), o servidor valida o header Host (deve ser mcp.foura.ai ou localhost) e o header Origin quando presente (na allowlist: mcp.foura.ai, claude.ai, app.cursor.sh, app.cursor.com). Chamadores servidor para servidor (curl, clientes MCP no modo de ponte stdio) não enviam Origin e passam direto.
Ferramentas
Todas as três ferramentas são anotadas com readOnlyHint: true e openWorldHint: true conforme a especificação do MCP de 18-06-2025. Clientes que autoaprovam ferramentas confiáveis de apenas leitura as chamam sem um modal de confirmação por request.
foura_single
Um request HTTP, response de volta. 200ms a 2s. Espelha POST /api/single/ de um para um.
Use para páginas estáticas, APIs JSON, HTML renderizado no servidor.
foura_proxy
Request HTTP roteado por um pool de proxy rotativo com retry automático. 1 a 5s. Espelha POST /api/proxy/.
Use quando o foura_single retornar 403, captcha ou conteúdo bloqueado geograficamente. O response inclui o ID do proxy que obteve sucesso (proxy) e o tempo total de relógio em segundos (total, float).
foura_browser
Sessão de browser completa. O JavaScript é executado, o DOM é renderizado, os cookies retornam. 2 a 10s. Espelha POST /api/browser/.
Use para single-page apps, conteúdo lazy-loaded ou páginas protegidas por desafios anti-bot que exigem um browser real para serem superadas.
Para formatos de entrada, padrões e regras de validação de cada ferramenta, consulte a referência do endpoint REST. Os esquemas das ferramentas correspondem campo a campo com a API REST, além do opt-in offload_large exclusivo do MCP (veja abaixo).
Responses tipados
Cada response de ferramenta inclui tanto o content (resumo de texto legível por humanos) quanto o structuredContent (JSON tipado validado contra o outputSchema da ferramenta). Cada ferramenta possui seu próprio formato exclusivo:
foura_single:{ status, headers, data, total_time, ... }(headers é um array, uma entrada por hop de redirecionamento)foura_proxy: igual ao single mais{ proxy, total }(ondetotalé segundos em float, timing externo incluindo retries)foura_browser: formato distinto{ status, headers: object, body, cookies, userAgent }(nota:bodypode ser uma string ou objeto dependendo do content-type)
Clientes que suportam structuredContent (Claude Desktop, Cursor, Windsurf a partir de 2026) passam o objeto tipado diretamente para o LLM, ignorando a re-tokenização de JSON como string. Espere uma economia de 30-40% de tokens em responses típicos.
Headers de response com múltiplos valores
Headers que aparecem múltiplas vezes (Set-Cookie, Link, WWW-Authenticate) retornam como arrays:
{
"headers": [
{
"result": { "version": "HTTP/2", "code": 200, "reason": "" },
"content-type": "text/html",
"set-cookie": ["a=1; Path=/", "b=2; Path=/"]
}
]
}
Isso é importante para sites que definem cookies de sessão + rastreamento + consentimento em um único response (a maior parte do e-commerce).
Responses grandes: offload_large (padrão: inline)
Por padrão (desde a v0.2.0), os corpos completos dos responses são retornados inline no structuredContent, independentemente do tamanho. Isso funciona em qualquer cliente MCP de forma nativa.
Se o seu cliente suportar resources/read do MCP E você quiser economizar tokens em páginas grandes, passe offload_large: true por chamada de ferramenta. Os responses ≥ 50 KB serão gravados em disco, retornados como um resource_link, e seu cliente buscará o corpo apenas quando realmente precisar dele. Os payloads em cache expiram após 1 hora.
{
"method": "GET",
"url": "https://en.wikipedia.org/wiki/Web_scraping",
"offload_large": true
}
| Cliente | offload_large: true |
|---|---|
| Claude Desktop | ainda não, deixe o padrão false |
| Claude Code, Cursor, Windsurf | suportado |
| VS Code MCP extension | suportado |
Isolamento por tenant: cada chave de API recebe seu próprio namespace (sha256(apiKey)[:16]). Apenas a chave que armazenou um payload pode lê-lo de volta. Leituras entre tenants retornam Payload not found sem vazamento de informações de existência.
Prompts integrados
Cinco templates de fluxo de trabalho aparecem em /prompts em qualquer cliente MCP. Cada um aceita argumentos nomeados e retorna uma mensagem de usuário baseada em template que orquestra uma ou mais ferramentas.
| Prompt | Argumentos | O que faz |
|---|---|---|
scrape_product_page |
url |
Busca via browser e, em seguida, extrai título do produto, preço, imagem, estoque e SKU como JSON |
extract_article |
url |
Busca via single com fallback para proxy, depois remove navegação/anúncios e retorna o JSON limpo do artigo |
monitor_pricing |
url, target_price opcional |
Busca via proxy, extrai o preço atual e compara com o preço-alvo |
check_endpoint_health |
url, expected_text opcional |
Busca via single com validação estrita, retorna acessibilidade e tempo de resposta |
bulk_fetch_urls |
urls (separados por vírgula) |
Busca paralela via single, com fallback automático para proxy por URL, retorna apenas metadados |
Os prompts custam zero tokens quando ociosos. Apenas os prompts invocados entram no contexto do LLM.
Texto completo e prompts de fallback manuais: MCP Recipes.
Envelope de erro
Cada erro (isError: true) carrega um envelope structuredContent. Campos mínimos em cada erro:
{
"service": "single | proxy | browser",
"code": "rate_limited",
"error": "Rate limit exceeded"
}
Em erros de upstream com status HTTP, o status também está presente. Em erros de rate limit e capacidade, o envelope de upstream adiciona retryAfter, current.{concurrency, rpm} e limits.{maxConcurrency, maxRpm}. Consulte API Errors para ver o formato REST subjacente.
Valores estáveis de code:
| Code | HTTP | Significado | Seguro para retry? |
|---|---|---|---|
ssrf_blocked |
n/a | IP de destino em uma faixa privada ou reservada (RFC 5735, 6598, IPv6 reservado) | Não, altere a URL |
upstream_non_json |
varia | O upstream retornou um corpo malformado | Talvez, investigue |
output_validation_failed |
n/a | O outputSchema do servidor MCP rejeitou o response do upstream (bug do servidor ou formato inesperado do upstream) |
Talvez, reporte |
bad_request |
400 | Formato de entrada rejeitado | Não, corrija os argumentos |
auth_failed |
401 | Chave ausente, inválida ou desativada | Não, corrija a chave |
forbidden |
403 | Autenticado, mas não permitido | Não, ou mude para foura_proxy |
not_found |
404 | Destino ou endpoint ausente | Não |
rate_limited |
429 | Limite de RPM atingido | Sim, aguarde retryAfter |
at_capacity |
503 | Limite de concorrência atingido | Sim, aguarde retryAfter |
service_disabled |
503 | Janela de manutenção ou seu plano não inclui esta ferramenta | Entre em contato com o suporte |
service_unavailable |
503 | 503 genérico | Sim, backoff curto |
upstream_error |
500+ | Upstream 5xx | Sim, backoff exponencial |
upstream_client_error |
4xx | Outro 4xx | Geralmente não |
upstream_unknown |
outro | Defensivo, não deve ocorrer na prática | Investigue |
Agentes de LLM podem ler o code diretamente para lógica de retry sem analisar texto em prosa. Passo a passo de autenticação: Authentication.
Limites
- Corpo inline por padrão. Com
offload_large: true, responses ≥ 50 KB vão para o disco +resource_link(por tenant, TTL de 1 hora). - Destinos privados são recusados (RFC 5735, RFC 6598, blocos reservados IPv6) na camada do MCP. Apenas hosts públicos são encaminhados.
- Limite de corpo de request de 256 KB em requests
/mcpde entrada (payloads reais do MCP são < 4 KB). - Os rate limits são aplicados pela API do FourA por serviço. Consulte Rate Limits.
Self-Hosting
Cada instância é executada em um container de forma stateless. Um espelho público no GitHub chegará com a v1.0. Até lá, o código-fonte está em um repositório privado e a imagem do container está disponível mediante solicitação. Entre em contato com support@foura.ai para obter acesso antecipado.
Ambiente configurável:
| Variável | Padrão | Finalidade |
|---|---|---|
PORT |
3076 |
Porta de escuta HTTP |
FOURA_API_BASE |
https://api.foura.ai/api |
URL base REST do FourA upstream |
FOURA_MCP_PAYLOADS_DIR |
/data/payloads |
Onde responses ≥ 50 KB são armazenados em cache no disco (com offload_large: true) |
FOURA_MCP_ALLOWED_HOSTS |
mcp.foura.ai,localhost,127.0.0.1,[::1] |
Allowlist de hostnames para o header Host (defesa contra DNS-rebinding) |
FOURA_MCP_ALLOWED_ORIGINS |
https://mcp.foura.ai,https://claude.ai,https://app.cursor.sh,https://app.cursor.com |
Allowlist de origins para chamadores via browser |
FOURA_MCP_RESOURCE_METADATA_URL |
https://foura.ai/docs/mcp/server#auth |
URL retornada no WWW-Authenticate em caso de 401 |
Executado como uid 1001 (não root) no container oficial. O ponto de montagem bind do host /data/payloads deve ter permissão de escrita para esse uid.
Dimensione horizontalmente atrás de qualquer balanceador de carga. Os clientes fornecem sua chave em cada request, portanto não há necessidade de sticky session.