AI Backtester
Backtest crypto trading strategies by describing them in plain English.
What it can do
- Whoami: Confirm the API key is valid and report the current plan and weekly backtest quota. Worth calling first in a conversation so later failures are not a surprise.
- Get Strategy Spec Rules: REQUIRED reading before calling run_backtest or check_strategy for the first time. Returns the full strategy format: the JSON schema, every supported indicator with the range
- List Symbols: Search every market with history in the archive, by ticker or by coin: USD-M perpetual futures (the default) or spot. Worth calling before writing a strategy: Binance futures prefix smal
What data it sees
Do you need an account
No: the server works without sign-in
Backtest crypto trading strategies by describing them in plain English. Your AI writes the rules; a deterministic engine runs them on real Binance data (perpetual futures and spot) with fees, slippage and funding counted. Signals fill at the next candle's open, and a candle that touches both stop and target counts as the stop. Optimize with a held-out check, forward test on live data, build portfolios, and get a full report for every result. Free to start.
How to connect
How to connect AI Backtester to Claude
The server address to paste into Claude settings:
https://backtester--ai-backtester.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect AI Backtester to ChatGPT
The server address to paste into ChatGPT settings:
https://backtester--ai-backtester.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect AI Backtester to Cursor
The server address to paste into Cursor settings:
https://backtester--ai-backtester.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (27)
Raw names from tools/list. Only developers need these.
| whoami | Confirm the API key is valid and report the current plan and weekly backtest quota. Worth calling first in a conversation so later failures are not a surprise. |
| get_strategy_spec_rules | REQUIRED reading before calling run_backtest or check_strategy for the first time. Returns the full strategy format: the JSON schema, every supported indicator with the range it can occupy, the condition operators, and worked examples. |
| list_symbols | Search every market with history in the archive, by ticker or by coin: USD-M perpetual futures (the default) or spot. Worth calling before writing a strategy: Binance futures prefix small-cap coins by lot size, so PEPE trades as 1000PEPEUSDT there (PEPEUSDT on spot), and guessing the ticker finds nothing. Spot also has coins with no futures market, pairs quoted in BTC, ETH, FDUSD and others, and history from 2017. |
| check_strategy | Validate a strategy spec and prove whether its rules can ever fire. Costs nothing and touches no market data. Catches impossible conditions (for example an RSI threshold above 100) and strategies with no way to close a position. |
| run_backtest | Run a strategy against real historical data and return its performance. Nothing is saved or published unless `save` is set — a backtest is a question, not a publication. Call get_strategy_spec_rules first if you have not already. If exactly this — same rules, settings and period, over months that have finished — was saved before (by this account, or publicly), that result comes back and no backtest is used. |
| get_trades | Every trade from a saved run, in order. |
| get_equity_curve | Account equity over time, downsampled to at most `maxPoints` samples. The default is deliberately small so the response fits comfortably in context. |
| list_strategies | List strategies saved to this account. |
| get_strategy | Fetch a strategy and its current spec by id. |
| search_strategies | Search public backtest results. Sorted by Sharpe ratio by default, not raw profit: ranking by return alone puts the most overfit result on top. Results with fewer than `minTrades` trades are excluded, because a handful of trades cannot distinguish skill from luck. |
| get_run | The headline numbers of one saved run by id — yours, or anyone's public one — with a link to its full report. Use get_trades and get_equity_curve for the detail. |
| compare_backtests | Put 2 to 6 saved runs (yours or public ones) side by side: return, buy & hold, drawdown, Sharpe, trades and win rate. Runs over different markets or periods are listed, but the answer says so, because their numbers are not comparable. |
| update_strategy | Rename one of your strategies, or change who can see it. Making it private takes it and every result it saved off Browse and your profile (Pro); making it public puts them back. To change its rules, run a backtest with the new spec and `save.strategyId`. |
| delete_strategy | Delete one of your strategies. It disappears from your strategies, Browse and your profile, its forward test (if any) stops, and its results become private. This cannot be undone from here, so `confirm` must be true: ask the user first. |
| fork_strategy | Copy someone else's public strategy into this account as a private strategy of its own, and run it once so it has a result (uses one backtest). Pro. Pass the id of one of its public runs, from search_strategies or a report link. |
| promote_strategy | Begin evaluating a saved strategy on candles it has never seen. A backtest can be tuned until it looks good; the future cannot be tuned. The gap between the two is the honest measure of whether a strategy actually works. |
| demote_strategy | Stop forward testing and DISCARD the forward record. Promoting again starts from zero at the new date: a forward test cannot be paused and resumed, because that would let an unflattering period be edited out. |
| propose_optimization_plan | Show what a sweep would search before spending anything on it: the values per param, the total combinations, and any range that had to be clamped because it reached outside what the param can actually affect. Costs nothing. |
| optimize_strategy | Search a strategy's declared params for the best combination, then report how much of that result is explained by the search itself. Searches on the first 60% of the window, chooses on the next 20%, and confirms on the last 20%, which it never looked at; rejects candidates that barely traded; and discounts the winning score by the number of attempts. Frequently concludes that the winner is not worth trading — that is the tool working, not failing. Uses 20 backtests from the quota, whatever its size. |
| create_portfolio | Put several of your saved strategies together as a portfolio, each with a share of the capital, and see their combined result — equity, drawdown, Sharpe, each one's contribution, and how correlated they are. Combining saved backtests costs nothing. Pro. |
| list_portfolios | List your portfolios, with how many strategies each holds. |
| get_portfolio | Show a portfolio: its latest run — the combined equity numbers, trades, and each strategy's part — or, if it has never run, its strategies' own saved results combined. Free. |
| update_portfolio | Rename a portfolio, or replace its strategies and their shares (give the whole list: it replaces the old one). |
| run_portfolio | Run every strategy in a portfolio over the same dates and show the combined result. The money is split by the allocations; each strategy trades its slice with its own current rules, position size and leverage (a fixed amount per trade is kept in proportion to its slice); the strategies themselves are not changed. Uses one backtest per strategy (none for a result already made over finished months). Capital or dates given here are used for this run and not saved; the dates default to the first day all its markets have data, to the start of this month. |
| optimize_portfolio | Search a portfolio's allocations — some may go to 0 — for the best score on the first 70% of its last run, then show how that did on the last 30% (which the search never saw) next to the current allocations and equal ones. The last 30% is the honest number; say so. Needs a run first (run_portfolio). Free: it re-weights the run's results. Nothing changes unless `apply` is true — ask the user before applying. Objectives: avg_month, green_months, min_drawdown, fast_recovery (these two never at a lower return than now), sharpe, return_over_dd. |
| delete_portfolio | Delete a portfolio. Its strategies and their results are kept. `confirm` must be true: ask the user first. |
| get_forward_result | Compare a strategy's backtest against how it has actually performed since being promoted. This is the number that matters: backtests are fitted to the past, forward results are not. |