schwab mcp码头
](https://www.docker.com/)  
Schwab交易API的Docker包装器,支持MCP(模型上下文协议),提供Schwab交易服务的轻松部署和管理。
⚠️ 免责声明:本项目仅用于教育和学习目的。它不是作为投资建议。交易股票和期权涉及巨大的损失风险。您对任何交易决策及其后果负全部责任。在做出投资决策之前,始终进行自己的研究并咨询合格的财务顾问。
概述
该项目将Schwab交易MCP服务器打包在Docker容器中,通过适当的配置管理、令牌持久性和安全控制,可以轻松部署和运行Schwab API服务。它允许AI助手和应用程序通过标准化的MCP协议与Schwab交易账户进行交互。
特性
- 🐳 基于Docker的部署 -使用Docker Compose轻松设置
- 🔒 安全认证 -OAuth 2.0流与令牌持久性
- 📊 全面的API访问 -账户详细信息、报价、价格历史、期权链和订单管理
- 🛡️ 只读模式 -防止意外交易的安全功能
- 🔄 令牌持久性 -自动令牌刷新和存储
- 📁 体积映射 -身份验证令牌的持久数据存储
- 🚀 MCP协议 -AI助手集成的标准化接口
- ⚡ 交互式身份验证 -内置身份验证设置工具
先决条件
- Docker引擎(20.10.0或更高版本)
- Docker Compose(1.29.0或更高版本)
- 嘉信理财拥有API证书的开发人员账户
- 从获取凭据 Schwab开发者门户 - 您需要: APP_KEY, APP_SECRET和a CALLBACK_URL
Docker 镜像
预构建的多架构Docker镜像可从GitHub容器注册表获得:
docker pull ghcr.io/metaif/schwab-mcp-docker:latest支持的架构:
linux/amd64(x86_64)linux/arm64(aarch64/苹果硅)
可用标签:
latest-最新稳定版本v1.x.x-特定版本标签sha-xxxxxx-提交特定版本
快速开始
您有两个选项可以运行此服务:
选项A:使用预构建的Docker镜像(推荐用户使用)
1.下载配置文件
# Create a project directory
mkdir schwab-mcp && cd schwab-mcp
# Download docker-compose file for pre-built image and .env.example
curl -O https://raw.githubusercontent.com/metaif/schwab-mcp-docker/master/docker-compose.yaml
curl -O https://raw.githubusercontent.com/metaif/schwab-mcp-docker/master/.env.example2.配置环境变量
创建 .env 文件基于 .env.example:
# Schwab API Credentials (Required)
SCHWAB_APP_KEY=your_app_key_here
SCHWAB_APP_SECRET=your_app_secret_here
SCHWAB_CALLBACK_URL=https://127.0.0.1
# Tokens file path (default is fine)
TOKENS_FILE=/app/data/tokens.json
# MCP Server Port
MCP_PORT=8000
# READONLY Mode (recommended for safety)
READONLY=true3.拉取Docker镜像
docker pull ghcr.io/metaif/schwab-mcp-docker:latest4.首次身份验证
在运行服务器之前,您需要完成OAuth身份验证流程:
# Create data directory for token storage
mkdir -p data
# Run the authentication setup
docker-compose run --rm schwab-mcp python setup_auth.py这将:
- 打开浏览器窗口(或提供要粘贴的URL)
- 指导您完成Schwab的OAuth登录
- 将身份验证令牌保存到
data/tokens.json
5.启动MCP服务器
# Start the service
docker-compose up -d
# Verify the service is running
docker-compose ps6.验证服务
# Check logs
docker-compose logs -f schwab-mcp
# Test the server is responding (from another terminal)
curl http://localhost:8000/mcp选项B:从源代码构建(推荐给开发人员)
1.克隆存储库
git clone https://github.com/metaif/schwab-mcp-docker.git
cd schwab-mcp-docker2.配置环境变量
创建 .env 项目根目录中的文件基于 .env.example:
# Schwab API Credentials (Required)
SCHWAB_APP_KEY=your_app_key_here
SCHWAB_APP_SECRET=your_app_secret_here
SCHWAB_CALLBACK_URL=https://127.0.0.1
# Tokens file path (default is fine)
TOKENS_FILE=/app/data/tokens.json
# MCP Server Port
MCP_PORT=8000
# READONLY Mode (recommended for safety)
READONLY=true3.构建和启动
# Build the Docker image directly
docker build -t schwab-mcp-docker .
# Run the authentication setup
docker run --rm -it \
-v $(pwd)/data:/app/data \
--env-file .env \
schwab-mcp-docker python setup_auth.py
# Start the service
docker run -d \
--name schwab-mcp-server \
-v $(pwd)/data:/app/data \
--env-file .env \
-p ${MCP_PORT:-8000}:8000 \
--restart unless-stopped \
schwab-mcp-docker
# Verify the service is running
docker ps | grep schwab-mcp-server4.验证服务
# Check logs
docker logs -f schwab-mcp-server
# Test the server is responding
curl http://localhost:8000/mcp配置
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
SCHWAB_APP_KEY | 是 | - | 您的Schwab应用程序密钥来自开发人员门户 |
SCHWAB_APP_SECRET | 是 | - | 您的Schwab申请机密 |
SCHWAB_CALLBACK_URL | 是的 | https://127.0.0.1 | OAuth回调URL(必须与您的应用配置匹配) |
TOKENS_FILE | 没有 | /app/data/tokens.json | 存储身份验证令牌的路径 |
MCP_PORT | 没有 | 8000 | 暴露主机上MCP服务器的端口 |
READONLY | 没有 | false | 启用只读模式以阻止交易操作 |
只读模式
为了安全起见,您可以通过设置以只读模式运行服务器 READONLY=true 在你的 .env 文件。这将:
- ✅ 允许:获取报价、账户详细信息、价格历史、期权链、列表订单
- ❌ Block:下单、修改订单、取消订单
# In .env file
READONLY=true在只读模式下,任何下单、修改或取消订单的尝试都将返回错误消息。
项目结构
对于运行预构建Docker镜像的用户,您只需要:
your-project/
├── docker-compose.yaml # Downloaded via curl from repository
├── .env.example # Downloaded via curl from repository
├── .env # Your environment variables (create this)
└── data/ # Token storage (auto-created)
└── tokens.json # OAuth tokens (auto-created)源代码结构(适用于贡献或从源代码构建的开发人员):
schwab-mcp-docker/
├── docker-compose.yaml # Docker Compose for pre-built image (default)
├── Dockerfile # Docker image definition for building from source
├── entrypoint.sh # Container startup script
├── server.py # MCP server implementation
├── schwab_wrapper.py # Schwab API wrapper
├── setup_auth.py # Authentication setup tool
├── requirements.txt # Python dependencies
└── .env.example # Example environment variables可用的MCP工具
服务器通过MCP协议公开以下工具:
市场数据工具
- get_quote -获取某个符号的实时报价(例如AAPL、AMD)
- get_price_history -通过可定制的周期和频率获取历史价格数据
- get_option_chain -使用各种过滤器获取符号的选项链数据
帐户工具
- get_count_details -获取账户余额和头寸
- 列表_订单 -列出带有可选过滤器的订单(日期范围、状态)
交易工具(在只读模式下禁用)
- 下单 -下达股票或期权订单(市场、限价、止损、STOP_LIMIT)
- 修改订单 -修改现有订单
- 取消订单 -取消待处理订单
用法
启动服务
如果使用预构建映像(docker compose.yaml):
docker-compose up -d如果从源构建:
docker run -d \
--name schwab-mcp-server \
-v $(pwd)/data:/app/data \
--env-file .env \
-p ${MCP_PORT:-8000}:8000 \
--restart unless-stopped \
schwab-mcp-docker停止服务
# For pre-built image
docker-compose down
# For building from source
docker stop schwab-mcp-server
docker rm schwab-mcp-server重新启动服务
# For pre-built image
docker-compose restart
# For building from source
docker restart schwab-mcp-server查看日志
# For pre-built image:
docker-compose logs -f schwab-mcp
# For building from source:
docker logs -f schwab-mcp-server
# View recent logs
# Pre-built image:
docker-compose logs --tail=100 schwab-mcp
# Build from source:
docker logs --tail=100 schwab-mcp-server重新验证
如果您的令牌过期或需要重新验证:
如果使用预构建图像:
# Stop the service
docker-compose down
# Remove old tokens
rm data/tokens.json
# Re-run authentication
docker-compose run --rm schwab-mcp python setup_auth.py
# Restart the service
docker-compose up -d如果从源构建:
# Stop the service
docker stop schwab-mcp-server
docker rm schwab-mcp-server
# Remove old tokens
rm data/tokens.json
# Re-run authentication
docker run --rm -it \
-v $(pwd)/data:/app/data \
--env-file .env \
schwab-mcp-docker python setup_auth.py
# Restart the service
docker run -d \
--name schwab-mcp-server \
-v $(pwd)/data:/app/data \
--env-file .env \
-p ${MCP_PORT:-8000}:8000 \
--restart unless-stopped \
schwab-mcp-docker更新到较新版本
如果使用预构建图像:
# Stop the service
docker-compose down
# Pull the latest image
docker pull ghcr.io/metaif/schwab-mcp-docker:latest
# Restart with the new image
docker-compose up -d如果从源构建:
# Stop the service
docker stop schwab-mcp-server
docker rm schwab-mcp-server
# Pull latest code
git pull
# Rebuild and restart
docker build -t schwab-mcp-docker .
docker run -d \
--name schwab-mcp-server \
-v $(pwd)/data:/app/data \
--env-file .env \
-p ${MCP_PORT:-8000}:8000 \
--restart unless-stopped \
schwab-mcp-docker访问服务
MCP服务器使用可流式传输的HTTP在HTTP上运行:
- 默认URL:
http://localhost:8000/mcp - 协议:带有服务器发送事件(SSE)的HTTP MCP
配置您的MCP客户端(如Claude Desktop或其他AI助手)以连接到此端点。
MCP客户端配置示例
对于Claude Desktop,添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"schwab": {
"url": "http://localhost:8000/mcp"
}
}
}故障排除
身份验证问题
问题:身份验证失败或浏览器无法打开
解决方案:
- 验证您的
SCHWAB_APP_KEY和SCHWAB_APP_SECRET是正确的 - 确保您的
SCHWAB_CALLBACK_URL与Schwab开发者门户中注册的内容相匹配 - 如果在远程服务器上运行,您可能需要手动复制身份验证URL
容器无法启动
解决方案:
- 检查是否设置了所需的环境变量:
docker-compose config- 验证
data/目录存在并且具有适当的权限:
mkdir -p data
chmod 755 data- 检查日志以获取详细的错误消息:
docker-compose logs schwab-mcp端口已在使用中
如果端口8000已被占用,请更改 MCP_PORT 在 .env:
MCP_PORT=8001然后重新启动服务。
令牌到期
Schwab代币通常在一段时间后到期。如果遇到身份验证错误:
- 检查日志中与令牌相关的错误
- 如上所述重新运行身份验证设置
- 包装器应自动刷新令牌,但偶尔可能需要手动重新身份验证
只读模式不工作
确保环境变量设置正确:
docker-compose exec schwab-mcp env | grep READONLY应该显示 READONLY=true。如果没有,请更新您的 .env 文件并重新启动。
安全考虑
- ⚠️ 永不承诺
.env文件 -它已经在里面了.gitignore,保持这种状态 - 🔐 默认情况下使用只读模式 -仅在活跃交易时禁用
- 🔒 保护您的API证书 -商店
.env安全,从不公开分享 - 🌐 防火墙配置 -如果公开端口,请使用适当的身份验证和加密
- 🔑 令牌安全 -The
data/tokens.json文件包含敏感的访问令牌,请相应地保护它 - 📁 卷权限 -确保
data/目录具有适当的权限(不可读)
建筑
本项目使用:
- Python 3.11 作为运行时环境
- 施瓦布德夫 施瓦布API集成库
- 快速MCP 用于MCP协议实现
- 码头工人 用于容器化和易于部署
- OAuth 2.0 用于安全身份验证
服务器以流式http模式运行,允许它同时为多个MCP客户端提供服务。
贡献
欢迎投稿!请随时提交拉取请求。
致谢
特别感谢:
- 施瓦布德夫 -Schwab API的Python库
- MCP协议 -模型上下文协议规范
- Schwab开发者平台 -API访问和文档
许可证
本项目按MIT许可证提供。有关详细信息,请参阅LICENSE文件。
嘉信理财API及相关服务受 Schwab服务条款本包装是一个独立项目,不隶属于或认可嘉信理财股份有限公司。
链接
支持
关于以下问题:
- 这个Docker包装器:在此存储库中打开一个问题
- 施瓦布德夫图书馆:访问 Schwabdev存储库
- 嘉信理财API:联系方式 Schwab开发者支持
- MCP协议:访问 MCP文件
______________________________________________________________________
由...制作❤️ 面向交易和人工智能社区
