Servidor MCP da Messora
A Messora expõe um Model Context Protocol (MCP) server remoto em Streamable HTTP. Ele permite que agentes LLM (Claude, Codex, Cursor e outros clientes MCP) chamem scrape, crawl, search e consultem jobs e uso — reutilizando a mesma conta, a mesma API key e a mesma pool de créditos da REST API.Endpoint
O endpoint
/health é independente do backend e retorna {"status": "ok", "service": "messora-mcp"} sem exigir autenticação.
Autenticação
O MCP usa exclusivamente o headerAuthorization: Bearer:
Configurando clientes
Claude Desktop
O Claude Desktop usa um config JSON em~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %APPDATA%\Claude\claude_desktop_config.json (Windows):
O Claude Desktop não suporta interpolação de variável de ambiente no config.
Use um placeholder e substitua, ou coloque a key diretamente — o arquivo é
local e não é versionado.
Cursor
O Cursor usa um arquivo.mcp.json na raiz do projeto ou ~/.cursor/mcp.json:
Cursor → Settings → MCP → Refresh para carregar o servidor.
Codex CLI
O Codex usa um arquivoconfig.toml em ~/.codex/config.toml:
MCP Inspector
- Transport type: Streamable HTTP
- URL:
https://mcp.messora.dev/mcp - Authentication: Bearer token
- Token env var:
MESSORA_API_KEY
Nunca coloque a API key literalmente em arquivos de configuração versionados.
Para o Codex, use sempre variável de ambiente (
$MESSORA_API_KEY). Para
Claude Desktop e Cursor, o config é local (não versionado) — substitua o
placeholder pela sua key.Ferramentas disponíveis
O servidor expõe exatamente cinco tools:scrape_url
Extrai conteúdo de uma URL. Consome crédito somente quando o backend retorna
scrape_status = success.
start_crawl
Inicia um crawl assíncrono e retorna job_id. Consulte get_job até o estado
virar SUCCESS, FAILURE ou REVOKED.
start_search
Inicia uma busca premium assíncrona e retorna job_id.
get_job
Consulta o estado de um job de crawl ou search.
Estados:
PENDING → STARTED → SUCCESS | FAILURE | REVOKED
Recomendamos polling a cada 2 segundos com backoff. O adaptador MCP não faz
polling interno nem retry automático de operações cobradas.
get_usage
Consulta plano, créditos usados e saldo da conta. Sem argumentos de produto.
Mesmo payload do REST GET /account/usage.
Passo-a-passo completo: os cinco tools em um fluxo
Os cinco tools têm padrões diferentes: síncrono (scrape_url), assíncrono com polling (start_crawl, start_search → get_job), e query (get_usage). Aqui está uma sequência realista:
scrape_url— uma URL, precisa resultado agora (markdown/JSON estruturado/HTML bruto)start_crawl+get_job— múltiplas URLs no mesmo domínio, em background, lote final de resultadosstart_search+get_job— busca por query em conteúdo indexado, em backgroundget_usage— verifica plano e saldo de créditos antes/depois de operações em lote
Fluxo assíncrono: start_* → get_job
Crawl e search são assíncronos no backend. O fluxo recomendado é:
Tamanho de resposta
Toda resposta de tool é limitada a 100.000 caracteres. Se excedir, campos textuais (markdown, rawHtml) são truncados preservando estrutura, status,
metering e JSON válido:
Erros
Em resposta não-2xx o adaptador descarta o corpo do backend por completo e
deriva o
error.message só do status HTTP (sempre em inglês). Ramifique por
error.code, nunca por error.message:
Input que o próprio adaptador valida (
formats duplicado, json_schema
ausente no formato json, pdf_ocr sem parse_pdf, sobreposição de
include_domains/exclude_domains, job_id malformado) retorna
validation_error com mensagem específica nomeando o campo.
O corpo de resposta 2xx é repassado, então o texto de sistema dentro dele
é normalizado para inglês: job em FAILURE retorna o valor fixo
data.error = "The job could not be completed. Try again.", e job de search em
STARTED reporta meta.stage como starting ou running. Conteúdo extraído
da web (results) nunca é reescrito.
data.json sempre traz exatamente os campos que o json_schema declara —
o backend nunca injeta chave extra nele, nem uma chamada error. Se a
extração falhar por completo, todo campo declarado vem null e um campo
irmão, data.json_extraction_error_code (hoje só "extraction_failed"),
reporta a falha em vez disso. Quando esse código está presente, o MCP
adiciona data.json_extraction_error_message com o texto fixo em inglês
"Structured extraction failed for this schema. Try again or adjust json_prompt/json_schema.". Se o seu schema declara sua própria property
error, ela nunca é tocada — esse campo só carrega o que o seu schema
pediu, em sucesso ou falha. _extraction_failed é reservado para esse sinal
interno e rejeitado como nome de property do json_schema
(validation_error).
O MCP é um adaptador fino: auth, billing, rate limit e jobs pertencem ao backend
FastAPI. Os mesmos limites e custos da REST API se aplicam.