Skip to main content
Glama
tradebox-mcp

tradebox-mcp

by dearvn

tradebox-mcp

Ein Flugschreiber + Schutzschalter für KI-Handelsagenten.

Börsen beginnen damit, KI-Agenten handeln zu lassen – und sie geben zu, dass sie nicht sehen können, was die Agenten denken. tradebox ist ein lokaler Proxy, der zwischen Ihrem LLM (Claude, Cursor oder einem beliebigen MCP-Host) und einem beliebigen Broker-MCP-Server sitzt. Er zeichnet jeden Tool-Aufruf und die Überlegungen des Agenten auf und blockiert jede Order, die Ihre Limits bricht – bevor die Order die Börse erreicht.

  • Null Agentenänderungen – Richten Sie Ihren MCP-Host auf tradebox aus statt auf den Broker-Server; der Agent sieht exakt dieselben Tools.

  • Local-first – Ihre API-Schlüssel gelangen direkt in den Broker-Subprozess. tradebox parst, protokolliert oder überträgt sie nie und führt selbst null Netzwerkaufrufe durch.

  • Ablehnung ≠ Absturz – Eine blockierte Order kommt als Klartext-Tool-Ergebnis zurück, das der Agent lesen und darauf reagieren kann, statt als Protokollfehler, der ihn in eine Wiederholungsschleife schickt.


So funktioniert es

tradebox spricht auf beiden Seiten MCP: Für Ihren Host ist es ein Server, für jeden Broker-Server, den es startet, ein Client.

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

Jeder tools/call durchläuft dieselbe 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

Die Order erreicht den Broker-Prozess nie, wenn eine Regel sie ablehnt – die Ablehnung erfolgt eine Prozessebene vor der Stelle, an der Ihre API-Schlüssel überhaupt einbezogen werden.


Related MCP server: PitBridge

Schnellstart

1 – Erstellen Sie Ihre Konfiguration (die Schlüssel bleiben auf Ihrer Maschine; wenden Sie chmod 600 darauf an):

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 – Richten Sie Ihren MCP-Host an tradebox aus statt an den Broker-Server (claude_desktop_config.json oder .cursor/mcp.json):

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

3 – (Optional, aber empfohlen) Fügen Sie eine Zeile zum System-Prompt Ihres Agents hinzu, damit die Blackbox Überlegungen und nicht nur Aktionen aufzeichnet:

Vor jeder Handelsentscheidung rufen Sie das Tool log_reasoning mit einer kurzen Erklärung auf, was Sie gleich tun werden und warum.

Damit ist es erledigt. Der Agent sieht ccxt__createOrder, ccxt__fetchTicker, … wie gewohnt. Auf der Agenten Seite ändert sich nichts.


Schutzmechanismen

Regel

Config-Schlüssel

Wirkung

Symbol-Whitelist

allowed_symbols

Lehnt jede Order ab, die nicht auf Ihrer Liste steht.

Ordergrößen-Limit

max_order_notional

Lehnt eine einzelne Bestellung über dem Limit ab (Market-Orders werden mit einem maximal 60 s alten Ticker-Kurs bewertet – andernfalls Ablehnung mit „zuerst die Agenturen order abzurufen“).

Rate-Limit

max_orders_per_hour

Endlosschleifen-Unterbrechung – der häufigste reale Fehlermodus fehlerhafter Agenten (gleitendes 1-Stunden-Fenster).

Tagesverlust-Schutz

max_daily_loss

Der zentrale Schutzschalter – siehe Diagramm unten.

Handelszeiten

trading_hours

Lässt Aufträge nur innerhalb eines UTC-Zeitfensters zu.

Transfers

(integriert)

Standardmäßig abgelehnt. Ein Handelsträger-Agent hat mit dem Abheben von Geldern nichts zu schaffen. Das Freigeben erfordert ein explizites allow_transfers: true.

Unbekannte Tools

unknown_tools

Ein Tool, das keine Karten (Mapping) erkennt und mutierend aussieht, wird abgelehnt, nicht als read-only angenommen.

Panik-Button

tradebox stop

Lehnt sofort alle Handels-Tools ab, sogar während der Agent mitten parapher rich läuft.

Der Lebenszyklus des Schutzschalters

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: Prüfen Sie Ihren Agenten, bevor Sie ihm Geld geben

dry_run: true (die Standardeinstellung) blockiert jeden Trade am Proxy, protokolliert ihn, als wäre er real, und gibt eine simulierte Ausführung zurück. tradebox führt ein Fake-Orderbuch, damit die Simulation konsistent bleibt: Das Stornieren oder Abrufen einer simulierten Order-ID liefert eine konsistente Antwort, und jedes simulierte Ergebnis ist mit "simulated": true markiert. Lassen Sie Ihren Agenten eine Woche lang im Dry-run, lesen Sie den Bericht, dann legen Sie den Schalter um.


Die Blackbox

Jeder Aufruf – erlaubt oder verwehrt – wird an ~/.tradebox/logs/YYYY-MM-DD.jsonl angehängt, ein JSON-Ereignis pro Zeile:

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

Geheimnisse gelangen nie in das Log: downstream liegen die env-Blöcke, die vom Recorder nie eingesehen werden, und jedes Feld, dessen Name wie key|secret|token|password klingt, wird unkenntlich gemacht.

Drift-Bericht – ist Ihr Agent noch der Agent, den Sie getestet haben?

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

Läuft offline, liest nur lokale JSONL, keine Netzwerkverbindung.


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

Ehrliche Einschränkungen (v0.1)

Wir würden sie hier lieber aufführen, als Sie sie mit echtem Geld herausfinden zu lassen:

  1. Nur stdio-Downstreams (CCXT MCP und vergleichbare). HTTP-Transport für Binance Agent OS / Robinhood MCP ist das oberste Roadmap-Ziel.

  2. Der Tagesverlust-Schutzschalter sieht Ausführungen nur über den Proxy. Ausführungen werden aus Orderergebnissen und den eigenen fetch_my_trades / fetch_closed_orders-Aufrufen des Agents geparst. Ein Agent, der seine Ausführungen nie abruft, macht den Schutzschalter blind.

  3. Die Positionsverfolgung ist eine Schätzung auf Basis der Orders, die durch den Proxy laufen. : Bisher noch kein Abgleich mit Handelsplätzen hinsichtlich der Salden.

  4. Dry-run-Ausführungen sind sofort simuliert. Echte Guthaben-/Positionsabfragen werden unverändert durchgereicht und zeigen keine simulierten Trades (jedes simulierte Ergebnis trägt "simulated": true).

  5. Alle Tagesgrenzen entsprechen UTC. Zu einem Zeitpunkt aktive nur immer ein Proxy-Instanz.


Eine Regel beisteuern

Eine Datei, eine Schnittstelle – PRs willkommen:

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

Legen Sie sie in src/guardrails/rules/ ab, registrieren Sie sie in engine.ts, und fügen Sie einen Test hin. Siehe docs/DESIGN.md für die Architekturentscheidungen und ihre Begründungen.

Roadmap

  1. HTTP-Transport-Proxxy → Binance Agent OS, Robinhood MCP

  2. Positionslimits, abgeglichen mit Börsenständen (Balance-Abgleich)

  3. Gehostetes Dashboard + Echtzeit-Alarme – der lokale Proxy und der Bericht bleiben für immer kostenlos und MIT-lizenziert

Lizenz

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