TastyTrade MCP服务器
适用于 ChatGPT桌面, 克劳德桌面版,或任何兼容MCP的客户端——本地和云中。
______________________________________________________________________
特性
- 72个MCP工具 涵盖整个TastTrade API
- 自动身份验证 使用存储的TastyTrade凭据(客户端机密+刷新令牌)
- OAuth 2.1授权服务器 用于ChatGPT和远程MCP客户端(PKCE、动态客户端注册)
- 实时市场数据 通过DXLink(报价、蜡烛、希腊选项)
- 双重运输:stdio(本地)和流式HTTP(云)
- 承载令牌安全 用于云部署
______________________________________________________________________
先决条件
- 20或更晚
- 具有API访问权限的TastTrade帐户(客户端机密和刷新令牌)
______________________________________________________________________
安装
git clone
cd tastytrade-mcp-server
npm install
npm run build______________________________________________________________________
用法
选项1:本地(stdio)
直接运行服务器,并通过stdio连接MCP客户端。
node build/index.jsChatGPT桌面
将此添加到您的ChatGPT桌面MCP配置中:
{
"mcpServers": {
"tastytrade": {
"command": "node",
"args": ["/absolute/path/to/build/index.js"]
}
}
}克劳德桌面版
添加到您的Claude桌面配置(claude_desktop_config.json):
{
"mcpServers": {
"tastytrade": {
"command": "node",
"args": ["/absolute/path/to/build/index.js"]
}
}
}MCP检查员(用于测试)
npx @modelcontextprotocol/inspector node build/index.js选项2:云(流式HTTP)
将服务器作为web服务运行,以便MCP客户端可以远程连接。
MCP_TRANSPORT=http MCP_BEARER_TOKEN=your-secret-token node build/index.js服务器在端口5000上启动(可通过配置 PORT 有人)。
- MCP端点:
https://your-server-url/mcp - 健康检查:
https://your-server-url/health
将您的MCP客户端连接到 /mcp 端点,并将承载令牌包含在 Authorization 头球
Authorization: Bearer your-secret-token______________________________________________________________________
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
MCP_TRANSPORT | 没有 | stdio | 运输方式: stdio (本地)或 http (云) |
MCP_BEARER_TOKEN | 用于保护HTTP端点的云 | - | 秘密令牌 |
TASTYTRADE_CLIENT_SECRET | 是 | - | TastyTrade OAuth客户端密钥(启动时自动加载) |
TASTYTRADE_REFRESH_TOKEN | 是 | - | TastyTrade OAuth刷新令牌(启动时自动加载) |
TASTYTRADE_SANDBOX | 没有 | false | 设置为 true 使用TastyTrade的沙盒/测试环境 |
PORT | 没有 | 5000 | HTTP服务器端口(仅限云模式) |
TOOL_DISCOVERY_MODE | 没有 | false | 启用动态工具发现模式(见下文) |
______________________________________________________________________
动态刀具发现模式
默认情况下,所有工具在启动时都会注册,并在每次调用时向LLM广播(每个请求约12000-15000个模式开销令牌)。对于对令牌敏感的部署,您可以启用 动态工具发现 模式,将初始模式开销减少到约200-500个令牌。
启用发现模式
TOOL_DISCOVERY_MODE=true node build/index.js启用后,启动时只显示三个轻量级元工具:
| 元工具 | 描述 |
|---|---|
list_tool_categories | 返回顶级工具类别(账户、订单、市场数据、工具、观察名单、风险、授权),并计算每个类别中的工具数量 |
search_tools | 对所有工具名称和描述进行关键字搜索——返回具有一句话摘要的匹配工具 |
get_tool_details | 按名称返回特定工具的完整输入模式和注释 |
完整的工具模式存储在内部注册表中,但 不广播 在最初的背景下,LLM。该模型根据需要发现和获取模式。
交互流程示例
User: What's the current price of AAPL?
Model → list_tool_categories()
← "Market Data (7 tools), Account (9 tools), ..."
Model → search_tools("quote price real-time")
← "get_quote [Market Data]: Get real-time quote data for one or more symbols using DXLink..."
Model → get_tool_details("get_quote")
← Full JSON schema with parameters (symbols, timeoutMs)
Model → get_quote(symbols=["AAPL"])
← { bid: 174.20, ask: 174.22, last: 174.21, ... }在同一会话中的后续回合中,模型可以跳过发现步骤并调用 get_quote 如果它已经知道对话早期的模式,则直接使用。
向后兼容
当 TOOL_DISCOVERY_MODE 未设置(或设置为 false),所有工具在启动时都会像以前一样注册。现有集成不受影响。
______________________________________________________________________
TastyTrade认证
服务器在启动时使用TastyTrade自动进行身份验证 TASTYTRADE_CLIENT_SECRET 和 TASTYTRADE_REFRESH_TOKEN 环境变量。不需要手动身份验证步骤。
若要获取您的客户机密和刷新令牌,请通过TastTrade的开发者门户注册API访问。
使用 check_auth_status 用于验证连接状态或在需要时重试身份验证的工具。
______________________________________________________________________
OAuth 2.1授权服务器
对于像ChatGPT这样的远程MCP客户端,该服务器包括一个内置的OAuth 2.1授权服务器,支持:
- PKCE (S256)用于安全授权码交换
- 动态客户端注册 (RFC 7591)用于自动客户入职
- 发现端点 (
/.well-known/oauth-authorization-server,/.well-known/oauth-protected-resource)
OAuth流
- 客户端通过以下方式发现OAuth配置
/.well-known/oauth-protected-resource和/.well-known/oauth-authorization-server - 客户端通过以下方式动态注册
POST /oauth/register - 客户端将用户重定向到
GET /oauth/authorizePKCE挑战 - 用户输入他们的
MCP_BEARER_TOKEN在授权页面上 - 服务器使用授权码重定向回
- 客户端在以下位置交换访问令牌代码
POST /oauth/token使用PKCE验证器 - 客户端使用访问令牌作为MCP请求的承载令牌
______________________________________________________________________
可用工具(72)
身份验证(2)
| 工具 | 说明 |
|---|---|
check_auth_status | 检查当前身份验证状态 |
disconnect | 断开与TastyTrade的连接 |
账目(4)
| 工具 | 说明 |
|---|---|
get_customer_accounts | 获取已验证客户的所有帐户 |
get_customer_resource | 获取客户资料信息 |
get_full_account_resource | 获取特定帐户的完整详细信息 |
get_account_status | 获取账户的交易状态 |
平衡与头寸(3)
| 工具 | 说明 |
|---|---|
get_account_balances | 获取账户的当前余额 |
get_positions | 获取一个账户的所有头寸 |
get_balance_snapshots | 获取历史余额快照 |
订单(14)
| 工具 | 说明 |
|---|---|
get_live_orders | 获取账户的实时(未结)订单 |
get_orders | 使用可选过滤功能获取订单 |
get_order | 按ID获取特定订单 |
create_order | 提交新订单 |
order_dry_run | 预览订单而不提交 |
cancel_order | 取消未结订单 |
replace_order | 替换现有订单 |
edit_order | 编辑现有订单 |
create_complex_order | 创建多腿复杂订单 |
cancel_complex_order | 取消复杂订单 |
reconfirm_order | 重新确认订单 |
replacement_order_dry_run | 预览替换订单 |
get_customer_live_orders | 获取所有账户的实时订单 |
get_customer_orders | 获取所有账户的订单 |
仪器(24)
| 工具 | 说明 |
|---|---|
get_equity | 获取特定股权的详细信息 |
get_equity_definitions | 通过过滤获取股权定义 |
get_active_equities | 获取所有活跃股票 |
get_equity_options | 获取某个交易品种的股票期权 |
get_single_equity_option | 获得特定的股票期权 |
get_option_chain | 获取符号的选项链 |
get_nested_option_chain | 获取嵌套选项链 |
get_compact_option_chain | 获得紧凑的选项链 |
get_futures | 获取期货合约 |
get_single_future | 获取特定的期货合约 |
get_future_option_chain | 获取期货期权链 |
get_nested_future_option_chain | 获取嵌套期货期权链 |
get_future_options | 获取未来选项 |
get_single_future_option | 获取特定的未来选项 |
get_futures_products | 获取所有期货产品 |
get_single_future_product | 获取特定的期货产品 |
get_future_option_products | 获取未来的可选产品 |
get_single_future_option_product | 获取特定的未来选项产品 |
get_cryptocurrencies | 获取可用的加密货币 |
get_single_cryptocurrency | 获取特定的加密货币 |
get_warrants | 获取可用的认股权证 |
get_single_warrant | 获得特定的搜查令 |
get_quantity_decimal_precisions | 获取数量小数精度规则 |
search_symbols | 通过文本查询搜索符号 |
市场数据(7)
| 工具 | 说明 |
|---|---|
get_market_metrics | 获取市场指标(IV排名、IV百分位数等) |
get_historical_dividends | 获取历史股息数据 |
get_historical_earnings | 获取历史收益数据 |
get_quote | 通过DXLink获取实时报价 |
get_candles | 通过DXLink获取历史烛台数据 |
get_options_greeks | 通过DXLink获取选项希腊语(delta、gamma、theta、vega、rho) |
get_api_quote_token | 获取DXLink API报价令牌 |
交易记录(3)
| 工具 | 说明 |
|---|---|
get_transactions | 获取帐户的交易历史记录 |
get_transaction | 按ID获取特定交易 |
get_total_fees | 获取帐户的总费用 |
观察名单(9)
| 工具 | 说明 |
|---|---|
get_all_watchlists | 获取所有个人观察名单 |
get_watchlist | 获取特定的观察名单 |
create_watchlist | 创建新的观察列表 |
replace_watchlist | 替换/更新观察名单 |
delete_watchlist | 删除监视列表 |
get_public_watchlists | 获取公共观察名单 |
get_public_watchlist | 获取特定的公共观察名单 |
get_pairs_watchlists | 获取配对交易观察名单 |
get_pairs_watchlist | 获取特定配对观察列表 |
风险与利润(6)
| 工具 | 说明 |
|---|---|
get_margin_requirements | 获取账户的保证金/资本要求 |
estimate_margin_requirements | 估计订单的利润(模拟运行) |
get_effective_margin_requirements | 获取特定交易品种的有效保证金 |
get_position_limit | 获取帐户的头寸限制 |
get_net_liq_history | 获取净清算价值历史记录 |
get_net_liq_value | 获取当前净变现价值 |
______________________________________________________________________
提示缓存
Anthropic和OpenAI都支持 快速缓存:当发送到模型的工具定义在连续回合之间相同时,提供者会缓存模式计算,并对后续请求收取正常费率的一小部分。使用73个工具(大约12000-15000个模式开销令牌),缓存可以通过以下方式降低每轮令牌成本 50–90% 在多回合对话中。
它如何与此服务器配合使用
此服务器的设计使工具定义始终在 相同的确定性顺序 在每次启动时:
- 身份验证工具
- 账户工具
- 平衡和定位工具
- 订购工具
- 仪器工具
- 市场数据工具
- 交易工具
- 监视列表工具
- 风险和利润工具
因为顺序永远不会改变,所以将工具列表转发给Anthropic或OpenAI的MCP客户端将在会话内和会话间的每个请求上发送相同的模式前缀,允许提供者从其缓存中提供模式。
验证缓存是否处于活动状态(Anthropic)
当您通过带有工具定义的Anthropic API使用Claude时,响应包括使用统计信息。查找非零 cache_read_input_tokens 字段:
{
"usage": {
"input_tokens": 512,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 14203
}
}非零 cache_read_input_tokens 该值确认工具模式是从Anthropic的提示缓存中提供的。在新缓存窗口中的第一个请求上,您将看到 cache_creation_input_tokens 相反,这是缓存种子的一次性成本。
HTTP缓存控制标头
服务器设置以下内容 Cache-Control 每种响应类型的标头:
| 端点 | 标题 | 原因 |
|---|---|---|
/.well-known/oauth-protected-resource | public, max-age=3600 | 稳定的OAuth元数据 |
/.well-known/oauth-authorization-server | public, max-age=3600 | 稳定的OAuth元数据 |
POST /mcp | no-store | 动态工具调用可能包含敏感的财务数据 |
GET /mcp 上海证券交易所 no-store | 实时服务器发送的事件流不可缓存 | |
DELETE /mcp | no-store | 会话拆分响应不可缓存 |
/health | no-store | 实时服务器状态 |
客户端要求
提示缓存由处理 客户端应用程序,不是这个服务器。当前的MCP SDK没有公开API来注入特定于提供商的 cache_control 注释(例如Anthropic的 {"type": "ephemeral"})到协议级别的工具列表中——这存在于客户端组装的LLM API请求中。要启用缓存,请执行以下操作:
- 无烟煤API:添加
{"type": "ephemeral"}作为cache_control注释到发送到Anthropic API的列表中的最后一个工具定义。此服务器中工具模式的稳定、确定性排序确保了内容哈希在每一轮都匹配。 - OpenAI API:对于超过1024个令牌的提示,会自动进行提示缓存;不需要额外的配置。
______________________________________________________________________
在Replit上部署
此项目已配置为在Replit上作为永远在线的VM进行部署:
- 在“答复机密”面板中设置以下机密:
- MCP_BEARER_TOKEN - TASTYTRADE_CLIENT_SECRET - TASTYTRADE_REFRESH_TOKEN
- 点击 发布 部署
- 您的MCP端点将在
https://your-replit-url/mcp
______________________________________________________________________
项目结构
src/
index.ts - Entry point (dual transport + OAuth 2.1 + bearer auth + TOOL_DISCOVERY_MODE)
tastytrade-client.ts - TastyTrade client wrapper (auto-authentication on startup)
oauth-provider.ts - Built-in OAuth 2.1 authorization server (DCR, PKCE, token management)
auth-page.ts - HTML authorization page rendered during OAuth flow
tools/
tool-registry.ts - Internal registry of all tool definitions (used by discovery mode)
discovery-tools.ts - Meta-tools: list_tool_categories, search_tools, get_tool_details
auth-tools.ts - Authentication tools
account-tools.ts - Account & customer tools
balance-position-tools.ts - Balances & positions
order-tools.ts - Order management
instrument-tools.ts - Instrument lookups
market-data-tools.ts - Market data (DXLink)
transaction-tools.ts - Transaction history
watchlist-tools.ts - Watchlist management
risk-margin-tools.ts - Margin & risk parameters______________________________________________________________________
许可证
麻省理工学院
