# Backtest360 MCP server

MCP server exposing the Backtest360 engine API as tools for AI agents.

## Links
- Registry page: https://www.getdrio.com/mcp/com-backtest360-backtest360
- Repository: https://github.com/Backtest360/backtest360-mcp

## Install
- Command: `uvx backtest360-mcp`
- Endpoint: https://mcp.backtest360.com/mcp
- Auth: Auth required by registry metadata

## Setup notes
- Remote header: X-API-Key (required; secret)
- Package: Pypi backtest360-mcp v0.5.0
- Environment variable: BACKTEST360_API_KEY (required; secret)
- The upstream registry signals required auth or secrets.
- Remote endpoint: https://mcp.backtest360.com/mcp
- Header: X-API-Key

## Tools
- get_me - The configured API key's permissions, limits, and current usage.

        Cheap. Call early in a session — before planning work — to learn what
        this key can do instead of discovering limits through failed calls.

        Returns:
            ``scopes``: the permission scopes the key carries. ``limits``:
            requests per minute and per day, max concurrent requests, and the
            per-run bar cap (null when uncapped). ``usage``: current
            consumption against those limits, with reset countdowns in
            seconds. ``capabilities``: feature flags such as server-side data
            fetch and the full metric set. A small fixed-shape record,
            returned as the engine sent it.
         Endpoint: https://mcp.backtest360.com/mcp
- engine_info - Engine version, API contract number, and health.

        Free (not quota-counted). Call once at the start of a session
        to confirm the engine is reachable and which contract it serves.
         Endpoint: https://mcp.backtest360.com/mcp
- get_catalog - Fetch one engine reference catalog.

        Catalogs (cheap, cacheable per session):
        - 'operators' — comparison operators for condition expressions
        - 'execution-modes' — entry/exit anchors and fill algorithms, with the
          validity matrix by market type
        - 'stop-types' — stop-loss types, re-entry modes, and their parameters
        - 'sizing-methods' — position-sizing methods and their parameters
        - 'bar-frequencies' — supported bar frequencies and the signal x
          execution validity matrix (which combinations are allowed)
        - 'sections' — the full metric catalog: every statistic's stable id,
          display label, section, and description
        - 'sampling-modes' — Monte-Carlo resampling modes, each with its
          status and parameters

        Fetch the relevant catalog BEFORE building a strategy or config; build
        only from values it lists — never guess parameter names or frequencies.
         Endpoint: https://mcp.backtest360.com/mcp
- list_indicators - List indicators, or fetch one indicator's full schema.

        Cheap, cacheable per session.

        With no arguments: a compact catalog — ``{"indicators": [...],
        "count": N}`` — where each entry carries id, name, category, kind,
        and value_dtype (no description, to keep the discovery scan small). Use
        it to discover what exists. Pass name='rsi' (id or name,
        case-insensitive) to get that single indicator's complete entry
        including its description and params_schema — do this before adding an
        indicator to a strategy so its parameters are exactly right.
        Pass compact=False for full entries for everything (large; the MCP
        server may cap it and set ``truncated_by_mcp`` — prefer compact or
        name=).

        Wire optimization: the compact discovery path asks the engine to omit
        per-entry descriptions (``descriptions=false``) since they are stripped
        locally anyway; the name= and compact=False paths request them. This is
        a pure saving — if the engine ignores the param it returns full entries
        and the local compact strip still yields a lean result.
         Endpoint: https://mcp.backtest360.com/mcp
- list_templates - List predesigned strategy templates, or fetch one in full.

        Cheap, cacheable per session. The engine returns the templates
        available to the calling key.

        With no arguments: a compact catalog — ``{"templates": [...],
        "count": N}`` — where each entry carries id, origin, name, and
        description. Use it to discover what exists. Pass name='sma-cross'
        (id or name, case-insensitive) to get that single template's complete
        entry: its strategy logic (``condition_tree`` + ``indicators``, the
        same shape validate_strategy and run_backtest accept) plus parameter
        metadata — ``defaults`` (starting parameter values), ``requires``,
        and ``locked_params`` (parameters that must keep their template
        values). Pass compact=False for complete entries for everything
        (large; the MCP server may cap it and set ``truncated_by_mcp`` —
        prefer compact or name=).
         Endpoint: https://mcp.backtest360.com/mcp
