JW3.ai remote MCP server for market reads and confirm-gated trading execution.
Maintained by@agnostic4321-ops(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
SERVER-EXECUTED, read-only: ask the JEV decision model for a typed verdict (verdict + agreement% + snapshot age). Pass family (cex | dex_perps | prediction) + venue + symbol. The server builds multi-timeframe candles itself for CEX (venue+symbol only); dex_perps needs snapshot.timeframes [{tf, candles:[{o,h,l,c,v?}]}]; prediction needs snapshot.brief ONLY — 2–6 research notes YOU assemble ({title, snippet, url, at} with real URLs you can vouch for): the server fetches the live book itself and grounds the call, so never paste prices as snapshot.market (a model-supplied market is ignored). Call this BEFORE any trade proposal and cite the verdict (agree/disagree + why) in the proposal thesis — uncertain/mixed verdicts mean no trade. NEVER narrate instead of calling it.
Market family matching the planned trade.
Alias of symbol (chat compat).
Venue slug (e.g. binance, kucoin, polymarket). Required for cex unless the snapshot already carries timeframes; prediction defaults to polymarket.
Pair, ticker, or condition id (e.g. BTC/USDT). Required for cex unless the snapshot already carries timeframes; prediction takes the Polymarket conditionId/slug or Opinion market id.
Alias of venue (chat compat).
Optional override: { timeframes: [{tf, candles: [{o,h,l,c,v?}]}] } for cex/dex_perps, { market, brief: [{title, snippet, url, at}] } for prediction. Omit for CEX — the server builds candles itself; dex_perps/prediction need the snapshot shapes above.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http jw3-mcp-cli https://nzhbfeahymmyqerzjgbt.supabase.co/functions/v1/mcp-server
SERVER-EXECUTED, read-only: ask the JEV decision model for a typed verdict (verdict + agreement% + snapshot age). Pass family (cex | dex_perps | prediction) + venue + symbol. The server builds multi-timeframe candles itself for CEX (venue+symbol only); dex_perps needs snapshot.timeframes [{tf, candles:[{o,h,l,c,v?}]}]; prediction needs snapshot.brief ONLY — 2–6 research notes YOU assemble ({title, snippet, url, at} with real URLs you can vouch for): the server fetches the live book itself and grounds the call, so never paste prices as snapshot.market (a model-supplied market is ignored). Call this BEFORE any trade proposal and cite the verdict (agree/disagree + why) in the proposal thesis — uncertain/mixed verdicts mean no trade. NEVER narrate instead of calling it.
| Argument | Type | Description |
|---|---|---|
| pair | string | Alias of symbol (chat compat). |
| venue | string | Venue slug (e.g. binance, kucoin, polymarket). Required for cex unless the snapshot already carries timeframes; prediction defaults to polymarket. |
| family* | string | Market family matching the planned trade. |
| symbol | string | Pair, ticker, or condition id (e.g. BTC/USDT). Required for cex unless the snapshot already carries timeframes; prediction takes the Polymarket conditionId/slug or Opinion market id. |
| exchange | string | Alias of venue (chat compat). |
| snapshot | object | Optional override: { timeframes: [{tf, candles: [{o,h,l,c,v?}]}] } for cex/dex_perps, { market, brief: [{title, snippet, url, at}] } for prediction. Omit for CEX — the server builds candles itself; dex_perps/prediction need the snapshot shapes above. |
{
"type": "object",
"required": [
"family"
],
"properties": {
"pair": {
"type": "string",
"description": "Alias of symbol (chat compat)."
},
"venue": {
"type": "string",
"description": "Venue slug (e.g. binance, kucoin, polymarket). Required for cex unless the snapshot already carries timeframes; prediction defaults to polymarket."
},
"family": {
"enum": [
"cex",
"dex_perps",
"prediction"
],
"type": "string",
"description": "Market family matching the planned trade."
},
"symbol": {
"type": "string",
"description": "Pair, ticker, or condition id (e.g. BTC/USDT). Required for cex unless the snapshot already carries timeframes; prediction takes the Polymarket conditionId/slug or Opinion market id."
},
"exchange": {
"type": "string",
"description": "Alias of venue (chat compat)."
},
"snapshot": {
"type": "object",
"description": "Optional override: { timeframes: [{tf, candles: [{o,h,l,c,v?}]}] } for cex/dex_perps, { market, brief: [{title, snippet, url, at}] } for prediction. Omit for CEX — the server builds candles itself; dex_perps/prediction need the snapshot shapes above."
}
},
"additionalProperties": false
}READ-ONLY / UNSIGNED: build an unsigned DeFi transaction payload (supply, redeem, borrow, repay, claim) or quote LP amounts (quote_lp) via the official Binance Web3 DeFi API. Never signs, never broadcasts, never touches private keys — returns unsigned contract calldata (and optional simulation result) for wallet signing or CLI inspection.
| Argument | Type | Description |
|---|---|---|
| action* | string | DeFi transaction builder action: supply|redeem|borrow|repay|claim|quote_lp. |
| amount | string | Token amount in human units or base units (required for supply|redeem|borrow|repay|quote_lp). |
| chainId | string | Optional chain slug or chainId (e.g. ethereum, bnb, arbitrum, base, polygon, optimism, avalanche, linea, sonic, solana). |
| simulate | boolean | When true (default), also runs Binance Web3 DeFi transaction simulation on the unsigned payload. |
| slippageBps | number | Optional slippage tolerance in basis points (default 50 = 0.5%). |
| investmentId* | string | Binance Web3 DeFi investmentId (from read_defi scope=investments). |
| tokenAddress | string | Optional input/output token contract address (defaults to investment primary token). |
| walletAddress | string | User wallet address (0x... for EVM or base58 for Solana). Required for supply|redeem|borrow|repay|claim. |
{
"type": "object",
"required": [
"action",
"investmentId"
],
"properties": {
"action": {
"enum": [
"supply",
"redeem",
"borrow",
"repay",
"claim",
"quote_lp"
],
"type": "string",
"description": "DeFi transaction builder action: supply|redeem|borrow|repay|claim|quote_lp."
},
"amount": {
"type": "string",
"description": "Token amount in human units or base units (required for supply|redeem|borrow|repay|quote_lp)."
},
"chainId": {
"type": "string",
"description": "Optional chain slug or chainId (e.g. ethereum, bnb, arbitrum, base, polygon, optimism, avalanche, linea, sonic, solana)."
},
"simulate": {
"type": "boolean",
"description": "When true (default), also runs Binance Web3 DeFi transaction simulation on the unsigned payload."
},
"slippageBps": {
"type": "number",
"description": "Optional slippage tolerance in basis points (default 50 = 0.5%)."
},
"investmentId": {
"type": "string",
"description": "Binance Web3 DeFi investmentId (from read_defi scope=investments)."
},
"tokenAddress": {
"type": "string",
"description": "Optional input/output token contract address (defaults to investment primary token)."
},
"walletAddress": {
"type": "string",
"description": "User wallet address (0x... for EVM or base58 for Solana). Required for supply|redeem|borrow|repay|claim."
}
},
"additionalProperties": false
}Cancel an open CEX order by order id. Needs trade:execute + YOLO eligibility; per-call kill-switch/autonomy check.
| Argument | Type | Description |
|---|---|---|
| pair | string | e.g. BTC/USDT (helps venue routing) |
| market | string | Optional market scope. Omit to search both. |
| orderId* | string | Venue order id to cancel |
| exchange* | string | CEX slug, e.g. kucoin |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"required": [
"exchange",
"orderId"
],
"properties": {
"pair": {
"type": "string",
"description": "e.g. BTC/USDT (helps venue routing)"
},
"market": {
"enum": [
"spot",
"futures"
],
"type": "string",
"description": "Optional market scope. Omit to search both."
},
"orderId": {
"type": "string",
"description": "Venue order id to cancel"
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}Close an open CEX futures position (or reduce it) with a reduce-only market order. Real money. Needs the trade:execute scope AND user YOLO eligibility; per-call kill-switch/autonomy check. NEVER touch positions the user marked manual unless explicitly asked.
| Argument | Type | Description |
|---|---|---|
| pair* | string | e.g. BTC/USDT |
| side* | string | Side of the OPEN position |
| size | string | Base units to close; omit to close the entire position, or pass a smaller amount to reduce partially |
| exchange* | string | CEX slug, e.g. kucoin |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"required": [
"exchange",
"pair",
"side"
],
"properties": {
"pair": {
"type": "string",
"description": "e.g. BTC/USDT"
},
"side": {
"enum": [
"long",
"short"
],
"type": "string",
"description": "Side of the OPEN position"
},
"size": {
"type": "string",
"description": "Base units to close; omit to close the entire position, or pass a smaller amount to reduce partially"
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}Build the morning brief (risk header, positions, 5-venue funding/OI, liquidation proxy, macro 24h, regime, JEV bias per name) and record it as the day's 'Daily analysis' in the diary. Reads need mcp:read; the diary write needs trade:propose (or pass write:false for a dry run). Sections carry [DATA]/[PROXY]/[UNAVAILABLE] tags — gaps are never synthesized.
| Argument | Type | Description |
|---|---|---|
| day | string | YYYY-MM-DD (default today UTC) |
| write | boolean | Record into diary_day_notes (default true) |
{
"type": "object",
"properties": {
"day": {
"type": "string",
"description": "YYYY-MM-DD (default today UTC)"
},
"write": {
"type": "boolean",
"description": "Record into diary_day_notes (default true)"
}
},
"additionalProperties": false
}Execute a live CEX order immediately (real money) via stored exchange keys. Needs the trade:execute scope AND user YOLO eligibility (kill switch off, autonomy != propose_only); caps enforced per order. Fee-aware: pass stop to refuse stops that cannot survive round-trip fees (min-move gate), or risk_usd to size from risk (needs stop, else an ATR stop from venue klines). Returns the fee estimate + min-move in the result. CEX spot/futures only — never on-chain.
| Argument | Type | Description |
|---|---|---|
| tp | number | Take-profit price (> 0) armed with the entry as a single 100%-share venue-native TP exit leg across all CEX venues. Must sit on the profit side of the entry (long: above, short: below). |
| pair* | string | e.g. BTC/USDT |
| side* | string | Order side: buy|sell |
| stop | number | Protective stop price (> 0). Gated server-side: stops inside round-trip fees x factor are refused with the shortfall spelled out, and armed as a venue-native SL exit leg after the entry across all CEX venues. |
| type | string | Order type. Defaults to 'limit' when a price is given, else 'market'. Use 'market' for a live entry: the exit legs are venue-native conditionals that attach to a POSITION, so a RESTING LIMIT has no position to protect and rests on the book unprotected until it fills. |
| actor | string | WHO is placing the order. 'machine' for the trading machine; 'owner' for the account owner's own manual trading. The account is SHARED, so this is what tells the machine's trades from the owner's when a closed trade is reconciled against the machine's daily loss cap. Defaults to 'owner'. |
| price | string | Limit price. OMIT for a market order. When the order type is 'market' the price is only a reference for sizing and is NOT sent to the venue — a resting limit has no position to protect, so the exit legs cannot attach to it. |
| amount | string | Base units, e.g. 0.05 (omit when risk_usd sizes the order) |
| market | string | Which market to trade (default spot) |
| tpLegs | array | Optional 1-3 split take-profit legs ({ price, share }, where share is 1..100 percent of entry size) armed as venue-native TP orders after the entry. |
| tpPrice | number | Deprecated alias of tp. |
| exchange* | string | CEX slug, e.g. kucoin |
| leverage | number | Futures only; rides the order (KuCoin has no venue-level setting) |
| risk_usd | number | Max USD loss at the stop — sizes the order as risk_usd / stop distance (needs stop, else ATR stop from venue klines; capped by max_position_usd + lot step). |
| clientOid | string | Optional caller-supplied identity tag for the order (max 36 chars, [A-Za-z0-9_-]). A later session uses it to attribute the order to its owner instead of classifying it as foreign/unknown-origin. Omit it and the server generates a random UUID. |
| marginMode | string | Futures only; isolated bounds max loss to position margin (default cross) |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
| referencePrice | string | For a MARKET order only: the price the exit legs were derived from. The venue may fill the entry at a different price, and the server REBASES the stop and target onto the actual fill (each keeps its distance from this reference). Omit it and the legs are placed at their original absolute prices, which can land on the wrong side of the fill. |
| idempotency_key | string | Optional per-INTENT key. Two submits with the same key are the same intent: the second is deduped and never dispatched again. Use it when a submission may be retried (a timeout, a reconnect) so a retry cannot double-fill. |
{
"type": "object",
"required": [
"exchange",
"pair",
"side"
],
"properties": {
"tp": {
"type": "number",
"description": "Take-profit price (> 0) armed with the entry as a single 100%-share venue-native TP exit leg across all CEX venues. Must sit on the profit side of the entry (long: above, short: below)."
},
"pair": {
"type": "string",
"description": "e.g. BTC/USDT"
},
"side": {
"enum": [
"buy",
"sell"
],
"type": "string",
"description": "Order side: buy|sell"
},
"stop": {
"type": "number",
"description": "Protective stop price (> 0). Gated server-side: stops inside round-trip fees x factor are refused with the shortfall spelled out, and armed as a venue-native SL exit leg after the entry across all CEX venues."
},
"type": {
"enum": [
"market",
"limit"
],
"type": "string",
"description": "Order type. Defaults to 'limit' when a price is given, else 'market'. Use 'market' for a live entry: the exit legs are venue-native conditionals that attach to a POSITION, so a RESTING LIMIT has no position to protect and rests on the book unprotected until it fills."
},
"actor": {
"enum": [
"machine",
"owner"
],
"type": "string",
"description": "WHO is placing the order. 'machine' for the trading machine; 'owner' for the account owner's own manual trading. The account is SHARED, so this is what tells the machine's trades from the owner's when a closed trade is reconciled against the machine's daily loss cap. Defaults to 'owner'."
},
"price": {
"type": "string",
"description": "Limit price. OMIT for a market order. When the order type is 'market' the price is only a reference for sizing and is NOT sent to the venue — a resting limit has no position to protect, so the exit legs cannot attach to it."
},
"amount": {
"type": "string",
"description": "Base units, e.g. 0.05 (omit when risk_usd sizes the order)"
},
"market": {
"enum": [
"spot",
"futures"
],
"type": "string",
"description": "Which market to trade (default spot)"
},
"tpLegs": {
"type": "array",
"items": {
"type": "object",
"required": [
"price",
"share"
],
"properties": {
"price": {
"type": "number",
"description": "Take-profit trigger price (> 0)"
},
"share": {
"type": "number",
"description": "Share of the entry to close at this leg, 1..100 percent"
}
},
"additionalProperties": false
},
"description": "Optional 1-3 split take-profit legs ({ price, share }, where share is 1..100 percent of entry size) armed as venue-native TP orders after the entry."
},
"tpPrice": {
"type": "number",
"description": "Deprecated alias of tp."
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin"
},
"leverage": {
"type": "number",
"description": "Futures only; rides the order (KuCoin has no venue-level setting)"
},
"risk_usd": {
"type": "number",
"description": "Max USD loss at the stop — sizes the order as risk_usd / stop distance (needs stop, else ATR stop from venue klines; capped by max_position_usd + lot step)."
},
"clientOid": {
"type": "string",
"description": "Optional caller-supplied identity tag for the order (max 36 chars, [A-Za-z0-9_-]). A later session uses it to attribute the order to its owner instead of classifying it as foreign/unknown-origin. Omit it and the server generates a random UUID."
},
"marginMode": {
"enum": [
"cross",
"isolated"
],
"type": "string",
"description": "Futures only; isolated bounds max loss to position margin (default cross)"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
},
"referencePrice": {
"type": "string",
"description": "For a MARKET order only: the price the exit legs were derived from. The venue may fill the entry at a different price, and the server REBASES the stop and target onto the actual fill (each keeps its distance from this reference). Omit it and the legs are placed at their original absolute prices, which can land on the wrong side of the fill."
},
"idempotency_key": {
"type": "string",
"description": "Optional per-INTENT key. Two submits with the same key are the same intent: the second is deduped and never dispatched again. Use it when a submission may be retried (a timeout, a reconnect) so a retry cannot double-fill."
}
},
"additionalProperties": false
}READ-ONLY: one-shot summary of the user's Insights page — market regime (BTC/ETH price + 24h, total market cap, Fear & Greed, ETF 7d net flow, stablecoin supply), cross-venue funding extremes, the fee-aware carry board, DEX perp volume share, the caller's own fee drag from the Diary, headlines, and a deterministic brief. Values may be null/unknown; missing blocks are listed in `gaps` and are never synthesized. Cite as 'observed at <time>'. Optional args: days (1-90, default 30), notional_usd (default 10000), fee_bps (default 5). Never trades, never writes.
| Argument | Type | Description |
|---|---|---|
| days | number | Lookback in days for the rollup, 1..90 (default 30). |
| fee_bps | number | Round-trip fee assumption in basis points, 0..100 (default 5). |
| notional_usd | number | Notional in USD used to price the carry board and the fee drag, > 0 (default 10000). |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"maximum": 90,
"minimum": 1,
"description": "Lookback in days for the rollup, 1..90 (default 30)."
},
"fee_bps": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Round-trip fee assumption in basis points, 0..100 (default 5)."
},
"notional_usd": {
"type": "number",
"minimum": 1,
"description": "Notional in USD used to price the carry board and the fee drag, > 0 (default 10000)."
}
},
"additionalProperties": false
}READ-ONLY: list the user's connected CEX venues (id, exchange slug, label, status, markets) so follow-up reads can target a connectionId. `markets` is spot|futures|both as verified at save (Kraken dual keys; KuCoin/Bitget futures scope) — a row with markets=both covers perpetuals, so prefer it for positions reads. Returns metadata only, never keys or secrets. Call this first when the user asks about positions, balances, or anything per-exchange.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}READ-ONLY: list recent execution fills on a CEX connection (individual order executions with price/qty/fee, spot + futures). Never moves funds, never writes Diary rows — fills are Activity history (see read_closed_pnl for realized PnL). Unimplemented venues return an empty list; a venue walk that exceeds its time budget fails loud, never truncated-as-empty.
| Argument | Type | Description |
|---|---|---|
| days | number | Lookback in days, 1..90 (default 30) |
| pair | string | Optional filter, e.g. BTC/USDT |
| limit | number | Max rows, newest-first, 1..500 (default 100) |
| market | string | Which fills to read (default all) |
| exchange | string | CEX slug, e.g. kucoin (resolved to an active connection; connectionId wins when both are given) |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"description": "Lookback in days, 1..90 (default 30)"
},
"pair": {
"type": "string",
"description": "Optional filter, e.g. BTC/USDT"
},
"limit": {
"type": "number",
"description": "Max rows, newest-first, 1..500 (default 100)"
},
"market": {
"enum": [
"spot",
"futures",
"all"
],
"type": "string",
"description": "Which fills to read (default all)"
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin (resolved to an active connection; connectionId wins when both are given)"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}List open orders on a CEX connection (spot + futures). Read-only.
| Argument | Type | Description |
|---|---|---|
| pair | string | Optional filter, e.g. BTC/USDT |
| exchange* | string | CEX slug, e.g. kucoin |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"required": [
"exchange"
],
"properties": {
"pair": {
"type": "string",
"description": "Optional filter, e.g. BTC/USDT"
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}APPROVAL CARD ONLY — NEVER auto-executed: propose one atomic bracket (entry + protective stop + 1–3 OCO take-profits) for in-app approval. Recorded as a proposed setup row (Diary → setups → Send to ticket). Never executes, never moves funds. Needs the trade:propose scope (PAT).
| Argument | Type | Description |
|---|---|---|
| pair* | string | e.g. BTC/USDT |
| side* | string | buy = long, sell = short |
| amount* | string | Base amount, e.g. 0.05. Must be > 0. |
| fee_usd | number | All-in fee in USD. Omit or null if unknown — never 0-substituted. |
| exchange* | string | CEX slug, e.g. kucoin |
| rationale* | string | One-sentence why-now |
| entry_type* | string | market = fill now; limit = resting entry at entry_price |
| stop_price* | number | Protective stop. Long: below entry; short: above. Must be > 0. |
| entry_price | number | Required when entry_type=limit. Must be > 0. |
| take_profits* | array | 1–3 take-profit legs {price > 0, weight (or fraction) 0..1 of position}. Weights should sum to ~1. |
{
"type": "object",
"required": [
"exchange",
"pair",
"side",
"entry_type",
"amount",
"stop_price",
"take_profits",
"rationale"
],
"properties": {
"pair": {
"type": "string",
"description": "e.g. BTC/USDT"
},
"side": {
"enum": [
"buy",
"sell",
"long",
"short"
],
"type": "string",
"description": "buy = long, sell = short"
},
"amount": {
"type": "string",
"description": "Base amount, e.g. 0.05. Must be > 0."
},
"fee_usd": {
"type": "number",
"description": "All-in fee in USD. Omit or null if unknown — never 0-substituted."
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin"
},
"rationale": {
"type": "string",
"description": "One-sentence why-now"
},
"entry_type": {
"enum": [
"market",
"limit"
],
"type": "string",
"description": "market = fill now; limit = resting entry at entry_price"
},
"stop_price": {
"type": "number",
"description": "Protective stop. Long: below entry; short: above. Must be > 0."
},
"entry_price": {
"type": "number",
"description": "Required when entry_type=limit. Must be > 0."
},
"take_profits": {
"type": "array",
"description": "1–3 take-profit legs {price > 0, weight (or fraction) 0..1 of position}. Weights should sum to ~1."
}
},
"additionalProperties": false
}APPROVAL CARD ONLY — NEVER auto-executed: propose flattening EVERY open position at once (or one venue/pair scope) for in-app approval. Records the proposal only — no order is placed, nothing is cancelled. Needs the trade:propose scope (PAT).
| Argument | Type | Description |
|---|---|---|
| pair | string | Optional pair filter (e.g. BTC/USDT) — flatten only this market. Omit for everything. |
| exchange | string | Optional CEX slug to flatten one venue only. Omit for every connected venue. |
| rationale* | string | Why flatten now |
| order_type | string | Default market. |
| limit_price | string | Required for order_type=limit. |
{
"type": "object",
"required": [
"rationale"
],
"properties": {
"pair": {
"type": "string",
"description": "Optional pair filter (e.g. BTC/USDT) — flatten only this market. Omit for everything."
},
"exchange": {
"type": "string",
"description": "Optional CEX slug to flatten one venue only. Omit for every connected venue."
},
"rationale": {
"type": "string",
"description": "Why flatten now"
},
"order_type": {
"enum": [
"market",
"limit"
],
"type": "string",
"description": "Default market."
},
"limit_price": {
"type": "string",
"description": "Required for order_type=limit."
}
},
"additionalProperties": false
}Append (default) or replace a markdown note on one diary day (diary_day_notes upsert — the same append/replace write the agent-chat approval path and daily_prep perform). Diary-only: never executes a trade, never moves funds. Needs the trade:propose scope (PAT).
| Argument | Type | Description |
|---|---|---|
| day | string | Day in YYYY-MM-DD format (default today UTC) |
| mode | string | append (default) or replace the day's note |
| body_md* | string | Markdown note content, 1..4000 chars (longer bodies are cut) |
{
"type": "object",
"required": [
"body_md"
],
"properties": {
"day": {
"type": "string",
"description": "Day in YYYY-MM-DD format (default today UTC)"
},
"mode": {
"enum": [
"append",
"replace"
],
"type": "string",
"description": "append (default) or replace the day's note"
},
"body_md": {
"type": "string",
"description": "Markdown note content, 1..4000 chars (longer bodies are cut)"
}
},
"additionalProperties": false
}APPROVAL CARD ONLY — NEVER auto-executed: propose a prediction-market trade for in-app approval. JEV-gated: pass the consult_jev family=prediction verdict (run analyze_market first) — a call without one is refused. Recorded as a proposal trail row. Never executes, never moves funds. Needs the trade:propose scope (PAT).
| Argument | Type | Description |
|---|---|---|
| side* | string | Outcome to buy |
| venue | string | Default polymarket (executable). opinion is proposal-only. |
| amount | number | Optional pUSD amount to spend (must be > 0 when provided) |
| question | string | Optional human-readable question, for UI display |
| market_id* | string | Polymarket conditionId or slug, or Opinion market id |
| rationale* | string | Why this market and side now |
| confidence | number | Optional agreement-weighted conviction 0–1 |
| jev_verdict* | string | The consult_jev family=prediction verdict (run analyze_market first) — required |
{
"type": "object",
"required": [
"market_id",
"side",
"rationale",
"jev_verdict"
],
"properties": {
"side": {
"enum": [
"yes",
"no"
],
"type": "string",
"description": "Outcome to buy"
},
"venue": {
"enum": [
"polymarket",
"opinion"
],
"type": "string",
"description": "Default polymarket (executable). opinion is proposal-only."
},
"amount": {
"type": "number",
"description": "Optional pUSD amount to spend (must be > 0 when provided)"
},
"question": {
"type": "string",
"description": "Optional human-readable question, for UI display"
},
"market_id": {
"type": "string",
"description": "Polymarket conditionId or slug, or Opinion market id"
},
"rationale": {
"type": "string",
"description": "Why this market and side now"
},
"confidence": {
"type": "number",
"description": "Optional agreement-weighted conviction 0–1"
},
"jev_verdict": {
"type": "string",
"description": "The consult_jev family=prediction verdict (run analyze_market first) — required"
}
},
"additionalProperties": false
}APPROVAL CARD ONLY — NEVER auto-executed: propose a trade setup for the user to approve in-app (Diary → setups → Send to ticket). Never executes, never moves funds. Needs the trade:propose scope (PAT).
| Argument | Type | Description |
|---|---|---|
| pair* | string | e.g. BTC/USDT |
| side* | string | Side to propose: buy|sell (long|short accepted as aliases, normalized to buy|sell) |
| stop* | number | Stop-loss price, must be > 0 |
| asset | string | Base symbol, e.g. BTC |
| entry* | number | Entry price, must be > 0 |
| venue | string | CEX slug or perps venue |
| thesis | string | One-paragraph rationale |
| size_usd | number | Suggested size in USD, must be > 0 |
| timeframe | string | e.g. 4h |
| jev_verdict | string | Optional caller-supplied JEV verdict captured alongside the proposal |
| invalidation | string | Optional invalidation note captured alongside the proposal |
| kronos_horizon | number | Optional Kronos horizon (positive integer) |
| kronos_direction | string | Optional Kronos oracle vote direction |
| kronos_captured_at | string | Optional ISO timestamp of the Kronos vote |
| kronos_expected_move_pct | number | Optional Kronos expected move in percent |
{
"type": "object",
"required": [
"pair",
"side",
"entry",
"stop"
],
"properties": {
"pair": {
"type": "string",
"description": "e.g. BTC/USDT"
},
"side": {
"enum": [
"buy",
"sell",
"long",
"short"
],
"type": "string",
"description": "Side to propose: buy|sell (long|short accepted as aliases, normalized to buy|sell)"
},
"stop": {
"type": "number",
"description": "Stop-loss price, must be > 0"
},
"asset": {
"type": "string",
"description": "Base symbol, e.g. BTC"
},
"entry": {
"type": "number",
"description": "Entry price, must be > 0"
},
"venue": {
"type": "string",
"description": "CEX slug or perps venue"
},
"thesis": {
"type": "string",
"description": "One-paragraph rationale"
},
"size_usd": {
"type": "number",
"description": "Suggested size in USD, must be > 0"
},
"timeframe": {
"type": "string",
"description": "e.g. 4h"
},
"jev_verdict": {
"type": "string",
"description": "Optional caller-supplied JEV verdict captured alongside the proposal"
},
"invalidation": {
"type": "string",
"description": "Optional invalidation note captured alongside the proposal"
},
"kronos_horizon": {
"type": "number",
"description": "Optional Kronos horizon (positive integer)"
},
"kronos_direction": {
"enum": [
"up",
"down",
"flat"
],
"type": "string",
"description": "Optional Kronos oracle vote direction"
},
"kronos_captured_at": {
"type": "string",
"description": "Optional ISO timestamp of the Kronos vote"
},
"kronos_expected_move_pct": {
"type": "number",
"description": "Optional Kronos expected move in percent"
}
},
"additionalProperties": false
}APPROVAL CARD ONLY — NEVER auto-executed: propose 1–3 personalized trade opportunities (best-first) for in-app approval. Each idea is recorded as a proposed setup row (Diary → setups → Send to ticket) plus one batch trail row. Never executes, never moves funds. Needs the trade:propose scope (PAT).
| Argument | Type | Description |
|---|---|---|
| ideas* | array | 1–3 trade ideas, best-first. Each: pair (e.g. BTC/USDT), side buy|sell (long|short accepted as aliases), entry > 0, stop > 0 (long: stop<entry, short: stop>entry), targets 1–3x {price>0, weight (or fraction) 0..1}, thesis (required). |
| rationale* | string | One-sentence why-now for the batch |
| jev_verdict | string | Optional caller-supplied JEV verdict captured alongside the batch (run analyze_market first for a fresh one) |
{
"type": "object",
"required": [
"ideas",
"rationale"
],
"properties": {
"ideas": {
"type": "array",
"description": "1–3 trade ideas, best-first. Each: pair (e.g. BTC/USDT), side buy|sell (long|short accepted as aliases), entry > 0, stop > 0 (long: stop<entry, short: stop>entry), targets 1–3x {price>0, weight (or fraction) 0..1}, thesis (required)."
},
"rationale": {
"type": "string",
"description": "One-sentence why-now for the batch"
},
"jev_verdict": {
"type": "string",
"description": "Optional caller-supplied JEV verdict captured alongside the batch (run analyze_market first for a fresh one)"
}
},
"additionalProperties": false
}READ-ONLY: realized/closed-PnL history on a CEX connection (one row per closed position carrying net pnl + fees, for diary sync). Never moves funds. Rows whose venue reports no side stay null — side is never inferred from the PnL sign; Binance rows carry entryPrice 0 = unknown (the income feed has no entry price) and exitPrice is the paired closing fill when one was found.
| Argument | Type | Description |
|---|---|---|
| days | number | Lookback in days, 1..90 (default 30) |
| pair | string | Optional filter, e.g. BTC/USDT |
| limit | number | Max rows, newest-first, 1..500 (default 100) |
| exchange | string | CEX slug, e.g. kucoin (resolved to an active connection; connectionId wins when both are given) |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"description": "Lookback in days, 1..90 (default 30)"
},
"pair": {
"type": "string",
"description": "Optional filter, e.g. BTC/USDT"
},
"limit": {
"type": "number",
"description": "Max rows, newest-first, 1..500 (default 100)"
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin (resolved to an active connection; connectionId wins when both are given)"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}READ-ONLY: query DeFi protocols, yield/lending/liquid-staking/LP/RWA markets, or wallet positions across all 10 Binance Web3 DeFi chains (BNB 56, Ethereum 1, Base 8453, Arbitrum 42161, Arc 5042, Polygon 137, Optimism 10, Avalanche 43114, Robinhood 4663, Katana 747474). Returns APY, base/reward APY breakdown, TVL, redeemDelayDays, yieldAnalytics, and investmentId with a fetch timestamp. Use propose_defi when the user wants an action card.
| Argument | Type | Description |
|---|---|---|
| chain | string | Optional chain filter by slug or chainId: bnb (56), ethereum (1), base (8453), arbitrum (42161), arc (5042), polygon (137), optimism (10), avalanche (43114), robinhood (4663), katana (747474). |
| limit | number | Max items to return, 1..50 (default 20). |
| scope | string | What to read: investments (default, yield/lending/LP markets), protocols (21+ audited platforms), positions (wallet-scoped DeFi holdings & rewards), protocol_detail (single protocol + markets), or investment_detail (single pool by investment_id). |
| token | string | Optional underlying token symbol or contract address filter (e.g. USDC, USDT, BNB, ETH, sUSDe). |
| address | string | Optional 0x EVM wallet address for scope=positions (auto-resolved from user's connected wallets when omitted). |
| category | string | Optional DeFi category filter. |
| protocol | string | Optional defiProtocolId filter (e.g. aave3, aave4, uniswap3, uniswap4, pancakeswap3, pancakeswap4, morphoblue, venus, venusflux, helio, astherus, lido, pendle2, spark, solv, renzo, rocketpool, quickswap3, benqi, frax, maple, cian, emberso, rexyz, usdai). |
| investment_id | string | Investment pool ID for scope=investment_detail (e.g. bn-aave4-5042-usdc). |
{
"type": "object",
"required": [],
"properties": {
"chain": {
"type": "string",
"description": "Optional chain filter by slug or chainId: bnb (56), ethereum (1), base (8453), arbitrum (42161), arc (5042), polygon (137), optimism (10), avalanche (43114), robinhood (4663), katana (747474)."
},
"limit": {
"type": "number",
"description": "Max items to return, 1..50 (default 20)."
},
"scope": {
"enum": [
"investments",
"protocols",
"positions",
"protocol_detail",
"investment_detail"
],
"type": "string",
"description": "What to read: investments (default, yield/lending/LP markets), protocols (21+ audited platforms), positions (wallet-scoped DeFi holdings & rewards), protocol_detail (single protocol + markets), or investment_detail (single pool by investment_id)."
},
"token": {
"type": "string",
"description": "Optional underlying token symbol or contract address filter (e.g. USDC, USDT, BNB, ETH, sUSDe)."
},
"address": {
"type": "string",
"description": "Optional 0x EVM wallet address for scope=positions (auto-resolved from user's connected wallets when omitted)."
},
"category": {
"enum": [
"LENDING",
"STAKING",
"LIQUID_STAKING",
"RESTAKING",
"YIELD",
"LIQUIDITY_POOL",
"RWA",
"VAULT"
],
"type": "string",
"description": "Optional DeFi category filter."
},
"protocol": {
"type": "string",
"description": "Optional defiProtocolId filter (e.g. aave3, aave4, uniswap3, uniswap4, pancakeswap3, pancakeswap4, morphoblue, venus, venusflux, helio, astherus, lido, pendle2, spark, solv, renzo, rocketpool, quickswap3, benqi, frax, maple, cian, emberso, rexyz, usdai)."
},
"investment_id": {
"type": "string",
"description": "Investment pool ID for scope=investment_detail (e.g. bn-aave4-5042-usdc)."
}
},
"additionalProperties": false
}READ-ONLY: read one diary day (trades, setups, analyses, actions) or an explicit day RANGE. Never writes — saving a note stays a propose_diary_note approval card. Pass an explicit day (YYYY-MM-DD) or an explicit start_day + end_day range (inclusive, max 31 days) — there is no today default, so ask the user when no day is given. Returns the most recent rows first with totals; quote it as observed diary state, not a live venue read.
| Argument | Type | Description |
|---|---|---|
| day | string | One day in YYYY-MM-DD format (required when no range is given; no default — ask the user). |
| end_day | string | Range end in YYYY-MM-DD format, inclusive. Requires start_day; the range caps at 31 days. |
| start_day | string | Range start in YYYY-MM-DD format, inclusive. Requires end_day; the range caps at 31 days. |
{
"type": "object",
"properties": {
"day": {
"type": "string",
"description": "One day in YYYY-MM-DD format (required when no range is given; no default — ask the user)."
},
"end_day": {
"type": "string",
"description": "Range end in YYYY-MM-DD format, inclusive. Requires start_day; the range caps at 31 days."
},
"start_day": {
"type": "string",
"description": "Range start in YYYY-MM-DD format, inclusive. Requires end_day; the range caps at 31 days."
}
},
"additionalProperties": false
}READ-ONLY: fetch ONE specific live datum on demand (open positions, account balances, or a market quote) instead of waiting for the context snapshot. Never moves funds, never places an order, never widens the context on its own — ask for exactly the datum you need. Returns numbers WITH the venue and a fetch timestamp; report them as 'observed at <time> on <venue>'. If the result has no fetched number, say the value is unavailable — NEVER invent a placeholder. Present positions/balances/order reads as an inline markdown table in your reply text (never 'shown above'); when empty, say 'No open positions' explicitly. Not for writing anything; use a propose_* tool when the user wants an action.
| Argument | Type | Description |
|---|---|---|
| tag | string | Optional tag pill to filter kind=predictions scope=markets: politics|crypto|sports|economy|ai|tech (Polymarket tag_slug; Opinion matches its category labels best-effort). Omit for the most liquid open markets overall. |
| kind* | string | Which datum to read. positions = open derivatives positions with mark/liq/leverage (rows also carry their resting venue-native exit legs as exits[] with TP/SL triggers across all CEX venues, or exitsUnknown:true when the stops book could not be read — quote those, never invent exits). balances = per-connection account balances. open_orders = resting OPEN orders across connections (optional connectionId/exchange narrow, optional symbol pair filter + category spot|linear; empty list means no resting orders, never a flat position). market = a live quote for one symbol. screener = top-by-volume 24h movers on one CEX (pass symbol=<exchange slug>, e.g. binance). onchain = wallet balances across the user's server-resolved wallets (addresses only, never keys; optional chains=<csv> filter, e.g. ethereum,solana). order = ONE order's status by venue order id (open|filled|unknown with observedAt; needs connectionId + orderId, optional symbol + category spot|linear). predictions = prediction-market reads across Polymarket + Opinion (default scope=markets: the most liquid open markets with yes/no prices, volume, liquidity, endDate, conditionId; scope=positions|orders reads the user's wallet-scoped positions and resting orders on both venues; scope=quote returns a live quote for one market/token: Polymarket orderbook + tick-size + taker-delay, Opinion latest price + quote tokens). The first leg of any prediction hunt is scope=markets; price before proposing from scope=quote. |
| scope | string | Prediction read scope for kind=predictions (default markets). markets = liquid open markets scan; positions = the user's open prediction positions (wallet-scoped, needs connected creds or wallets=); orders = resting prediction orders; quote = live quote for one market (needs market_id and/or token_id). |
| venue | string | Prediction venue for kind=predictions: polymarket|opinion|all. Scan (scope=markets) defaults to polymarket; positions|orders read both venues unless narrowed; quote defaults to polymarket unless the token/market id is Opinion-shaped. |
| chains | string | Optional comma list to filter kind=onchain, e.g. ethereum,solana. |
| status | string | Optional position-status filter for kind=predictions scope=positions: OPEN|REDEEMABLE|REDEEMABLE_LOST|CLOSED|MERGEABLE (default OPEN, Polymarket; Opinion returns its open positions). |
| symbol | string | Required for kind=market (e.g. BTC/USDT). Optional pair filter for kind=open_orders (e.g. BTC/USDT narrows the resting book). |
| orderId | string | Venue order id for kind=order (e.g. the orderId a placeOrder/YOLO fill returned). |
| wallets | string | Optional csv of 0x wallet addresses for kind=predictions scope=positions (merged with the stored Polymarket funder; capped at 10). Omit to read the connected wallets only. |
| category | string | Optional market scope for kind=order|open_orders: spot|linear. Omit to search both on perp venues. |
| exchange | string | Venue slug for kind=market (e.g. binance). For positions|balances|open_orders, narrows to one venue; omit to read every connection. |
| token_id | string | Outcome token id for kind=predictions scope=quote: Polymarket CTF clobTokenId (orderbook + tick-size + taker-delay) or Opinion token id (latest price). |
| market_id | string | Prediction market selector for kind=predictions scope=orders|quote (and to narrow positions): Polymarket conditionId (0x…), slug, or numeric id; Opinion market id. |
| withExits | boolean | Accepted for backward compatibility (older CLI versions send it): positions reads always carry their resting venue-native exit legs as exits[] with TP/SL triggers across all CEX venues, or exitsUnknown:true when the stops book could not be read. Other venues ignore it. |
| connectionId | string | CEX connection id for positions|balances|open_orders (see list_connections). Omit to read every active connection. REQUIRED for kind=order (an order id is connection-scoped). |
| max_age_seconds | number | Optional freshness bound. The executor prefers its already-fetched value when it is younger than this; otherwise it reads again. |
{
"type": "object",
"required": [
"kind"
],
"properties": {
"tag": {
"type": "string",
"description": "Optional tag pill to filter kind=predictions scope=markets: politics|crypto|sports|economy|ai|tech (Polymarket tag_slug; Opinion matches its category labels best-effort). Omit for the most liquid open markets overall."
},
"kind": {
"enum": [
"positions",
"balances",
"open_orders",
"market",
"screener",
"onchain",
"order",
"predictions"
],
"type": "string",
"description": "Which datum to read. positions = open derivatives positions with mark/liq/leverage (rows also carry their resting venue-native exit legs as exits[] with TP/SL triggers across all CEX venues, or exitsUnknown:true when the stops book could not be read — quote those, never invent exits). balances = per-connection account balances. open_orders = resting OPEN orders across connections (optional connectionId/exchange narrow, optional symbol pair filter + category spot|linear; empty list means no resting orders, never a flat position). market = a live quote for one symbol. screener = top-by-volume 24h movers on one CEX (pass symbol=<exchange slug>, e.g. binance). onchain = wallet balances across the user's server-resolved wallets (addresses only, never keys; optional chains=<csv> filter, e.g. ethereum,solana). order = ONE order's status by venue order id (open|filled|unknown with observedAt; needs connectionId + orderId, optional symbol + category spot|linear). predictions = prediction-market reads across Polymarket + Opinion (default scope=markets: the most liquid open markets with yes/no prices, volume, liquidity, endDate, conditionId; scope=positions|orders reads the user's wallet-scoped positions and resting orders on both venues; scope=quote returns a live quote for one market/token: Polymarket orderbook + tick-size + taker-delay, Opinion latest price + quote tokens). The first leg of any prediction hunt is scope=markets; price before proposing from scope=quote."
},
"scope": {
"enum": [
"markets",
"positions",
"orders",
"quote"
],
"type": "string",
"description": "Prediction read scope for kind=predictions (default markets). markets = liquid open markets scan; positions = the user's open prediction positions (wallet-scoped, needs connected creds or wallets=); orders = resting prediction orders; quote = live quote for one market (needs market_id and/or token_id)."
},
"venue": {
"type": "string",
"description": "Prediction venue for kind=predictions: polymarket|opinion|all. Scan (scope=markets) defaults to polymarket; positions|orders read both venues unless narrowed; quote defaults to polymarket unless the token/market id is Opinion-shaped."
},
"chains": {
"type": "string",
"description": "Optional comma list to filter kind=onchain, e.g. ethereum,solana."
},
"status": {
"type": "string",
"description": "Optional position-status filter for kind=predictions scope=positions: OPEN|REDEEMABLE|REDEEMABLE_LOST|CLOSED|MERGEABLE (default OPEN, Polymarket; Opinion returns its open positions)."
},
"symbol": {
"type": "string",
"description": "Required for kind=market (e.g. BTC/USDT). Optional pair filter for kind=open_orders (e.g. BTC/USDT narrows the resting book)."
},
"orderId": {
"type": "string",
"description": "Venue order id for kind=order (e.g. the orderId a placeOrder/YOLO fill returned)."
},
"wallets": {
"type": "string",
"description": "Optional csv of 0x wallet addresses for kind=predictions scope=positions (merged with the stored Polymarket funder; capped at 10). Omit to read the connected wallets only."
},
"category": {
"type": "string",
"description": "Optional market scope for kind=order|open_orders: spot|linear. Omit to search both on perp venues."
},
"exchange": {
"type": "string",
"description": "Venue slug for kind=market (e.g. binance). For positions|balances|open_orders, narrows to one venue; omit to read every connection."
},
"token_id": {
"type": "string",
"description": "Outcome token id for kind=predictions scope=quote: Polymarket CTF clobTokenId (orderbook + tick-size + taker-delay) or Opinion token id (latest price)."
},
"market_id": {
"type": "string",
"description": "Prediction market selector for kind=predictions scope=orders|quote (and to narrow positions): Polymarket conditionId (0x…), slug, or numeric id; Opinion market id."
},
"withExits": {
"type": "boolean",
"description": "Accepted for backward compatibility (older CLI versions send it): positions reads always carry their resting venue-native exit legs as exits[] with TP/SL triggers across all CEX venues, or exitsUnknown:true when the stops book could not be read. Other venues ignore it."
},
"connectionId": {
"type": "string",
"description": "CEX connection id for positions|balances|open_orders (see list_connections). Omit to read every active connection. REQUIRED for kind=order (an order id is connection-scoped)."
},
"max_age_seconds": {
"type": "number",
"description": "Optional freshness bound. The executor prefers its already-fetched value when it is younger than this; otherwise it reads again."
}
},
"additionalProperties": false
}READ-ONLY: fetch the latest crypto headlines as keyword-matched news clusters for fundamentals analysis (ETF flows, unlocks, macro, hacks — read the headlines here, act through a propose_* tool). Optional pair (BTC, ETH, or SOL — also accepts BTC/USDT or BTC-USD forms) narrows to that asset's keywords; omit it for all three. Returns the top clusters newest-first with per-item source links and recency (publishedAt + ageHrs) plus a fetch timestamp; quote them as 'observed at <time> from <source>'. If no headlines match, say so — NEVER invent a headline.
| Argument | Type | Description |
|---|---|---|
| pair | string | Optional asset filter: BTC, ETH, or SOL (BTC/USDT and BTC-USD forms accepted). Omit for all three. |
| limit | integer | Max items kept per asset cluster, 1..12 (default 6). |
| source | string | Optional feed filter: CoinDesk, Cointelegraph, or Decrypt (case-insensitive). Omit for all three feeds. |
| window_hrs | number | Harvest window in hours, 1..168 (default 48). |
{
"type": "object",
"required": [],
"properties": {
"pair": {
"type": "string",
"description": "Optional asset filter: BTC, ETH, or SOL (BTC/USDT and BTC-USD forms accepted). Omit for all three."
},
"limit": {
"type": "integer",
"description": "Max items kept per asset cluster, 1..12 (default 6)."
},
"source": {
"type": "string",
"description": "Optional feed filter: CoinDesk, Cointelegraph, or Decrypt (case-insensitive). Omit for all three feeds."
},
"window_hrs": {
"type": "number",
"description": "Harvest window in hours, 1..168 (default 48)."
}
},
"additionalProperties": false
}Read-only onchain wallet balances across EVM/Solana/TON/Tron/BTC via the balance cache + public RPCs. Server resolves the user's wallet addresses itself (addresses only, never keys). The chains filter uses canonical slugs and matches non-EVM chains exactly — `sol` never matches `solana`, `bitcoin` reads as `btc`; one linked EVM address is readable on any requested EVM chain. TON matches by chain slug, not address form — raw (0:…), bounceable (EQ…) and non-bounceable (UQ…) versions of one wallet resolve to the same balance.
| Argument | Type | Description |
|---|---|---|
| chains | string | Optional comma list of canonical chain slugs, e.g. ethereum,solana. Non-EVM slugs (solana, ton, tron, btc) match exactly — no aliases or substrings; ton covers every TON address version. EVM slugs expand: one linked EVM address reads on any requested EVM chain. |
{
"type": "object",
"properties": {
"chains": {
"type": "string",
"description": "Optional comma list of canonical chain slugs, e.g. ethereum,solana. Non-EVM slugs (solana, ton, tron, btc) match exactly — no aliases or substrings; ton covers every TON address version. EVM slugs expand: one linked EVM address reads on any requested EVM chain."
}
},
"additionalProperties": false
}READ-ONLY: read the user's risk posture (kill switch, autonomy level, caps, daily usage). Never edits limits — the agent must check this before proposing live size.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Counts the venue's realized LOSSES against the daily risk counters. A trade closed by the VENUE's own stop never goes through the close path, so without this the daily loss cap can never fire on it. Idempotent: each venue trade is counted exactly once, tracked in the realized-PnL ledger. Never moves funds, never places an order. Returns how many trades were counted, the loss recorded, and what was skipped and why.
| Argument | Type | Description |
|---|---|---|
| days | number | How far back to reconcile, in days, 1..30 (default 2) |
| exchange | string | CEX slug, e.g. kucoin (resolved to an active connection; connectionId wins when both are given) |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"description": "How far back to reconcile, in days, 1..30 (default 2)"
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. kucoin (resolved to an active connection; connectionId wins when both are given)"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}KuCoin reserve sweep (real money on live fire): keeps `keep` units of `currency` in the futures wallet and moves the excess futures -> main -> trade in two legs carrying the same amount. Dry-run by default (plan only, zero bytes to the venue, no YOLO gate). Live fire (dryRun:false) needs the trade:execute scope AND user YOLO eligibility (kill switch off, autonomy != propose_only). KuCoin only.
| Argument | Type | Description |
|---|---|---|
| keep | number | Units of currency to leave in futures (default 10) |
| dryRun | boolean | Plan only, moves nothing (default true). Pass false to fire both transfer legs. |
| currency | string | Settlement asset to sweep: USDT, USDC, BTC or ETH (XBT accepted as BTC; default USDT) |
| exchange* | string | CEX slug — kucoin only (resolved to an active connection; connectionId wins when both are given) |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
{
"type": "object",
"required": [
"exchange"
],
"properties": {
"keep": {
"type": "number",
"description": "Units of currency to leave in futures (default 10)"
},
"dryRun": {
"type": "boolean",
"description": "Plan only, moves nothing (default true). Pass false to fire both transfer legs."
},
"currency": {
"type": "string",
"description": "Settlement asset to sweep: USDT, USDC, BTC or ETH (XBT accepted as BTC; default USDT)"
},
"exchange": {
"type": "string",
"description": "CEX slug — kucoin only (resolved to an active connection; connectionId wins when both are given)"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
}
},
"additionalProperties": false
}Arm or replace venue-native SL and/or TP on an open CEX position (spot or futures across binance, bybit, okx, kucoin, gateio, mexc, bitget, bingx, coinbase, kraken). Clears existing stops on the pair and arms the new legs sized against the live position. Needs trade:execute + YOLO eligibility.
| Argument | Type | Description |
|---|---|---|
| pair* | string | e.g. BTC/USDT |
| market | string | Which market the open position is on (default futures). Spot needs quantity. |
| slPrice | number | Stop-loss trigger. Must sit on the loss side of the entry (long: below, short: above). |
| tpPrice | number | Take-profit trigger. Must sit on the profit side of the entry (long: above, short: below). |
| exchange* | string | CEX slug, e.g. binance, bybit, okx, kucoin, gateio, mexc, bitget, bingx, coinbase, kraken |
| quantity | number | Spot only: position size in base units (the venue reports no spot position to size against) |
| connectionId | string | CEX connection id (see list_connections). Takes precedence over exchange. |
| referencePrice | number | The price the stop and take-profit were DERIVED FROM. The server rebases both legs onto the position's ACTUAL entry price, keeping their distances, so a fill that came in better than the reference cannot leave a take-profit on the wrong side of the entry (where its trigger is already satisfied and it would close the position instantly for a fee). |
{
"type": "object",
"required": [
"exchange",
"pair"
],
"properties": {
"pair": {
"type": "string",
"description": "e.g. BTC/USDT"
},
"market": {
"enum": [
"spot",
"futures"
],
"type": "string",
"description": "Which market the open position is on (default futures). Spot needs quantity."
},
"slPrice": {
"type": "number",
"description": "Stop-loss trigger. Must sit on the loss side of the entry (long: below, short: above)."
},
"tpPrice": {
"type": "number",
"description": "Take-profit trigger. Must sit on the profit side of the entry (long: above, short: below)."
},
"exchange": {
"type": "string",
"description": "CEX slug, e.g. binance, bybit, okx, kucoin, gateio, mexc, bitget, bingx, coinbase, kraken"
},
"quantity": {
"type": "number",
"description": "Spot only: position size in base units (the venue reports no spot position to size against)"
},
"connectionId": {
"type": "string",
"description": "CEX connection id (see list_connections). Takes precedence over exchange."
},
"referencePrice": {
"type": "number",
"description": "The price the stop and take-profit were DERIVED FROM. The server rebases both legs onto the position's ACTUAL entry price, keeping their distances, so a fill that came in better than the reference cannot leave a take-profit on the wrong side of the entry (where its trigger is already satisfied and it would close the position instantly for a fee)."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 9, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.