Backtest from your AI agent
You already point an agent at Manifold-BT, and it hands back code that looks right and will not compile. Give it the guide, every signature and the rules the compiler enforces, and the first version runs.
The engine on your machine, the reference for your agent.
What a copy-paste cannot give it
Cost is only the visible half. The rest is that a pasted page goes stale, arrives without the parts that matter, or never arrives at all.
A crawler sees navigation, not documentation
retrievalThis site renders client-side. An agent that fetches a documentation URL gets the page shell, not the guide, so it falls back to guessing. The MCP hands it the actual text, already split into sections.
The rules no signature reveals
correctnessHow to combine two conditions, when a NaN is the correct position, what a cross-asset reference requires, why a window comes back empty. None of it is inferable from a function list, and all of it is what the compiler refuses.
Answers are stamped to a version
freshnessSignatures, config fields and indicator lists are generated by introspecting a real engine build, not written from memory. Every answer reports the version it describes, so a stale reply is visible rather than plausible.
Connect in one line
A hosted HTTP endpoint: nothing to install, nothing to keep updated, and no engine on your side of the wire. Point any MCP client at the URL.
{
"mcpServers": {
"manifoldbt-docs": {
"url": "https://mcp.manifoldbt.com/docs/mcp"
}
}
}claude mcp add --transport http manifoldbt-docs https://mcp.manifoldbt.com/docs/mcpThen ask for a strategy as you normally would. The agent consults the reference on its own.
Four tools, deliberately
A long tool list makes a model pick worse. This one covers the whole authoring loop and stops there.
search_docsSearch the authoring guide, DSL rules, indicator and config signatures, and worked examples. Ask in natural language or by symbol name.
explain_errorPaste an engine error verbatim and get the cause and the fix. Engine messages name a rule, not the mistake that triggered it.
get_capabilitiesWhich engine version the reference covers, and which research APIs are gated behind a Pro licence.
list_topicsEverything the reference holds, by kind, for when a search comes back empty.
Errors become fixes
The engine's messages are precise but written for someone who already knows the execution model. They state a rule, not the mistake that broke it, so an agent reading one tends to change something adjacent and try again.
explain_error closes that loop: paste the message, get the cause and the correction. Each entry is an error that came up in real use.
SymbolRef requires orchestrator-level multi-symbol handlingA cross-asset reference was evaluated per symbol. Use the dict universe form, qualify the name, and keep symbol_ref() inside a signal.
'close' is not callablePrice columns are bare names. Write close, not close(...); use symbol_ref('BTCUSDT', 'close') for another market.
chained comparisons (a < b < c) are not supported& binds tighter than >. Parenthesise each side: (close > ema(close,50)) & (close > ema(close,200)).
empty bar datasetAlmost always a missing end date: timestamps are nanoseconds, so a start with no end asks for an empty window.
What it changes in practice
You ask for the strategy you want. The agent checks the reference before writing, so the first version compiles and the parameters mean what you intended, rather than arriving three corrections later.
The rules it needs are the ones no signature reveals: how to combine conditions, when a NaN is correct, why a window comes back empty, what a cross-asset reference requires.
You: add a regime filter to my ETH strategy using BTC's trend
Agent: search_docs("reference another symbol")
-> Cross-Asset References + a worked example
: writes symbol_ref("BTCUSDT", "close") inside a signal,
parenthesises the conditions, sets warmup_barsYour backtests stay yours
The engine runs on your machine, against your own data store. Nothing about a strategy you are working on, and none of the data you run it against, is sent anywhere: the endpoint only ever receives a question about the documentation.
That is also why it is fast and always available. It holds no engine and no market data, so there is nothing to queue behind and nothing to saturate, and it answers a lookup in milliseconds no matter what you are running locally.
Give your agent the reference
One URL in your MCP client, and the next strategy it writes for you compiles.