- get_strategy_schema - JSON Schema for the strategy document (condition_tree + indicators).

        Fetch this before composing a strategy by hand; the
        validate_strategy tool checks against the same rules.
         Endpoint: https://mcp.backtest360.com/mcp
- validate_strategy - Validate a strategy document without running a backtest.

        A cheap quota separate from backtest runs,
        so validate freely and ALWAYS before run_backtest.

        Args:
            strategy: The strategy document — name, indicators[], and
                condition_tree (see get_strategy_schema for the exact shape).
            injected_indicators: Names of custom time-series columns the
                caller will supply via data_inputs at run time, so conditions
                referencing them validate.

        Returns:
            On success: {"valid": true, "warmup_bars": ..., referenced
            indicators/columns}. On failure: {"valid": false, "errors": [...]}
            where each error carries a machine code, the location in the
            document, a message, and context (e.g. the list of valid column
            names). A failed validation is a NORMAL result, not an error —
            read the errors, fix the document, and validate again before
            running.
         Endpoint: https://mcp.backtest360.com/mcp
- run_backtest - Run a historical backtest against the engine.

        Quota-counted and compute-bound. Validate the
        strategy first (validate_strategy is far cheaper). On a 504 compute
        timeout, do NOT retry the same request — reduce the date range, use a
        coarser frequency, or simplify the strategy. On 429/503, wait for the
        advertised Retry-After before retrying.

        Args:
            data_source: Either inline OHLCV ({"ohlcv": {dates, open, high,
                low, close, volume?}} as parallel arrays, ISO-8601 dates) or a
                server-side fetch ({"symbol", "start", "end", "frequency"} —
                requires a paid plan).
            strategy: Strategy document (indicators[] + condition_tree).
                Mutually exclusive with signals.
            signals: Precomputed signal series ({"dates": [...], "values":
                [-1|0|1, ...]}). Mutually exclusive with strategy.
            execution: Execution/cost/risk/sizing settings. Use values from
                get_catalog('execution-modes'/'stop-types'/'sizing-methods');
                omit for engine defaults.
            benchmark: Optional benchmark data source (same shape as
                data_source) — when given, the result also carries
                benchmark-relative metrics (beta, alpha, information ratio,
                tracking error, up/down capture) and bar-alignment info.
            data_inputs: Optional custom time-series the strategy references
                (name -> {dates, values}).
            response_detail: 'summary' (default — headline metrics, smallest),
                'stats' (every metric), 'full' (plus trades and series
                downsampled to a fixed, server-controlled number of points).
            include: Optional add-on blocks at any detail level: 'trades',
                'equity_curve', 'monthly_returns', 'yearly_returns',
                'signal_diagnostics' (which per-bar entry/exit conditions
                fired, as capped fire-date lists — {"available": false, ...}
                if the run has none, e.g. precomputed signals).
            trades_limit: Max trades returned when trades are included.

        Returns:
            The shaped result at the requested detail (including
            ``benchmark_relative``/``alignment`` when a benchmark was given);
            an oversized result is thinned and marked ``truncated_by_mcp``. If
            the engine rejects the request as invalid (400/422), returns
            {"accepted": false, "error": ...} so you can fix the named
            field(s) and retry. Capacity, timeout, and permission failures
            (e.g. 429/503/504/401/403) raise a tool error carrying explicit
            recovery guidance.
         Endpoint: https://mcp.backtest360.com/mcp
- get_latest_signal - Evaluate the strategy on the most recent bar only — no P&L, no stats.

        Returns the latest signal (-1/0/1), which
        condition slots fired, and the bar timestamp. Use for "what would this
        strategy do right now" questions; use run_backtest for performance.
         Endpoint: https://mcp.backtest360.com/mcp
