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).
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
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.
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:
{
"mcpServers": {
"emidlabs-backtest": {
"url": "https://mcp.backtest.emidlabs.com/mcp"
}
}
}/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.Autentique
Três formas de autenticar, e você pode combinar mais de uma — o conector tenta na ordem abaixo:
| Método | Como | Melhor 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-key | Configure 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 tool | Passe 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. |
/.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.
| Argumento | Tipo | Descrição |
|---|---|---|
| backtestApiKey | string (opcional) | Desnecessário se você conectou via login OAuth ou o header x-api-key está configurado nesse conector. |
| assetPair | string | ex: "BTC-USDC". |
| initialDate | string | Data ISO, ex: "2025-01-01". |
| finalDate | string | Data ISO, ex: "2025-06-01". |
| strategySnapshotJson | object | O objeto de Strategy DSL — veja o resource strategy-dsl-spec abaixo. |
| backtestBaseUrl | string (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.
| Argumento | Tipo | Descrição |
|---|---|---|
| backtestApiKey | string (opcional) | Desnecessário se você conectou via login OAuth ou o header x-api-key está configurado nesse conector. |
| id | string | O id retornado por submit_backtest. |
| waitForCompletion | boolean | Padrão true — faz polling até terminar ou pollTimeoutMs esgotar. |
| pollTimeoutMs | number | Padrão 120000 (2 minutos). |
| backtestBaseUrl | string (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.
| Argumento | Tipo | Descrição |
|---|---|---|
| backtestApiKey | string (opcional) | Desnecessário se você conectou via login OAuth ou o header x-api-key está configurado nesse conector. |
| backtestBaseUrl | string (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.
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:
| Limite | Escopo | O que protege | O que você vê |
|---|---|---|---|
| Cota do backtest-api | Por API key | O limite real de uso/faturamento da sua conta | Um 429 do backtest-api, repassado como erro de tool do MCP. |
| Guarda de infra do MCP | Por IP/conexão | O processo do MCP em si, contra loops descontrolados ou enxurradas malformadas | Um 429 com uma mensagem identificando explicitamente que é a guarda da própria camada MCP, não a cota da sua conta. |
#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.