Skip to main content

kainext-binance-mcp

CI License: MIT Python 3.12+ MCP PyPI Typed: mypy strict

Let an AI assistant read Binance spot markets, analyze them, and propose real-money trades — while a separate, human-gated process is the only thing that can ever execute. The model never holds a trade key, and nothing moves without a physical click.

The native macOS confirmation dialog: REAL MONEY (MAINNET) banner, exact order fields, Cancel as the default button
The gate. Every order renders exactly what will execute — and the default button is Cancel.

kainext-binance-mcp is a Model Context Protocol server that connects any MCP client (Claude Code, Claude Desktop, …) to a Binance spot account. It exposes 23 tools, 5 analyst prompts and 8 knowledge resources spanning live market data, technical indicators, news & sentiment, derivatives positioning, market structure, portfolio/risk analytics, transparent trading signals, and two-phase order execution with a human in the loop — a complete, honest crypto analysis consultant in one install.

It is built around one uncompromising idea: treat the language model as untrusted. Even a fully prompt-injected or malfunctioning model cannot move your funds, because it has neither the credential nor the authority to do so. See SECURITY.md for the full threat model.

⚠️ Real money. On mainnet, every order moves actual funds. Always start on testnet and switch to mainnet only once everything is verified. ⚠️ Execution currently requires macOS. The confirmer uses osascript for the native confirmation dialog. Read/analysis tools are cross-platform; execution on other OSes is on the roadmap.


Why this exists

LLM agents are great at reasoning about markets and terrible at being trusted with irreversible, money-moving actions. Most "AI trading" tooling hands the model an API key and hopes for the best. This project takes the opposite stance: the AI gets rich, read-only context and a way to propose an action, but a human holds the trigger and a separate process holds the key. You get the upside of an AI co-pilot for spot trading without surrendering custody or control.

Security model — the headline feature

Two processes, least privilege, human-in-the-loop:

Process Launched by Key Role
MCP server kainext-binance-mcp your MCP client (stdio) read-only (BINANCE_READ_*) reads, pre-validates, and proposes orders. Never executes, holds no trade key.
Confirmer kainext-binance-mcp-confirmer you, in a separate terminal trade (BINANCE_TRADE_*) the sole authority: receives canonical fields, renders the dialog, re-validates, and executes only on your click.
sequenceDiagram
    participant AI as AI model (untrusted)
    participant S as MCP server<br/>(read-only key)
    participant C as Confirmer<br/>(trade key)
    participant H as You (human)
    participant B as Binance

    AI->>S: binance_spot_order_propose(...)
    S->>S: pre-validate vs symbol filters
    S->>C: canonical fields (local IPC socket)
    S-->>AI: intent_id (no order placed yet)
    C->>H: native dialog with exact fields ⚠️
    H-->>C: physical click: Confirm / Cancel
    C->>C: re-validate
    C->>B: execute (only if confirmed)
    AI->>S: binance_spot_order_status(intent_id)
    S-->>AI: pending → executed / rejected / expired

To execute one order you need both the trade key (isolated in the confirmer) and your physical click. The model has neither. Defense in depth on top of that:

  • On mainnet, the server aborts at startup if its read key can trade.
  • The confirmer aborts at startup if the trade key has withdrawals/transfer/margin/futures permissions or no IP whitelist.
  • Withdrawals and transfers are permanently out of scope — no key enables them.
  • Single-tenant: one server+confirmer pair serves exactly one account; run separate pairs for separate accounts.

Tools (23)

Read (5 · read key · no gate)

Tool What it does Params
binance_get_balance Spot balances (free/locked), non-zero only
binance_get_price Current price/ticker for a symbol symbol
binance_get_open_orders Open spot orders + status symbol?
binance_get_order_history Closed spot order history symbol, limit?
binance_get_account_info Flags + fees; key permissions (mainnet)

Market data — layer 2 (4 · read key · 100% read-only)

Tool What it does Params
binance_get_klines OHLCV candles (Decimal). last_n returns only the newest N to keep responses small symbol, interval, limit? (≤1000), last_n?
binance_get_ticker_24h Rolling 24h stats (% change, high/low, volume) symbol
binance_compute_indicators RSI / MACD / EMA / Bollinger / ATR. Returns only the latest value per series by default (last_n=1) to keep responses small; raise last_n for recent history symbol, interval, indicators, limit?, last_n?
binance_backtest Lightweight, no-lookahead backtest of a simple rule symbol, interval, strategy (ema_cross/rsi_threshold), limit?

News & sentiment — layer 3 (2 · public RSS · no API key · 100% read-only)

Tool What it does Params
binance_get_news Crypto headlines from RSS (CoinDesk, crypto.news) asset?, sources?, limit?
binance_get_sentiment Aggregated raw sentiment (lexicon, not a prediction) asset, window_hours?

Signals — layer 4 (3 · read key · propose, never execute)