- compare_backtests - Run several strategies on the same data and compare side by side.

        One quota-counted call, but compute scales with the number of
        strategies. If the wall-clock compute budget is exceeded, the call
        fails with a tool error (504) instead of returning partial results —
        narrow the request (fewer strategies, shorter date range, coarser
        frequency) and retry.

        Args:
            data_source: Shared data source (same shape as run_backtest).
            strategies: List of {"label": str, "strategy": {...},
                "execution": {...}?} entries. Labels need not be unique or
                id-safe — they are echoed back verbatim in the result.
            include_benchmark: Add a buy-and-hold benchmark to the comparison.
            response_detail: Shaping level applied to each strategy's result.
            trades_limit: Max trades per strategy when detail is 'full'.

        Returns:
            {"strategies": [{"label", "result"}, ...], "equity_curves": {...},
            "alignment"?}, each result shaped at the requested detail. When a
            benchmark is included, non-benchmark entries also carry
            "relative" (beta, alpha, information ratio, etc.). A 400/422
            rejection returns {"accepted": false, "error": ...};
            capacity/timeout/permission failures raise a tool error.
         Endpoint: https://mcp.backtest360.com/mcp
- export_backtest - Export a multi-strategy comparison as an Excel workbook.

        Quota-counted; needs a key whose plan includes full-metrics export
        (a 403 means the configured key's plan does not — do not retry).
        Returns the workbook base64-encoded — decode and write it to a
        ``.xlsx`` file.

        Args:
            data_source: Shared data source (same shape as run_backtest).
            strategies: Same shape as compare_backtests' ``strategies``.
            include_benchmark: Add a buy-and-hold benchmark to the export.

        Returns:
            {"filename", "content_type", "size_bytes", "content_base64"}. A
            400/422 rejection returns {"accepted": false, "error": ...};
            capacity/timeout/permission failures raise a tool error. If the
            encoded workbook would exceed the output size limit, raises a
            tool error — narrow the request (shorter date range, fewer
            strategies, coarser frequency) and retry.
         Endpoint: https://mcp.backtest360.com/mcp
- compute_stats - Compute the engine's performance metrics from a returns series.

        Use when the returns came from somewhere
        other than run_backtest (an external system, a portfolio) — backtest
        results already include these statistics.

        Args:
            returns: Per-bar log returns as {"dates": [...], "values": [...]}
                parallel arrays (ISO-8601 dates).
            trading_days_per_year: Required annualization factor — 252 for a
                daily equities calendar, 365 for 24/7 crypto. Must match the bar
                calendar of the returns series; a wrong value silently
                mis-annualizes Sharpe, volatility, and CAGR.
            benchmark_returns: Optional benchmark series, same shape — adds
                alpha/beta/capture metrics.
            trades: Optional trade records (entry_date, exit_date, direction,
                return_net, ...) — adds trade-level metrics.
            risk_free_rate: Annual risk-free rate as a decimal.

        Returns:
            {"stats": {...}} — the metric set the API key's plan allows.
            See get_catalog('sections') for every metric's id and description.
         Endpoint: https://mcp.backtest360.com/mcp
- search_tickers - Search available assets by ticker or name (relevance-ranked).

        Use to resolve a user's asset mention ("bitcoin",
        "S&P") to the exact ticker before requesting a server-side data fetch.
        asset_class filters to 'stocks', 'crypto', 'forex', or 'indices'.
         Endpoint: https://mcp.backtest360.com/mcp
- list_tickers - List available tickers, optionally filtered by asset class.

        The full universe is very large, so the MCP server
        caps the returned list and marks it ``truncated_by_mcp`` — pass
        asset_class to narrow it, or use search_tickers to resolve a specific
        asset by name.
         Endpoint: https://mcp.backtest360.com/mcp
- get_data_range - Available date range and estimated bar count for a symbol/frequency.

        Available on paid plans. Call before a server-side fetch so the
        requested start/end stay inside what the provider can deliver and the
        bar count stays inside the key's per-run limit.
         Endpoint: https://mcp.backtest360.com/mcp
