Skip to main content

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 header Authorization: Bearer:
O header X-API-Key usado na REST API não é aceito pelo MCP. Use sempre Authorization: Bearer.
Você precisa de uma API key da Messora. Se ainda não tem, crie uma em www.messora.dev/auth/signup → API Keys.

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):
Reinicie o Claude Desktop após salvar. As ferramentas da Messora aparecem no seletor de tools.
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:
Reinicie o Cursor ou rode Cursor → Settings → MCP → Refresh para carregar o servidor.

Codex CLI

O Codex usa um arquivo config.toml em ~/.codex/config.toml:
Exporte a API key no shell antes de iniciar o Codex:

MCP Inspector

No Inspector, configure:
  • 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. 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:
Quando usar cada uma:
  • 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 resultados
  • start_search + get_job — busca por query em conteúdo indexado, em background
  • get_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.