MCP API reference

Every tool exposed by the Bagtester MCP server. JSON-RPC over HTTP POST.

Endpoint

http
POST https://bagtester.com/api/mcp
Authorization: Bearer bag_yourkeyhere
Content-Type: application/json

Tools

submit_strategyrequired

Submit a Python strategy for backtesting. Returns standardized metrics.

ParamTypeDescription
codestring (required)Python source. Subclass bagtester.Strategy.
modeminute | hybrid | tick (default: minute)Execution mode.
symbolstring (required)BTCUSDT, EURUSD, AAPL, SPY, etc.
from_dateYYYY-MM-DDBacktest start.
to_dateYYYY-MM-DDBacktest end.
initial_capitalnumber (default: 10000)Starting capital.
paramsobject (optional)Forwarded to your Strategy.__init__(**params).
fee_profileauto | crypto_spot | fx_major | us_stock | us_etfPer-asset cost preset.
commission_bpsnumber (optional)Override commission.
slippage_bpsnumber (optional)Override slippage.
waitboolean (default: true)true = sync; false = returns job_id only.
timeout_secondsinteger (default: 300)Max time to wait for sync result.
get_backtest_resultsrequired

Retrieve a previously submitted backtest by job_id.

ParamTypeDescription
job_idstring (required)From a previous submit_strategy call.
timeout_secondsinteger (default: 60)Max wait if still running.
list_my_jobsrequired

List your most recent backtest jobs (id, status, mode, symbol, dates, credits).

ParamTypeDescription
limitinteger (default: 20, max 100)Number of jobs to return.
list_available_datanot required

Asset universe + timeframes + tier-access metadata. Use this to discover what's submittable.

get_data_samplenot required

Last N OHLCV bars for a symbol — verify schema and value ranges before submitting.

ParamTypeDescription
symbolstring (required)BTCUSDT, EURUSD, etc.
timeframe1m | 5m | 15m | 1h | 4h | 1d (default: 1m)Bar size.
ninteger (default: 10, max 200)Number of rows.
asset_classcrypto | fx | stocks | etfs (default: crypto)Used to route data lookup.
optimize_strategyrequired (Quant)

Run a parameter sweep. Returns ranked top combinations by primary_metric.

ParamTypeDescription
code, mode, symbol, from_date, to_date, initial_capitalSame as submit_strategy.
param_gridobject (required){ paramName: [v1, v2, ...] } — Cartesian product.
primary_metricsharpe_ratio | sortino_ratio | total_return_pct | cagr_pctRanking metric.
max_combinationsinteger (default: 200, max 500)Hard cap on combinations.
timeout_secondsinteger (default: 900)Sync timeout.
walk_forwardrequired (Quant)

Rolling in/out-of-sample test. Detects overfit by comparing OOS to in-sample.

ParamTypeDescription
code, mode, symbol, from_date, to_date, initial_capitalSame as submit_strategy.
param_gridobject (required)Optimized within each in-sample window.
in_sample_daysinteger (default: 90)Length of optimization window.
out_sample_daysinteger (default: 30)Length of evaluation window.
primary_metricsharpe_ratio | sortino_ratio | total_return_pct | cagr_pctOptimization metric.
max_combinationsinteger (default: 50, max 200)Per-window cap.
improve_strategyrequired

Re-run a previous job with a structured improvement (extend range, switch to hybrid/tick, parameter sweep).

ParamTypeDescription
job_idstring (required)ID of a previous job.
improvement_idextend_time_range | use_hybrid_mode | use_tick_mode | parameter_sweepWhich improvement to apply.
param_gridobjectRequired for parameter_sweep.
from_date / to_dateYYYY-MM-DDOverride for extend_time_range.

Response shapes

All responses include schema_version. Successful single backtests return:

json
{
  "job_id": "bt_3a7f...",
  "status": "completed",
  "mode": "minute",
  "summary": {
    "total_return_pct": 24.7,
    "cagr_pct": 26.1,
    "sharpe_ratio": 1.83,
    "sortino_ratio": 2.41,
    "max_drawdown_pct": -14.2,
    "win_rate": 0.58,
    "trades_total": 87,
    "credits_used": 1
  },
  "equity_curve": [{ "timestamp": "2024-01-01T00:00:00", "equity": 10000.0 }, ...],
  "trades": [...],
  "billing": {
    "charged": 1,
    "remaining_credits": 99,
    "capped": false
  }
}

Errors

JSON-RPC 2.0 error codes: