Skip to main content
Glama
dearvn

tradebox-mcp

by dearvn

tradebox-mcp

Un registrador de vuelo + interruptores de circuito para agentes de trading de IA.

Los exchanges están empezando a permitir que agentes de IA operen — y admiten que no pueden ver lo que los agentes están pensando. tradebox es un proxy local que se sitúa entre tu LLM (Claude, Cursor o cualquier host MCP) y cualquier servidor MCP de bróker. Registra cada llamada a herramienta y el razonamiento del agente, y bloquea cualquier orden que rompa tus límites — antes de que la orden llegue al exchange.

  • Cero cambios en el agente — apunta tu host MCP a tradebox en lugar del servidor del bróker; el agente ve exactamente las mismas herramientas.

  • Local primero — tus claves API van directamente al proceso hijo del bróker. tradebox nunca las analiza, registra ni transmite, y no realiza ninguna llamada de red por su cuenta.

  • Denegar ≠ fallar — una orden bloqueada vuelve como resultado de herramienta en lenguaje claro que el agente puede leer y al que puede adaptarse, no como un error de protocolo que lo lanza a un bucle de reintentos.


Cómo funciona

tradebox habla MCP por ambos lados: es un servidor para tu host y un cliente para cada servidor de bróker que lanza.

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

Cada tools/call pasa por el mismo pipeline:

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

La orden nunca llega al proceso del bróker cuando una regla la deniega — la denegación ocurre un proceso antes de que tus claves API estén siquiera involucradas.


Related MCP server: PitBridge

Inicio rápido

1 — Crea tu configuración (las claves se quedan en tu máquina; hazle un 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 — Apunta tu host MCP a tradebox en lugar del servidor del bróker (en claude_desktop_config.json o .cursor/mcp.json):

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

3 — (Opcional pero recomendado) añade una línea al system prompt de tu agente para que la caja negra recoja el razonamiento, no solo las acciones:

Antes de cada decisión de trading, llama a la herramienta log_reasoning con una breve explicación de lo que estás a punto de hacer y por qué.

Eso es todo. El agente ve ccxt__createOrder, ccxt__fetchTicker, … con normalidad. Nada cambia del lado del agente.


Guardrails

Regla

Clave de configuración

Qué hace

Lista blanca de símbolos

allowed_symbols

Deniega cualquier orden que no esté en la lista

Límite de tamaño de orden

max_order_notional

Deniega una operación individual que supere el límite. Las órdenes de mercado se valoran con un precio de ticker de ≤ 60 s; si no, en caso se deniega con "obtén el ticker primero"

Tasa límite

max_orders_per_hour

Interruptor de bucles desbocados — el fallo real más común de los agentes con errores (ventana deslizante de 1 hora)

Pérdida diaria máx

max_daily_loss

El interruptor principal — consulta el diagrama inferior

Horario de negociación

trading_hours

Solo admite órdenes dentro de una ventana UTC

Transferencias

(integrado)

Denegadas por defecto. Un agente de trading no tiene por qué retirar fondos. Hacerlas abre la operación requiere un allow_transfers: true explícito

Herramientas desconocidas

unknown_tools

Si ningún mapa reconoce la herramienta y parece mutación, se deniega, no se asume como lectura estricta

Botón de pánico

tradebox stop

Deniega al instante todas las herramientas de trading, incluso si el agente está en plena ejecución

Ciclo de vida del interruptor de circuito

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

Back testing: audita a tu agente antes de darle dinero

dry_run: true (el valor por defecto) bloquea todas las operaciones en el proxy que lo registra como si fueran reales y devuelve una ejecución simulada. tradebox mantiene un libro de órdenes falso para que la simulación siga siendo coherente: cancelar o consultar el id de una orden simulada devuelve una respuesta consistente, y cada resultado simulado viene marcado con "simulated": true. Ejecuta tu agente en dry-run durante una semana, ante el informe y luego actantes el interruptor.


La caja negra

Every call — right or denied — is appended to ~/.tradebox/logs/YYYY-MM-DD.jsonl, one JSON result per line:

{"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"}

The secretos ya no acaban en el registro: no storage blocks env later fase later, and any field with the extension key|secret|token|password will be edited out.

Informe de deriva: ¿sigue siendo tu agente el agente que probaste?

$ 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.

Offline; solo el JSONL local, sin red.


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

Limitaciones honestas (v0.1)

Muchos prefieren esta lista a que la descubras con dinero real:

  1. Solo agentes downstream de stdio (CCXT MCP y equivalente). El transporte HTTP para Binance Agent OS / Robinhood MCP es el primer tema de la hoja de ruta.

  2. El interruptor de pérdida diaria solo ve las ejecuciones a través del proxy. Estas executions se interpreta from the order results and from the agent's own calls fetch_my_trades / fetch_closed_orders. Si un agente nunca consulta sus ejecuciones, el interruptor queda ciego.

  3. El rastreo de posiciones es una estimación construida a partir de las órdenes que pasan por el proxy; todavía no hay conciliación con los saldos de exchange.

  4. Las ejecuciones del dry-run se quedan en simulación al instante. The balances/posiciones reales atravies la paso sin cambios y no van a reflejar esas operaciones simuladas — de hecho, todas las resultados simulados muestran "simulated" : true.

  5. El límite del día es en UTC. Solo habrá una instancia del proxy a la vez.


Cómo contribuir con una regla

Un solo archivo, una sola interfaz — los PR son bienvenidos:

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;
}

Déjala en src/guardrails/rules/, regístrala en engine.ts y añade un test. Lee docs/DESIGN.md para entender las decisiones de arquitectura y sus motivos.

Roadmap

  1. Proxy con transporte HTTP → Binance Agent OS, Robinhood MCP

  2. Límites de posición conciliados contra los balances del exchange

  3. Dashboard alojado + alertas de real time — el proxy local y el reporte siguen siendo gratuitos hoy y siempre, con licencia MIT

Licencia

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