backtest360-mcp
MCP server exposing the Backtest360 engine API as tools for AI agents.
<!-- mcp-name: com.backtest360/backtest360 -->Connect any MCP-capable AI client and drive real backtests conversationally: discover indicators, build and validate strategies, run backtests, and read the results — all against the deterministic Backtest360 engine. The server contains no AI and computes no numbers of its own; it is a thin, faithful adapter over the engine HTTP API. Your engine API key and its plan govern everything (permissions, rate limits, data access).
Two transports: a hosted HTTP endpoint at
https://mcp.backtest360.com/mcp (send your key as an X-API-Key header) and local
stdio (self-host — see below).
Install
pip install backtest360-mcp # or, from a clone: pip install -e .
Requires Python 3.10+ and a Backtest360 API key — create one at backtest360.com.
Configuration
Everything is environment-driven:
| Variable | Required | Default | Purpose |
|---|---|---|---|
BACKTEST360_API_KEY | yes | — | Engine API key, sent as X-API-Key |
BACKTEST360_ENGINE_URL | no | https://api.backtest360.com | Engine base URL |
BACKTEST360_MCP_TIMEOUT | no | 300 | Per-request timeout (seconds) |
BACKTEST360_MCP_MAX_OUTPUT_BYTES | no | 100000 | Hard cap on a single tool result |
Connect an MCP client
Hosted (recommended)
Point your MCP client at the hosted endpoint over HTTP and send your key as an
X-API-Key header:
{
"mcpServers": {
"backtest360": {
"type": "streamable-http",
"url": "https://mcp.backtest360.com/mcp",
"headers": {
"X-API-Key": "b360_..."
}
}
}
}
Local (stdio)
Run the server yourself and let your client launch it over stdio (the common
mcpServers shape):
{
"mcpServers": {
"backtest360": {
"command": "backtest360-mcp",
"env": {
"BACKTEST360_API_KEY": "b360_..."
}
}
}
}
Prefer not to put the key in a config file? Point command at a small wrapper script
that exports the key from your secrets manager and then runs backtest360-mcp. A
minimal example config is in examples/mcp.json.
Tools
| Tool | What it does |
|---|---|
engine_info | Engine version, API contract, health |
get_catalog | Reference catalogs: operators, execution modes, stop types, sizing methods, bar frequencies, metric sections |
list_indicators | Indicator discovery; per-indicator parameter schemas |
get_strategy_schema | JSON Schema for strategy documents |
validate_strategy | Validate a strategy without running it — returns structured, locatable errors |
run_backtest | Run a historical backtest |
get_latest_signal | Evaluate the most recent bar only (no P&L) |
compare_backtests | Run several strategies on the same data, side by side |
compute_stats | Compute the metric set from an externally produced returns series |
search_tickers / list_tickers | Asset discovery for server-side data fetch |
get_data_range | Available history and bar-count estimate for a symbol |
The cheap static catalogs are also published as MCP resources
(backtest360://catalog/{name}, backtest360://schema/strategy) for clients that
support resource attachment.
Response shaping
A full backtest result is megabytes; an agent's context is not. run_backtest and
compare_backtests take response_detail:
summary(default) — headline metrics, warnings, counts, equity endpointsstats— every metric the plan allowsfull— plus series (downsampled, endpoints preserved) and trades (paginated)
include=["trades", "equity_curve", "monthly_returns", "yearly_returns"] adds specific
blocks at the lighter levels. Results exceeding the output cap are reduced further and
explicitly marked truncated_by_mcp — never silently cut. Shaping only ever selects and
thins what the engine returned; no value is computed or altered.
Error semantics
Designed for agents:
- Fixable by changing the request → returned as a normal result: failed validations
arrive as
{"valid": false, "errors": [...]}with machine codes and document locations; engine rejections arrive as{"accepted": false, "error": ...}with a hint. - Not fixable that way → a tool error with explicit guidance: rate limits carry the
Retry-Aftervalue; engine-busy says retry with backoff; a compute timeout says do not retry and reduce scope instead; permission problems name the missing capability. Engine request ids are included for support.
Running the tests (self-host)
pip install -e ".[dev]"
pytest # unit suite vs a mock engine — no network
Questions / feedback
Questions or feedback? hello@backtest360.com — we read everything. backtest360-mcp is in active development, so help shape it.
Bug reports and feature requests: open an issue on GitHub.
License
MIT — see LICENSE.