Skip to content

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's scopes array must cover it. Otherwise MCP returns CallToolResult.is_error=true + {"error": "unknown MCP tool \"…\"", "status": "error"} or unauthorized.
  • 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
    • means Option<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_fields is enforced — typo'd field names (e.g. stock vs the new canonical symbol) return an unknown field error 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=true and 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

futu_ping

  • Scope: qot:read
  • Python SDK equivalent: — (gateway-local, no SDK equivalent)
  • Route: MCP JSON-RPC tools/call with 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/call with 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/call with 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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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/call with 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/call with 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/call with 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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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 Returns Err(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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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🇲🇲ss' (optional); alias: begin / start_time / from
end_time string? end, to End time 'yyyy-MM-dd HH🇲🇲ss' (optional); alias: end / to

⚠️ Unknown fields: deny_unknown_fields is enabled — any field not listed above returns an unknown field error (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/call with 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🇲🇲ss' (optional); alias: begin / start_time / from
end_time string? end, to End time 'yyyy-MM-dd HH🇲🇲ss' (optional); alias: end / to

⚠️ Unknown fields: deny_unknown_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with name = "futu_place_order"
  • ⚠️ Trade write: launch futu-mcp with --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_fields is enabled — any field not listed above returns an unknown field error (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/call with name = "futu_modify_order"
  • ⚠️ Trade write: launch futu-mcp with --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_fields is enabled — any field not listed above returns an unknown field error (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/call with name = "futu_cancel_order"
  • ⚠️ Trade write: launch futu-mcp with --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_fields is enabled — any field not listed above returns an unknown field error (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/call with name = "futu_cancel_all_order"
  • ⚠️ Trade write: launch futu-mcp with --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_fields is enabled — any field not listed above returns an unknown field error (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/call with name = "futu_reconfirm_order"
  • ⚠️ Trade write: launch futu-mcp with --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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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_fields is enabled — any field not listed above returns an unknown field error (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/call with 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