Skip to main content
Glama
xyonium

futu-opend-mcp

by xyonium
README.md
# 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](https://openapi.futunn.com/skills/opend-skills.zip)
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):**
```json
{
  "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):**
```json
{
  "mcpServers": {
    "futu-opend": {
      "command": "uvx",
      "args": ["futu-opend-mcp"],
      "env": {
        "FUTU_OPEND_ENCRYPT": "false"
      }
    }
  }
}
```

Extract the RSA key for the env var:
```bash
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.

TDQS

C2.9/5.0

Scored across 53 tools

Disambiguation4/5

Most tools have clearly distinct purposes, with detailed descriptions differentiating them. However, the pair get_institutional_holdings and get_institution_holdings are very similarly named and require careful reading to avoid confusion, slightly lowering the score.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., get_snapshot, search_quote, screen_stocks), making it predictable for agents.

Tool Count2/5

With 53 tools, the server is extremely extensive. While the financial domain is broad, this number is excessive and may overwhelm agents, leading to difficulty in selecting the right tool.

Completeness4/5

The tool set covers a wide range of financial data needs including stocks, options, fundamentals, institutional holdings, and economic calendars. Minor gaps like lack of order book depth or tick data exist, but the core data surface is comprehensive.

Maintenance

ActivityMaintained
ResponsivenessNo issues