Skip to main content
Glama
dearvn

tradebox-mcp

by dearvn

tradebox-mcp

Бортовой самописец + предохранители для ИИ-торговых агентов.

Биржи начинают пускать ИИ-агентов к торговле — и сами признают, что не видят, о чём те думают. tradebox — это локальный прокси, который сидит между вашей LLM (Claude, Cursor или любой другой MCP-хост) и любым брокерским MCP-сервером. Он записывает каждый вызов инструмента и рассуждения агента, а также блокирует любой ордер, нарушающий ваши лимиты, — до того, как ордер достигнет биржи.

  • Ноль изменений для агента — направьте ваш MCP-хост на tradebox вместо брокерского сервера; агент видит те же самые инструменты.

  • Локальность прежде всего — ваши API-ключи идут напрямую в дочерний процесс брокера. tradebox их не разбирает, не логирует и не передаёт, и сам совершает ноль сетевых вызовов.

  • Отказ ≠ сбой — заблокированный ордер возвращается как понятный результат вызова инструмента, который агент может прочитать и приспособиться к нему, а не как ошибка протокола, отправляющая его в цикл повторов.


Как это работает

tradebox работает с MCP с обеих сторон: он сервер для вашего хоста и клиент для каждого брокерского сервера, который он запускает.

flowchart LR
    subgraph HOST["Your machine"]
        A["MCP host<br/>(Claude Desktop / Cursor)"]
        subgraph TB["tradebox-mcp"]
            G["Guardrail engine<br/>(allow / deny)"]
            R["Recorder<br/>(JSONL blackbox)"]
        end
        C["CCXT MCP server<br/>(child process)"]
        L[("~/.tradebox/logs/<br/>YYYY-MM-DD.jsonl")]
    end
    X["Exchange<br/>(Binance, …)"]

    A -- "stdio (JSON-RPC / MCP)" --> G
    G -- "allowed calls only" --> C
    G -.-> R
    R -.-> L
    C -- "HTTPS (your API keys<br/>never leave this hop)" --> X

Каждый tools/call проходит через один и тот же конвейер:

sequenceDiagram
    participant Agent as Agent (LLM)
    participant TB as tradebox
    participant Broker as CCXT MCP
    participant Ex as Exchange

    Note over Agent,Ex: ✅ order within limits
    Agent->>TB: createOrder BTC/USDT, $150
    TB->>TB: classify → trade.place<br/>guardrails → ALLOW
    TB->>Broker: forward
    Broker->>Ex: place order
    Ex-->>Broker: filled
    Broker-->>TB: result
    TB->>TB: log call + result (JSONL)
    TB-->>Agent: result

    Note over Agent,Ex: ⛔ order over the limit
    Agent->>TB: createOrder DOGE/USDT, $520
    TB->>TB: classify → trade.place<br/>guardrails → DENY (allowed_symbols)
    TB->>TB: log the denial
    TB-->>Agent: "Order denied: DOGE/USDT is not<br/>in allowed_symbols (BTC/USDT, ETH/USDT)."
    Note over Agent: agent reads the reason<br/>and adjusts — no crash loop

Ордер никогда не попадает в брокерский процесс, когда правило его отклоняет: это происходит на один процесс раньше, чем в дело вообще вступают ваши API-ключи.


Related MCP server: PitBridge

Быстрый старт

1 — Создайте конфигурацию (ключи остаются на вашей машине; выполните chmod 600 для неё):

mkdir -p ~/.tradebox
cp config.example.yaml ~/.tradebox/config.yaml
chmod 600 ~/.tradebox/config.yaml
# ~/.tradebox/config.yaml (minimal)
downstreams:
  ccxt:
    command: npx
    args: ["-y", "@lazydino/ccxt-mcp", "--config", "~/.tradebox/ccxt-accounts.json"]
    # ccxt-accounts.json holds your exchange keys (see config.example.yaml).
    # Use a read + trade key. NEVER enable withdrawals on it.

