返回市场
施瓦布-MCP

施瓦布-MCP

作者:jkoelker20 星标更新:2025-10-31

项目介绍

Schwab 模型上下文协议服务器

这是一个使用 schwab-py 和 MCP python-sdk 实现的模型上下文协议(MCP)服务器。

特性

  • 通过模型上下文协议暴露 Schwab API 功能
  • 获取账户信息和持仓
  • 获取股票报价和价格历史
  • 获取市场信息和市场动向
  • 获取期权链和到期数据
  • 访问订单和交易历史
  • 全面的订单构建和下单能力
  • 高级订单策略(OCO、触发式和套利订单)
  • 使用特殊工具修改账户状态(需通过 Discord 审批,可绕过审批使用 --jesus-take-the-wheel 参数)
  • 设计用于与大型语言模型(LLMs)集成

安装

# 安装所有依赖项
uv add -e .

# 安装开发依赖项
uv add -e .[dev]

使用方法

认证

第一步是认证 Schwab API 并生成一个令牌:

# 认证并生成令牌
uv run schwab-mcp auth --client-id YOUR_CLIENT_ID --client-secret YOUR_CLIENT_SECRET --callback-url YOUR_CALLBACK_URL

你可以通过环境变量设置这些凭据以避免每次输入它们:

默认情况下,令牌保存在 ~/.local/share/schwab-mcp/token.yaml(平台特定)。你可以指定不同的路径:

uv run schwab-mcp auth --token-path /path/to/token.yaml

支持 YAML 和 JSON 格式的令牌,并会根据文件扩展名推断格式。

运行服务器

认证后,你可以运行服务器:

# 使用默认令牌路径运行服务器
uv run schwab-mcp server \
  --client-id YOUR_CLIENT_ID \
  --client-secret YOUR_CLIENT_SECRET \
  --callback-url YOUR_CALLBACK_URL \
  --discord-token YOUR_DISCORD_BOT_TOKEN \
  --discord-channel-id YOUR_APPROVAL_CHANNEL_ID \
  --discord-approver DISCORD_USER_ID [--discord-approver ANOTHER_USER_ID ...]

# 使用自定义令牌路径运行
uv run schwab-mcp server \
  --token-path /path/to/token.json \
  --client-id YOUR_CLIENT_ID \
  --client-secret YOUR_CLIENT_SECRET \
  --callback-url YOUR_CALLBACK_URL \
  --discord-token YOUR_DISCORD_BOT_TOKEN \
  --discord-channel-id YOUR_APPROVAL_CHANNEL_ID

# 使用自动批准的账户修改工具(无需 Discord 提示)
uv run schwab-mcp server \
  --jesus-take-the-wheel \
  --client-id YOUR_CLIENT_ID \
  --client-secret YOUR_CLIENT_SECRET \
  --callback-url YOUR_CALLBACK_URL

令牌有效期验证 - 如果超过 5 天,系统将提示重新认证。

也可以通过环境变量提供与 Discord 相关的标志:

  • SCHWAB_MCP_DISCORD_TOKEN
  • SCHWAB_MCP_DISCORD_CHANNEL_ID
  • SCHWAB_MCP_DISCORD_TIMEOUT(可选,默认为 600 秒)
  • SCHWAB_MCP_DISCORD_APPROVERS(可选逗号分隔的 Discord 用户 ID 列表)

容器镜像

发布的容器镜像可以在 ghcr.io/jkoelker/schwab-mcp 找到。该镜像默认运行 schwab-mcp server 并在 /root/.local/share/schwab-mcp 下持久化令牌数据,除非被覆盖。

podman run --rm --interactive \
  --env SCHWAB_CLIENT_ID \
  --env SCHWAB_CLIENT_SECRET \
  --env SCHWAB_CALLBACK_URL \
  --env SCHWAB_MCP_DISCORD_TOKEN \
  --env SCHWAB_MCP_DISCORD_CHANNEL_ID \
  --publish 8182:8182 \
  --volume ~/.local/share/schwab-mcp:/schwab-mcp \
  ghcr.io/jkoelker/schwab-mcp:latest \
    server \
    --token-path /schwab-m- cp/token.yaml

容器入口点读取与 CLI 相同的环境变量,因此可以通过追加它们来覆盖或添加标志(例如,... ghcr.io/jkoelker/schwab-mcp:latest --jesus-take-the-wheel)。要探索其他入口点,请运行 docker run ghcr.io/jkoelker/schwab-mcp:latest --help

