这是一个使用 schwab-py 和 MCP python-sdk 实现的模型上下文协议(MCP)服务器。
--jesus-take-the-wheel 参数)# 安装所有依赖项
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
你可以通过环境变量设置这些凭据以避免每次输入它们:
SCHWAB_CLIENT_IDSCHWAB_CLIENT_SECRETSCHWAB_CALLBACK_URL(默认为 https://127.0.0.1:8182)默认情况下,令牌保存在 ~/.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_TOKENSCHWAB_MCP_DISCORD_CHANNEL_IDSCHWAB_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。
SCHWAB_MCP_DISCORD_TOKEN 中。None,以禁用默认授权链接。bot 范围。当权限矩阵出现时,授予机器人以下权限:
警告:使用
--jesus-take-the-wheel标志启用可以修改账户状态的工具。谨慎使用,因为这允许 LLM 取消订单并可能执行其他更改账户状态的操作。
服务器公开了以下 MCP 工具:
注意:工具 27-39 将暂停等待 Discord 审批后再执行。传递
--jesus-take-the-wheel可完全绕过审批流程。
get_datetime - 获取当前日期时间(ISO 格式)get_market_hours - 获取特定市场的交易时间get_movers - 获取特定指数的市场动向get_instruments - 搜索具有特定符号的证券get_account_numbers - 获取账户 ID 到账户哈希的映射get_accounts - 获取所有关联 Schwab 账户的信息get_accounts_with_positions - 获取具有持仓信息的账户get_account - 获取特定账户的信息get_account_with_positions - 获取具有持仓信息的特定账户get_user_preferences - 获取所有账户的用户偏好设置,包括昵称get_order - 获取特定订单的详细信息get_orders - 获取特定账户的订单get_quotes - 获取指定符号的报价get_advanced_price_history - 获取特定符号的高级价格历史get_price_history_every_minute - 获取每分钟频率的价格历史get_price_history_every_five_minutes - 获取每五分钟频率的价格历史get_price_history_every_ten_minutes - 获取每十分钟频率的价格历史get_price_history_every_fifteen_minutes - 获取每十五分钟频率的价格历史get_price_history_every_thirty_minutes - 获取每三十分钟频率的价格历史get_price_history_every_day - 获取每日频率的价格历史get_price_history_every_week - 获取每周频率的价格历史get_option_chain - 获取特定符号的期权链get_advanced_option_chain - 获取特定符号的高级期权链get_option_expiration_chain - 获取特定符号的期权到期信息get_transactions - 获取特定账户的交易get_transaction - 获取特定交易的详细信息--jesus-take-the-wheel 标志)cancel_order - 取消特定订单place_equity_market_order - 下单购买股票或 ETF 的市价订单place_equity_limit_order - 下单购买股票或 ETF 的限价订单place_equity_stop_order - 下单购买股票或 ETF 的止损订单place_equity_stop_limit_order - 下单购买股票或 ETF 的止损限价订单place_equity_order - 统一函数,用于下达任何类型的股票订单create_option_symbol - 从组件创建正确格式化的期权符号place_option_market_order - 下单购买期权合约的市价订单place_option_limit_order - 下单购买期权合约的限价订单place_option_order - 统一函数,用于下达任何类型的期权订单place_one_cancels_other_order - 创建一个 OCO 订单对,其中一个订单的执行会取消另一个订单place_first_triggers_second_order - 创建一个序列,其中第一个订单的执行会触发第二个订单place_bracket_order - 创建一个完整的策略,包含入场订单和 OCO 出场订单--jesus-take-the-wheel 标志使 LLM 能够执行可以修改账户状态的操作,包括:
这些操作有直接的财务影响。仅在受控环境中使用此标志,并且完全理解所涉及的风险。考虑使用小额仓位或在可用的情况下在模拟交易账户中进行测试。
# 类型检查
uv run pyright
# 格式化代码
uv run ruff format .
# 代码检查
uv run ruff check .
# 运行测试
uv run pytest
本项目在 MIT 许可证下提供。