Skip to main content
Glama
tradebox-mcp

tradebox-mcp

by dearvn

tradebox-mcp

AI 交易代理的通知数据器 + 熔断器。

交易所开始允许 AI 代理进行交易——而它们承认自己看不到代理到底在 思考 什么。tradebox 是一个本地代理,位于你的 LLM(Claude、Cursor 或任何 MCP 主机)和任何经纪商 MCP 服务之间。它会记录每笔工具调用 以及代理收到决策过程,并且会交易*到达交易所之前拦截任何超出你限制的订单。

  • 零代理改动 —— 将 MCP 主机指向 tradebox 而不是经纪商服务器,代理所见工具完全一样。

  • 本地优先 —— API 密钥直接进入经纪商子进程。tradebox 从不解析、记录或传输它们,并且自身零网络调用。

  • 拒绝 ≠ 死机 —— 被拦截的订单会以自然语言工具结果的形式返回,代理可以读取并调整适应,而不是收到让代理陷入重试循环的协议错误。


工作原理

tradebox 在两端采用 MCP:对它对应的主机,它是一个 服务器;对每一个它启动的经纪商 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、ct:__fetchTicker…… 代理端不需要任何改动。


安全护栏

护栏

配置项

作用

代码白名单

allowed_symbols

拒绝你的列表之外的任何订单

单笔订单金额上限

max_order_notional

拒绝超过上限的单笔订单(市价单按不超过 60 秒前的 ticker 价格估值,否则以“李获得行情”为由拒绝)

频率限制

max_orders_per_hour

失控循环断路器——代理线程最常见是挂起死循环的真实故障模式(滑动 1 小时窗口)

每日亏损熔断器

max_daily_loss

主断路器,见下方图

交易时段

trading_hours

只允许在 UTC 时间窗之外下单

转账

*(内置)*

默认拒绝;交易代理没有理由去出金;需要显式开启时才它,即 allow_transfers: true

未知工具

unknown_tools

任何映射中不可识别的且看起来像写操作的调用,都会被拒绝,而不是默认为只读

紧急停

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 会维护一个虚拟订单簿,让模拟结果自己一致:取消或查询模拟订单 ID 均返回一致的答复,所有模拟结果都会打上 "simulated": true 标记。先用试运行模式跑代理一周,阅读报告,再拨动正式开关。


黑匣子(Blackbox)

每一次调用,无论放行或拒绝,都会追加到 ~/.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.

仅本地离线读取 JSONL,不联网。


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 downstream 即(CCXT MCP 和同类型);对 Binance Agent OS / Robinhood MCP 的 HTTP 传输支持路线图上的优先事项。

  2. 每日亏损熔断只能看到在 proxy 中经过的单。 成交素材会同时从 order 结果代理以及代理自身的 fetch_my_trades / fetch_closed_orders 调用中解析。如果一个代理从不取回它的成交价,那么熔断器就形同虚设。

  3. 持仓跟踪是近似值,它根据经过代理的订单推发力;暂时没有旗下有余额核对。

  4. 试运行的撮合是即时模拟的。 真实持仓/余额读取原样透传,不会反映模拟的交易结果(但每条模拟结果都带着 "simulated": true)。

  5. 所有日期边界以 UTC 为准。 同一时间只运行一个代理,构成一条实例。


如何贡献规则

像一个文件像一个环动 indicator——欢迎 PR:

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 传输代理 → Binance Agent OS、Robinhood MCP

  2. 仓位限额纳入所对账

  3. 托管面板 + 实时告警—— 不过本地代理和看板永远免费且保持 MIT 开源

License

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    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
    109 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Sits between an agent and an upstream MCP server to enforce per-profile tool grants, deterministic allow/deny/handoff rules, field and PII masking, idempotent writes, and one-line audit logging from a single YAML config. Enables regulated deployments to add guardrails that fail closed without changing the customer's tools or the agent's prompt.
    MIT