mcpField
I
IBKR Portfolio Builder

IBKR Portfolio Builder

远程服务
github.com/adwiteeymauriya金融数据2020 周前更新
代码仓库

关于 IBKR Portfolio Builder

IBKR Portfolio Builder 是用于 Interactive Brokers 研究型组合构建的 MCP 服务,整合按策略分类的筛选器、新闻和只读账户数据,支持 LLM 驱动的研究流程。

主要功能

  1. 01468 个按策略标记的扫描定义
  2. 02按品种和类别整理筛选目录
  3. 03运行扫描并组合结果
  4. 04只读账户与市场数据
  5. 05新闻源和标题访问

适用场景

  1. 01查找符合组合策略的扫描
  2. 02按品种和指标筛选候选项
  3. 03结合新闻核对扫描结果
  4. 04查看持仓和账户余额

MCP 相关

通过 Streamable HTTP 向 MCP 客户端提供 IBKR 研究、筛选、新闻和只读账户工具。支持 OAuth 2.1 和静态 bearer token 身份验证。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://{ibkr_mcp_host}/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://{ibkr_mcp_host}/mcp需要授权

工具

详细介绍

ibkr-portfolio-builder-mcp

面向 使用 Interactive Brokers 自上而下构建投资组合 的远程 MCP 服务。可用作 Claude.ai 自定义连接器、Claude Code MCP,或任何 HTTP MCP 客户端。

大多数 ibkr-mcp 服务只提供单项查询基础工具,如 get_quote、get_position、place_order。本服务提供的是研究工作流:一个包含 468 个筛选器、覆盖 16 个类别且按策略意图(价值/成长/收益/动量/质量/事件/……)标记的类型化目录、每项扫描适用的金融工具、反向配对链接,以及实时新闻和账户访问能力——因此,大模型可以真正自上而下地构建投资组合(选择行业/策略 → 运行扫描 → 与新闻交叉参考 → 筛选候选项),而不是自下而上地盲目寻找股票代码。

为什么要开发它

我开发这个项目,是因为社区中现有的 IBKR-MCP 服务都把 IBKR 当作“查询单只股票代码”的数据源。这与大多数零售券商 UI 的使用方式相符,但并非有效构建投资组合的实际方式。

良好的自上而下工作流如下:

  1. 宏观论点(“利率即将下降,派息股票应该会重新估值”)→
  2. 策略意图(“给我看看针对美国大盘股、偏重质量的收益筛选条件”)→
  3. 筛选器组合(运行股息收益率 + ROE + 低负债筛选;取交集)→
  4. 事件/新闻背景(“这些股票中,有没有未来两周内公布财报的?有没有负面的分析师评级调整?”)→
  5. 缩小候选范围(“五个股票代码,按我的标准排序,可进行更深入的尽职调查”)。

要用大模型实现这一点,MCP 服务需要提供研究词汇体系,而不只是原始 API。这正是本服务要填补的空白:

  • 类型化扫描目录——包含 16 个类别中 468 个 IBKR 扫描代码(Fundamentals、Price Movement、Dividends、Options & Volatility、Events & Earnings、52/26/13 Week High-Low、ESG、Bonds、……),并自动标记 28 个策略意图标签(value、growth、quality、income、momentum_up、momentum_down、analyst、technical、gap、volatility、events、leverage、efficiency、risk_adjusted、……)。大模型询问“美国股票有哪些价值类扫描?”时,就会得到清晰且可筛选的结果,而不必试图从训练数据中猜测扫描代码。
  • 反向配对链接——预先计算每组 HIGH_X ↔ LOW_X 和 X_ASC ↔ X_DESC 配对,因此大模型可以切换方向(“LOW_PE_RATIO 的反向条件是什么?”),无需猜测。
  • 逐项扫描的金融工具映射——目录会标明每项扫描适用于哪些金融工具,如 STK、ETF、OPT、BOND 等。这样,大模型就不会再把 Refinitiv 扫描发送给债券工具并得到空结果。
  • 筛选器目录——单独的类型化数值筛选器映射表(priceAbove、peRatioBelow、divYieldAbove、growthRateAbove、avgVolumeAbove、marketCapAbove、……),按类别分组,并附有各类金融工具的适用性说明。
  • 新闻与筛选器集成在同一工具界面——使用同一连接器、同一身份验证和同一对话。大模型可以将扫描结果与近期头条或即将公布的财报进行交叉筛选,无需切换上下文。
  • 两种身份验证模式——面向 Claude.ai 自定义连接器的完整 OAuth 2.1(DCR + PKCE + well-knowns),以及适用于其他所有场景的静态 bearer token。使用同一服务和同一组工具。

这仍是一个早期服务。IBKR API 对模拟账户实际可查看的内容有不少限制(尤其是历史新闻权限)。但目录和工作流结构已达到生产就绪状态,而且它们是大模型驱动研究循环的关键基础。

快速信息

  • 传输方式: /mcp 上的 Streamable HTTP。
  • 身份验证: OAuth 2.1(PKCE + RFC 7591 动态客户端注册)和/或静态 bearer token。可通过 AUTH_MODE 选择。
  • 持久化: 目前仅使用内存(容器重启后会重置会话 / DCR 客户端 / OAuth 令牌)。Redis 已列入路线图,见下文。
  • IBKR 连接: ib-gateway(ghcr.io/gnzsnz/ib-gateway:stable)作为同一 compose 中的同级服务运行;默认使用只读 API 模式下的模拟账户。
  • 构建基础: FastMCP + ib_async。

工具

与 IBKR 官方 MCP 的 9 个只读工具功能对等(跳过两个写入 / 下单指令工具,详见路线图),另有 5 个筛选器 / 新闻 / 目录工具,这些正是此服务的存在意义。

工具功能
ib_account_summary查询已连接的模拟或实盘账户的 NetLiquidation / BuyingPower / TotalCashValue / AvailableFunds / UnrealizedPnL。
ib_positions查询受管理账户中的未平仓头寸,包括数量 / 平均成本 / 按市值计价 / 未实现盈亏。
ib_open_orders查询当前有效订单及其状态、已成交 / 剩余数量、平均成交价格。
ib_trades查询近期已执行的成交(days_back 时间范围,IBKR 将历史记录限制在约 7 天内)。
ib_price_snapshot查询美国股票当前的买价 / 卖价 / 最新价 / 最高价 / 最低价 / 成交量。清晰显示 IBKR 的市场数据限制消息。
ib_price_history查询任意时长 / K 线周期的 OHLCV 数据(1 day、1 hour、5 mins……)。无论是否订阅市场数据,始终可用。
ib_search_contracts按名称 / 部分股票代码模糊搜索 IBKR 合约数据库。
ib_contract_details完整合约元数据 — long_name、industry、category、subcategory、交易时段、有效交易所。为结合行业自上而下筛选提供支持。
ib_scan_catalog类型化扫描目录。可按 category、strategy、instrument、自由文本 query 筛选;也可通过 list_meta=true 返回所有可用类别 + 策略的完整列表。
ib_filter_catalog按类别(price、volume、market_cap、fundamentals、technical、options)分组的筛选参数代码,并附带适用的工具说明。
ib_screener_codes对原始 scan-parameters.xml 代码进行子串搜索(旧版 / 后备工具)。适用于查找尚未纳入精选目录的较新供应商代码。
ib_screener运行 IBKR 扫描 — 传入 scan_code、instrument、location 以及可选的价格 / 成交量筛选条件。返回排名 + 股票代码 + 交易所。
ib_news_providers列出已订阅的 IBKR 新闻提供商(Briefing.com、Dow Jones 等)。
ib_news_for_symbol跨所有已订阅提供商获取美国股票的新闻标题。仅返回标题;如果账户没有历史新闻权限,会清晰显示 notice 字段。
ib_news_article根据 provider_code + article_id 获取单篇文章正文。⚠️ 可能会产生单篇文章费用(尤其是 Dow Jones)。

关于下单的说明。 IBKR 官方 MCP 还提供 Create Order Instruction 和 Delete Order Instruction。本服务有意不提供这两项工具 — 它以 READ_ONLY_API=yes 模式运行 ib-gateway,因此即使工具调用路由错误,也无法下单。订单执行应由另一个拥有独立审批关卡的服务负责。路线图中还提到一种可能的“仅暂存”指令工具:它只会写入本地存储,不会触及 IBKR。

身份验证

AUTH_MODE 用于选择服务器接受的身份验证机制。默认值为 both。

模式接受的方式必需的环境变量
oauth仅接受由 OAuth 签发的令牌。Claude.ai 自定义连接器必须使用此模式。LOGIN_PASSWORD
bearer仅接受静态 Authorization: Bearer <token>。跳过 OAuth 流程——最适合 CLI 客户端、Claude Code 和你自己的脚本。STATIC_BEARER_TOKEN
both (默认)接受 OAuth 令牌或静态 bearer 令牌。LOGIN_PASSWORD 或 STATIC_BEARER_TOKEN 至少需要一个。

OAuth 端点(/authorize、/token、/register、/.well-known/*、/login)始终会注册。在 bearer 模式下,它们不会生效——无需在你的 README 中指向这些端点。

生成密钥
uv run --no-project python -c "import secrets; print(secrets.token_urlsafe(48))"   # bearer token
uv run --no-project python -c "import secrets; print(secrets.token_urlsafe(48))"   # session secret
使用静态 bearer 令牌
curl -X POST https://YOUR.DOMAIN/mcp \
  -H "Authorization: Bearer $STATIC_BEARER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
从 Claude.ai 连接(OAuth)

设置 → 连接器 → 添加自定义连接器 → URL:https://YOUR.DOMAIN/mcp → 将 OAuth 客户端 ID/密钥留空(Claude.ai 使用 DCR)。Claude.ai 开始 OAuth 流程时,系统会提示你输入 LOGIN_PASSWORD。

运行

cp .env.example .env
# edit .env: set TWS_USERID / TWS_PASSWORD (paper account), LOGIN_PASSWORD, STATIC_BEARER_TOKEN, PUBLIC_BASE_URL
docker compose up -d

默认情况下,此操作会从 GitHub Container Registry 拉取已发布的多架构镜像:ghcr.io/adwiteeymauriya/ibkr-portfolio-builder-mcp:latest。若要改为在本地构建(例如迭代开发源代码时),请先运行 docker compose build ibkr-mcp。

首次启动后,ib-gateway 需要约 60–90 秒才能完成 IBKR 登录。使用 docker logs -f ibkr-mcp-gateway 查看日志。

仅供本地使用时(bearer 令牌客户端,不使用 Claude.ai),这样就足够了——现在 http://localhost:8000/mcp 已可提供服务。Claude.ai 自定义连接器需要可公开访问的 HTTPS URL,因此必须在前面配置带 TLS 的反向代理。

为 Claude.ai 配置 TLS

任选一种。两种方式最终都会提供可用的 https://your-host/mcp 和有效证书。

选项 1 — Cloudflare Tunnel(无需公网 IP,无需端口转发)。 适合服务器运行在家庭网络中或位于 NAT 后的虚拟机上。Cloudflare 免费提供主机名和 TLS;隧道守护进程会从服务器向外连接到 Cloudflare 边缘节点。

# One-time: install cloudflared, then
cloudflared tunnel login
cloudflared tunnel create ibkr-mcp
cloudflared tunnel route dns ibkr-mcp ibkr-mcp.your-domain.com

~/.cloudflared/config.yml:

tunnel: ibkr-mcp
credentials-file: /home/you/.cloudflared/<TUNNEL_ID>.json
ingress:
  - hostname: ibkr-mcp.your-domain.com
    service: http://localhost:8000
  - service: http_status:404

使用 cloudflared tunnel run ibkr-mcp 运行(或通过 cloudflared service install 安装为 systemd 单元)。然后在 .env 中设置 PUBLIC_BASE_URL=https://ibkr-mcp.your-domain.com,并运行 docker compose restart ibkr-mcp。

选项 2 — 使用 Let's Encrypt 的 Caddy 反向代理。 适合拥有公网 IP 且开放了 80/443 端口的服务器。Caddy 会自动获取证书。

Caddyfile:

ibkr-mcp.your-domain.com {
    reverse_proxy localhost:8000
}

使用 caddy run 运行(或安装为系统服务:运行 sudo caddy start 并添加 systemd 单元)。.env 中的修改与上文相同。

两种方式都要求 PUBLIC_BASE_URL 与你提供给 Claude.ai 的 URL 完全一致——Claude.ai 会据此验证 OAuth 发行方。

LLM 提示词示例(自上而下的工作流)

1. Discovery:
   "List the strategies and categories available in ib_scan_catalog."

2. Strategy intent:
   "Find me value scans for US stocks. Show me their inverse codes too."

3. Composition:
   "Run LOW_PE_RATIO on STK.US.MAJOR with priceAbove $20 and avgVolumeAbove
    1,000,000, top 30. Cross-reference with HIGH_RETURN_ON_EQUITY top 30.
    Show me overlap."

4. Event context:
   "For the overlap list, check ib_news_for_symbol for any negative
    headlines in the last 7 days, and Events & Earnings scans for
    upcoming earnings within 14 days."

5. Narrow:
   "Rank the survivors by liquidity and tell me which two you'd dig
    into next."

路线图

领域项目
身份验证基于 Redis 的会话、DCR 客户端、OAuth 令牌
身份验证每个令牌的作用域(read-only、read-news、screener-only,……)
交易品种期权(链、希腊值、IV/价格计算)
交易品种期货(ContFuture、通过 Bag 组合)
交易品种债券(搜索 + 报价)
交易品种外汇 + 加密货币
交易所非美国股票路由(欧盟、香港、日本、澳大利亚)
交易所支持货币的 ib_account_summary
研究Reuters 基本面数据(reqFundamentalDataAsync)
研究实时流式 K 线 + 逐笔行情
研究Level 2 订单簿
研究每日 PnL 流(pnlAsync、pnlSingleAsync)
研究顾问子账户(reqFamilyCodesAsync)
研究将目录导入 Memgraph,以支持多跳查询
研究扩展 ib_news_search
风险ib_what_if_order(保证金预览,不执行订单)
风险本地暂存指令工具(不写入 IBKR)

欢迎就以上任何项目提交问题或 PR。

目录结构

.
├── Dockerfile
├── docker-compose.yml             # connector + ib-gateway, internal IBKR network
├── pyproject.toml                 # uv-managed: fastmcp, itsdangerous, uvicorn, ib_async
├── uv.lock
├── .env.example
├── LICENSE                        # MIT
├── scan-parameters.xml            # IBKR's authoritative scan params (raw XML)
├── scanner_reference.json         # IBKR-categorized scanner reference
├── scanner_params.json            # Flat dump of scan codes + filters
├── scripts/
│   └── build_catalog.py           # Regenerates src/connector/data/* from the three source files above
└── src/
    └── connector/
        ├── settings.py            # env-driven config (incl. AUTH_MODE)
        ├── auth.py                # LoginGatedOAuthProvider + static bearer override + /login
        ├── ibkr.py                # ib_async connection helper (connect-per-call)
        ├── screener.py            # raw scan-parameters.xml substring search (fallback tool)
        ├── catalog.py             # typed scan + filter catalog loaders + filtering
        ├── tools.py               # 15 MCP tools wired into FastMCP
        ├── server.py              # FastMCP + Starlette wiring + uvicorn entry
        └── data/
            ├── scan_catalog.json  # generated
            └── filter_catalog.json # generated

许可证

MIT。

致谢

免责声明

本软件会连接到你的 Interactive Brokers 账户。默认情况下,它会以只读 API 模式连接模拟账户运行——即使工具尝试下单,也无法下单。如果你切换到真实账户,风险由你自行承担。工具输出均不构成投资建议;策略标签只是词汇辅助工具,并非推荐引擎。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。