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 every one of the 60+ MCP tools: scope / Python SDK equivalent / parameters / alias support / enum dual-accept (int OR string) / deny_unknown_fields behavior / runtime validate rules / JSON-RPC call example.

Conventions

  • Scope: what permission is required (qot:read / acc:read / trade:real | trade:simulate / trade:unlock). The MCP key'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 added in v1.4.83/84 for py-futu-api / legacy client compatibility. v1.5 deprecated — new code should use the canonical name (the first column header).
  • Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] is enforced — typo'd field names (e.g. stock vs the new canonical symbol) return an unknown field error instead of silently dropping (CLAUDE.md pitfalls #30 / #45).
  • Enum dual-accept: v1.4.84 §5 B2 — fields like market / sub_types / order_type / kl_type / op (price reminder) accept integer enum values and string names simultaneously. Per-field accepted values are listed in the field description.
  • Responses: all tools return JSON text; on failure, the MCP protocol layer sets is_error=true and the content carries {"error": "...", "status": "error"} (the standard format established after v1.4.58 Phase C migration).

Common error codes

Error Typical source
unknown MCP tool \"…\" tool name typo, or this daemon version does not support the tool (check futu-opend --version)
unauthorized API key lacks the required scope
gateway connect failed: … futu-opend not running / wrong port
unknown field \"…\" deny_unknown_fields triggered (v1.4.84+)
backend proto error (ret_type != 0) raw JSON envelope's ret_msg carries the concrete reason

Quick index


Core / Status

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.

Request arguments: none (zero-arg tool)

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_ping",
    "arguments": {}
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

futu_get_global_state

  • Scope: qot:read
  • Python SDK equivalent: OpenQuoteContext.get_global_state
  • Route: MCP JSON-RPC tools/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.

Request arguments: none (zero-arg tool)

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_get_global_state",
    "arguments": {}
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

futu_get_user_info

  • Scope: qot:read
  • Python SDK equivalent: OpenQuoteContext.get_user_info
  • Route: MCP JSON-RPC tools/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.

Request arguments: none (zero-arg tool)

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_get_user_info",
    "arguments": {}
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

futu_get_delay_statistics

  • Scope: qot:read
  • Python SDK equivalent: OpenQuoteContext.get_delay_statistics
  • Route: MCP JSON-RPC tools/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.

Request arguments: none (zero-arg tool)

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_get_delay_statistics",
    "arguments": {}
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

Quote Subscription

futu_subscribe

  • Scope: qot:read
  • Python SDK equivalent: OpenQuoteContext.subscribe
  • Route: MCP JSON-RPC tools/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, 3=Ticker, 4=RT, 5=KL_Day, 6=KL_5Min, 7=KL_15Min, 8=KL_30Min, 9=KL_60Min, 10=KL_Month, 11=KL_Year, 12=KL_1Min, 13=KL_Week, 14=Broker) OR string ("Basic" / "OrderBook" / "KL_Day" / "day" / ...). Alias: sub_type_list. v1.4.84 §5 B2 双接.