guardrails:
  allowed_symbols: ["BTC/USDT", "ETH/USDT"]
  max_order_notional: 200        # $ per single order
  max_orders_per_hour: 6
  max_daily_loss: 100            # trips the circuit breaker (UTC day)
  dry_run: true                  # ON by default — flip to false to go live

2 — Направьте ваш MCP-хост на tradebox вместо брокерского сервера (claude_desktop_config.json или .cursor/mcp.json):

{
  "mcpServers": {
    "trading": {
      "command": "npx",
      "args": ["-y", "tradebox-mcp", "run", "--config", "~/.tradebox/config.yaml"]
    }
  }
}

3 — (Необязательно, но рекомендуется) добавьте одну строку в системный промпт агента, чтобы бортовой самописец записывал не только действия, но и рассуждения:

Перед каждым торговым решением вызывайте инструмент log_reasoning с кратким объяснением того, что вы собираетесь сделать и почему.

Вот и всё. Агент видит ccxt__createOrder, ccxt__fetchTicker, … как обычно. На стороне агента ничего не меняется.


Защитные механизмы

Правило

Ключ конфигурации

Что делает

Белый список символов

allowed_symbols

Отклоняет любой ордер вне вашего списка

Ограничение размера ордера

max_order_notional

Отклоняет ордер выше этого размера (рыночные ордера оцениваются по цене тикера давностью не более 60 секунд — иначе отказ с сообщением "fetch the ticket first")

Частотное ограничение

max_orders_per_hour

Предохранитель от зацикленного цикла — самый частый реальный сбой проблемных агентов (скользящее часовое торговое окно)

Лимит дневного убытка

max_daily_loss

Главный предохранитель — см. диаграмму ниже

Торговые часы

trading_hours

Разрешает ордера только в заданном временно́м окне в UTC

Трансферы

(встроено)

Отклоняются по умолчанию. Торговый агент не должен выводить средства. Открытие требует явного allow_transfers: true

Неизвестные инструменты

unknown_tools

Инструмент, который не распознаёт ни одна карта и который выглядит мутирующим, отклоняется, а не считается read-only

Паническая кнопка

tradebox stop

Мгновенно отклоняет все торговые инструменты, даже если агент уже используется в запущенной сессии

Жизненный цикл предохранителя

stateDiagram-v2
    [*] --> Trading
    Trading --> Locked : realized daily PnL ≤ −max_daily_loss
    Trading --> Locked : operator runs "tradebox stop"
    Locked --> Trading : operator runs "tradebox resume"
    Locked --> Locked : every trade.* call → denied<br/>(reads still pass through)

    note right of Locked
        The lock survives restarts —
        state is a projection of the log,
        so a crash never resets the breaker.
    end note

Пробный прогон: проверьте агента до того, как дадите ему деньги

dry_run: true (по умолчанию) блокирует каждую сделку на прокси, записывает её так, будто она реальная, и возвращает симулированное исполнение. tradebox хранит поддельный стакан заявок, чтобы симуляция оставалась непротиворечивой: отмена или получение симулированного идентификатора даёт устойчивый ответ, а каждый симулированный результат помечен "мятун": true. Прогоните агента в dry-run неделю, изучите отчёт, потом переключите тумблер.


Чёрный ящик

Каждый вызов — разрешённый или отклонённый — дописывается в ~/.tradebox/logs/YYYY-MM-DD.jsonl, по одному JSON-событию на строку:

{"ts":"2026-08-25T12:00:00.123Z","event":"tool_call","server":"ccxt","tool":"createOrder","category":"trade.place","args":{"symbol":"BTC/USDT","side":"buy","type":"limit","amount":0.02,"price":58900},"decision":"allow","latency_ms":840,"result":{"order_id":"123","filled":0.02,"avg_price":58895}}
{"ts":"2026-08-25T12:05:01.000Z","event":"tool_call","server":"ccxt","tool":"createOrder","category":"trade.place","args":{"symbol":"DOGE/USDT","side":"buy","amount":50000},"decision":"deny","rule":"allowed_symbols","latency_ms":2}
{"ts":"2026-08-25T12:05:04.500Z","event":"reasoning","text":"DOGE blocked. Holding BTC, waiting for the 58K retest."}
{"ts":"2026-08-25T13:00:00.000Z","event":"guardrail_trip","rule":"max_daily_loss","value":-102.5,"limit":-100,"action":"trading_locked"}

