Skip to content

Watchlists / Private Notes

MCP tool overview

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:write
  • 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).

Runtime validation: this request type has a validate() method that adds runtime required-field / enum-value validation on top of the JSON schema.

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_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=custom, 2=system, 3=all.

Request arguments:

Field Type Required Alias Description
group_type i32 ✓ default default_user_security_group_type — Group type: 1=custom, 2=system, 3=all (default 1)

⚠️ 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.

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_stock_note_labels

  • Scope: acc:read
  • Python SDK equivalent: —
  • Route: MCP JSON-RPC tools/call with name = "futu_get_stock_note_labels"

Description:

Private stock-note basic labels. Requires authenticated REST forwarding and --enable-v18-stock-notes.

Request arguments:

Field Type Required Alias Description
c2s_json string ✅ — Official generated C2S JSON. Field names use generated proto serde snake_case, e.g. multi_legs / combo_legs / order_type.
api_key string? — — Optional per-call API key plaintext. HTTP scope mode still requires a valid Bearer on every /mcp request; this field overrides that identity for the tool handler. In stdio mode: tool argument > startup 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_get_stock_note_labels",
    "arguments": {
      "c2s_json": "{\"mode\":1,\"stock_ids\":[],\"extension_version\":1}",
      "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_stock_notes

  • Scope: acc:read
  • Python SDK equivalent: —
  • Route: MCP JSON-RPC tools/call with name = "futu_get_stock_notes"

Description:

Private stock-note details for explicit nonzero stock IDs. Requires authenticated REST forwarding.

Request arguments:

Field Type Required Alias Description
c2s_json string ✅ — Official generated C2S JSON. Field names use generated proto serde snake_case, e.g. multi_legs / combo_legs / order_type.
api_key string? — — Optional per-call API key plaintext. HTTP scope mode still requires a valid Bearer on every /mcp request; this field overrides that identity for the tool handler. In stdio mode: tool argument > startup 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_get_stock_notes",
    "arguments": {
      "c2s_json": "{\"stock_ids\":[7001],\"extension_version\":1}",
      "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_set_stock_note

  • Scope: qot:write
  • Python SDK equivalent: —
  • Route: MCP JSON-RPC tools/call with name = "futu_set_stock_note"

Description:

Create, update, or delete a private stock note through authenticated REST. No automatic resend on unknown outcome.

Request arguments:

Field Type Required Alias Description
c2s_json string ✅ — Official generated C2S JSON. Field names use generated proto serde snake_case, e.g. multi_legs / combo_legs / order_type.
api_key string? — — Optional per-call API key plaintext. HTTP scope mode still requires a valid Bearer on every /mcp request; this field overrides that identity for the tool handler. In stdio mode: tool argument > startup 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_set_stock_note",
    "arguments": {
      "c2s_json": "{\"operation\":3,\"stock_id\":7001,\"title\":\"watch\",\"detail\":\"review later\",\"is_display\":1,\"extension_version\":1}",
      "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"}.