Enum double-accept: Array of SubType enum values; each item accepts integer or string (Basic / OrderBook / KL_Day / KL_1Min / KL_5Min / ...)
is_first_push boolean ✓ default default_is_first_push If true, backend pushes current snapshot immediately after subscribe (useful for agents needing warm state). Default true.
is_reg_push boolean ✓ default default_is_reg_push If true, register push on this connection (agent will receive push via SSE notification in HTTP mode). Default true.

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
sub_types array of i32 ✓ default default sub_type_list Sub-type ids to unsubscribe. Accept int (1=Basic, 2=OrderBook, 3=Ticker, 4=RT, 5=KL_Day, 6=KL_5Min, ...) OR string ("Basic" / "OrderBook" / "KL_Day" / "day" / ...). Alias: sub_type_list. v1.4.84 §5 B2 双接.
Enum double-accept: Array of SubType enum values; each item accepts integer or string (Basic / OrderBook / KL_Day / KL_1Min / KL_5Min / ...)
unsub_all boolean ✓ default default unsubscribe_all true=clear all subscriptions on this connection (ignores symbols/sub_types); alias: unsubscribe_all (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"}.

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) (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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) (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
kl_type string ✓ default default_kl_type ktype, k_type K-line type: day|week|month|quarter|year|1min|3min|5min|15min|30min|60min (alias: ktype / k_type / kl_type for SDK compat) (v1.5 deprecated — prefer canonical name)
count i32? num, max_count, req_count Number of candles to return (default 100); alias: num / max_count / req_count (v1.5 deprecated — prefer canonical name)
begin string? begin_time, from Start date yyyy-MM-dd (optional; default computed from count); alias: begin_time / from (v1.5 deprecated — prefer canonical name)
end string? end_time, to End date yyyy-MM-dd (optional; default today); alias: end_time / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
kl_type string ✓ default default_kl_type ktype, k_type K-line type: day|week|month|quarter|year|1min|3min|5min|15min|30min|60min (default day); alias: ktype / k_type (v1.5 deprecated — prefer canonical name)
rehab_type string ✓ default default_rehab_none Rehab type: none|forward|backward (default none)
begin string begin_time, start_time, from Start date yyyy-MM-dd; alias: begin_time / start_time / from (v1.5 deprecated — prefer canonical name)
end string end_time, to End date yyyy-MM-dd; alias: end_time / to (v1.5 deprecated — prefer canonical name)
max_count i32? num, count, req_count Max number of candles to return (default 1000); alias: num / count / req_count (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"
    }
  }
}

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 (v1.5 deprecated — prefer canonical name)
depth i32 ✓ default default_depth num Order book depth, 1-10 (default 10); alias: num (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
count i32 ✓ default default_ticker_count num, max_count, req_count Number of ticks to fetch (default 100, max 1000); alias: num / max_count / req_count (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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) (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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) (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
period_type i32? Period type: 1=INTRADAY 2=DAY 3=WEEK 4=MONTH (default 1)
begin_time string? begin, start_time, from Begin time 'yyyy-MM-dd' (optional, DAY/WEEK/MONTH only); alias: begin / start_time / from (v1.5 deprecated — prefer canonical name)
end_time string? end, to End time 'yyyy-MM-dd' (optional); alias: end / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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) (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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) (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
end_time string end, to End date (yyyy-MM-dd); alias: end / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
end_time string end, to End date (yyyy-MM-dd); alias: end / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
holder_category i32 category Holder category: 1=Institution, 2=Fund, 3=Executive; alias: category (v1.5 deprecated — prefer canonical name)
begin_time string? begin, start_time, from Begin time YYYY-MM-DD HH:MM:SS (optional); alias: begin / start_time / from (v1.5 deprecated — prefer canonical name)
end_time string? end, to End time YYYY-MM-DD HH:MM:SS (optional); alias: end / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"}.

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 (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
num i32 ✓ default default_stock_filter_num count, max_count, req_count Max rows (1-200, default 50); alias: count / max_count / req_count (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
reference_type string ✓ default default_reference_type Reference type: warrant|future (default warrant). Note: option is NOT supported — use futu_get_option_chain instead.

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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
num i32 ✓ default default_warrant_num count, max_count, req_count Max rows (1-200, default 20); alias: count / max_count / req_count (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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",
      "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 (v1.5 deprecated — prefer canonical name)
begin_time string begin, start_time, from Expiry range begin date yyyy-MM-dd; alias: begin / start_time / from (v1.5 deprecated — prefer canonical name)
end_time string end, to Expiry range end date yyyy-MM-dd; alias: end / to (v1.5 deprecated — prefer canonical name)
option_type string? Option type: all|call|put (default all)
delta_min float? Optional Greek filter: only return options with delta in [min, max]. Typical ATM range: 0.3 to 0.7 for calls, -0.7 to -0.3 for puts.
delta_max float? See delta_min.
iv_min float? Implied volatility filter min (decimal, e.g. 0.3 = 30%).
iv_max float? See iv_min.
oi_min float? Open interest (contracts) filter min, integer.
oi_max float? See oi_min.
gamma_min float? Gamma filter min (decimal).
gamma_max float? See gamma_min.
vega_min float? Vega filter min (decimal).
vega_max float? See vega_min.
theta_min float? Theta filter min (decimal).
theta_max float? See theta_min.

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
index_option_type i32? For index options only: Qot_Common::IndexOptionType (optional)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
op i32 op_type, operation Op: 1=AddInto, 2=Delete (from this group), 3=MoveOut; alias: op_type / operation (v1.5 deprecated — prefer canonical name)
symbols array of string stocks, code_list, symbol_list, security_list Security symbols to add/delete/move; alias: stocks / code_list / symbol_list / security_list (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 is an INTEGER (not a string literal): 1=Add, 2=Del, 3=Enable, 4=Disable, 5=Modify, 6=DeleteAll. Python SDK: OpenQuoteContext.set_price_reminder.

Request arguments:

Field Type Required Alias Description
symbol string code, stock Security symbol; alias: code / stock (v1.5 deprecated — prefer canonical name)
op i32 op_type, operation Op: 1=Add / SetAdd, 2=Del / SetDel, 3=Enable / SetEnable, 4=Disable / SetDisable, 5=Modify, 6=DeleteAll / DelAll. Accept int OR string form. Alias: op_type / operation (v1.5 deprecated — prefer canonical name). v1.4.84 §5 B2 双接.
Enum double-accept: Accepts integer op code (1-6) or string (Add / Del / Enable / Disable / Modify / DeleteAll and SetAdd aliases)
key i64? Reminder key (from get_price_reminder; required for modify/del/enable/disable)
reminder_type i32? Qot_Common::PriceReminderType: 1=PriceUp, 2=PriceDown, 3=ChangeRateUp, 4=ChangeRateDown, 5=5MinRateUp, 6=5MinRateDown, 7=VolumeUp, 8=TurnoverUp, 9=TurnoverRateUp, 10=BidAskRatioBias, 11=AmplitudeUp
freq i32? Qot_Common::PriceReminderFreq: 1=Always, 2=OncePerDay, 3=Once
value float? Threshold value (required for Add/Modify)
note string? User note, 20 Chinese chars max (optional)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns unknown field error (previously silently dropped).

Runtime validation: this request type has a validate() method — v1.4.84 §5 B4 adds runtime required-field / enum-value validation.

v1.4.84 §5 B4: runtime validate — op-conditional required fields. op=1 (Add): reminder_type + value 必填 op=5 (Modify): key 必填 (reminder_type / value 可保持原值 None) op=⅔/4 (Del / Enable / Disable): key 必填 op=6 (DeleteAll): 无额外必填 返 Err(String) 带清晰错误信息给 LLM agent / SDK user.

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_set_price_reminder",
    "arguments": {
      "symbol": "HK.00700",
      "op": 1
    }
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

futu_get_price_reminder

  • Scope: qot:read
  • Python SDK equivalent: OpenQuoteContext.get_price_reminder
  • Route: MCP JSON-RPC tools/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: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns unknown field error (previously silently dropped).

Runtime validation: this request type has a validate() method — v1.4.84 §5 B4 adds runtime required-field / enum-value validation.

v1.4.84 §5 B4: runtime validate — symbol XOR market required. v1.4.30 P3: schema-level oneOf 不可能通过 serde 强制 (Option 模型无法 表达 "exactly one of"). runtime check 返清晰错误.

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_get_price_reminder",
    "arguments": {
      "symbol": "HK.00700",
      "market": "HK"
    }
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

Trading Accounts (Read-only)

futu_list_accounts

  • Scope: acc:read
  • Python SDK equivalent: OpenTradeContext.get_acc_list
  • Route: MCP JSON-RPC tools/call with name = "futu_list_accounts"

Description:

List all trading accounts (real + simulate) visible to the gateway login.

Request arguments: none (zero-arg tool)

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_list_accounts",
    "arguments": {}
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

futu_get_funds

  • Scope: acc:read
  • Python SDK equivalent: OpenTradeContext.accinfo_query
  • Route: MCP JSON-RPC tools/call with name = "futu_get_funds"

Description:

Get account funds summary (total assets, cash, market value, buying power) for a given account + market.

Request arguments:

Field Type Required Alias Description
market string Trade market: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"
    }
  }
}

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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"
    }
  }
}

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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"
    }
  }
}

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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"
    }
  }
}

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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)
order_id_ex_list array of string order_ids_ex, order_ids Order_id_ex list (strings) — returned by place_order response; alias: order_ids_ex / order_ids (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)
order_type i32 Order type. Accepts both INTEGER (1=NORMAL/limit, 2=MARKET, 5=AUCTION, 6=ABSOLUTE_LIMIT, 7=SPECIAL_LIMIT) and STRING enum (NORMAL|MARKET|AUCTION|ABSOLUTE_LIMIT|SPECIAL_LIMIT). Example: 1 or "NORMAL".
Enum double-accept: Accepts integer or OrderType enum string (NORMAL|LIMIT|MARKET|ABSOLUTE_LIMIT|AUCTION|AUCTION_LIMIT|SPECIAL_LIMIT)
code string symbol, stock Security code WITHOUT market prefix (e.g. 00700 / AAPL); alias: symbol / stock (v1.5 deprecated — prefer canonical name)
price float Limit price (pass 0.0 for market orders)
order_id u64? Existing order_id (for modify-order max-qty calc, optional)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)
codes array of string symbols, code_list, symbol_list Symbols in MARKET.CODE format (e.g. HK.00700, US.AAPL); alias: symbols / code_list / symbol_list (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)
code_list array of string ✓ default default symbols, symbol_list Filter by codes (empty = all). Each item is bare code without market prefix. Alias: symbols / symbol_list
begin_time string? begin, start_time, from Begin time 'yyyy-MM-dd HH🇲🇲ss' (optional); alias: begin / start_time / from (v1.5 deprecated — prefer canonical name)
end_time string? end, to End time 'yyyy-MM-dd HH🇲🇲ss' (optional); alias: end / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env trd_env Trade environment: real|simulate (default real); alias: trd_env (v1.5 deprecated — prefer canonical name)
code_list array of string ✓ default default symbols, symbol_list Filter by codes (empty = all). Each item is bare code without market prefix. Alias: symbols / symbol_list
begin_time string? begin, start_time, from Begin time 'yyyy-MM-dd HH🇲🇲ss' (optional); alias: begin / start_time / from (v1.5 deprecated — prefer canonical name)
end_time string? end, to End time 'yyyy-MM-dd HH🇲🇲ss' (optional); alias: end / to (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default.
market string Trade market: HK / US / CN / HKCC
clearing_date string date, query_date Clearing date (yyyy-MM-dd); queries flow entries for that day; alias: date / query_date (v1.5 deprecated — prefer canonical name)
direction i32? flow_direction Direction: 1=InFlow, 2=OutFlow, omit for both; alias: flow_direction (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default.
market string Trade market: HK / US / CN / HKCC
clearing_date string date, query_date Clearing date (yyyy-MM-dd); queries flow entries for that day; alias: date / query_date (v1.5 deprecated — prefer canonical name)
direction i32? flow_direction Direction: 1=InFlow, 2=OutFlow, omit for both; alias: flow_direction (v1.5 deprecated — prefer canonical name)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"}.

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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env_simulate trd_env Trade environment: real|simulate. Defaults to simulate for safety. Alias: trd_env
side string trd_side Order side: BUY|SELL|SELL_SHORT|BUY_BACK. Alias: trd_side
order_type string ✓ default default_order_type Order type: NORMAL (limit) | MARKET | ABSOLUTE_LIMIT | AUCTION | AUCTION_LIMIT | SPECIAL_LIMIT | SPECIAL_LIMIT_ALL | v1.4.53 条件单: STOP (止损市价) | STOP_LIMIT (止损限价) | MIT (止盈触及市价) | LIT (止盈触及限价) | TRAILING_STOP (跟踪止损市价) | TRAILING_STOP_LIMIT (跟踪止损限价) | TWAP_MARKET | TWAP_LIMIT | VWAP_MARKET | VWAP_LIMIT. 条件单须搭配 stop_price / trail_type / trail_value / trail_spread 字段。
code string Security code WITHOUT market prefix, e.g. 00700 / AAPL / 600519
qty float Order quantity (shares / contracts)
price float? Limit price (required for NORMAL; optional for MARKET)
api_key string? Optional per-call API key override (plaintext). When set, this key is used for scope/limits/audit instead of the process-wide FUTU_MCP_API_KEY. Useful for multi-tenant scenarios where different calls should be billed / scoped to different keys.
idempotency_key string? v1.4.39: Optional idempotency key. When set, retries with the same key within 90-second TTL return the cached response WITHOUT placing a duplicate order. Example: generate a UUID per logical order intent; if agent retry fires, pass the same key. Without this field, each call places a separate order (backward-compatible with v1.4.38).
stop_price float? v1.4.53 条件单: stop / take-profit trigger price (aka aux_price). Required for STOP / STOP_LIMIT / MIT (market-if-touched) / LIT (limit-if-touched). For MIT/LIT it's the take-profit trigger.
trail_type i32? v1.4.53 trailing stop: 1=Ratio (percentage) / 2=Amount (absolute value). Only for TRAILING_STOP / TRAILING_STOP_LIMIT order types.
trail_value float? v1.4.53 trailing stop: trail percentage (if trail_type=1) or amount (if trail_type=2).
trail_spread float? v1.4.53 trailing stop limit: price spread for TRAILING_STOP_LIMIT (limit offset from trigger).

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env_simulate trd_env Trade environment: real|simulate (default simulate); alias: trd_env (v1.5 deprecated — prefer canonical name)
order_id u64 Order ID to modify (accepts integer OR string — string recommended for JS clients, since u64 > 2^53 loses precision as JSON number)
Enum double-accept: Accepts JSON integer or integer-string (recommended for JS clients — u64 > 2^53 loses precision as JSON number)
op string ✓ default default_modify_op Modify op: NORMAL (change qty/price) | CANCEL | DISABLE | ENABLE | DELETE
qty float? New quantity (for NORMAL op)
price float? New price (for NORMAL op)
api_key string? Optional per-call API key override. See PlaceOrderReq.api_key.
idempotency_key string? v1.4.39: Optional idempotency key (90s TTL). See PlaceOrderReq.idempotency_key.

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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: HK|US|CN|HKCC
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default; omitting or inventing an id fails.
env string ✓ default default_env_simulate trd_env Trade environment: real|simulate (default simulate); alias: trd_env (v1.5 deprecated — prefer canonical name)
order_id u64 Order ID to cancel (accepts integer OR string — string recommended for JS clients, since u64 > 2^53 loses precision as JSON number)
Enum double-accept: Accepts JSON integer or integer-string (recommended for JS clients — u64 > 2^53 loses precision as JSON number)
api_key string? Optional per-call API key override. See PlaceOrderReq.api_key.
idempotency_key string? v1.4.39: Optional idempotency key (90s TTL). See PlaceOrderReq.idempotency_key.

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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 (v1.5 deprecated — prefer canonical name)
acc_id u64 Trading account ID (u64). ⚠️ Call futu_list_accounts first to discover — gateway does NOT infer a default.
market string ✓ default default Market (REQUIRED, NOT optional): HK / US / HKCC / A_SH / A_SZ / SG / JP / AU / CA. Leaving empty returns a validation error — the backend needs a specific market to cancel orders in.
api_key string? Per-call API key override (optional)

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns unknown field error (previously silently dropped).

Runtime validation: this request type has a validate() method — v1.4.84 §5 B4 adds runtime required-field / enum-value validation.

v1.4.84 §5 B4: runtime validate — market 非空. Schema description 已明写 REQUIRED, 但 Rust 字段是 String + #[serde(default)], default 是空字符串, serde 层放过. Runtime check 返清晰错误.

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_cancel_all_order",
    "arguments": {
      "env": "simulate",
      "acc_id": 123456,
      "market": "HK",
      "api_key": "optional-per-call-api-key"
    }
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.

futu_unlock_trade

  • Scope: trade:unlock
  • Python SDK equivalent: OpenTradeContext.unlock_trade
  • Route: MCP JSON-RPC tools/call with name = "futu_unlock_trade"

Description:

⚠️ Opens a trade window for subsequent futu_place_order / futu_modify_order / futu_cancel_order calls. Password is read from OS keychain (via futucli set-trade-pwd) or FUTU_TRADE_PWD env — NEVER pass it via tool args. Requires trade:unlock scope. Lifetime: once unlocked, all subsequent trade calls succeed without re-authenticating until gateway restart or an explicit unlock=false lock-back. Do NOT call this on every trade (server-side anti-abuse may throttle).

Request arguments:

Field Type Required Alias Description
unlock boolean ✓ default default_true true to unlock trading (default); false to lock trading cipher back (defensive). Lock does not require a password.
otp string? token, one_time_password OTP / 2FA token (plaintext). Only required when a previous unlock call returned need_otp=true or err_code=-8 (TRADE_AUTH_NEED_AUTH_TOKEN). Leave empty for accounts without 2FA. Alias: token / one_time_password
security_firm i32? broker, security_firm_id Optional. Restrict unlock to a single security firm (broker). SecurityFirm enum (i32): 1=FutuHK, 2=FutuUS/MooMoo, 3=FutuSG, 4=FutuAU, 5=FutuCA, 6=FutuMY, 7=FutuJP. If omitted, unlocks all brokers in parallel (backward-compatible default). Alias: broker / security_firm_id
acc_ids array of u64? account_ids, accounts Optional. Array of u64 acc_ids to unlock (empty / omitted = no per-account filter, use security_firm rule or unlock all). Intersects with security_firm: account must satisfy BOTH. Use when you need to exclude a shadow sub-account that shares a broker with the main account — pass only the main acc_id here. Alias: account_ids / accounts

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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. v1.4.38+: HTTP-mode MCP clients receive pushes as LoggingMessage notifications (level=Info, logger="futu_push") with {kind, proto_id, body_base64}. Payload body is raw Futu protobuf (2208=UpdateOrder, 2218=UpdateOrderFill), decode client-side. Python SDK: OpenTradeContext.sub_acc_push.

Request arguments:

Field Type Required Alias Description
acc_ids array of u64 account_ids, accounts Array of account IDs (u64) to receive order/deal push for. ⚠️ Call futu_list_accounts first to discover real acc_id values; do NOT hallucinate 18-digit numbers — invalid ids will silently fail to receive push. Alias: account_ids / accounts

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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
      ]
    }
  }
}

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:

