MCP server exposing Futu OpenD read-only investment-research quote APIs.
Project description
futu-opend-mcp
An MCP server that exposes Futu OpenD's read-only investment-research quote APIs (stock/option/warrant/futures prices, financials, news/announcements, shareholders, institutions, macro) as MCP tools. It borrows your already-running, logged-in Futu OpenD gateway - no separate auth. No trading, no subscriptions.
It wraps the official Futu skill pack unmodified, so it stays in sync with Futu's own field-parsing logic.
Install & run
Claude Code / Claude Desktop (stdio)
claude mcp add futu-opend-mcp -- uvx futu-opend-mcp
Or from git before a PyPI release:
claude mcp add futu-opend-mcp -- uvx --from git+https://github.com/ER-EPR/futu-opend-mcp futu-opend-mcp
Open WebUI via mcpo (HTTP)
uvx mcpo --port 8000 -- futu-opend-mcp
# OpenAPI at http://localhost:8000, docs at /docs
MCP JSON config
Add to ~/.claude/settings.json, .mcp.json, or Claude Desktop config:
Remote OpenD (with encryption):
{
"mcpServers": {
"futu-opend": {
"command": "uvx",
"args": ["futu-opend-mcp"],
"env": {
"FUTU_OPEND_HOST": "your-opend-host",
"FUTU_OPEND_PORT": "11111",
"FUTU_OPEND_ENCRYPT": "true",
"FUTU_OPEND_RSA_KEY": "-----BEGIN RSA PRIVATE KEY-----\\nMIIC...\\n-----END RSA PRIVATE KEY-----"
}
}
}
}
Local OpenD (no encryption):
{
"mcpServers": {
"futu-opend": {
"command": "uvx",
"args": ["futu-opend-mcp"],
"env": {
"FUTU_OPEND_ENCRYPT": "false"
}
}
}
}
Extract the RSA key for the env var:
docker exec futu-opend cat /rsa/rsa_private_pkcs1.pem | awk '{printf "%s\\n", $0}'
Configuration (env vars)
| Var | Default | Purpose |
|---|---|---|
FUTU_OPEND_HOST |
127.0.0.1 |
OpenD host |
FUTU_OPEND_PORT |
11111 |
OpenD port |
FUTU_OPEND_RSA_KEY |
- | inline PEM of the shared RSA private key |
FUTU_OPEND_RSA_KEY_FILE |
- | path to the PEM file (alternative to above) |
FUTU_OPEND_ENCRYPT |
true |
proto encryption; false for local 127.0.0.1 OpenD |
FUTU_OPEND_LOG_LEVEL |
INFO |
logging level |
OpenD and the SDK share one RSA private key (PKCS#1 1024-bit). Get it from a dockerized
OpenD with: docker compose logs opend | grep -A20 'NEW RSA PRIVATE KEY'.
Tools
~50 read-only tools across: price/quote, search, screening, financials, research/valuation,
corporate actions, shareholders, profile, capital flow, short interest, options, option
underlying IV/HV, warrants/futures, plates, industrial chains, institutions, macro,
dividends, IPO, and diagnostics. See docs/superpowers/specs/2026-07-10-futu-opend-mcp-design.md.
Development
pip install -e ".[dev]"
pytest -q -m "not integration" # unit tests (no OpenD needed)
ruff check .
Live-OpenD integration tests are marked integration and skip themselves when OpenD is
unreachable. Re-vendor the official skill pack with ./scripts/sync_skill.sh.
Attribution
Wraps the official Futu futuapi skill pack (vendored under
src/futu_opend_mcp/_skill/futuapi/, unmodified). Legal terms in that folder apply.
License
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file futu_opend_mcp-0.1.2.tar.gz.
File metadata
- Download URL: futu_opend_mcp-0.1.2.tar.gz
- Upload date:
- Size: 243.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1662cce7f9656729babab5c91623c513c98e98f531039709e5a51bf533ca0716
|
|
| MD5 |
2ffe348988d4ca3d83fa14ae7eb04f28
|
|
| BLAKE2b-256 |
875d8788aed1341b116a5241e0fcdc72ddcc04a33cc324d362b1cd4d3f8d1b65
|
Provenance
The following attestation bundles were made for futu_opend_mcp-0.1.2.tar.gz:
Publisher:
publish.yml on xyonium/futu-opend-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
futu_opend_mcp-0.1.2.tar.gz -
Subject digest:
1662cce7f9656729babab5c91623c513c98e98f531039709e5a51bf533ca0716 - Sigstore transparency entry: 2168150417
- Sigstore integration time:
-
Permalink:
xyonium/futu-opend-mcp@342455d5517ab91ea80e8358a4b70e9203e10899 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/xyonium
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@342455d5517ab91ea80e8358a4b70e9203e10899 -
Trigger Event:
push
-
Statement type:
File details
Details for the file futu_opend_mcp-0.1.2-py3-none-any.whl.
File metadata
- Download URL: futu_opend_mcp-0.1.2-py3-none-any.whl
- Upload date:
- Size: 413.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c47e75d014c6bf22994e918eb2926b8545df9f72d1bf17ad7c6d4f35cd60bddb
|
|
| MD5 |
c254b9d7d2fcd40fa1f77ee721f86a91
|
|
| BLAKE2b-256 |
dbe4043aaf3c92496e47ee25bf10aadbd80028a8349cb1800c2c5e832ec31cd1
|
Provenance
The following attestation bundles were made for futu_opend_mcp-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on xyonium/futu-opend-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
futu_opend_mcp-0.1.2-py3-none-any.whl -
Subject digest:
c47e75d014c6bf22994e918eb2926b8545df9f72d1bf17ad7c6d4f35cd60bddb - Sigstore transparency entry: 2168150443
- Sigstore integration time:
-
Permalink:
xyonium/futu-opend-mcp@342455d5517ab91ea80e8358a4b70e9203e10899 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/xyonium
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@342455d5517ab91ea80e8358a4b70e9203e10899 -
Trigger Event:
push
-
Statement type: