{"serverId":"mcp-registry/com.backtest360/backtest360","tools":[{"name":"compare_backtests","fixed":{"name":"compare_backtests","description":"Run several strategies on the same data and compare side by side.\n\n        One quota-counted call, but compute scales with the number of\n        strategies. If the wall-clock compute budget is exceeded, the call\n        fails with a tool error (504) instead of returning partial results —\n        narrow the request (fewer strategies, shorter date range, coarser\n        frequency) and retry.\n\n        Args:\n            data_source: Shared data source (same shape as run_backtest).\n            strate","inputSchema":{"type":"object","title":"compare_backtestsArguments","required":["data_source","strategies"],"properties":{"strategies":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Strategies"},"data_source":{"type":"object","title":"Data Source","additionalProperties":true},"trades_limit":{"type":"integer","title":"Trades Limit","default":50},"response_detail":{"enum":["summary","stats","full"],"type":"string","title":"Response Detail","default":"summary"},"include_benchmark":{"type":"boolean","title":"Include Benchmark","default":false}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":316,"tokensAfter":316},{"name":"compute_stats","fixed":{"name":"compute_stats","description":"Compute the engine's performance metrics from a returns series.\n\n        Use when the returns came from somewhere\n        other than run_backtest (an external system, a portfolio) — backtest\n        results already include these statistics.\n\n        Args:\n            returns: Per-bar log returns as {\"dates\": [...], \"values\": [...]}\n                parallel arrays (ISO-8601 dates).\n            trading_days_per_year: Required annualization factor — 252 for a\n                daily equities calendar","inputSchema":{"type":"object","title":"compute_statsArguments","required":["returns","trading_days_per_year"],"properties":{"trades":{"anyOf":[{"type":"array","items":{"type":"object","additionalProperties":true}},{"type":"null"}],"title":"Trades","default":null},"returns":{"type":"object","title":"Returns","additionalProperties":true},"risk_free_rate":{"type":"number","title":"Risk Free Rate","default":0},"benchmark_returns":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Benchmark Returns","default":null},"trading_days_per_year":{"type":"integer","title":"Trading Days Per Year"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":328,"tokensAfter":328},{"name":"engine_info","fixed":{"name":"engine_info","description":"Engine version, API contract number, and health.\n\n        Free (not quota-counted). Call once at the start of a session\n        to confirm the engine is reachable and which contract it serves.\n        ","inputSchema":{"type":"object","title":"engine_infoArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":90,"tokensAfter":90},{"name":"export_backtest","fixed":{"name":"export_backtest","description":"Export a multi-strategy comparison as an Excel workbook.\n\n        Quota-counted; needs a key whose plan includes full-metrics export\n        (a 403 means the configured key's plan does not — do not retry).\n        Returns the workbook base64-encoded — decode and write it to a\n        ``.xlsx`` file.\n\n        Args:\n            data_source: Shared data source (same shape as run_backtest).\n            strategies: Same shape as compare_backtests' ``strategies``.\n            include_benchmark: Add a ","inputSchema":{"type":"object","title":"export_backtestArguments","required":["data_source","strategies"],"properties":{"strategies":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Strategies"},"data_source":{"type":"object","title":"Data Source","additionalProperties":true},"include_benchmark":{"type":"boolean","title":"Include Benchmark","default":false}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":263,"tokensAfter":263},{"name":"get_catalog","fixed":{"name":"get_catalog","description":"Fetch one engine reference catalog.\n\n        Catalogs (cheap, cacheable per session):\n        - 'operators' — comparison operators for condition expressions\n        - 'execution-modes' — entry/exit anchors and fill algorithms, with the\n          validity matrix by market type\n        - 'stop-types' — stop-loss types, re-entry modes, and their parameters\n        - 'sizing-methods' — position-sizing methods and their parameters\n        - 'bar-frequencies' — supported bar frequencies and the signal","inputSchema":{"type":"object","title":"get_catalogArguments","required":["catalog"],"properties":{"catalog":{"enum":["operators","execution-modes","stop-types","sizing-methods","bar-frequencies","sections","sampling-modes"],"type":"string","title":"Catalog"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":225,"tokensAfter":225},{"name":"get_data_range","fixed":{"name":"get_data_range","description":"Available date range and estimated bar count for a symbol/frequency.\n\n        Available on paid plans. Call before a server-side fetch so the\n        requested start/end stay inside what the provider can deliver and the\n        bar count stays inside the key's per-run limit.\n        ","inputSchema":{"type":"object","title":"get_data_rangeArguments","required":["symbol","frequency"],"properties":{"symbol":{"type":"string","title":"Symbol"},"frequency":{"type":"string","title":"Frequency"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":150,"tokensAfter":150},{"name":"get_latest_signal","fixed":{"name":"get_latest_signal","description":"Evaluate the strategy on the most recent bar only — no P&L, no stats.\n\n        Returns the latest signal (-1/0/1), which\n        condition slots fired, and the bar timestamp. Use for \"what would this\n        strategy do right now\" questions; use run_backtest for performance.\n        ","inputSchema":{"type":"object","title":"get_latest_signalArguments","required":["data_source","strategy"],"properties":{"strategy":{"type":"object","title":"Strategy","additionalProperties":true},"execution":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Execution","default":null},"data_inputs":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Data Inputs","default":null},"data_source":{"type":"object","title":"Data Source","additionalProperties":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":240,"tokensAfter":240},{"name":"get_macro_series","fixed":{"name":"get_macro_series","description":"Observations for one macroeconomic series over an optional date range.\n\n        Free — no special plan. ``series`` is an ``id`` from list_macro_series\n        (e.g. treasury_10y, cpi, unemployment_rate); arbitrary external ids are\n        not accepted. ``start``/``end`` are ``YYYY-MM-DD``, inclusive, both\n        optional (full history when omitted). Returns the value series at its\n        native reporting frequency, with the series descriptor and an ``as_of``\n        date. A long history is dow","inputSchema":{"type":"object","title":"get_macro_seriesArguments","required":["series"],"properties":{"end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End","default":null},"start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start","default":null},"series":{"type":"string","title":"Series"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":241,"tokensAfter":241},{"name":"get_me","fixed":{"name":"get_me","description":"The configured API key's permissions, limits, and current usage.\n\n        Cheap. Call early in a session — before planning work — to learn what\n        this key can do instead of discovering limits through failed calls.\n\n        Returns:\n            ``scopes``: the permission scopes the key carries. ``limits``:\n            requests per minute and per day, max concurrent requests, and the\n            per-run bar cap (null when uncapped). ``usage``: current\n            consumption against those li","inputSchema":{"type":"object","title":"get_meArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":172,"tokensAfter":172},{"name":"get_price_history","fixed":{"name":"get_price_history","description":"OHLCV price history for a symbol over a date range.\n\n        Requires a paid plan (managed market data). ``start`` is required\n        (``YYYY-MM-DD``); ``end`` defaults to today. Returns a summary (symbol,\n        resolved date range, total bar count, price range, gap flags),\n        market-hours detection, and the OHLCV arrays. A long history is\n        downsampled by the MCP server to a bounded number of points — first and\n        last bar always kept, every column thinned on the same dates —","inputSchema":{"type":"object","title":"get_price_historyArguments","required":["symbol","start"],"properties":{"end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End","default":null},"start":{"type":"string","title":"Start"},"symbol":{"type":"string","title":"Symbol"},"frequency":{"type":"string","title":"Frequency","default":"daily"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":251,"tokensAfter":251},{"name":"get_quote","fixed":{"name":"get_quote","description":"Latest available price for a symbol.\n\n        Requires a paid plan (managed market data). Returns the most recent\n        *available* bar for the given frequency — the end-of-day close for\n        daily, the last completed bar otherwise — as open/high/low/close/volume\n        plus an ``as_of`` timestamp for that bar. This is a last-known price,\n        not a live tick; read ``as_of`` to judge how stale it is.\n        ","inputSchema":{"type":"object","title":"get_quoteArguments","required":["symbol"],"properties":{"symbol":{"type":"string","title":"Symbol"},"frequency":{"type":"string","title":"Frequency","default":"daily"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":188,"tokensAfter":188},{"name":"get_strategy_schema","fixed":{"name":"get_strategy_schema","description":"JSON Schema for the strategy document (condition_tree + indicators).\n\n        Fetch this before composing a strategy by hand; the\n        validate_strategy tool checks against the same rules.\n        ","inputSchema":{"type":"object","title":"get_strategy_schemaArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":94,"tokensAfter":94},{"name":"get_ticker_info","fixed":{"name":"get_ticker_info","description":"Identity and data coverage for one symbol, in a single call.\n\n        Metadata only — no market data, so no paid plan is needed. Returns the\n        asset's identity (name, asset class, exchange, currency, and whether it\n        is still active) together with a coverage summary for the given\n        frequency: the available date range and an estimated bar count. Use it\n        to confirm a symbol resolves and that the history you need exists before\n        requesting a quote or a price fetch. Fo","inputSchema":{"type":"object","title":"get_ticker_infoArguments","required":["symbol"],"properties":{"symbol":{"type":"string","title":"Symbol"},"frequency":{"type":"string","title":"Frequency","default":"daily"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":213,"tokensAfter":213},{"name":"list_indicators","fixed":{"name":"list_indicators","description":"List indicators, or fetch one indicator's full schema.\n\n        Cheap, cacheable per session.\n\n        With no arguments: a compact catalog — ``{\"indicators\": [...],\n        \"count\": N}`` — where each entry carries id, name, category, kind,\n        and value_dtype (no description, to keep the discovery scan small). Use\n        it to discover what exists. Pass name='rsi' (id or name,\n        case-insensitive) to get that single indicator's complete entry\n        including its description and para","inputSchema":{"type":"object","title":"list_indicatorsArguments","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":null},"compact":{"type":"boolean","title":"Compact","default":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":218,"tokensAfter":218},{"name":"list_macro_series","fixed":{"name":"list_macro_series","description":"List the available macroeconomic series (the catalog).\n\n        Free — no special plan. Returns the set of macro series you can fetch\n        with get_macro_series, each with its stable ``id`` (the value\n        get_macro_series takes), title, category, native reporting frequency,\n        and units, plus the list of categories. Optionally filter to one\n        ``category`` (e.g. rates, yield_curve, inflation, employment, recession,\n        growth). Call this first to find the ``id`` for the seri","inputSchema":{"type":"object","title":"list_macro_seriesArguments","properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":202,"tokensAfter":202},{"name":"list_templates","fixed":{"name":"list_templates","description":"List predesigned strategy templates, or fetch one in full.\n\n        Cheap, cacheable per session. The engine returns the templates\n        available to the calling key.\n\n        With no arguments: a compact catalog — ``{\"templates\": [...],\n        \"count\": N}`` — where each entry carries id, origin, name, and\n        description. Use it to discover what exists. Pass name='sma-cross'\n        (id or name, case-insensitive) to get that single template's complete\n        entry: its strategy logic (`","inputSchema":{"type":"object","title":"list_templatesArguments","properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","default":null},"compact":{"type":"boolean","title":"Compact","default":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":217,"tokensAfter":217},{"name":"list_tickers","fixed":{"name":"list_tickers","description":"List available tickers, optionally filtered by asset class.\n\n        The full universe is very large, so the MCP server\n        caps the returned list and marks it ``truncated_by_mcp`` — pass\n        asset_class to narrow it, or use search_tickers to resolve a specific\n        asset by name.\n        ","inputSchema":{"type":"object","title":"list_tickersArguments","properties":{"asset_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Class","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":146,"tokensAfter":146},{"name":"run_backtest","fixed":{"name":"run_backtest","description":"Run a historical backtest against the engine.\n\n        Quota-counted and compute-bound. Validate the\n        strategy first (validate_strategy is far cheaper). On a 504 compute\n        timeout, do NOT retry the same request — reduce the date range, use a\n        coarser frequency, or simplify the strategy. On 429/503, wait for the\n        advertised Retry-After before retrying.\n\n        Args:\n            data_source: Either inline OHLCV ({\"ohlcv\": {dates, open, high,\n                low, close, ","inputSchema":{"type":"object","title":"run_backtestArguments","required":["data_source"],"properties":{"include":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Include","default":null},"signals":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Signals","default":null},"strategy":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Strategy","default":null},"benchmark":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Benchmark","default":null},"execution":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Execution","default":null},"data_inputs":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Data Inputs","default":null},"data_source":{"type":"object","title":"Data Source","additionalProperties":true},"trades_limit":{"type":"integer","title":"Trades Limit","default":50},"response_detail":{"enum":["summary","stats","full"],"type":"string","title":"Response Detail","default":"summary"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":457,"tokensAfter":457},{"name":"search_tickers","fixed":{"name":"search_tickers","description":"Search available assets by ticker or name (relevance-ranked).\n\n        Use to resolve a user's asset mention (\"bitcoin\",\n        \"S&P\") to the exact ticker before requesting a server-side data fetch.\n        asset_class filters to 'stocks', 'crypto', 'forex', or 'indices'.\n        ","inputSchema":{"type":"object","title":"search_tickersArguments","required":["query"],"properties":{"limit":{"type":"integer","title":"Limit","default":20},"query":{"type":"string","title":"Query"},"asset_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Class","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":175,"tokensAfter":175},{"name":"validate_strategy","fixed":{"name":"validate_strategy","description":"Validate a strategy document without running a backtest.\n\n        A cheap quota separate from backtest runs,\n        so validate freely and ALWAYS before run_backtest.\n\n        Args:\n            strategy: The strategy document — name, indicators[], and\n                condition_tree (see get_strategy_schema for the exact shape).\n            injected_indicators: Names of custom time-series columns the\n                caller will supply via data_inputs at run time, so conditions\n                re","inputSchema":{"type":"object","title":"validate_strategyArguments","required":["strategy"],"properties":{"strategy":{"type":"object","title":"Strategy","additionalProperties":true},"injected_indicators":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Injected Indicators","default":null}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":244,"tokensAfter":244}],"toolsChanged":20,"tokensSaved":0,"todo":[{"tool":"compare_backtests","params":["strategies","data_source","trades_limit","response_detail","include_benchmark"]},{"tool":"compute_stats","params":["trades","returns","risk_free_rate","benchmark_returns","trading_days_per_year"]},{"tool":"export_backtest","params":["strategies","data_source","include_benchmark"]},{"tool":"get_catalog","params":["catalog"]},{"tool":"get_data_range","params":["symbol","frequency"]},{"tool":"get_latest_signal","params":["strategy","execution","data_inputs","data_source"]},{"tool":"get_macro_series","params":["end","start","series"]},{"tool":"get_price_history","params":["end","start","symbol","frequency"]},{"tool":"get_quote","params":["symbol","frequency"]},{"tool":"get_ticker_info","params":["symbol","frequency"]},{"tool":"list_indicators","params":["name","compact"]},{"tool":"list_macro_series","params":["category"]},{"tool":"list_templates","params":["name","compact"]},{"tool":"list_tickers","params":["asset_class"]},{"tool":"run_backtest","params":["include","signals","strategy","benchmark","execution","data_inputs","data_source","trades_limit","response_detail"]},{"tool":"search_tickers","params":["limit","query","asset_class"]},{"tool":"validate_strategy","params":["strategy","injected_indicators"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}