Documentation

Servidor MCP

Conecte um agente de IA diretamente à Backtesting API via Model Context Protocol — sem código de integração customizado.

#Visão geral

O emidlabs-backtest-mcp é um servidor Model Context Protocol (MCP) hospedado que expõe a Backtesting API como tools chamáveis por agente. Aponte qualquer cliente compatível com MCP ou coding agent pra ele e ele consegue submeter backtests, ler resultados e descobrir ativos disponíveis diretamente, sem você escrever uma integração REST.

Endpoint: https://mcp.backtest.emidlabs.com/mcp (transporte Streamable HTTP).

Esse servidor é um adaptador de protocolo fino — não tem lógica própria além de validar entrada e repassar pro backtest.emidlabs.com. Todo backtest que ele submete usa sua própria API key da EmidLabs e consome créditos da sua conta, do mesmo jeito que chamar a API REST diretamente.

#Conectando um agente

Funciona comClaudeChatGPTCursor+ any MCP client
1

Escolha seu cliente

Claude e ChatGPT descobrem esse servidor automaticamente via OAuth. Cursor e a maioria dos coding agents preferem o bloco JSON cru abaixo.

2

Adicione o conector

Adicione o servidor na configuração do seu cliente MCP. O arquivo exato varia por cliente, mas o formato é o mesmo em todo lugar — um nome e uma URL:

mcp config (ex: claude_desktop_config.json)
{
  "mcpServers": {
    "emidlabs-backtest": {
      "url": "https://mcp.backtest.emidlabs.com/mcp"
    }
  }
}
Alguns clientes (ex: o diálogo "Add custom connector" do Claude) pedem uma URL simples em vez desse bloco JSON. Cole o endereço completo incluindo o caminho /mcp https://mcp.backtest.emidlabs.com/mcp, não só mcp.backtest.emidlabs.com. Esquecer o caminho é o motivo mais comum de um conector falhar ao registrar, e o erro resultante raramente deixa a causa real óbvia.
3

Autentique

Três formas de autenticar, e você pode combinar mais de uma — o conector tenta na ordem abaixo:

MétodoComoMelhor para
Login via OAuth (recomendado)Só adicione o conector sem configuração extra. Claude/ChatGPT descobrem o fluxo de login automaticamente e pedem pra você entrar com sua conta EmidLabs — uma API key dedicada é criada pra sua conta na primeira vez e reutilizada depois disso.Conectores pessoais no Claude.ai / ChatGPT. Nada pra copiar, colar ou digitar — nunca.
Header x-api-keyConfigure uma API key específica da EmidLabs uma vez ao adicionar o conector (ex: a opção "custom header" / static_headers do Claude) — anexada automaticamente em toda requisição a partir daí.Conectores gerenciados por organização, onde um admin quer que todo membro compartilhe uma key específica em vez de logins OAuth individuais.
Argumento na toolPasse uma API key como backtestApiKey em cada chamada — o agente recebe a key diretamente (ex: na conversa).Coding agents, uso local/CLI, ou qualquer cliente sem suporte a autenticação no nível do conector.
Precedência quando mais de um está presente: header, depois OAuth, depois o argumento — se nenhum se aplica, toda chamada de tool falha rápido com um erro claro nomeando as três opções, nunca uma falha de autenticação silenciosa ou ambígua. O login via OAuth em si não exige configuração manual nenhuma: esse servidor implementa descoberta OAuth padrão e Dynamic Client Registration (/.well-known/oauth-protected-resource, /register), então um cliente compatível (Claude, ChatGPT) se descobre e se registra automaticamente — deixe qualquer campo de "OAuth Client ID / Secret" no diálogo de conector do seu cliente em branco, ele só é necessário pra servidores sem suporte a registro automático.

#Tools

submit_backtest

Submete uma estratégia pra backtesting. Retorna imediatamente com um id e status — o agente então chama get_backtest_result pra buscar o resultado.

ArgumentoTipoDescrição
backtestApiKeystring (opcional)Desnecessário se você conectou via login OAuth ou o header x-api-key está configurado nesse conector.
assetPairstringex: "BTC-USDC".
initialDatestringData ISO, ex: "2025-01-01".
finalDatestringData ISO, ex: "2025-06-01".
strategySnapshotJsonobjectO objeto de Strategy DSL — veja o resource strategy-dsl-spec abaixo.
backtestBaseUrlstring (opcional)Usa a API pública de produção por padrão.

