accueil / serveurs / Dev & Code / io.github.emidlabs/backtest-mcp
io.github.emidlabs/backtest-mcp
serveur MCP (Model Context Protocol) · emidlabs-backtest-mcp 0.1.0
Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur.
Est-ce que io.github.emidlabs/backtest-mcp est sûr ?
Au dernier audit MCP Hub, le serveur MCP « io.github.emidlabs/backtest-mcp » est classé « Non encore testé ». Référencé dans l'annuaire. Seul le pentest comportemental fait foi, et il n'a pas encore été exécuté sur ce serveur. Le verdict est réévalué en continu ; consultez la fiche pour l'état à jour.
Méthode : MCP Hub analyse la description de chaque outil (couche 1) et, pour le verdict fort, exécute le serveur dans une micro-VM isolée avec leurres et réseau bloqué (couche 2). On publie des noms et des compteurs, jamais le contenu brut renvoyé par un outil.
Les 9 outils
- get_backtest_batch_results≈ 2324 tokens
Fetches every asset's outcome from a submit_backtest_batch call, paginated. By default (waitForCompletion: true) polls internally until every item in the batch is done — a cheap check, not one that pages through everything — so one call returns the finished page. Each item has the same aggregate metrics and recency fields (recentTradeCount/recentAvgPnlR/recentOutcomes) get_backtest_result returns for a single backtest, plus assetPair/status/error, so the single-result and batch-result shapes never drift apart. totalCount/completedCount/failedCount/pendingCount come back on every page, not just the last, so you can tell the batch is done from a single pageSize=1 call.
Paramètres, retour & exemple (7)
Paramètrespage· integer · optionnel
1-based page number. Default 1.batchId· string|null · optionnel
The batchId returned by submit_backtest_batch.pageSize· integer · optionnel
Items per page, 1-100. Default 20.pollTimeoutMs· integer · optionnel
Defaults to 300000 (5 minutes) — a batch's slowest item determines the total wait, so this is higher than get_backtest_result's default.backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key. Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API.waitForCompletion· boolean · optionnel
If true (default), polls internally until every item in the batch is done or pollTimeoutMs elapses.
Exemple d'appel{"name": "get_backtest_batch_results", "arguments": {"page": 1, "batchId": "texte", "pageSize": 1, "pollTimeoutMs": 1, "backtestApiKey": "texte", "backtestBaseUrl": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"page": 1, "items": [], "batchId": "texte", "pageSize": 1, "totalCount": 1, "totalPages": 1, "failedCount": 1, "pendingCount": 1, "completedCount": 1}} - get_backtest_result≈ 2026 tokens
Fetches a submitted backtest by id. By default (waitForCompletion: true) polls internally until it finishes, so one call returns one final answer — no need to poll from the caller's side. Only aggregate metrics are returned here, no trade-by-trade detail — call get_backtest_trades for that (paginated, sortable). Fetching many results from the same submit_backtest_batch call? Use get_backtest_batch_results instead.
Paramètres, retour & exemple (5)
Paramètresid· string|null · optionnel
The id returned by submit_backtest.pollTimeoutMs· integer · optionnel
Defaults to 120000 (2 minutes).backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key. Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API.waitForCompletion· boolean · optionnel
If true (default), polls internally until the backtest finishes or pollTimeoutMs elapses.
Exemple d'appel{"name": "get_backtest_result", "arguments": {"id": "texte", "pollTimeoutMs": 1, "backtestApiKey": "texte", "backtestBaseUrl": "texte", "waitForCompletion": true}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "result": {}, "status": "texte", "runtimeMs": 1, "errorMessage": "texte", "recentAvgPnlR": 1, "unitsConsumed": 1, "recentOutcomes": [], "candlesProcessed": 1, "recentTradeCount": 1}} - get_backtest_trades≈ 1330 tokens
Fetches the closed-trade list for a completed backtest, paginated and sortable — the trade-by-trade detail get_backtest_result deliberately omits. Only closed trades ever appear; a position still open when the backtest's date range ends isn't represented here or anywhere else. Example: sortBy="exitTime", sortDirection="desc", pageSize=5 for the most recently closed trades.
Paramètres, retour & exemple (7)
Paramètresid· string|null · optionnel
The id returned by submit_backtest.page· integer · optionnel
1-based page number. Default 1.sortBy· string|null · optionnel
One of: number, pnlR, pnlPct, entryTime, exitTime. Defaults to number (closing order).pageSize· integer · optionnel
Trades per page, 1-100. Default 20.sortDirection· string|null · optionnel
"asc" or "desc". Defaults to asc.backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key. Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API.
Exemple d'appel{"name": "get_backtest_trades", "arguments": {"id": "texte", "page": 1, "sortBy": "texte", "pageSize": 1, "sortDirection": "texte", "backtestApiKey": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"page": 1, "items": [], "pageSize": 1, "totalCount": 1, "totalPages": 1}} - get_confirmation_source≈ 592 tokens
Fetches a submitted confirmation source by id. By default (waitForCompletion: true) polls internally until it finishes, so one call returns one final answer. No trade-outcome fields here at all (no PnlR/WinRate/...) — a confirmation source never opens a position. Once Completed, its id can be used as a confirmationSources sourceId in submit_backtest; its raw signal timeline is available separately via get_confirmation_source_signals.
Paramètres, retour & exemple (5)
Paramètresid· string|null · optionnel
The id returned by submit_confirmation_source.pollTimeoutMs· integer · optionnel
Defaults to 120000 (2 minutes).backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key. Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API.waitForCompletion· boolean · optionnel
If true (default), polls internally until the confirmation source finishes or pollTimeoutMs elapses.
Exemple d'appel{"name": "get_confirmation_source", "arguments": {"id": "texte", "pollTimeoutMs": 1, "backtestApiKey": "texte", "backtestBaseUrl": "texte", "waitForCompletion": true}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "status": "texte", "assetPair": "texte", "runtimeMs": 1, "timeframe": "texte", "errorMessage": "texte", "unitsConsumed": 1, "candlesProcessed": 1}} - get_confirmation_source_signals≈ 804 tokens
Fetches a completed confirmation source's raw signal timeline, paginated — the actual data a backtest's confirmationSources requirement is checked against. Can easily run into the thousands for a frequent condition over a long range (every candle-condition match is a row, not just closed trades), which is why this is paginated from the start. Debugging/inspection only — you do NOT need this tool to make confirmationSources work, and should not fetch these rows to reconstruct the gating yourself. To actually gate a backtest by this source, pass its id directly as sourceId in submit_backtest's own confirmationSources array; the backend applies the backward-only state check against this exact timeline automatically, including the higher-timeframe-to-lower-timeframe alignment. Reimplementing that alignment by hand from this raw data is unnecessary and easy to get wrong (e.g. failing to correctly persist a higher-timeframe state across every lower-timeframe candle until the next higher-timeframe close). Use this tool only to sanity-check a source's signal density or diagnose an unexpectedly low ConfirmedSignalsCount after the fact.
Paramètres, retour & exemple (5)
Paramètresid· string|null · optionnel
The id returned by submit_confirmation_source.page· integer · optionnel
1-based page number. Default 1.pageSize· integer · optionnel
Signals per page, 1-100. Default 20.backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key. Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API.
Exemple d'appel{"name": "get_confirmation_source_signals", "arguments": {"id": "texte", "page": 1, "pageSize": 1, "backtestApiKey": "texte", "backtestBaseUrl": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"page": 1, "items": [], "pageSize": 1, "totalCount": 1, "totalPages": 1}} - list_available_assets≈ 353 tokens
Lists every asset pair with real historical data, each with its supported timeframes and the date range actually available. Optional to call — submit_backtest already returns a clear error (with the real available range) when an asset or date range doesn't have data, so this is for up-front exploration or for recovering from an "unknown asset" error, not a required step before every submit_backtest.
Paramètres, retour & exemple (2)
ParamètresbacktestApiKey· string|null · optionnel
Your EmidLabs backtest API key. Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API. Override only for self-hosted/staging use.
Exemple d'appel{"name": "list_available_assets", "arguments": {"backtestApiKey": "texte", "backtestBaseUrl": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"assets": []}} - submit_backtest≈ 2504 tokens
Submits a strategy for backtesting against historical OHLCV data. Returns immediately with an id and status — call get_backtest_result to fetch the outcome once it finishes. Testing the same strategy against many assets? Use submit_backtest_batch instead — one call per asset here adds up fast. Optionally accepts confirmationSources to only count a candidate Entry/Exit as a real trade once corroborated by a submit_confirmation_source result (multi-timeframe or cross-asset confirmation) — see the confirmationSources argument and submit_confirmation_source's own description.
Paramètres, retour & exemple (7)
ParamètresassetPair· string|null · optionnel
e.g. "BTC-USDC".finalDate· string|null · optionnel
ISO date string, e.g. "2025-06-01".initialDate· string|null · optionnel
ISO date string, e.g. "2025-01-01".backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key (created in the Console). Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API. Override only for self-hosted/staging use.confirmationSources· array|null · optionnel
Optional. Each entry names a submit_confirmation_source result (same account only, must already be Completed) that every candidate Entry/Exit must be corroborated by before it's simulated as a trade — an unconfirmed candidate is dropped before trade simulation, never appears in get_backtest_trades or affects PnlR/WinRate/etc. See ConfirmedSignalsCount/UnconfirmedSignalsCount on get_backtest_result. A sourceId that doesn't exist, isn't Completed, or belongs to another account fails this submission immediately (unlike live, this is synchronous/batch — letting it through would produce a confusing zero-trade result with no explanation).strategySnapshotJson· object|null · optionnel
The Strategy DSL object — every field below documents its own exact shape, this is just the execution model that ties them together. Entry fills at the close of the candle where decision.entry turns true (no lookahead). A position closes on the first of these to happen, checked in this order: stop-loss hit, take-profit hit, decision.exit turning true (a same-candle stop/take-profit always wins over exit). Multiple positions can be open at once by default — cap with configuration.maxOpenPositions. Results are measured in R-units (risk multiples); expectancyR (average R per trade) is the metric to optimize, not raw win rate or trade count.
Exemple d'appel{"name": "submit_backtest", "arguments": {"assetPair": "texte", "finalDate": "texte", "initialDate": "texte", "backtestApiKey": "texte", "backtestBaseUrl": "texte", "confirmationSources": []}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "status": "texte"}} - submit_backtest_batch≈ 2380 tokens
Submits ONE strategy against MANY asset pairs in a single call — the same backtest you'd get from calling submit_backtest once per asset, without needing dozens of round trips. Returns immediately with a batchId (pass it to get_backtest_batch_results to fetch every asset's outcome, paginated) plus the per-asset id/status assigned right away. Best-effort: one bad asset pair (unknown, or its date range outside coverage) shows up with an error in that item only — every other asset in the batch is unaffected. Optionally accepts confirmationSources, applied identically to every asset in the batch — see submit_backtest's own confirmationSources argument for the full semantics.
Paramètres, retour & exemple (7)
ParamètresfinalDate· string|null · optionnel
ISO date string, e.g. "2025-06-01".assetPairs· array|null · optionnel
e.g. ["BTC-USDC", "ETH-USDC", "SOL-USDC"]. Every asset gets the exact same strategySnapshotJson and date range.initialDate· string|null · optionnel
ISO date string, e.g. "2025-01-01".backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key (created in the Console). Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API. Override only for self-hosted/staging use.confirmationSources· string|null · optionnel
Optional. A JSON-encoded STRING (not a native array/object — pass it exactly like a quoted string value), containing the same shape as submit_backtest's own confirmationSources: [{"sourceId":"<a submit_confirmation_source id>","signalType":"entry","validityWindow":{"count":1}}]. Applied identically to every asset pair in this batch (one shared gate, not one per asset). Passed as a raw JSON string rather than a native array because this tool already has one array parameter (assetPairs) — a second one crashes the MCP SDK's own parameter marshaller. A sourceId that doesn't exist, isn't Completed, or belongs to another account fails that item only (same best-effort semantics as an unknown asset pair), not the whole batch.strategySnapshotJson· object|null · optionnel
Same Strategy DSL object submit_backtest takes — see that tool's description for the full shape.
Exemple d'appel{"name": "submit_backtest_batch", "arguments": {"finalDate": "texte", "assetPairs": [], "initialDate": "texte", "backtestApiKey": "texte", "backtestBaseUrl": "texte", "confirmationSources": "texte"}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"items": [], "batchId": "texte"}} - submit_confirmation_source≈ 2009 tokens
Runs a strategy against historical data purely to produce a signal timeline used to confirm OTHER backtests — not a backtest itself. Walks the same candles and evaluates the same DSL as submit_backtest, but never simulates a position: no trade, no PnL, no WinRate/drawdown, none of that applies here, because this strategy is never meant to be traded on its own. Returns immediately with an id and status — call get_confirmation_source to check completion, then pass that id as a confirmationSources sourceId in submit_backtest (e.g. only count an XRP entry once a BTC-neutral confirmation source agrees). Costs the same capacity as a regular backtest of the same size — the compute is identical, it just skips trade simulation.
Paramètres, retour & exemple (6)
ParamètresassetPair· string|null · optionnel
e.g. "BTC-USDC".finalDate· string|null · optionnel
ISO date string, e.g. "2025-06-01".initialDate· string|null · optionnel
ISO date string, e.g. "2025-01-01".backtestApiKey· string|null · optionnel
Your EmidLabs backtest API key (created in the Console). Not needed if this connector was added with a static 'x-api-key' header.backtestBaseUrl· string|null · optionnel
Defaults to the public production API. Override only for self-hosted/staging use.strategySnapshotJson· object|null · optionnel
The Strategy DSL object — identical shape to submit_backtest's own. riskManagement is accepted but never used (no position is ever opened), so it's fine to omit.
Exemple d'appel{"name": "submit_confirmation_source", "arguments": {"assetPair": "texte", "finalDate": "texte", "initialDate": "texte", "backtestApiKey": "texte", "backtestBaseUrl": "texte", "strategySnapshotJson": {}}}Exemple de retour{"content": [{"type": "text", "text": "…"}], "structuredContent": {"id": "texte", "status": "texte"}}
C'est votre serveur ?
Revendiquez-le sur l'espace créateur (preuve GitHub, domaine ou npm) pour afficher le badge « propriétaire vérifié » et lancer un pentest comportemental à la demande afin d'obtenir le badge « Vérifié ».