MCP Tool Reference (full auto-generated)¶
auto-generated
This file is auto-generated by the FutuOpenD-rs build pipeline and refreshed with every daemon release.
This page documents all 78 tools: scope / Python SDK
equivalent / parameters / alias support / enum dual-accept (int OR string) /
deny_unknown_fields behavior / runtime validate rules / JSON-RPC call example.
Conventions¶
- Scope: what permission is required (
qot:read/acc:read/trade:real | trade:simulate/trade:unlock). The MCP key'sscopesarray must cover it. Otherwise MCP returnsCallToolResult.is_error=true+{"error": "unknown MCP tool \"…\"", "status": "error"}orunauthorized. - Python SDK equivalent: the corresponding py-futu-api method, to ease Python migration.
- Required column:
✅means the field is required✓ default \xxx`means serde has#[serde(default = "xxx")]` fallback—meansOption<T>, may be omitted
- Alias: synonym field names retained for py-futu-api / legacy client compatibility. Deprecated — new code should use the canonical name (the first column header).
- Unknown fields:
deny_unknown_fieldsis enforced — typo'd field names (e.g.stockvs the new canonicalsymbol) return anunknown fielderror instead of silently dropping (defends against the silent-success anti-pattern). - Enum dual-accept: fields like
market/sub_types/order_type/kl_type/op(price reminder) accept integer enum values and string names simultaneously. Per-field accepted values are listed in the field description. - Responses: all tools return JSON text; on failure, the MCP protocol
layer sets
is_error=trueand the content carries{"error": "...", "status": "error"}.
Common error codes¶
| Error | Typical source |
|---|---|
unknown MCP tool \"…\" |
tool name typo, or this daemon version does not support the tool (check futu-opend --version) |
unauthorized |
API key lacks the required scope |
gateway connect failed: … |
futu-opend not running / wrong port |
unknown field \"…\" |
deny_unknown_fields triggered (typo'd field name) |
backend proto error (ret_type != 0) |
raw JSON envelope's ret_msg carries the concrete reason |
Quick index¶
- Core / Status — 8 tool(s)
- Quote Subscription — 4 tool(s)
- Quote Queries — 20 tool(s)
- Plates & Filters — 5 tool(s)
- Reference / Derivatives — 5 tool(s)
- Watchlist / Price Reminders — 5 tool(s)
- Trading Accounts (Read-only) — 22 tool(s)
- Trade Write (
--enable-tradingrequired) — 6 tool(s) - Account Push Subscription — 3 tool(s)
Core / Status¶
futu_ping¶
- Scope:
qot:read - Python SDK equivalent:
— (gateway-local, no SDK equivalent) - Route: MCP JSON-RPC
tools/callwith name ="futu_ping"
Description:
Ping the Futu gateway. Returns RTT and connection status.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_ping",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_global_state¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_global_state - Route: MCP JSON-RPC
tools/callwith name ="futu_get_global_state"
Description:
Get gateway global state: per-market trading status, server version / time, quote & trade login status. Python SDK: OpenContext.get_global_state.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_global_state",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_user_info¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_user_info - Route: MCP JSON-RPC
tools/callwith name ="futu_get_user_info"
Description:
Get user info: nickname, per-market quote permissions, subscribe quota, history-K quota. Python SDK: OpenContext.get_user_info.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_user_info",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_quote_rights¶
- Scope:
qot:read - Python SDK equivalent:
— (gateway user profile / quote-right display surface) - Route: MCP JSON-RPC
tools/callwith name ="futu_get_quote_rights"
Description:
Get quote-rights profile grouped like Futu OpenD GUI: HK/US/CN/SG/JP/crypto permissions, raw values, labels and quota. Set refresh=true to trigger request_highest_quote_right first.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
refresh |
boolean? | — | — | If true, trigger request_highest_quote_right before querying |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_quote_rights",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_delay_statistics¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_delay_statistics - Route: MCP JSON-RPC
tools/callwith name ="futu_get_delay_statistics"
Description:
Get delay-statistics summary: counts of quote-push / request-reply / place-order samples. Python SDK: OpenContext.get_delay_statistics. For raw per-segment buckets use REST /api/delay-statistics.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_delay_statistics",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_token_state¶
- Scope:
acc:read - Python SDK equivalent:
— (gateway local token diagnostics) - Route: MCP JSON-RPC
tools/callwith name ="futu_get_token_state"
Description:
Query Futu Token / moomoo Token enable + bind state. Returns 4 fields: nn_token_enable, nn_token_bind, mm_token_enable, mm_token_bind (1=enabled/bound, 0=disabled/unbound). Use case: when /api/unlock-trade fails with -20011 ("please enable Futu Token"), call this tool first to diagnose which side is missing token binding.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_token_state",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_risk_free_rate¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_risk_free_rate - Route: MCP JSON-RPC
tools/callwith name ="futu_get_risk_free_rate"
Description:
Risk-free rate for HK / US / JP markets (option pricing baseline, e.g. Black-Scholes). Returns rate as percent (e.g. 4.5) plus raw uint64 (×10^9). Useful for pricing options or computing implied volatility / cost of carry.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_risk_free_rate",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_spread_table¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_spread_table - Route: MCP JSON-RPC
tools/callwith name ="futu_get_spread_table"
Description:
Get full spread tables (price tick rules per market). Returns spread_table_list with spread_code + price intervals (price_from / price_to / value, in actual decimals). Useful for client-side price validation before PlaceOrder / ModifyOrder.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_spread_table",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Quote Subscription¶
futu_subscribe¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.subscribe - Route: MCP JSON-RPC
tools/callwith name ="futu_subscribe"
Description:
Subscribe market data for given symbols + sub_types. Push data arrives via SSE notifications (HTTP mode). Python SDK: OpenQuoteContext.subscribe.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Security symbols to subscribe, e.g. ["HK.00700", "US.AAPL"]. Alias: stocks / code_list / symbol_list / security_list |
sub_types |
array of i32 | ✅ | sub_type_list |
Sub-type ids to subscribe. Accept int (1=Basic, 2=OrderBook, 4=Ticker, 5=RT, 6=KL_Day, 7=KL_5Min, 8=KL_15Min, 9=KL_30Min, 10=KL_60Min, 11=KL_1Min, 12=KL_Week, 13=KL_Month, 14=Broker, 15=KL_Quarter, 16=KL_Year, 17=KL_3Min) OR string ("Basic" / "OrderBook" / "KL_Day" / "day" / ...). Alias: sub_type_list. v1.4.84 §5 B2 双接. v1.4.104 eli S-006 P1 fix: 修正 int 表 对齐 daemon proto (Qot_Common.SubType: 跳 3=None, 4=Ticker, 10=KL_60Min, 13=KL_Month). 之前 schema 描述 10=KL_Month 与 daemon 不一致, agent 按 schema 数字 10 调用实际订到 KL_60Min. Enum double-accept: Array of SubType enum values; each item accepts integer or string (Basic / OrderBook / KL_Day / KL_1Min / KL_5Min / ...) |
is_first_push |
boolean | ✓ default default_is_first_push |
— | If true, backend pushes current snapshot immediately after subscribe (useful for agents needing warm state). Default true. |
is_reg_push |
boolean | ✓ default default_is_reg_push |
— | If true, register push on this connection (agent will receive push via SSE notification in HTTP mode). Default true. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_subscribe",
"arguments": {
"symbols": [
"HK.00700"
],
"sub_types": [
"Basic",
"OrderBook"
],
"is_first_push": true,
"is_reg_push": true
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_unsubscribe¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.unsubscribe - Route: MCP JSON-RPC
tools/callwith name ="futu_unsubscribe"
Description:
Unsubscribe market data (by symbol+type, or unsub_all to clear this connection). Python SDK: OpenQuoteContext.unsubscribe / unsubscribe_all.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✓ default default |
stocks, code_list, symbol_list, security_list |
Security symbols to unsubscribe (ignored if unsub_all=true); alias: stocks / code_list / symbol_list / security_list |
sub_types |
array of i32 | ✓ default default |
sub_type_list |
Sub-type ids to unsubscribe. Accept int (1=Basic, 2=OrderBook, 4=Ticker, 5=RT, 6=KL_Day, 7=KL_5Min, 8=KL_15Min, 9=KL_30Min, 10=KL_60Min, 11=KL_1Min, 12=KL_Week, 13=KL_Month, 14=Broker, 15=KL_Quarter, 16=KL_Year, 17=KL_3Min) OR string ("Basic" / "OrderBook" / "KL_Day" / "day" / ...). Alias: sub_type_list. v1.4.84 §5 B2 双接. v1.4.104 eli S-006 P1 fix: 修正 int 表 (proto 跳 3, 4=Ticker 不是 3=Ticker; 10=KL_60Min 不是 10=KL_Month). Enum double-accept: Array of SubType enum values; each item accepts integer or string (Basic / OrderBook / KL_Day / KL_1Min / KL_5Min / ...) |
unsub_all |
boolean | ✓ default default |
unsubscribe_all |
true=clear all subscriptions on this connection (ignores symbols/sub_types); alias: unsubscribe_all |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_unsubscribe",
"arguments": {
"symbols": [
"HK.00700"
],
"sub_types": [
"Basic",
"OrderBook"
],
"unsub_all": false
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_query_subscription¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.query_subscription - Route: MCP JSON-RPC
tools/callwith name ="futu_query_subscription"
Description:
Query current subscription state (subscribed types, quota used/remaining). Python SDK: OpenQuoteContext.query_subscription.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
is_req_all_conn |
boolean | ✓ default default |
— | true=query all connections; false=only this connection (default) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_query_subscription",
"arguments": {
"is_req_all_conn": false
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_used_quota¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_used_quota - Route: MCP JSON-RPC
tools/callwith name ="futu_get_used_quota"
Description:
Get current daemon used quota counters: subscribed quote quota and historical K-line quota. Python SDK: OpenQuoteContext.get_used_quota.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_used_quota",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Quote Queries¶
futu_get_quote¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_stock_quote - Route: MCP JSON-RPC
tools/callwith name ="futu_get_quote"
Description:
Get real-time basic quote (price, volume, turnover) for a security. Auto-subscribes SubType::Basic on first call.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL (alias: code / stock / security for SDK compat) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_quote",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_snapshot¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_market_snapshot - Route: MCP JSON-RPC
tools/callwith name ="futu_get_snapshot"
Description:
Get a security snapshot (one-shot, no subscription) with extended fields: 52-week high/low, avg price, volume ratio, amplitude, bid/ask.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL (alias: code / stock / security for SDK compat) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_snapshot",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_kline¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_cur_kline - Route: MCP JSON-RPC
tools/callwith name ="futu_get_kline"
Description:
Get historical K-line (OHLCV). Supports day/week/month/quarter/year plus ⅓/5/15/30/60 minute bars.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Security symbol (MARKET.CODE); alias: code / stock |
kl_type |
string | ✓ default default_kl_type |
ktype, k_type |
K-line type: day|week|month|quarter|year|1min|3min|5min|15min|30min|60min (alias: ktype / k_type / kl_type for SDK compat) |
count |
i32? | — | num, max_count, req_count |
Number of candles to return (default 100); alias: num / max_count / req_count |
begin |
string? | — | begin_time, from |
Start date yyyy-MM-dd (optional; default computed from count); alias: begin_time / from |
end |
string? | — | end_time, to |
End date yyyy-MM-dd (optional; default today); alias: end_time / to |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_kline",
"arguments": {
"symbol": "HK.00700",
"kl_type": "day"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_history_kline¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.request_history_kline - Route: MCP JSON-RPC
tools/callwith name ="futu_get_history_kline"
Description:
Historical K-line / OHLCV time series with rehab type control (forward/backward/none) and pagination-friendly max_count. Python SDK: OpenQuoteContext.request_history_kline.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Security symbol (MARKET.CODE); alias: code / stock |
kl_type |
string | ✓ default default_kl_type |
ktype, k_type |
K-line type: day|week|month|quarter|year|1min|3min|5min|15min|30min|60min (default day); alias: ktype / k_type |
rehab_type |
string | ✓ default default_rehab_none |
— | Rehab type: none|forward|backward (default none) |
begin |
string | ✅ | begin_time, start_time, from |
Start date yyyy-MM-dd; alias: begin_time / start_time / from |
end |
string | ✅ | end_time, to |
End date yyyy-MM-dd; alias: end_time / to |
max_count |
i32? | — | num, count, req_count |
Max number of candles to return (default 1000, range 1-1000). If omitted, the gateway uses 1000; pass explicit 0 to request no limit only when you can handle a large response. alias: num / count / req_count |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_history_kline",
"arguments": {
"symbol": "HK.00700",
"kl_type": "day",
"rehab_type": "none",
"begin": "2026-01-01",
"end": "2026-12-31",
"max_count": 100
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_orderbook¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_order_book - Route: MCP JSON-RPC
tools/callwith name ="futu_get_orderbook"
Description:
Get the order book (bids and asks with price, volume, order count). Auto-subscribes OrderBook.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol (MARKET.CODE); alias: code / stock / security |
depth |
i32 | ✓ default default_depth |
num |
Order book depth, 1-10 (default 10); alias: num |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_orderbook",
"arguments": {
"symbol": "HK.00700",
"depth": 10
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_ticker¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_rt_ticker - Route: MCP JSON-RPC
tools/callwith name ="futu_get_ticker"
Description:
Get recent ticker (trade-by-trade). Auto-subscribes Ticker.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol (MARKET.CODE); alias: code / stock / security |
count |
i32 | ✓ default default_ticker_count |
num, max_count, req_count |
Number of ticks to fetch (default 100, max 1000); alias: num / max_count / req_count |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_ticker",
"arguments": {
"symbol": "HK.00700",
"count": 100
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_rt¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_rt_data - Route: MCP JSON-RPC
tools/callwith name ="futu_get_rt"
Description:
Get intraday (RT / time-sharing) minute-by-minute price series. Auto-subscribes RT.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL (alias: code / stock / security for SDK compat) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_rt",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_static¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_stock_basicinfo - Route: MCP JSON-RPC
tools/callwith name ="futu_get_static"
Description:
Get static info (name, lot size, listing date) for one or more securities. No subscription needed.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Array of security symbols in MARKET.CODE format (e.g. ["HK.00700", "US.AAPL"]). Field name is symbols (Rust native snake_case); aliases: stocks / code_list / symbol_list / security_list for SDK compat. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_static",
"arguments": {
"symbols": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_broker¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_broker_queue - Route: MCP JSON-RPC
tools/callwith name ="futu_get_broker"
Description:
Get the broker queue (HK only). Auto-subscribes Broker.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL (alias: code / stock / security for SDK compat) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_broker",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_market_state¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_market_state - Route: MCP JSON-RPC
tools/callwith name ="futu_get_market_state"
Description:
Query current market state for a list of securities (open/closed/lunch-break etc). Python SDK: OpenQuoteContext.get_market_state.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Symbols list in MARKET.CODE format; alias: stocks / code_list / symbol_list / security_list |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_market_state",
"arguments": {
"symbols": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_capital_flow¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_capital_flow - Route: MCP JSON-RPC
tools/callwith name ="futu_get_capital_flow"
Description:
Capital flow (net inflow) time series for a security. Python SDK: OpenQuoteContext.get_capital_flow.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Security symbol in MARKET.CODE format (e.g. HK.00700); alias: code / stock |
period_type |
i32? | — | — | Period type: 1=INTRADAY 2=DAY 3=WEEK 4=MONTH (default 1) |
begin_time |
string? | — | begin, start_time, from |
Begin time 'yyyy-MM-dd' (optional, DAY/WEEK/MONTH only); alias: begin / start_time / from |
end_time |
string? | — | end, to |
End time 'yyyy-MM-dd' (optional); alias: end / to |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_capital_flow",
"arguments": {
"symbol": "HK.00700",
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_capital_distribution¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_capital_distribution - Route: MCP JSON-RPC
tools/callwith name ="futu_get_capital_distribution"
Description:
Capital distribution (super/big/mid/small order in/out flow amounts) snapshot. Python SDK: OpenQuoteContext.get_capital_distribution.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL (alias: code / stock / security for SDK compat) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_capital_distribution",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_rehab¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_rehab - Route: MCP JSON-RPC
tools/callwith name ="futu_get_rehab"
Description:
Rehab (dividend / split / bonus) events and adjustment factors. Required for long-term K-line alignment. Python SDK: OpenQuoteContext.get_rehab.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL (alias: code / stock / security for SDK compat) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_rehab",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_suspend¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_multi_points_history_kline (suspend flag) - Route: MCP JSON-RPC
tools/callwith name ="futu_get_suspend"
Description:
Suspend (trading halt) days for securities in a date range. Python SDK: OpenQuoteContext.get_suspend.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Array of security symbols in MARKET.CODE format (e.g. ["HK.00700", "HK.09988"]). Alias: stocks / code_list / symbol_list / security_list |
begin_time |
string | ✅ | begin, start_time, from |
Begin date (yyyy-MM-dd); alias: begin / start_time / from |
end_time |
string | ✅ | end, to |
End date (yyyy-MM-dd); alias: end / to |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_suspend",
"arguments": {
"symbols": [
"HK.00700"
],
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_trading_days¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.request_trading_days - Route: MCP JSON-RPC
tools/callwith name ="futu_get_trading_days"
Description:
Trading days for a market in a date range. Python SDK: OpenQuoteContext.request_trading_days. Note: returns natural-day-minus-weekends-and-holidays, excluding temporary market closures.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
i32 | ✅ | — | Market code — Qot_Common.TradeDateMarket enum (i32, NOT QotMarket!): 1=HK, 2=US, 3=CN, 4=NorthboundSZ/SH, 5=SouthboundHK, 6=JP_Future, 7=SG_Future. Different from QotMarket (ipo_list/stock_filter use 1=HK 11=US 21=SH 22=SZ). v1.4.30 P3 documented inconsistency. |
begin_time |
string | ✅ | begin, start_time, from |
Begin date (yyyy-MM-dd); alias: begin / start_time / from |
end_time |
string | ✅ | end, to |
End date (yyyy-MM-dd); alias: end / to |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_trading_days",
"arguments": {
"market": "HK",
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_history_kl_quota¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_history_kl_quota - Route: MCP JSON-RPC
tools/callwith name ="futu_get_history_kl_quota"
Description:
Historical K-line download quota (used / remain). Python SDK: OpenQuoteContext.get_history_kl_quota.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
get_detail |
boolean | ✓ default default |
— | Whether to fetch detailed per-symbol download history (default false) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_history_kl_quota",
"arguments": {
"get_detail": false
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_holding_change¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_holding_change_list - Route: MCP JSON-RPC
tools/callwith name ="futu_get_holding_change"
Description:
Top-holder share change list (institution / fund / executive). Python SDK: OpenQuoteContext.get_holding_change_list.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Underlying stock symbol (e.g. HK.00700, US.AAPL); alias: code / stock |
holder_category |
i32 | ✅ | category |
Holder category: 1=Institution, 2=Fund, 3=Executive; alias: category |
begin_time |
string? | — | begin, start_time, from |
Begin time YYYY-MM-DD HH:MM:SS (optional); alias: begin / start_time / from |
end_time |
string? | — | end, to |
End time YYYY-MM-DD HH:MM:SS (optional); alias: end / to |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_holding_change",
"arguments": {
"symbol": "HK.00700",
"holder_category": 1,
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_code_change¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_code_change - Route: MCP JSON-RPC
tools/callwith name ="futu_get_code_change"
Description:
Code change / temporary-ticker info (currently HK market only). Python SDK: OpenQuoteContext.get_code_change.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Security symbols to query (currently HK only); alias: stocks / code_list / symbol_list / security_list |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_code_change",
"arguments": {
"symbols": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_ticker_statistic¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_ticker_statistic - Route: MCP JSON-RPC
tools/callwith name ="futu_get_ticker_statistic"
Description:
Per-stock ticker statistic (avg_price / volume / buy_volume / sell_volume / neutral_volume / trade_num). Symbol format: 'HK.00700' / 'US.AAPL'. Pre-condition: must subscribe / get_static_info first to populate stock_id in static_cache. ticker_type: 0=ALL, 1=BUY, 2=SELL, 3=BUY_AND_SELL, 4=NEUTRAL. stat_type: 0=ALL, 1=BEFORE, 2=TRADING, 3=AFTER (market session).
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL |
ticker_type |
i32? | — | — | Ticker type filter: 0=ALL, 1=BUY, 2=SELL, 3=BUY_AND_SELL, 4=NEUTRAL (default ALL) |
stat_type |
u32? | — | — | Market session: 0=ALL, 1=BEFORE, 2=TRADING, 3=AFTER (default ALL) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_ticker_statistic",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_ticker_statistic_detail¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_ticker_statistic_detail - Route: MCP JSON-RPC
tools/callwith name ="futu_get_ticker_statistic_detail"
Description:
Per-stock ticker statistic detail (price-level distribution). Companion of futu_get_ticker_statistic. Typical flow: (1) call futu_get_ticker_statistic to get ticker_time + summary stats, (2) call this tool with same ticker_time to get DetailItem list (price / buy_volume / sell_volume / volume / ratio / neutral_volume per price level). Symbol format: 'HK.00700' / 'US.AAPL'. Pre-condition: must subscribe / get_static_info first to populate stock_id in static_cache. ticker_type: 0=ALL, 1=BUY, 2=SELL, 3=BUY_AND_SELL, 4=NEUTRAL. stat_type: 0=ALL, 1=BEFORE, 2=TRADING, 3=AFTER. select_num: 0=all levels, 1..N=top N (backend max ~100). data_from / data_max_count: pagination.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock, security |
Security symbol in MARKET.CODE format, e.g. HK.00700, US.AAPL |
ticker_type |
i32? | — | — | Ticker type filter: 0=ALL, 1=BUY, 2=SELL, 3=BUY_AND_SELL, 4=NEUTRAL (default ALL) |
ticker_time |
u64? | — | — | Ticker timestamp (ms) — usually from prior futu_get_ticker_statistic call. 0 / omit = use backend latest available. |
select_num |
u32? | — | — | Filter type: 0=all price levels, 1..N=top N levels (backend max ~100) |
data_from |
u32? | — | — | Pagination start offset (default 0) |
data_max_count |
u32? | — | — | Pagination size, max items returned (default 20) |
stat_type |
u32? | — | — | Market session: 0=ALL, 1=BEFORE, 2=TRADING, 3=AFTER (default ALL) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_ticker_statistic_detail",
"arguments": {
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Plates & Filters¶
futu_list_plates¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_plate_list - Route: MCP JSON-RPC
tools/callwith name ="futu_list_plates"
Description:
List plates by market and set type (industry / region / concept / all).
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Market: HK|HK_FUTURE|US|SH|SZ |
plate_set |
string | ✓ default default_plate_set |
plate_set_type |
Plate set: all|industry|region|concept (default all); alias: plate_set_type |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_list_plates",
"arguments": {
"market": "HK",
"plate_set": "all"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_plate_stocks¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_plate_stock - Route: MCP JSON-RPC
tools/callwith name ="futu_plate_stocks"
Description:
List constituent securities of a plate.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
plate |
string | ✅ | symbol, code, plate_code |
Plate symbol, MARKET.CODE format (e.g. HK.LIST1001); alias: symbol / code / plate_code |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_plate_stocks",
"arguments": {
"plate": "HK.LIST1001"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_owner_plate¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_owner_plate - Route: MCP JSON-RPC
tools/callwith name ="futu_get_owner_plate"
Description:
List plates (industry/concept/region) that contain given stocks. Python SDK: OpenQuoteContext.get_owner_plate.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Array of security symbols in MARKET.CODE format (e.g. ["HK.00700", "US.AAPL"]). Field name is symbols (Rust native snake_case); aliases: stocks / code_list / symbol_list / security_list for SDK compat. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_owner_plate",
"arguments": {
"symbols": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_stock_filter¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_stock_filter - Route: MCP JSON-RPC
tools/callwith name ="futu_get_stock_filter"
Description:
Stock filter / scanner (minimal: market + pagination). Python SDK: OpenQuoteContext.get_stock_filter. For condition-based filters (PE/cap/volume/etc.) use REST /api/stock-filter directly.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
i32 | ✅ | — | Market code — Qot_Common.QotMarket enum. Accept int (1=HK, 11=US, 21=SH, 22=SZ) OR string ("HK" / "US" / ...). v1.4.84 §5 B2 双接. Enum double-accept: Accepts integer QotMarket enum or market string (1=HK, 11=US, 21=SH/CN, 22=SZ, 31=SG, 41=JP, 51=AU, 61=MY, 71=CA, 81=FX) |
begin |
i32 | ✓ default default |
offset, skip |
Pagination begin index (default 0); alias: offset / skip |
num |
i32 | ✓ default default_stock_filter_num |
count, max_count, req_count |
Max rows (1-200, default 50); alias: count / max_count / req_count |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_stock_filter",
"arguments": {
"market": "HK",
"begin": "2026-01-01",
"num": 50
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_ipo_list¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_ipo_list - Route: MCP JSON-RPC
tools/callwith name ="futu_get_ipo_list"
Description:
Upcoming / recent IPOs for a market. Python SDK: OpenQuoteContext.get_ipo_list. market: 1=HK, 11=US, 21=SH, 22=SZ.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
i32 | ✅ | — | Market code — Qot_Common.QotMarket enum. Accept int (1=HK, 11=US, 21=SH, 22=SZ) OR string ("HK" / "US" / "SH" / "SZ" / ...). v1.4.84 §5 B2 双接. Enum double-accept: Accepts integer QotMarket enum or market string (1=HK, 11=US, 21=SH/CN, 22=SZ, 31=SG, 41=JP, 51=AU, 61=MY, 71=CA, 81=FX) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_ipo_list",
"arguments": {
"market": "HK"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Reference / Derivatives¶
futu_get_reference¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_referencestock_list - Route: MCP JSON-RPC
tools/callwith name ="futu_get_reference"
Description:
Related securities of an underlying: list all warrants/futures/options derived from a given stock. Python SDK: OpenQuoteContext.get_referencestock_list.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Underlying symbol (e.g. HK.00700, US.AAPL); alias: code / stock |
reference_type |
string | ✓ default default_reference_type |
— | Reference type: warrant|future (default warrant). Note: option is NOT supported — use futu_get_option_chain instead. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_reference",
"arguments": {
"symbol": "HK.00700",
"reference_type": "warrant"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_warrant¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_warrant - Route: MCP JSON-RPC
tools/callwith name ="futu_get_warrant"
Description:
List warrants on an underlying stock (or whole-market when owner_symbol omitted), sorted by volume desc. Python SDK: OpenQuoteContext.get_warrant. For advanced filtering (strike/premium/delta/etc.) use REST /api/warrant directly.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
owner_symbol |
string? | — | symbol, owner, code |
Underlying stock symbol (e.g. HK.00700); None = whole-market warrants. Alias: symbol / owner / code |
begin |
i32 | ✓ default default |
offset, skip |
Pagination begin index (default 0); alias: offset / skip |
num |
i32 | ✓ default default_warrant_num |
count, max_count, req_count |
Max rows (1-200, default 20); alias: count / max_count / req_count |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_warrant",
"arguments": {
"owner_symbol": "HK.00700",
"begin": "2026-01-01",
"num": 20
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_option_chain¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_option_chain - Route: MCP JSON-RPC
tools/callwith name ="futu_get_option_chain"
Description:
Option chain of an underlying stock within an expiry date range, grouped by strike time with call/put symbol lists. Python SDK: OpenQuoteContext.get_option_chain.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
owner_symbol |
string | ✅ | symbol, owner, code, stock |
Underlying stock symbol (e.g. HK.00700, US.AAPL); alias: symbol / owner / code / stock |
begin_time |
string | ✅ | begin, start_time, from |
Expiry range begin date yyyy-MM-dd; alias: begin / start_time / from |
end_time |
string | ✅ | end, to |
Expiry range end date yyyy-MM-dd; alias: end / to |
option_type |
string? | — | — | Option type: all|call|put (default all) |
delta_min |
float? | — | — | Optional Greek filter: only return options with delta in [min, max]. Typical ATM range: 0.3 to 0.7 for calls, -0.7 to -0.3 for puts. |
delta_max |
float? | — | — | See delta_min. |
iv_min |
float? | — | — | Implied volatility filter min (decimal, e.g. 0.3 = 30%). |
iv_max |
float? | — | — | See iv_min. |
oi_min |
float? | — | — | Open interest (contracts) filter min, integer. |
oi_max |
float? | — | — | See oi_min. |
gamma_min |
float? | — | — | Gamma filter min (decimal). |
gamma_max |
float? | — | — | See gamma_min. |
vega_min |
float? | — | — | Vega filter min (decimal). |
vega_max |
float? | — | — | See vega_min. |
theta_min |
float? | — | — | Theta filter min (decimal). |
theta_max |
float? | — | — | See theta_min. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_option_chain",
"arguments": {
"owner_symbol": "HK.00700",
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_option_expiration_date¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_option_expiration_date - Route: MCP JSON-RPC
tools/callwith name ="futu_get_option_expiration_date"
Description:
Option expiration-date list for an underlying (HSI / HSCEI or HK/US equity). Python SDK: OpenQuoteContext.get_option_expiration_date.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
owner_symbol |
string | ✅ | symbol, owner, code, stock |
Underlying stock symbol (HK/US equities + HSI/HSCEI only); alias: symbol / owner / code / stock |
index_option_type |
i32? | — | — | For index options only: Qot_Common::IndexOptionType (optional) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_option_expiration_date",
"arguments": {
"owner_symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_future_info¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_future_info - Route: MCP JSON-RPC
tools/callwith name ="futu_get_future_info"
Description:
Future contract info (contract size, last trade date, trading hours). Python SDK: OpenQuoteContext.get_future_info.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Array of future contract symbols in MARKET.CODE format (e.g. ["HK.HSImain", "US.MNQmain"]). Alias: stocks / code_list / symbol_list / security_list |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_future_info",
"arguments": {
"symbols": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Watchlist / Price Reminders¶
futu_get_user_security_group¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_user_security_group - Route: MCP JSON-RPC
tools/callwith name ="futu_get_user_security_group"
Description:
List the user's custom + system watchlist groups. Python SDK: OpenQuoteContext.get_user_security_group. group_type: 1=all, 2=custom, 3=system.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
group_type |
i32 | ✓ default default_user_security_group_type |
— | Group type: 1=all, 2=custom, 3=system (default 1) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_user_security_group",
"arguments": {
"group_type": 1
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_user_security¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_user_security - Route: MCP JSON-RPC
tools/callwith name ="futu_get_user_security"
Description:
List securities in a user watchlist group. Python SDK: OpenQuoteContext.get_user_security. Use futu_get_user_security_group to find available group names.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
group_name |
string | ✅ | group, name |
Watchlist group name (use futu_get_user_security_group to list groups); alias: group / name |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_user_security",
"arguments": {
"group_name": "WATCHLIST1"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_modify_user_security¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.modify_user_security - Route: MCP JSON-RPC
tools/callwith name ="futu_modify_user_security"
Description:
Modify watchlist group — add / delete / move-out stocks. op is an INTEGER (not a string literal): 1=AddInto, 2=Delete-from-group, 3=MoveOut. Python SDK: OpenQuoteContext.modify_user_security.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
group_name |
string | ✅ | group, name |
Watchlist group name; alias: group / name |
op |
i32 | ✅ | op_type, operation |
Op: 1=AddInto, 2=Delete (from this group), 3=MoveOut; alias: op_type / operation |
symbols |
array of string | ✅ | stocks, code_list, symbol_list, security_list |
Security symbols to add/delete/move; alias: stocks / code_list / symbol_list / security_list |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_modify_user_security",
"arguments": {
"group_name": "WATCHLIST1",
"op": 1,
"symbols": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_set_price_reminder¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.set_price_reminder - Route: MCP JSON-RPC
tools/callwith name ="futu_set_price_reminder"
Description:
Set price reminder. op accepts integer code 1-6 (1=Add, 2=Del, 3=Enable, 4=Disable, 5=Modify, 6=DeleteAll); MCP also accepts string aliases Add/Del/Enable/Disable/Modify/DeleteAll (and legacy SetAdd/SetDel/SetEnable/SetDisable/DelAll). Add (op=1) requires reminder_type + freq + value. Modify (op=5) requires key (other fields preserved when omitted). Python SDK: OpenQuoteContext.set_price_reminder.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Security symbol (e.g. "HK.00700"). Field aliases: code / stock (deprecated — prefer canonical symbol). |
op |
i32 | ✅ | op_type, operation |
Op: 1=Add / SetAdd, 2=Del / SetDel, 3=Enable / SetEnable, 4=Disable / SetDisable, 5=Modify, 6=DeleteAll / DelAll. Accepts integer code OR string form (e.g. 1 or "Add"). Aliases for the field name: op_type / operation (deprecated — prefer canonical op).Enum double-accept: Accepts integer op code (1-6) or string (Add / Del / Enable / Disable / Modify / DeleteAll and SetAdd aliases) |
key |
i64? | — | — | Reminder key (from get_price_reminder; required for modify/del/enable/disable) |
reminder_type |
i32? | — | — | Qot_Common::PriceReminderType: 1=PriceUp, 2=PriceDown, 3=ChangeRateUp, 4=ChangeRateDown, 5=5MinChangeRateUp, 6=5MinChangeRateDown, 7=VolumeUp, 8=TurnoverUp, 9=TurnoverRateUp, 10=BidPriceUp, 11=AskPriceDown, 12=BidVolUp, 13=AskVolUp, 14=3MinChangeRateUp, 15=3MinChangeRateDown. |
freq |
i32? | — | — | Qot_Common::PriceReminderFreq: 1=Always, 2=OncePerDay, 3=Once. Required for op=1 (Add) — the gateway rejects Add without freq. Optional for op=5 (Modify) / ⅔/4 (Del/Enable/Disable) where the backend preserves the existing value when omitted. |
value |
float? | — | — | Threshold value (required for Add/Modify) |
note |
string? | — | — | User note (optional). Maximum length: 40 half-width bytes (~20 CN characters or 40 ASCII characters) using UTF-16 half-/full-width counting (each ASCII code unit = 1 byte, each non-ASCII code unit = 2 bytes). |
reminder_session_list |
array of i32 | ✓ default default |
— | Reminder session list (PriceReminderMarketStatus: 1=Open, 2=USPre, 3=USAfter, 4=USOverNight). For US stocks, an empty list defaults to [Open, USPre, USAfter]; for non-US securities the list is cleared. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).Runtime validation: this request type has a
validate()method that adds runtime required-field / enum-value validation on top of the JSON schema.Runtime validation for op-conditional required fields. Required fields by op: - op=1 (Add):
reminder_type+freq+value- op=5 (Modify):key(other fields are optional and the backend preserves the existing value when omitted) - op=⅔/4 (Del / Enable / Disable):key- op=6 (DeleteAll): no extra required fields ReturnsErr(String)with a human-readable hint for the agent / SDK user when validation fails.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_set_price_reminder",
"arguments": {
"symbol": "HK.00700",
"op": 1,
"reminder_session_list": []
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_price_reminder¶
- Scope:
qot:read - Python SDK equivalent:
OpenQuoteContext.get_price_reminder - Route: MCP JSON-RPC
tools/callwith name ="futu_get_price_reminder"
Description:
Query price reminders (by symbol or market). Python SDK: OpenQuoteContext.get_price_reminder.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string? | — | code, stock |
Security symbol (MARKET.CODE, e.g. HK.00700). Exactly one of symbol or market must be set. Passing both: symbol wins. Passing neither returns an error. v1.4.30 P3: schema-level oneOf not enforceable via serde; runtime check in handler. Alias: code / stock |
market |
i32? | — | — | Market code — Qot_Common.QotMarket enum. Accept int (1=HK, 11=US, 21=CN) OR string ("HK" / "US" / "CN"). Exactly one of symbol or market required (see symbol field doc). v1.4.84 §5 B2 双接.Enum double-accept: Accepts integer QotMarket enum OR market string; Optional field |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).Runtime validation: this request type has a
validate()method that adds runtime required-field / enum-value validation on top of the JSON schema.v1.4.84 §5 B4: runtime validate — symbol XOR market required. v1.4.30 P3: schema-level oneOf 不可能通过 serde 强制 (Option
模型无法 表达 "exactly one of"). runtime check 返清晰错误.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_price_reminder",
"arguments": {
"symbol": "HK.00700",
"market": "HK"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Trading Accounts (Read-only)¶
futu_list_accounts¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_acc_list - Route: MCP JSON-RPC
tools/callwith name ="futu_list_accounts"
Description:
List all trading accounts (real + simulate) visible to the gateway login.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_list_accounts",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_funds¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.accinfo_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_funds"
Description:
Get account funds summary (total assets, cash, market value, buying power) for a given account + market.\n\n Cash semantics: top-level cash field is backend's summary cash in the response currency (i.e. union_currency for futures/universal, primary market currency for legacy accounts). It is NOT the sum of cash_info_list[].cash across currencies (different currencies cannot be summed without FX conversion). For per-currency breakdown, read cash_info_list. To match Futu mobile app's '现金总值 in HKD' display, client-side compute sum(cash_info_list[i].cash * fx_rate(currency[i], HKD)) — daemon does not perform FX aggregation.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. card_num accepts the 4-digit suffix shown in the App or the full 16-digit card number. |
card_num |
string? | — | — | App-visible card number. Accepts 4-digit suffix or 16-digit full card number. Either acc_id OR card_num is required; if both are passed, daemon validates they refer to the same account. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
api_key |
string? | — | — | Optional per-call API key plaintext. Same priority as PlaceOrderReq.api_key: tool args > HTTP Bearer > startup. Use to scope this call to a specific narrow key. |
currency |
string? | — | — | Optional currency for fund response unit (HKD|USD|CNH|JPY|SGD|AUD|CAD|MYR|USDT). If omitted, daemon uses the broker/account default view currency. Explicit values are validated against the account; single-market accounts may ignore explicit currency and return their base currency. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_funds",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_positions¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.position_list_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_positions"
Description:
Get current positions (holdings) for an account in a given market.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. card_num accepts the 4-digit suffix shown in the App or the full 16-digit card number. |
card_num |
string? | — | — | App-visible card number. Accepts 4-digit suffix or 16-digit full card number. Either acc_id OR card_num is required; if both are passed, daemon validates they refer to the same account. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
api_key |
string? | — | — | Optional per-call API key plaintext. Same priority as PlaceOrderReq.api_key: tool args > HTTP Bearer > startup. Use to scope this call to a specific narrow key. |
currency |
string? | — | — | Optional currency for fund response unit (HKD|USD|CNH|JPY|SGD|AUD|CAD|MYR|USDT). If omitted, daemon uses the broker/account default view currency. Explicit values are validated against the account; single-market accounts may ignore explicit currency and return their base currency. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_positions",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_orders¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.order_list_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_orders"
Description:
Get today's orders (including pending / filled / cancelled) for an account in a given market.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. card_num accepts the 4-digit suffix shown in the App or the full 16-digit card number. |
card_num |
string? | — | — | App-visible card number. Accepts 4-digit suffix or 16-digit full card number. Either acc_id OR card_num is required; if both are passed, daemon validates they refer to the same account. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
api_key |
string? | — | — | Optional per-call API key plaintext. Same priority as PlaceOrderReq.api_key: tool args > HTTP Bearer > startup. Use to scope this call to a specific narrow key. |
currency |
string? | — | — | Optional currency for fund response unit (HKD|USD|CNH|JPY|SGD|AUD|CAD|MYR|USDT). If omitted, daemon uses the broker/account default view currency. Explicit values are validated against the account; single-market accounts may ignore explicit currency and return their base currency. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_orders",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_deals¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.deal_list_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_deals"
Description:
Get today's deals / order fills for an account in a given market.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. card_num accepts the 4-digit suffix shown in the App or the full 16-digit card number. |
card_num |
string? | — | — | App-visible card number. Accepts 4-digit suffix or 16-digit full card number. Either acc_id OR card_num is required; if both are passed, daemon validates they refer to the same account. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
api_key |
string? | — | — | Optional per-call API key plaintext. Same priority as PlaceOrderReq.api_key: tool args > HTTP Bearer > startup. Use to scope this call to a specific narrow key. |
currency |
string? | — | — | Optional currency for fund response unit (HKD|USD|CNH|JPY|SGD|AUD|CAD|MYR|USDT). If omitted, daemon uses the broker/account default view currency. Explicit values are validated against the account; single-market accounts may ignore explicit currency and return their base currency. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_deals",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_order_fee¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.order_fee_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_order_fee"
Description:
Query order fee breakdown (commission / platform fee / stamp duty) by order_id_ex list. Python SDK: OpenTradeContext.order_fee_query.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
order_id_ex_list |
array of string | ✅ | order_ids_ex, order_ids |
Order_id_ex list (strings) — returned by place_order response; alias: order_ids_ex / order_ids |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_order_fee",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"order_id_ex_list": []
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_max_trd_qtys¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.acctradinginfo_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_max_trd_qtys"
Description:
Max buy/sell/short/buy-back qtys before placing an order. Python SDK: OpenTradeContext.acctradinginfo_query. For NORMAL (limit) orders, price is required. order_type aligns with Trd_Common.OrderType enum (1=limit, 2=market, etc).
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
order_type |
i32 | ✅ | — | Order type. Accepts both INTEGER (1=NORMAL/limit, 2=MARKET, 5=AUCTION, 6=ABSOLUTE_LIMIT, 7=SPECIAL_LIMIT) and STRING enum (NORMAL|MARKET|AUCTION|ABSOLUTE_LIMIT|SPECIAL_LIMIT). Example: 1 or "NORMAL". Enum double-accept: Accepts integer or OrderType enum string (NORMAL|LIMIT|MARKET|ABSOLUTE_LIMIT|AUCTION|AUCTION_LIMIT|SPECIAL_LIMIT) |
code |
string | ✅ | symbol, stock |
Security code WITHOUT market prefix (e.g. 00700 / AAPL); alias: symbol / stock |
price |
float | ✅ | — | Limit price (pass 0.0 for market orders) |
order_id |
u64? | — | — | Existing order_id (for modify-order max-qty calc, optional) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_max_trd_qtys",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"order_type": "NORMAL",
"code": "00700",
"price": 300.0,
"order_id": "123456789"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_margin_ratio¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_margin_ratio - Route: MCP JSON-RPC
tools/callwith name ="futu_get_margin_ratio"
Description:
Query margin ratio (long/short permissions, short-pool remaining, long/short initial margin ratios) by symbol list. Python SDK: OpenTradeContext.get_margin_ratio.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
codes |
array of string | ✅ | symbols, code_list, symbol_list |
Symbols in MARKET.CODE format (e.g. HK.00700, US.AAPL); alias: symbols / code_list / symbol_list |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_margin_ratio",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"codes": [
"HK.00700"
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_history_orders¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.history_order_list_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_history_orders"
Description:
Query historical orders (filled / cancelled) with optional time range + code filter. Python SDK: OpenTradeContext.history_order_list_query.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
code_list |
array of string | ✓ default default |
symbols, symbol_list |
Filter by codes (empty = all). Each item is bare code without market prefix. Alias: symbols / symbol_list |
begin_time |
string? | — | begin, start_time, from |
Begin time 'yyyy-MM-dd HH |
end_time |
string? | — | end, to |
End time 'yyyy-MM-dd HH |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_history_orders",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"code_list": [
"HK.00700"
],
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_history_deals¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.history_deal_list_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_history_deals"
Description:
Query historical deals / fills with optional time range + code filter. Python SDK: OpenTradeContext.history_deal_list_query.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails. |
env |
string | ✓ default default_env |
trd_env |
Trade environment: real|simulate (default real); alias: trd_env |
code_list |
array of string | ✓ default default |
symbols, symbol_list |
Filter by codes (empty = all). Each item is bare code without market prefix. Alias: symbols / symbol_list |
begin_time |
string? | — | begin, start_time, from |
Begin time 'yyyy-MM-dd HH |
end_time |
string? | — | end, to |
End time 'yyyy-MM-dd HH |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_history_deals",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "real",
"code_list": [
"HK.00700"
],
"begin_time": "2026-01-01",
"end_time": "2026-12-31"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_acc_cash_flow¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.acc_cash_flow_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_acc_cash_flow"
Description:
Account cash-flow statement for a clearing date. Python SDK: OpenTradeContext.get_acc_cash_flow.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real); alias: trd_env |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default. |
market |
string | ✅ | — | Trade market — accepts STRING (HK / US / CN / HKCC / SG / AU / JP / MY / CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩. |
clearing_date |
string | ✅ | date, query_date |
Clearing date (yyyy-MM-dd); queries flow entries for that day; alias: date / query_date |
direction |
i32? | — | flow_direction |
Direction: 1=InFlow, 2=OutFlow, omit for both; alias: flow_direction |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_acc_cash_flow",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"clearing_date": "2026-04-20",
"direction": 1
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_flow_summary¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.acc_cash_flow_query (summary variant) - Route: MCP JSON-RPC
tools/callwith name ="futu_get_flow_summary"
Description:
Alias of futu_get_acc_cash_flow (MCP-REST naming symmetry with /api/flow-summary). Account cash-flow statement for a clearing date. Python SDK: OpenTradeContext.get_acc_cash_flow.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real); alias: trd_env |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default. |
market |
string | ✅ | — | Trade market — accepts STRING (HK / US / CN / HKCC / SG / AU / JP / MY / CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩. |
clearing_date |
string | ✅ | date, query_date |
Clearing date (yyyy-MM-dd); queries flow entries for that day; alias: date / query_date |
direction |
i32? | — | flow_direction |
Direction: 1=InFlow, 2=OutFlow, omit for both; alias: flow_direction |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_flow_summary",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"clearing_date": "2026-04-20",
"direction": 1
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_cash_log¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.cash_flow_query - Route: MCP JSON-RPC
tools/callwith name ="futu_get_cash_log"
Description:
Fetch detailed account cash log entries (mobile-driven, richer than futu_get_acc_cash_flow). Native time range, business group / currency / keyword / symbol / direction filters, cursor-based pagination. When max_cnt is omitted the daemon uses the mobile default of 50.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64). Call futu_list_accounts first. |
market |
string? | — | — | Optional legacy market hint. Accepted for backward compatibility (HK/US/CN/HKCC/SG/AU/JP/MY/CA/HKFUND/USFUND or ½/¾/6/8/15/111/112/113/123), but cash-log identity does not trust this field: daemon derives backend market from acc_id/account cache. |
begin_time |
u64? | — | — | Begin time (epoch seconds, optional) |
end_time |
u64? | — | — | End time (epoch seconds, optional) |
biz_group_id |
u32? | — | — | Business group ID filter (default all) |
biz_sub_group_id |
u32? | — | — | Business sub-group ID filter (optional; value from futu_get_biz_group sub_groups) |
in_out |
u32? | — | — | In/out direction: 1=in, 2=out, 0/omit=all |
keyword |
string? | — | — | Search keyword (optional) |
symbol |
string? | — | — | Stock symbol (e.g. AAPL.US, 00700.HK), exact match (optional) |
stock_id |
u64? | — | — | Backend stock_id filter (optional; use when available from upstream/account UI data) |
log_id |
string? | — | — | Cursor: log_id from previous response next_log_id (omit for first page) |
max_cnt |
u32? | — | — | Max entries per response (daemon uses mobile default 50 if omit) |
currency |
string? | — | — | Currency filter: CNY/HKD/USD/JPY/SGD (optional) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_cash_log",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"begin_time": "2026-01-01",
"end_time": "2026-12-31",
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_cash_detail¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.cash_flow_query (detail variant) - Route: MCP JSON-RPC
tools/callwith name ="futu_get_cash_detail"
Description:
Fetch a single cash log entry detail. Use after futu_get_cash_log; log_id comes from monthly_logs[].entries[].log_id.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) |
market |
string? | — | — | Optional legacy market hint; accepted for backward compatibility but ignored. Daemon derives backend market from acc_id/account cache. |
log_id |
string | ✅ | — | Cash log ID (from futu_get_cash_log response) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_cash_detail",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"log_id": "…"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_biz_group¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_biz_group - Route: MCP JSON-RPC
tools/callwith name ="futu_get_biz_group"
Description:
Fetch cash log business group, currency, and direction metadata for client UI filters. Returns biz_groups with sub_groups, currencies, and directions.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) |
market |
string? | — | — | Optional legacy market hint; accepted for backward compatibility but ignored. Daemon derives backend market from acc_id/account cache. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_biz_group",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_margin_info¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_margin_info - Route: MCP JSON-RPC
tools/callwith name ="futu_get_margin_info"
Description:
Per-account margin info: buying power, leverage, risk status, liquidity, HK margin fields, and mobile risk metadata. Supports HK / US / CN_AH markets (mobile cmd 3101/3102/3107). Complements futu_get_margin_ratio, which is per-security.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64). Call futu_list_accounts first. |
market |
string | ✅ | — | Market: HK / US / CN_AH (only these 3 supported; mobile cmd 3101/3102/3107). Other markets: use futu_get_margin_ratio (per-security ratio). |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_margin_info",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_account_flag¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_account_flag - Route: MCP JSON-RPC
tools/callwith name ="futu_get_account_flag"
Description:
Query account compliance flag (product access, risk disclosure, opt-in status). Common flag_id values: 5=US options, 22=derivatives disclosure, 10=fund KYC R1-R5, 16=PDT, 23=US OTC, 11=HK options. The response includes item_present and flag_value_present so clients can distinguish a missing flag record from an explicit flag_value=0.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) for per-broker routing |
flag_id |
u32 | ✅ | — | Flag ID to query. Common: 5=US 期权确认, 8=期权测评, 10=基金 KYC (R1~R5), 11=HK 期权确认, 16=PDT 风披, 22=衍生品风批 (合并新), 23=美股 OTC, 24=港股期权测评, 25=算法交易风披, 34=人脸识别风批, 46=OpenAPI 免责. Full 36+ list in proto header. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_account_flag",
"arguments": {
"env": "real",
"acc_id": 123456,
"flag_id": 0
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_bond_total_asset¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_bond_total_asset - Route: MCP JSON-RPC
tools/callwith name ="futu_get_bond_total_asset"
Description:
Bond account total asset and P&L summary for HK/US/SG bond accounts. Returns total_asset, position_incomes, today_incomes, accrued_interest, and ccy.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) for per-broker routing |
market |
string | ✅ | — | Market: HK / US / SG (仅 3 市场有债券业务) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_bond_total_asset",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_bond_single_asset¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_bond_single_asset - Route: MCP JSON-RPC
tools/callwith name ="futu_get_bond_single_asset"
Description:
Single bond position for HK/US/SG bond accounts, including market value, quantity, cost, expiry, dividend schedule, accrued interest, legacy notice fields, notice_list, currency, and price.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) for per-broker routing |
market |
string | ✅ | — | Market: HK / US / SG (仅 3 市场有债券业务) |
symbol |
string | ✅ | — | Bond symbol (债券代码, 如 HK1234 或 11000018) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_bond_single_asset",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_bond_position_list¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_bond_position_list - Route: MCP JSON-RPC
tools/callwith name ="futu_get_bond_position_list"
Description:
Bond account position list for HK/US/SG bond accounts. Returns total and bond_list items with name, symbol, market value, quantity, price, cost, incomes, accrued interest, notice, call flag, and ccy.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) for per-broker routing |
market |
string | ✅ | — | Market: HK / US / SG (仅 3 市场有债券业务) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_bond_position_list",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_bond_answer_state¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_bond_answer_state - Route: MCP JSON-RPC
tools/callwith name ="futu_get_bond_answer_state"
Description:
Query whether the user needs to answer a suitability questionnaire before bond trading. Returns need_to_answer plus notice fields such as title, content, and confirm_url.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) for per-broker routing |
market |
string | ✅ | — | Market: HK / US / SG (仅 3 市场有债券业务) |
symbol |
string | ✅ | — | Bond symbol (债券代码, 如 HK1234 或 11000018) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_bond_answer_state",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_get_bond_trade_reminder¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.get_bond_trade_reminder - Route: MCP JSON-RPC
tools/callwith name ="futu_get_bond_trade_reminder"
Description:
Bond trade reminders for buy/sell availability, complex product, high risk, and pre-qualification. Returns ReminderItem fields for tradeable, complex_product, high_risk, sell_tradeable, and pre_qualification.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env |
trd_env |
Trade env: real / simulate (default real) |
acc_id |
u64 | ✅ | — | Trading account ID (u64) for per-broker routing |
market |
string | ✅ | — | Market: HK / US / SG (仅 3 市场有债券业务) |
symbol |
string | ✅ | — | Bond symbol (债券代码, 如 HK1234 或 11000018) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_get_bond_trade_reminder",
"arguments": {
"env": "real",
"acc_id": 123456,
"market": "HK",
"symbol": "HK.00700"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Trade Write (--enable-trading required)¶
futu_place_order¶
- Scope:
trade:real | trade:simulate - Python SDK equivalent:
OpenTradeContext.place_order - Route: MCP JSON-RPC
tools/callwith name ="futu_place_order" - ⚠️ Trade write: launch
futu-mcpwith--enable-trading(real env also needs--allow-real-trading)
Description:
⚠️ REAL MONEY when env=real. Place an order on a live brokerage account. REQUIRES futu-mcp started with --enable-trading; real env additionally requires --allow-real-trading; gateway must have been unlocked via futu_unlock_trade first. Market hours requirement: OpenD does NOT pre-submit orders during closed hours — call during active session (HK 09:30-16:00 HKT, US 09:30-16:00 ET, etc.). Off-hours: use Futu/moomoo mobile APP (separate queue), not this tool. Changing order_type (AUCTION / fill_outside_rth) does NOT bypass this — server refuses identically.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. ⚠️ Call futu_list_accounts first to discover acc_id — gateway does NOT infer a default. v1.4.105 D12: alternatively pass card_num (App 显示的 4 位末尾或 16 位完整) and daemon resolves it via GetAccList. |
card_num |
string? | — | — | v1.4.105 D12: card number (App 显示卡号). Accepts 4-digit suffix (e.g. <card-suffix>, App 内显示如 "Margin Composite Account (<card-suffix>)") OR 16-digit full (e.g. <full-card-num>). 示例为 synthetic placeholder, 不是真实账户信息. Daemon resolves via GetAccList → matched acc_id. Either acc_id OR card_num required; if both passed, daemon validates resolution matches acc_id (mismatch = 400 reject). |
env |
string | ✓ default default_env_simulate |
trd_env |
Trade environment: real|simulate. Defaults to simulate for safety. Alias: trd_env |
side |
string | ✅ | trd_side |
Order side: BUY|SELL|SELL_SHORT|BUY_BACK. Alias: trd_side |
order_type |
string | ✓ default default_order_type |
— | Order type — accepts STRING enum OR INT (Trd_Common.OrderType). v1.4.90 P0-E 双接覆盖 v1.4.53 全 17 variant: NORMAL=1 (limit) | MARKET=2 | ABSOLUTE_LIMIT=5 | AUCTION=6 | AUCTION_LIMIT=7 | SPECIAL_LIMIT=8 | SPECIAL_LIMIT_ALL=9 | v1.4.53 条件单: STOP=10 (止损市价) | STOP_LIMIT=11 (止损限价) | MIT=12 (止盈触及市价) | LIT=13 (止盈触及限价) | TRAILING_STOP=14 (跟踪止损市价) | TRAILING_STOP_LIMIT=15 (跟踪止损限价) | TWAP_MARKET=16 | TWAP_LIMIT=17 | VWAP_MARKET=18 | VWAP_LIMIT=19. 条件单须搭配 stop_price / trail_type / trail_value / trail_spread 字段。alias: LIMIT → NORMAL. |
code |
string | ✅ | — | Security code WITHOUT market prefix, e.g. 00700 / AAPL / 600519 |
qty |
float | ✅ | — | Order quantity (shares / contracts) |
price |
float? | — | — | Limit price (required for NORMAL; optional for MARKET) |
api_key |
string? | — | — | Optional per-call API key override (plaintext). When set, this key is used for scope/limits/audit instead of the process-wide FUTU_MCP_API_KEY. Useful for multi-tenant scenarios where different calls should be billed / scoped to different keys. |
idempotency_key |
string? | — | — | v1.4.39: Optional idempotency key. When set, retries with the same key within 90-second TTL return the cached response WITHOUT placing a duplicate order. Example: generate a UUID per logical order intent; if agent retry fires, pass the same key. Without this field, each call places a separate order (backward-compatible with v1.4.38). |
stop_price |
float? | — | — | v1.4.53 条件单: stop / take-profit trigger price (aka aux_price). Required for STOP / STOP_LIMIT / MIT (market-if-touched) / LIT (limit-if-touched). For MIT/LIT it's the take-profit trigger. |
trail_type |
i32? | — | — | v1.4.53 trailing stop: 1=Ratio (percentage) / 2=Amount (absolute value). Only for TRAILING_STOP / TRAILING_STOP_LIMIT order types. |
trail_value |
float? | — | — | v1.4.53 trailing stop: trail percentage (if trail_type=1) or amount (if trail_type=2). |
trail_spread |
float? | — | — | v1.4.53 trailing stop limit: price spread for TRAILING_STOP_LIMIT (limit offset from trigger). |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_place_order",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "simulate",
"side": "BUY",
"order_type": "NORMAL",
"code": "00700",
"qty": 100,
"api_key": "optional-per-call-api-key",
"idempotency_key": "uuid-v4-here"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_modify_order¶
- Scope:
trade:real | trade:simulate - Python SDK equivalent:
OpenTradeContext.modify_order - Route: MCP JSON-RPC
tools/callwith name ="futu_modify_order" - ⚠️ Trade write: launch
futu-mcpwith--enable-trading(real env also needs--allow-real-trading)
Description:
⚠️ REAL MONEY when env=real. Modify an existing live order (change qty/price, cancel, disable/enable/delete). REQUIRES --enable-trading; real env needs --allow-real-trading. For simple cancel, prefer futu_cancel_order. Market hours requirement: same as futu_place_order — off-hours hit server-side refusal regardless of op.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. v1.4.105 D12: alternative is card_num. |
card_num |
string? | — | — | v1.4.105 D12: card number (4-digit suffix or 16-digit full). See PlaceOrderReq.card_num for semantics. |
env |
string | ✓ default default_env_simulate |
trd_env |
Trade environment: real|simulate (default simulate); alias: trd_env |
order_id |
string | ✅ | — | Order ID to modify. Accepts numeric orderID (integer or integer string) OR backend orderIDEx string such as FU.../FH...; string recommended for JS clients since u64 > 2^53 loses precision as JSON number. |
op |
string | ✓ default default_modify_op |
— | Modify op: NORMAL (change qty/price) | CANCEL | DISABLE | ENABLE | DELETE |
qty |
float? | — | — | New quantity (for NORMAL op) |
price |
float? | — | — | New price (for NORMAL op) |
api_key |
string? | — | — | Optional per-call API key override. See PlaceOrderReq.api_key. |
idempotency_key |
string? | — | — | v1.4.39: Optional idempotency key (90s TTL). See PlaceOrderReq.idempotency_key. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_modify_order",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "simulate",
"order_id": "123456789",
"op": "NORMAL",
"api_key": "optional-per-call-api-key",
"idempotency_key": "uuid-v4-here"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_cancel_order¶
- Scope:
trade:real | trade:simulate - Python SDK equivalent:
OpenTradeContext.modify_order(op=ModifyOrderOp.CANCEL) - Route: MCP JSON-RPC
tools/callwith name ="futu_cancel_order" - ⚠️ Trade write: launch
futu-mcpwith--enable-trading(real env also needs--allow-real-trading)
Description:
⚠️ REAL MONEY when env=real. Cancel a live order by order_id. REQUIRES --enable-trading; real env needs --allow-real-trading. Convenience wrapper over futu_modify_order with op=CANCEL. Same market-hours requirement as futu_place_order.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5 (期货下单入口). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. v1.4.105 D12: alternative is card_num. |
card_num |
string? | — | — | v1.4.105 D12: card number (4-digit suffix or 16-digit full). See PlaceOrderReq.card_num for semantics. |
env |
string | ✓ default default_env_simulate |
trd_env |
Trade environment: real|simulate (default simulate); alias: trd_env |
order_id |
string | ✅ | — | Order ID to cancel. Accepts numeric orderID (integer or integer string) OR backend orderIDEx string such as FU.../FH...; string recommended for JS clients since u64 > 2^53 loses precision as JSON number. |
api_key |
string? | — | — | Optional per-call API key override. See PlaceOrderReq.api_key. |
idempotency_key |
string? | — | — | v1.4.39: Optional idempotency key (90s TTL). See PlaceOrderReq.idempotency_key. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_cancel_order",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "simulate",
"order_id": "123456789",
"api_key": "optional-per-call-api-key",
"idempotency_key": "uuid-v4-here"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_cancel_all_order¶
- Scope:
trade:real | trade:simulate - Python SDK equivalent:
OpenTradeContext.cancel_all_order - Route: MCP JSON-RPC
tools/callwith name ="futu_cancel_all_order" - ⚠️ Trade write: launch
futu-mcpwith--enable-trading(real env also needs--allow-real-trading)
Description:
Cancel all pending orders for an account in a specific market. market is REQUIRED (HK / US / HKCC / A_SH / A_SZ / SG / JP / AU / CA). Python SDK: OpenTradeContext.cancel_all_order. REQUIRES --enable-trading. Real env requires --allow-real-trading. DANGER: unrecoverable — cancels every pending order in the specified market immediately.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
env |
string | ✓ default default_env_simulate |
trd_env |
Trading env: simulate (default) / real; alias: trd_env |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default. |
market |
string | ✓ default default |
— | Market (REQUIRED, NOT optional) — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA). Leaving empty returns a validation error — the backend needs a specific market to cancel orders in. v1.4.90 P0-E + P1-G 双接 + 5 markets 扩, v1.4.93 C2 加 Futures=5. |
api_key |
string? | — | — | Per-call API key override (optional) |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).Runtime validation: this request type has a
validate()method that adds runtime required-field / enum-value validation on top of the JSON schema.v1.4.84 §5 B4: runtime validate — market 非空. Schema description 已明写 REQUIRED, 但 Rust 字段是
String+#[serde(default)], default 是空字符串, serde 层放过. Runtime check 返清晰错误.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_cancel_all_order",
"arguments": {
"env": "simulate",
"acc_id": 123456,
"market": "HK",
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_reconfirm_order¶
- Scope:
trade:real | trade:simulate - Python SDK equivalent:
OpenTradeContext.reconfirm_order - Route: MCP JSON-RPC
tools/callwith name ="futu_reconfirm_order" - ⚠️ Trade write: launch
futu-mcpwith--enable-trading(real env also needs--allow-real-trading)
Description:
⚠️ REAL MONEY when env=real. Reconfirm a pending high-risk or price-warning order by numeric order_id. REQUIRES --enable-trading; real env needs --allow-real-trading; gateway must have been unlocked via futu_unlock_trade first. Use only for orders that the backend explicitly asked to reconfirm.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market — accepts STRING (HK|US|CN|HKCC|FUTURES|SG|AU|JP|MY|CA) OR INT (1=HK, 2=US, 3=CN, 4=HKCC, 5=Futures, 6=SG, 8=AU, 15=JP, 111=MY, 112=CA per Trd_Common.TrdMarket). |
acc_id |
u64? | — | — | Trading account ID (u64). Either acc_id OR card_num is required. |
card_num |
string? | — | — | Card number (4-digit suffix or 16-digit full). Either acc_id OR card_num is required. |
env |
string | ✓ default default_env_simulate |
trd_env |
Trade environment: real|simulate (default simulate); alias: trd_env |
order_id |
string | ✅ | — | FTAPI numeric order_id to reconfirm. Accepts JSON number or integer string; orderIDEx strings are not supported by Trd_ReconfirmOrder. |
reason |
i32 | ✅ | — | Reconfirm reason int per Trd_Common.ReconfirmOrderReason. |
api_key |
string? | — | — | Optional per-call API key override. See PlaceOrderReq.api_key. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_reconfirm_order",
"arguments": {
"market": "HK",
"acc_id": 123456,
"env": "simulate",
"order_id": "123456789",
"reason": 0,
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_unlock_trade¶
- Scope:
trade:unlock - Python SDK equivalent:
OpenTradeContext.unlock_trade - Route: MCP JSON-RPC
tools/callwith name ="futu_unlock_trade"
Description:
⚠️ Opens a trade window for subsequent futu_place_order / futu_modify_order / futu_cancel_order / futu_reconfirm_order calls. Password is read from account-scoped OS keychain (via futucli set-trade-pwd --account <login-account> plus futu-mcp --trade-pwd-account <login-account>) or FUTU_TRADE_PWD env — NEVER pass it via tool args. Requires trade:unlock scope. Lifetime: once unlocked, all subsequent trade calls succeed without re-authenticating until gateway restart or an explicit unlock=false lock-back. Do NOT call this on every trade (server-side anti-abuse may throttle).
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
unlock |
boolean | ✓ default default_true |
— | true to unlock trading (default); false to lock trading cipher back (defensive). Lock does not require a password. |
otp |
string? | — | token, one_time_password |
OTP / 2FA token (plaintext). Only required when a previous unlock call returned need_otp=true or err_code=-8 (TRADE_AUTH_NEED_AUTH_TOKEN). Leave empty for accounts without 2FA. Alias: token / one_time_password |
security_firm |
i32? | — | broker, security_firm_id |
Optional. Restrict unlock to a single security firm (broker). SecurityFirm enum (i32): 1=FutuHK, 2=FutuUS/MooMoo, 3=FutuSG, 4=FutuAU, 5=FutuCA, 6=FutuMY, 7=FutuJP. If omitted, unlocks all brokers in parallel (backward-compatible default). Alias: broker / security_firm_id |
acc_ids |
array of u64? | — | account_ids, accounts |
Optional. Array of positive non-zero u64 acc_ids to unlock (empty / omitted = no per-account filter, use security_firm rule or unlock all). Intersects with security_firm: account must satisfy BOTH. Use when you need to exclude a shadow sub-account that shares a broker with the main account — pass only the main acc_id here. Alias: account_ids / accounts |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_unlock_trade",
"arguments": {
"unlock": true,
"acc_ids": [
123456
]
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Account Push Subscription¶
futu_sub_acc_push¶
- Scope:
acc:read - Python SDK equivalent:
OpenTradeContext.subscribe_acc_push (internal to Futu daemon) - Route: MCP JSON-RPC
tools/callwith name ="futu_sub_acc_push"
Description:
Subscribe account order / deal push for given trading accounts. HTTP-mode MCP clients receive pushes as LoggingMessage notifications with {kind, proto_id, body_base64}. Payload body is raw Futu protobuf; decode client-side. Python SDK: OpenTradeContext.sub_acc_push.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
acc_ids |
array of u64 | ✅ | account_ids, accounts |
Array of account IDs (u64) to receive order/deal push for. ⚠️ Call futu_list_accounts first to discover real acc_id values; do NOT hallucinate 18-digit numbers — invalid ids will silently fail to receive push. Alias: account_ids / accounts |
api_key |
string? | — | — | Optional per-call API key plaintext. Priority: tool args > HTTP Bearer > startup key. Use to scope this push subscription to a specific narrow key. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_sub_acc_push",
"arguments": {
"acc_ids": [
123456
],
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_unsub_acc_push¶
- Scope:
acc:read - Python SDK equivalent:
— (daemon-only session control) - Route: MCP JSON-RPC
tools/callwith name ="futu_unsub_acc_push"
Description:
Unsubscribe from account push notifications. Pass session_id from previous futu_sub_acc_push response (session_id field or unsub_hint). Returns {removed_count}. If session_id is not found, removed_count=0 (likely auto-purged or never registered).
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
session_id |
string? | — | — | Required: session_id returned by futu_sub_acc_push response (session_id field or unsub_hint). If omitted, handler returns an error. If session_id not found (e.g. 4h auto-purged), removed_count=0 is returned. |
api_key |
string? | — | — | Optional per-call API key plaintext. Priority: tool args > HTTP Bearer > startup key. Use the same key that created the push subscription when running in stdio mode with multiple keys. |
⚠️ Unknown fields:
deny_unknown_fieldsis enabled — any field not listed above returns anunknown fielderror (previously silently dropped).
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_unsub_acc_push",
"arguments": {
"session_id": "abc-session-xyz",
"api_key": "optional-per-call-api-key"
}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
futu_push_subscriber_info¶
- Scope:
acc:read - Python SDK equivalent:
— (daemon-only diagnostics) - Route: MCP JSON-RPC
tools/callwith name ="futu_push_subscriber_info"
Description:
Diagnostic — list active push subscriptions on this MCP server. Returns {total_count, subscriptions: [{session_id, acc_ids, age_secs}]}. Useful to verify whether futu_sub_acc_push registered, check auto-purge timing, or debug missing pushes.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_push_subscriber_info",
"arguments": {}
}
}
Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.
Alphabetic tool index¶
futu_cancel_all_orderfutu_cancel_orderfutu_get_acc_cash_flowfutu_get_account_flagfutu_get_biz_groupfutu_get_bond_answer_statefutu_get_bond_position_listfutu_get_bond_single_assetfutu_get_bond_total_assetfutu_get_bond_trade_reminderfutu_get_brokerfutu_get_capital_distributionfutu_get_capital_flowfutu_get_cash_detailfutu_get_cash_logfutu_get_code_changefutu_get_dealsfutu_get_delay_statisticsfutu_get_flow_summaryfutu_get_fundsfutu_get_future_infofutu_get_global_statefutu_get_history_dealsfutu_get_history_kl_quotafutu_get_history_klinefutu_get_history_ordersfutu_get_holding_changefutu_get_ipo_listfutu_get_klinefutu_get_margin_infofutu_get_margin_ratiofutu_get_market_statefutu_get_max_trd_qtysfutu_get_option_chainfutu_get_option_expiration_datefutu_get_order_feefutu_get_orderbookfutu_get_ordersfutu_get_owner_platefutu_get_positionsfutu_get_price_reminderfutu_get_quotefutu_get_quote_rightsfutu_get_referencefutu_get_rehabfutu_get_risk_free_ratefutu_get_rtfutu_get_snapshotfutu_get_spread_tablefutu_get_staticfutu_get_stock_filterfutu_get_suspendfutu_get_tickerfutu_get_ticker_statisticfutu_get_ticker_statistic_detailfutu_get_token_statefutu_get_trading_daysfutu_get_used_quotafutu_get_user_infofutu_get_user_securityfutu_get_user_security_groupfutu_get_warrantfutu_list_accountsfutu_list_platesfutu_modify_orderfutu_modify_user_securityfutu_pingfutu_place_orderfutu_plate_stocksfutu_push_subscriber_infofutu_query_subscriptionfutu_reconfirm_orderfutu_set_price_reminderfutu_sub_acc_pushfutu_subscribefutu_unlock_tradefutu_unsub_acc_pushfutu_unsubscribe