get_backtest_result

Busca um backtest submetido pelo id. Por padrão faz polling internamente até o backtest terminar, então o agente ganha uma chamada → uma resposta final, sem precisar de um loop de polling do lado do cliente.

ArgumentoTipoDescrição
backtestApiKeystring (opcional)Desnecessário se você conectou via login OAuth ou o header x-api-key está configurado nesse conector.
idstringO id retornado por submit_backtest.
waitForCompletionbooleanPadrão true — faz polling até terminar ou pollTimeoutMs esgotar.
pollTimeoutMsnumberPadrão 120000 (2 minutos).
backtestBaseUrlstring (opcional)Usa a API pública de produção por padrão.

Sem detalhe trade-a-trade aqui — o próprio GET /backtest/:id upstream não retorna mais nenhum, só métricas agregadas (pnlR, winRate, expectancyR, etc.), os mesmos campos documentados na Referência de Métricas. A lista completa de trades vive no próprio endpoint paginado (veja GET /backtest/:id/trades), mas essa tool ainda não o expõe — uma chamada HTTP crua é o jeito de alcançá-lo a partir de um agente hoje.

list_available_assets

Lista todo par de ativo com dados históricos reais, cada um com seus timeframes suportados e o intervalo de datas realmente disponível.

ArgumentoTipoDescrição
backtestApiKeystring (opcional)Desnecessário se você conectou via login OAuth ou o header x-api-key está configurado nesse conector.
backtestBaseUrlstring (opcional)Usa a API pública de produção por padrão.

Opcional, não é uma etapa obrigatória antes de toda chamada de submit_backtest. Quando uma requisição tem um ativo desconhecido ou um intervalo de datas sem sobreposição de dados, submit_backtestjá retorna um erro claro — pra um intervalo sem sobreposição, ele cita o intervalo realmente disponível direto. Use essa tool pra exploração prévia, ou pra se recuperar de um erro de "ativo desconhecido" vendo o que realmente existe.

#Resources

strategy-dsl-spec

Uma referência condensada, em markdown, pro formato JSON exato de Strategy DSL esperado pelo campo strategySnapshotJson de submit_backtest (emidlabs://strategy-dsl-spec) — ela espelha o bloco Copiar Spec para IA da página Strategy System.

A seção de inputs/conditions/score — idêntica não importa onde a estratégia rode — é buscada em tempo real do dono do domínio do emidlabs-strategy-mcp (o próprio GET /dsl-core-reference do strategy-api) e cacheada por alguns minutos, em vez de copiada à mão — o mesmo núcleo que o emidlabs-live-mcp e o emidlabs-strategy-mcp também buscam, então essa parte não consegue dessincronizar entre eles. O que fica local nesse servidor — entryFeePct/exitFeePct, e riskManagement de fato fechando uma posição simulada — é específico de backtesting e não se aplica a uma subscription ao vivo.

Ler esse resource primeiro é opcional, não obrigatório — todo campo no próprio schema da tool submit_backtest já documenta seu formato exato (lista de funções, regras do modelo de execução, formato do risk management) diretamente, já que clientes MCP não buscam de forma confiável um resource separado antes de gerar uma chamada. Esse resource é uma referência mais profunda pros casos que o schema inline não precisa cobrir por completo.

#Limites de taxa

Dois limites independentes se aplicam, e eles aparecem de forma diferente de propósito pra nunca serem confundidos entre si:

LimiteEscopoO que protegeO que você vê
Cota do backtest-apiPor API keyO limite real de uso/faturamento da sua contaUm 429 do backtest-api, repassado como erro de tool do MCP.
Guarda de infra do MCPPor IP/conexãoO processo do MCP em si, contra loops descontrolados ou enxurradas malformadasUm 429 com uma mensagem identificando explicitamente que é a guarda da própria camada MCP, não a cota da sua conta.
O servidor MCP não aplica sua própria cópia da cota de backtest da sua conta — isso arriscaria dois contadores discordando pra mesma chamada. Ele só adiciona uma guarda baseada em IP, folgada e generosa, pra proteger o próprio processo do servidor.

#Escopo

Esse servidor só expõe backtesting — submeter e ler backtests. Ele não expõe nenhuma ação do Console (criar ou rotacionar API keys, mudar planos de cobrança, gestão de conta). Essas continuam sendo ações só-humano na UI do Console, mantidas de propósito fora do que um agente autônomo pode fazer sem supervisão.