Connect your AI over MCP
What this is
crypto-comp runs a Model Context Protocol server. Point Claude, Cursor or any MCP client at it and that assistant can read the block catalog, validate a strategy spec, save strategies, launch backtests and read their results — as you, with the same limits your plan has in the app. It cannot update or delete anything, and nothing touching money, your account or your settings is exposed.
Protocol version 2025-06-18. Whatever the assistant reads through these tools is sent to that assistant’s own provider.
1 · Mint a key
Create an API key on Settings → API keys (you need to be signed in). It is shown once, starts with mcpk_, and is what replaces mcpk_YOUR_KEY_HERE below. Give it only the scopes you want the assistant to have; you can revoke it there at any time.
2 · Add the server to your client
Each snippet below already contains this installation’s address. Claude Desktop only launches local servers from its config file, so its snippet uses the mcp-remote bridge through npx.
Server URL
https://your-crypto-comp-host/api/mcpStreamable HTTP, JSON-RPC 2.0. Every request carries Authorization: Bearer <your key>.
Cursor
Paste into ~/.cursor/mcp.json (or .cursor/mcp.json in a project), then replace the key placeholder.
{
"mcpServers": {
"crypto-comp": {
"url": "https://your-crypto-comp-host/api/mcp",
"headers": {
"Authorization": "Bearer mcpk_YOUR_KEY_HERE"
}
}
}
}Claude Code
Paste into a terminal, then replace the key placeholder.
claude mcp add --transport http crypto-comp https://your-crypto-comp-host/api/mcp --header "Authorization: Bearer mcpk_YOUR_KEY_HERE"
Claude Desktop
Paste into claude_desktop_config.json (Settings → Developer → Edit Config); needs Node.js for npx, then replace the key placeholder.
{
"mcpServers": {
"crypto-comp": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://your-crypto-comp-host/api/mcp",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer mcpk_YOUR_KEY_HERE"
}
}
}
}Any other MCP client
Paste into its remote-server (Streamable HTTP) settings, then replace the key placeholder.
{
"mcpServers": {
"crypto-comp": {
"type": "http",
"url": "https://your-crypto-comp-host/api/mcp",
"headers": {
"Authorization": "Bearer mcpk_YOUR_KEY_HERE"
}
}
}
}3 · What the assistant can call
| Tool | Scope it needs | What it does |
|---|---|---|
| catalog | catalog:read | List every strategy block the engine supports (indicators, conditions and their inputs/outputs), projected from the engine's own registry. Call this before composing a spec. |
| validate_spec | catalog:read | Deep-validate a strategy spec through the engine's own validator and return the verdict. On failure the response carries structured errors; fix them and validate again. This is the same validator that guards saving and launching — nothing bypasses it. |
| list_strategies | strategies:read | List your saved strategies, newest first. Specs are omitted; use get_strategy for one. |
| get_strategy | strategies:read | Read one of your saved strategies, including its full spec. |
| save_strategy | strategies:write | Save a NEW strategy under your account. The spec is deep-validated by the engine first; an invalid spec is rejected and nothing is stored. Saving never overwrites an existing strategy. |
| launch_run | runs:write | Queue a backtest for a spec and a run window. Subject to the same subscription limits as the UI (concurrent runs, how far back the data window may reach, spot-only markets) — a refusal comes back as a tier_limit error naming which limit. Returns a run_id; poll get_run for the outcome. |
| list_runs | runs:read | List your runs, newest first, each with its summary. Optionally filter to one of your strategies. |
| get_run | runs:read | Read one of your runs: its status, timings, error and full result. |
| get_results | runs:read | Read the full stored result of one of your runs (summary, equity curves, fills, signal log, and for a futures run the funding ledger, its net total, any liquidations and the execution stamp). `result.version` is the branch point: "0.1" predates the metric suite, "0.2" predates futures, "0.3" carries everything; stored results are immutable and never recomputed, so treat later fields as optional. Null until the run finishes. Large — prefer get_metrics when you only need performance figures. |
| get_metrics | runs:read | Read just the performance metrics of one of your runs (Sharpe, Sortino, max drawdown, win rate, profit factor, expectancy and the rest). Every figure is a decimal string. Null for a run that has not finished, and for runs recorded before the metric suite existed. |
A refused call (a missing scope, a plan limit, something that is not yours) comes back to the assistant as a readable error, so it can tell you why. The same key also works for the REST API.