Tool What it does Params
binance_generate_signal Composite, transparent signal: direction + score + per-factor rationale + ATR risk levels symbol, interval?, threshold?
binance_scan_signals Signals for a watchlist, ranked by score symbols, interval?
binance_backtest_signal Backtest the composite technical signal (no lookahead, sentiment=0) symbol, interval?, limit?, threshold?

Analyst — layers 5/6 (5 · read key + free public APIs · 100% read-only)

Tool What it does Params
binance_get_derivatives Funding rate (+ short history), mark/index price, open interest — the leverage thermometer. Public futures endpoints, no extra permissions symbol, funding_limit?
binance_get_market_structure Fear & Greed (+week), BTC dominance, total mcap, BTC ATH/drawdown, on-chain fees & hashrate. Free sources, per-source degradation
binance_analyze_cycle Mayer Multiple (price/200d MA), drawdown from ATH, distance to next halving — objective cycle inputs symbol?
binance_analyze_portfolio Live balances valued, concentration, per-asset PNL and net break-even (taxes + spread) — cost basis is always a user parameter cost_basis?, tax_rate?, cashout_spread?
binance_assess_risk Realized vol (30/90d), max drawdown, BTC correlation per held asset symbols?

Write — two-phase (4 · spot only · the server never executes)

Tool What it does Params
binance_spot_order_propose Proposes an order; does not execute. Returns intent_id symbol, side, type, env, quantity?, quote_quantity?, price?, time_in_force?
binance_spot_order_status Polls the outcome of a proposal intent_id
binance_cancel_order_propose Proposes a cancellation (re-checks state); does not cancel symbol, order_id, env
binance_cancel_order_status Polls the outcome of a cancellation intent_id

The read, market-data, news, and signal tools work without the confirmer. The *_propose tools require the confirmer to be running.


The knowledge layer — what makes it a consultant

Tools fetch data; knowledge tells the model how to think about it. The server ships its methodology through the two MCP surfaces most servers ignore:

