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 every one of the 60+ MCP 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 added in v1.4.83/84 for py-futu-api / legacy client compatibility. v1.5 deprecated — new code should use the canonical name (the first column header).
- Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]is enforced — typo'd field names (e.g.stockvs the new canonicalsymbol) return anunknown fielderror instead of silently dropping (CLAUDE.md pitfalls #30 / #45). - Enum dual-accept: v1.4.84 §5 B2 — 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"}(the standard format established after v1.4.58 Phase C migration).
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 (v1.4.84+) |
backend proto error (ret_type != 0) |
raw JSON envelope's ret_msg carries the concrete reason |
Quick index¶
- Core / Status — 4 tool(s)
- Quote Subscription — 3 tool(s)
- Quote Queries — 18 tool(s)
- Plates & Filters — 5 tool(s)
- Reference / Derivatives — 5 tool(s)
- Watchlist / Price Reminders — 5 tool(s)
- Trading Accounts (Read-only) — 12 tool(s)
- Trade Write (
--enable-tradingrequired) — 5 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.
Request arguments: none (zero-arg tool)
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.
Request arguments: none (zero-arg tool)
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.
Request arguments: none (zero-arg tool)
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_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.
Request arguments: none (zero-arg tool)
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"}.
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, 3=Ticker, 4=RT, 5=KL_Day, 6=KL_5Min, 7=KL_15Min, 8=KL_30Min, 9=KL_60Min, 10=KL_Month, 11=KL_Year, 12=KL_1Min, 13=KL_Week, 14=Broker) OR string ("Basic" / "OrderBook" / "KL_Day" / "day" / ...). Alias: sub_type_list. v1.4.84 §5 B2 双接. 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
sub_types |
array of i32 | ✓ default default |
sub_type_list |
Sub-type ids to unsubscribe. Accept int (1=Basic, 2=OrderBook, 3=Ticker, 4=RT, 5=KL_Day, 6=KL_5Min, ...) OR string ("Basic" / "OrderBook" / "KL_Day" / "day" / ...). Alias: sub_type_list. v1.4.84 §5 B2 双接. 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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"}.
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) (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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) (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
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) (v1.5 deprecated — prefer canonical name) |
count |
i32? | — | num, max_count, req_count |
Number of candles to return (default 100); alias: num / max_count / req_count (v1.5 deprecated — prefer canonical name) |
begin |
string? | — | begin_time, from |
Start date yyyy-MM-dd (optional; default computed from count); alias: begin_time / from (v1.5 deprecated — prefer canonical name) |
end |
string? | — | end_time, to |
End date yyyy-MM-dd (optional; default today); alias: end_time / to (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
end |
string | ✅ | end_time, to |
End date yyyy-MM-dd; alias: end_time / to (v1.5 deprecated — prefer canonical name) |
max_count |
i32? | — | num, count, req_count |
Max number of candles to return (default 1000); alias: num / count / req_count (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"
}
}
}
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 (v1.5 deprecated — prefer canonical name) |
depth |
i32 | ✓ default default_depth |
num |
Order book depth, 1-10 (default 10); alias: num (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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) (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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) (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
end_time |
string? | — | end, to |
End time 'yyyy-MM-dd' (optional); alias: end / to (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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) (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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) (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
end_time |
string | ✅ | end, to |
End date (yyyy-MM-dd); alias: end / to (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
end_time |
string | ✅ | end, to |
End date (yyyy-MM-dd); alias: end / to (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
holder_category |
i32 | ✅ | category |
Holder category: 1=Institution, 2=Fund, 3=Executive; alias: category (v1.5 deprecated — prefer canonical name) |
begin_time |
string? | — | begin, start_time, from |
Begin time YYYY-MM-DD HH:MM:SS (optional); alias: begin / start_time / from (v1.5 deprecated — prefer canonical name) |
end_time |
string? | — | end, to |
End time YYYY-MM-DD HH:MM:SS (optional); alias: end / to (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"}.
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
num |
i32 | ✓ default default_stock_filter_num |
count, max_count, req_count |
Max rows (1-200, default 50); alias: count / max_count / req_count (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 |
num |
i32 | ✓ default default_warrant_num |
count, max_count, req_count |
Max rows (1-200, default 20); alias: count / max_count / req_count (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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",
"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 (v1.5 deprecated — prefer canonical name) |
begin_time |
string | ✅ | begin, start_time, from |
Expiry range begin date yyyy-MM-dd; alias: begin / start_time / from (v1.5 deprecated — prefer canonical name) |
end_time |
string | ✅ | end, to |
Expiry range end date yyyy-MM-dd; alias: end / to (v1.5 deprecated — prefer canonical name) |
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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
index_option_type |
i32? | — | — | For index options only: Qot_Common::IndexOptionType (optional) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
op |
i32 | ✅ | op_type, operation |
Op: 1=AddInto, 2=Delete (from this group), 3=MoveOut; alias: op_type / operation (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 is an INTEGER (not a string literal): 1=Add, 2=Del, 3=Enable, 4=Disable, 5=Modify, 6=DeleteAll. Python SDK: OpenQuoteContext.set_price_reminder.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
symbol |
string | ✅ | code, stock |
Security symbol; alias: code / stock (v1.5 deprecated — prefer canonical name) |
op |
i32 | ✅ | op_type, operation |
Op: 1=Add / SetAdd, 2=Del / SetDel, 3=Enable / SetEnable, 4=Disable / SetDisable, 5=Modify, 6=DeleteAll / DelAll. Accept int OR string form. Alias: op_type / operation (v1.5 deprecated — prefer canonical name). v1.4.84 §5 B2 双接. 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=5MinRateUp, 6=5MinRateDown, 7=VolumeUp, 8=TurnoverUp, 9=TurnoverRateUp, 10=BidAskRatioBias, 11=AmplitudeUp |
freq |
i32? | — | — | Qot_Common::PriceReminderFreq: 1=Always, 2=OncePerDay, 3=Once |
value |
float? | — | — | Threshold value (required for Add/Modify) |
note |
string? | — | — | User note, 20 Chinese chars max (optional) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown fielderror (previously silently dropped).Runtime validation: this request type has a
validate()method — v1.4.84 §5 B4 adds runtime required-field / enum-value validation.v1.4.84 §5 B4: runtime validate — op-conditional required fields. op=1 (Add): reminder_type + value 必填 op=5 (Modify): key 必填 (reminder_type / value 可保持原值 None) op=⅔/4 (Del / Enable / Disable): key 必填 op=6 (DeleteAll): 无额外必填 返
Err(String)带清晰错误信息给 LLM agent / SDK user.
JSON-RPC call example:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "futu_set_price_reminder",
"arguments": {
"symbol": "HK.00700",
"op": 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_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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown fielderror (previously silently dropped).Runtime validation: this request type has a
validate()method — v1.4.84 §5 B4 adds runtime required-field / enum-value validation.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.
Request arguments: none (zero-arg tool)
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.
Request arguments:
| Field | Type | Required | Alias | Description |
|---|---|---|---|---|
market |
string | ✅ | — | Trade market: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"
}
}
}
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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"
}
}
}
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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"
}
}
}
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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"
}
}
}
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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
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 (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: HK|US|CN|HKCC |
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 (v1.5 deprecated — prefer canonical name) |
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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default. |
market |
string | ✅ | — | Trade market: HK / US / CN / HKCC |
clearing_date |
string | ✅ | date, query_date |
Clearing date (yyyy-MM-dd); queries flow entries for that day; alias: date / query_date (v1.5 deprecated — prefer canonical name) |
direction |
i32? | — | flow_direction |
Direction: 1=InFlow, 2=OutFlow, omit for both; alias: flow_direction (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
acc_id |
u64 | ✅ | — | Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default. |
market |
string | ✅ | — | Trade market: HK / US / CN / HKCC |
clearing_date |
string | ✅ | date, query_date |
Clearing date (yyyy-MM-dd); queries flow entries for that day; alias: date / query_date (v1.5 deprecated — prefer canonical name) |
direction |
i32? | — | flow_direction |
Direction: 1=InFlow, 2=OutFlow, omit for both; alias: flow_direction (v1.5 deprecated — prefer canonical name) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"}.
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: HK|US|CN|HKCC |
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_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: NORMAL (limit) | MARKET | ABSOLUTE_LIMIT | AUCTION | AUCTION_LIMIT | SPECIAL_LIMIT | SPECIAL_LIMIT_ALL | v1.4.53 条件单: STOP (止损市价) | STOP_LIMIT (止损限价) | MIT (止盈触及市价) | LIT (止盈触及限价) | TRAILING_STOP (跟踪止损市价) | TRAILING_STOP_LIMIT (跟踪止损限价) | TWAP_MARKET | TWAP_LIMIT | VWAP_MARKET | VWAP_LIMIT. 条件单须搭配 stop_price / trail_type / trail_value / trail_spread 字段。 |
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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: HK|US|CN|HKCC |
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_simulate |
trd_env |
Trade environment: real|simulate (default simulate); alias: trd_env (v1.5 deprecated — prefer canonical name) |
order_id |
u64 | ✅ | — | Order ID to modify (accepts integer OR string — string recommended for JS clients, since u64 > 2^53 loses precision as JSON number) Enum double-accept: Accepts JSON integer or integer-string (recommended for JS clients — 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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: HK|US|CN|HKCC |
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_simulate |
trd_env |
Trade environment: real|simulate (default simulate); alias: trd_env (v1.5 deprecated — prefer canonical name) |
order_id |
u64 | ✅ | — | Order ID to cancel (accepts integer OR string — string recommended for JS clients, since u64 > 2^53 loses precision as JSON number) Enum double-accept: Accepts JSON integer or integer-string (recommended for JS clients — 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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 (v1.5 deprecated — prefer canonical name) |
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): HK / US / HKCC / A_SH / A_SZ / SG / JP / AU / CA. Leaving empty returns a validation error — the backend needs a specific market to cancel orders in. |
api_key |
string? | — | — | Per-call API key override (optional) |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown fielderror (previously silently dropped).Runtime validation: this request type has a
validate()method — v1.4.84 §5 B4 adds runtime required-field / enum-value validation.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_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 calls. Password is read from OS keychain (via futucli set-trade-pwd) 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 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: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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. v1.4.38+: HTTP-mode MCP clients receive pushes as LoggingMessage notifications (level=Info, logger="futu_push") with {kind, proto_id, body_base64}. Payload body is raw Futu protobuf (2208=UpdateOrder, 2218=UpdateOrderFill), 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 |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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
]
}
}
}
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:
v1.4.58+: 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 not found, removed_count=0 (likely 4h 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. |
⚠️ Unknown fields: since v1.4.84,
#[serde(deny_unknown_fields)]rejects any field not listed above — returnsunknown 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"
}
}
}
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:
v1.4.58+: Diagnostic — list all active push subscriptions on this MCP server (global scope, not per-session — rmcp Peer identity lacks PartialEq). Returns {total_count, subscriptions: [{session_id, acc_ids, age_secs}]}. Useful to verify if futu_sub_acc_push registered, check 4h auto-purge timeline, or debug missing pushes.
Request arguments: none (zero-arg tool)
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_brokerfutu_get_capital_distributionfutu_get_capital_flowfutu_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_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_referencefutu_get_rehabfutu_get_rtfutu_get_snapshotfutu_get_staticfutu_get_stock_filterfutu_get_suspendfutu_get_tickerfutu_get_trading_daysfutu_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_set_price_reminderfutu_sub_acc_pushfutu_subscribefutu_unlock_tradefutu_unsub_acc_pushfutu_unsubscribe