Discord 审批设置

  1. https://discord.com/developers/applications 创建或打开你的应用,添加一个机器人,重置令牌,并将其粘贴到 SCHWAB_MCP_DISCORD_TOKEN 中。
  2. 安装标签页(左侧边栏)中,将安装链接设置为 None,以禁用默认授权链接。
  3. 打开机器人标签页,关闭公共机器人
  4. 使用OAuth2 → URL 生成器构建邀请链接,选择 bot 范围。当权限矩阵出现时,授予机器人以下权限:
    • 查看频道
    • 发送消息
    • 嵌入链接
    • 添加反应
    • 阅读消息历史
    • 管理消息
  5. 复制生成的 URL(权限整数反映了你勾选的框),登录拥有审批服务器的 Discord 账户,打开它,并授权机器人进入应发布审批的频道。

警告:使用 --jesus-take-the-wheel 标志启用可以修改账户状态的工具。谨慎使用,因为这允许 LLM 取消订单并可能执行其他更改账户状态的操作。

可用工具

服务器公开了以下 MCP 工具:

注意:工具 27-39 将暂停等待 Discord 审批后再执行。传递 --jesus-take-the-wheel 可完全绕过审批流程。

日期和市场信息

  1. get_datetime - 获取当前日期时间(ISO 格式)
  2. get_market_hours - 获取特定市场的交易时间
  3. get_movers - 获取特定指数的市场动向
  4. get_instruments - 搜索具有特定符号的证券

账户信息

  1. get_account_numbers - 获取账户 ID 到账户哈希的映射
  2. get_accounts - 获取所有关联 Schwab 账户的信息
  3. get_accounts_with_positions - 获取具有持仓信息的账户
  4. get_account - 获取特定账户的信息
  5. get_account_with_positions - 获取具有持仓信息的特定账户
  6. get_user_preferences - 获取所有账户的用户偏好设置,包括昵称

订单

  1. get_order - 获取特定订单的详细信息
  2. get_orders - 获取特定账户的订单

报价

  1. get_quotes - 获取指定符号的报价

价格历史

  1. get_advanced_price_history - 获取特定符号的高级价格历史
  2. get_price_history_every_minute - 获取每分钟频率的价格历史
  3. get_price_history_every_five_minutes - 获取每五分钟频率的价格历史
  4. get_price_history_every_ten_minutes - 获取每十分钟频率的价格历史
  5. get_price_history_every_fifteen_minutes - 获取每十五分钟频率的价格历史
  6. get_price_history_every_thirty_minutes - 获取每三十分钟频率的价格历史
  7. get_price_history_every_day - 获取每日频率的价格历史
  8. get_price_history_every_week - 获取每周频率的价格历史

期权

  1. get_option_chain - 获取特定符号的期权链
  2. get_advanced_option_chain - 获取特定符号的高级期权链
  3. get_option_expiration_chain - 获取特定符号的期权到期信息

交易

  1. get_transactions - 获取特定账户的交易
  2. get_transaction - 获取特定交易的详细信息

账户修改工具(需要 --jesus-take-the-wheel 标志)

  1. cancel_order - 取消特定订单

股票订单

  1. place_equity_market_order - 下单购买股票或 ETF 的市价订单
  2. place_equity_limit_order - 下单购买股票或 ETF 的限价订单
  3. place_equity_stop_order - 下单购买股票或 ETF 的止损订单
  4. place_equity_stop_limit_order - 下单购买股票或 ETF 的止损限价订单
  5. place_equity_order - 统一函数,用于下达任何类型的股票订单

期权订单

  1. create_option_symbol - 从组件创建正确格式化的期权符号
  2. place_option_market_order - 下单购买期权合约的市价订单
  3. place_option_limit_order - 下单购买期权合约的限价订单
  4. place_option_order - 统一函数,用于下达任何类型的期权订单

复杂订单策略

  1. place_one_cancels_other_order - 创建一个 OCO 订单对,其中一个订单的执行会取消另一个订单
  2. place_first_triggers_second_order - 创建一个序列,其中第一个订单的执行会触发第二个订单
  3. place_bracket_order - 创建一个完整的策略,包含入场订单和 OCO 出场订单

安全警告

--jesus-take-the-wheel 标志使 LLM 能够执行可以修改账户状态的操作,包括:

  • 取消订单
  • 下单购买市价、限价、止损和止损限价订单
  • 创建复杂订单策略(OCO、触发式和套利订单)

这些操作有直接的财务影响。仅在受控环境中使用此标志,并且完全理解所涉及的风险。考虑使用小额仓位或在可用的情况下在模拟交易账户中进行测试。

开发

# 类型检查
uv run pyright

# 格式化代码
uv run ruff format .

# 代码检查
uv run ruff check .

# 运行测试
uv run pytest

许可证

本项目在 MIT 许可证下提供。