tradebox-mcp
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)" --> XCada 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 loopLa 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 live2 — 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_reasoningcon 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 |
| Deniega cualquier orden que no esté en la lista |
Límite de tamaño de orden |
| 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 |
| 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 |
| El interruptor principal — consulta el diagrama inferior |
Horario de negociación |
| 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 |
Herramientas desconocidas |
| Si ningún mapa reconoce la herramienta y parece mutación, se deniega, no se asume como lectura estricta |
Botón de pánico |
| 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 noteBack 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 lockLimitaciones honestas (v0.1)
Muchos prefieren esta lista a que la descubras con dinero real:
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.
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.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.
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.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
Proxy con transporte HTTP → Binance Agent OS, Robinhood MCP
Límites de posición conciliados contra los balances del exchange
Dashboard alojado + alertas de real time — el proxy local y el reporte siguen siendo gratuitos hoy y siempre, con licencia MIT
Licencia
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
- FensoryOAuthcom.fensory
Trading MCP server for AI agents, with live market data, account reads and controlled execution.
AgentGuard — 20-tool AI safety MCP: policy preflight, risk scoring, audit logging, rate limits.
Free, read-only directory of 114 AI trading tools: broker MCP servers, market data APIs, bots and backtesters. Sourced facts on who can place orders and what safeguards exist; search, compare and check order gating for every broker MCP.
Real-time MCP & A2A prompt-injection, jailbreak, and tool-schema poisoning firewall for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceSits 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
- AlicenseNot gradedqualityDmaintenanceEnables 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.1Apache 2.0
- AlicenseAqualityBmaintenanceEnables 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.9176 npmMIT
- AlicenseNot gradedqualityCmaintenanceA 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.1MIT