v1.4.58+: Unsubscribe from account push notifications. Pass session_id from previous futu_sub_acc_push response (session_id field or unsub_hint). Returns {removed_count}. If session_id not found, removed_count=0 (likely 4h auto-purged or never registered).

Request arguments:

Field Type Required Alias Description
session_id string? Required: session_id returned by futu_sub_acc_push response (session_id field or unsub_hint). If omitted, handler returns an error. If session_id not found (e.g. 4h auto-purged), removed_count=0 is returned.

⚠️ Unknown fields: since v1.4.84, #[serde(deny_unknown_fields)] rejects any field not listed above — returns 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"
    }
  }
}

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:

v1.4.58+: Diagnostic — list all active push subscriptions on this MCP server (global scope, not per-session — rmcp Peer identity lacks PartialEq). Returns {total_count, subscriptions: [{session_id, acc_ids, age_secs}]}. Useful to verify if futu_sub_acc_push registered, check 4h auto-purge timeline, or debug missing pushes.

Request arguments: none (zero-arg tool)

JSON-RPC call example:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "futu_push_subscriber_info",
    "arguments": {}
  }
}

Response: JSON text matching the corresponding REST endpoint / Python SDK. On failure MCP CallToolResult.is_error=true + content carries {"error": "...", "status": "error"}.


Alphabetic tool index