Resources (kb://…) — read them from any MCP client:

Resource What it teaches
kb://discipline The operating doctrine: DCA > timing, position sizing, never leverage, cold-blooded exit rules, net break-even
kb://research/no-edge Our own walk-forward research: 0/36 configurations with a robust edge — why signals are context, not alpha
kb://sources Curated source registry with each source's bias annotated, including where to read ETF flows
kb://frameworks/news-analysis Separating signal from noise: primary vs derivative, flows/rules/structure
kb://frameworks/cycle-analysis Halving cycles, Mayer Multiple, drawdown bands — with explicit uncertainty
kb://frameworks/token-value The five questions that decide whether a token captures its project's value
kb://macro-calendar FOMC / CPI / halving dates (static, versioned, with sources)
kb://glossary Terms with an interpretive reading, not just definitions

Prompts — complete playbooks that orchestrate the tools (in Claude Code they appear as slash commands): portfolio_review, asset_thesis, market_briefing, risk_check, dca_plan. Every playbook grounds itself in kb://discipline first, and the server's instructions tell clients to read the doctrine before giving any investment analysis.

Quickstart

Prerequisites: Python 3.12+, uv, and (for execution) macOS.

1. Create the API key(s) on Binance

Go to Binance → API Management. The design uses two keys for least privilege:

  1. Read-only (used by the server): Enable Reading ON; everything else OFF.
  2. Trade (used by the confirmer): Enable Spot & Margin Trading ON; withdrawals, universal/internal transfer, margin, futures OFF; IP whitelist mandatory. The confirmer aborts on mainnet if any dangerous permission is on or the IP restriction is off.

On testnet (testnet.binance.vision), a single key serves both roles — there are no granular permissions or IP whitelist there.

2. Set environment variables

Variable Process Where it goes
BINANCE_ENV both testnet or mainnet (no default → aborts if missing/invalid)
BINANCE_READ_API_KEY / BINANCE_READ_API_SECRET server .mcp.json (via ${VAR}) or the server's shell
BINANCE_TRADE_API_KEY / BINANCE_TRADE_API_SECRET confirmer only the shell where you launch the confirmer

🔒 Hard rule: the trade key never goes in .mcp.json or any environment your AI client inherits. It lives only in the confirmer's shell.

3. Add the server to your MCP client

.mcp.json (Claude Code style). Only the read key + BINANCE_ENV:

{
  "mcpServers": {
    "binance": {
      "command": "uvx",
      "args": ["kainext-binance-mcp"],
      "env": {
        "BINANCE_ENV": "${BINANCE_ENV}",
        "BINANCE_READ_API_KEY": "${BINANCE_READ_API_KEY}",
        "BINANCE_READ_API_SECRET": "${BINANCE_READ_API_SECRET}"
      }
    }
  }
}

${VAR} placeholders are resolved from your shell. If a variable arrives unexpanded, the server aborts with a clear message — export the variables before launching your client.

Installing from git instead of PyPI? Use "args": ["--from", "git+https://github.com/Alejandrehl/kainext-binance-mcp@v1.0.0", "kainext-binance-mcp"] (pin a tag; git+https works without any GitHub credentials).

4. Run the confirmer (required to execute)

In a separate terminal, with the trade key exported:

export BINANCE_ENV=testnet
export BINANCE_TRADE_API_KEY="...your trade key..."
export BINANCE_TRADE_API_SECRET="...your trade secret..."

uvx kainext-binance-mcp-confirmer  # or: uvx --from "git+https://github.com/Alejandrehl/kainext-binance-mcp@v1.0.0" kainext-binance-mcp-confirmer

It listens on a local Unix socket. When the AI proposes an order, a native dialog appears with the exact fields (symbol, side, type, effective quantity, price, timeInForce, estimated notional, and a TESTNET / ⚠️ REAL MONEY banner). The default button is Cancel; the order executes only when you click Confirm.

Testnet-first (recommended)

  1. Generate keys at testnet.binance.vision (login with GitHub → Generate HMAC_SHA256 Key) and request faucet funds.
  2. Export BINANCE_ENV=testnet and the testnet keys.
  3. Exercise the full flow with fake money before touching mainnet.

Mainnet = real money + macOS

On mainnet, the confirmer re-validates against live symbol filters, shows the ⚠️ REAL MONEY banner, and waits for your click. Start with minimal order sizes. Execution requires macOS (the dialog uses osascript).


Development

Requires Python 3.12+ and uv. See CONTRIBUTING.md for details.

uv venv --python 3.12
uv pip install -e ".[dev]"

uv run ruff check src/ tests/ examples/   # lint (the release gate)
uv run mypy                               # strict type checking
uv run pytest -q                          # tests + coverage (hard gate: 90% min)

The unit suite runs fully offline. Integration tests (-m integration) hit Binance testnet and skip cleanly without keys; the news test hits live RSS only with RUN_NETWORK_TESTS=1. CI runs lint + types + tests on ubuntu and macOS (the confirmer's target OS) across Python 3.12/3.13, plus pip-audit and CodeQL, on every push and PR. pre-commit install gets you the same ruff check locally.

Roadmap

  • Migrate to MCP SDK 2.x (v1.0.0 pins mcp==1.29.0; 2.0 is a breaking API change).
  • Headless / non-macOS confirmation (today the dialog is macOS-only via osascript).
  • Additional order types and exchange surfaces beyond spot.
  • Optional notification channels for proposal/execution events.

Research: is there an edge?

We backtested our own composite signal the hard way — out-of-sample walk-forward over ~51,000 real candles (4 pairs x 3 timeframes x 3 strategies, grid search on train windows, measured on unseen test windows, triple anti-lookahead). Result: 0 of 36 configurations showed a robust out-of-sample edge; in-sample "edges" were overfitting.

That is why every signal tool ships with a disclaimer: the signals are context, not alpha. Full write-ups and reproducible scripts: docs/research/ + examples/.

Disclaimer

This software is not financial advice and comes with no warranty (MIT). Trading cryptocurrencies can result in the loss of your entire capital. Signals, indicators, and backtests are informational; past performance does not predict future results. You are solely responsible for every order you confirm — that is exactly why the human gate exists.

Author

Built by Alejandro Exequiel Hernández Lara — founder of KaiNext. Part of KaiNext's MCP product line.

License

MIT © 2026 Alejandro Exequiel Hernández Lara (KaiNext)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kainext_binance_mcp-1.1.0.tar.gz (235.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kainext_binance_mcp-1.1.0-py3-none-any.whl (94.8 kB view details)

Uploaded Python 3

File details

Details for the file kainext_binance_mcp-1.1.0.tar.gz.

File metadata

  • Download URL: kainext_binance_mcp-1.1.0.tar.gz
  • Upload date:
  • Size: 235.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for kainext_binance_mcp-1.1.0.tar.gz
Algorithm Hash digest
SHA256 9cd807401e50b24444cd23f8316313cebd71ca46aeccddad56a41bede3ae6f9b
MD5 b6d471d974849c44febaf507d97a2c93
BLAKE2b-256 7b62f5e54ee5bb0cc1dd1c1bac870edf9d9ea6478194321edf32385a6e98e943

See more details on using hashes here.

Provenance

The following attestation bundles were made for kainext_binance_mcp-1.1.0.tar.gz:

Publisher: release.yml on Alejandrehl/kainext-binance-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file kainext_binance_mcp-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for kainext_binance_mcp-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fc5492be0e8b4569dc7f3286503d7bf4f80e5eb94958a4354216dad998cddb13
MD5 f4b7c06fbbe2e7a3d17608f4605b8c0a
BLAKE2b-256 d32a95ef24c6e45456ef12be49dde6b7a4b516659a76a4a90a8d3f9154f865a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for kainext_binance_mcp-1.1.0-py3-none-any.whl:

Publisher: release.yml on Alejandrehl/kainext-binance-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.2.1

2 files

1.2.0

2 files

This release

1.1.0 This release

2 files

1.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page