Секреты никогда не попадают в лог: нижестоящие блоки env не видны получателю, а любое поле с именем вида key|secret|token|password маскируется.

Отчёт по дрейфу — ваш агент всё тот же агент, которого вы тестировали?

$ tradebox report --window 7d

AGENT BEHAVIOR REPORT              2026-08-18 → 2026-08-25
──────────────────────────────────────────────────────────
                      baseline (7d)    last 24h        Δ
orders/day                  4.2            11        ×2.6  ⚠
avg order notional        $145           $410        ×2.8  ⚠
symbols traded        BTC 82% · ETH 18%  +SOL 37%          ⚠ new symbol
avg hold time             3.1 h          22 min      ÷8.5  ⚠
denied calls                 0             7    max_order_notional ×5
realized PnL              +$83           −$61
──────────────────────────────────────────────────────────
⚠ BEHAVIORAL DRIFT: the agent is behaving differently than
  it did 7 days ago. Model update? Prompt change? Check
  before it costs you.

Работает офлайн: читает только локальный PLN, без сети.


CLI

tradebox run --config <path>    start the proxy (spawned by your MCP host)
tradebox report [--window 7d]   behavior + drift report from local logs
tradebox stop                   PANIC — deny all trading immediately
tradebox resume                 clear the panic / daily-loss lock

Честные ограничения (v0.1)

Мы предпочитаем перечислить их здесь, чем вы найдёте их на реальных деньгах:

  1. Подключаемые серверы только через stdio (CCXT MCP и аналоги). HTTP-транспорт для Binance Agent OS / Robinhood MCP — главный пункт в списке приоритетов.

  2. Дневной предохранитель просыпает заполнения только через прокси. Заполенения извлекаются из результатов ордеров и из собственных вызовов агента fetch_my_trades / fetch_closed_orders. Если агент никогда не запрашивает свои заполнения, дневной предохранитель остаётся слепым.

  3. Сочленения позиций — это примерная оценка, основанная на ордерах, проходивших через прокси. Сверки с бизаном на бирже пока нет.

  4. Исполнения в dry-run симулируются мгновенно. Реальные запросы баланса/позиций по прежнему не отражают симулированные сделки (каждый симулированный результат содержит "simulated": true).

  5. Все границы суток в UTC. Одн временный только один экземпляр прокси.


Добавление правила

Один файл, один интерфейс — заподняжные предложения приветствуются:

export interface GuardrailRule {
  name: string;
  // return null to pass; return a string to deny (the reason is sent to the LLM)
  check(call: ClassifiedToolCall, state: SessionState, cfg: Config): string | null;
}

Положите его в src/guardrails/rules/, зарегистрируйте в engine.ts, добавьте тест. Архитектурные решения и их причины см. в docs/DESIGN.md.

Дорожная карта

  1. HTTP-transport proxy → Binance Agent OS, Robinhood MCP

  2. Пересчёт лимитов позиций по биржевым балансам

  3. Веб-панель + оповещения в реальном времени — локальный прокси и отчёт навсегда остаются бесплатными и подходятся к MIT-лицензией

Лицензия

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Sits in front of any MCP server to enforce allow/ask/block policies on tool calls, paths, shell commands, and network domains, with local approval prompts and an audit log.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to interact with a NinjaTrader 8 futures account through MCP, with deterministic guardrails and hard risk limits enforced locally that the agent cannot bypass.
    1
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI agents to place and manage Hyperliquid trades through MCP with position, leverage, daily-loss, market, and stop-loss limits enforced outside the model, plus paper trading and an auditable decision log.
    9
    176 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A transparent MCP stdio proxy that sits between an agent client and a real MCP server, intercepting tools/call requests to enforce runtime guardrails derived from the same YAML rules used for CI regression testing. It blocks forbidden, out-of-whitelist, looping, or non-idempotent tool invocations with JSON-RPC errors and writes every decision to an audit log.
    1
    MIT