- get_ticker_info - Identity and data coverage for one symbol, in a single call.

        Metadata only — no market data, so no paid plan is needed. Returns the
        asset's identity (name, asset class, exchange, currency, and whether it
        is still active) together with a coverage summary for the given
        frequency: the available date range and an estimated bar count. Use it
        to confirm a symbol resolves and that the history you need exists before
        requesting a quote or a price fetch. For the precise per-frequency range
        use get_data_range.
         Endpoint: https://mcp.backtest360.com/mcp
- get_quote - Latest available price for a symbol.

        Requires a paid plan (managed market data). Returns the most recent
        *available* bar for the given frequency — the end-of-day close for
        daily, the last completed bar otherwise — as open/high/low/close/volume
        plus an ``as_of`` timestamp for that bar. This is a last-known price,
        not a live tick; read ``as_of`` to judge how stale it is.
         Endpoint: https://mcp.backtest360.com/mcp
- get_price_history - OHLCV price history for a symbol over a date range.

        Requires a paid plan (managed market data). ``start`` is required
        (``YYYY-MM-DD``); ``end`` defaults to today. Returns a summary (symbol,
        resolved date range, total bar count, price range, gap flags),
        market-hours detection, and the OHLCV arrays. A long history is
        downsampled by the MCP server to a bounded number of points — first and
        last bar always kept, every column thinned on the same dates — with
        ``downsampled_from_bars`` and ``points_returned`` recorded on the
        ``ohlcv`` block; the untouched ``summary.total_bars`` still reports the
        true bar count. The window is bounded by the plan's per-request bar cap
        — call get_data_range first to size a request.
         Endpoint: https://mcp.backtest360.com/mcp
- list_macro_series - List the available macroeconomic series (the catalog).

        Free — no special plan. Returns the set of macro series you can fetch
        with get_macro_series, each with its stable ``id`` (the value
        get_macro_series takes), title, category, native reporting frequency,
        and units, plus the list of categories. Optionally filter to one
        ``category`` (e.g. rates, yield_curve, inflation, employment, recession,
        growth). Call this first to find the ``id`` for the series you want.
         Endpoint: https://mcp.backtest360.com/mcp
- get_macro_series - Observations for one macroeconomic series over an optional date range.

        Free — no special plan. ``series`` is an ``id`` from list_macro_series
        (e.g. treasury_10y, cpi, unemployment_rate); arbitrary external ids are
        not accepted. ``start``/``end`` are ``YYYY-MM-DD``, inclusive, both
        optional (full history when omitted). Returns the value series at its
        native reporting frequency, with the series descriptor and an ``as_of``
        date. A long history is downsampled by the MCP server to a bounded
        number of points (first and last kept), marked with
        ``downsampled_from_bars`` and ``points_returned`` on the
        ``observations`` block.

        Note: values are the latest revised figures stamped by reference period,
        not point-in-time as-first-reported data — do not treat them as the
        values that were known at a past date.
         Endpoint: https://mcp.backtest360.com/mcp

## Resources
- backtest360://schema/strategy - MIME type: text/plain

## Prompts
- robustness_review - Robustness review of a backtested strategy Walk the connected AI through a rigorous robustness review of a
        backtested strategy on one symbol: validate, run, compare against
        buy-and-hold, weigh the evidence base (sample size, significance and
        robustness statistics, warnings), and report with caveats.

        Args:
            symbol: The asset the strategy trades (e.g. "BTC-USD").
            strategy: Optional strategy document (as JSON text) to review. If
                omitted, the prompt points at building or supplying one first. Arguments: symbol, strategy
- build_and_validate - Build and validate a strategy from an idea Walk the connected AI from a plain-language strategy idea to a
        validated Backtest360 strategy document, then a dry-run: survey the
        catalogs, fetch the document schema, construct the strategy, validate
        and fix in a loop until it passes, then smoke-test that it runs.

        Args:
            idea: The strategy idea in plain language (e.g. "buy when the
                50-day crosses above the 200-day, exit on the reverse cross"). Arguments: idea

## Metadata
- Owner: com.backtest360
- Version: 0.5.0
- Runtime: Pypi
- Transports: STDIO, HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jul 29, 2026
- Source: https://registry.modelcontextprotocol.io
