@ backtest- kit/ mcp 页面存档备份,存于互联网档案馆
模拟上下文协议服务器 反测试- kit. 让一个LLM代理(Claude,或任何MCP客户端)观察您的活交易组合,并打开、平均或关闭位置——通过 5个守卫工具,而交易引擎则保持其侧面的每个关卡,限制和验证.
📚 文档 • 妇女 参考执行情况 • 妇女 GitHub 图像
npm install @backtest-kit/mcp backtest-kit @modelcontextprotocol/sdk
在贸易过程中 登记 MCP 计划并曝光 HTTP 桥:
import { addMCPSchema } from 'backtest-kit';
import { serve } from '@backtest-kit/mcp';
addMCPSchema({
mcpName: 'my-mcp',
strategyName: 'my-strategy', // the strategy whose live instances the agent sees
});
serve(); // HTTP bridge on 127.0.0.1:60051 (CC_MCP_HOST / CC_MCP_PORT)
在MCP客户端 (例如:. .mcp.json claude Code)——运行stdio服务器:
{
"mcpServers": {
"trading-signals": {
"command": "npx",
"args": ["@backtest-kit/mcp"],
"env": { "CC_MCP_HOST": "127.0.0.1", "CC_MCP_PORT": "60051" }
}
}
}
经纪人得到 get_status, (中文(简体) ), open_position 财务报告和审定财务报表 close_position。您的策略代码不会改变 .
为什么
代理决定 何时何地 - 引擎决定 其他的都一样。 。 。 . 一个给定的 LLM 原始交换 API 密钥是一种责任: 一个被幻觉的参数,它以错误的价格买入了错误的大小而不停止. 在这里,代理的全部词汇是五个工具,打开的命令只携带 symbol, (中文(简体) ), position 和人可读 description. 取取利润、停站损失和入站成本通过背试-吻合计算(固定为50%的月球袋TP;硬站断裂后完全低于2.5%的网格) CC_MAX_STOPLOSS_DISTANCE_PERCENT;费用来自MCP计划)。 每个命令都通过与任何其他信号源相同的验证链-MCP-战略-风险简介-动作,一个已经持有位置的符号的开口被引擎所拒绝,而不是被即时工程所拒绝.
为 LLM 消费而构建的文本第一状态. get_status 返回每个交易符号中包含当前价格、投资余额、队列输入顺序、未实现的 PnL 活动位置以及队列关闭顺序的信息。 空插槽被明确表示("Entry 队列:空"),所以模型从来就不用猜测一个字段是否被省略或只是缺失了——说明原因的代理和产生幻觉的代理之间的区别. 习惯 getMessages 在 schema 中可以替换或扩展默认的渲染器,包括基数64的图表图像,将1:1映射到 MCP 图像内容块上.
两个过程,一个合同. Stdio MCP服务器生活在代理商的世界中,没有交易状态;它将HTTP的每一个呼叫都转发到交易过程. 管家总是回答 200 ——运输成功不是运营成功——结果囊括: error 是一个关于成功和引擎确切消息的空字符串(MCP Error: symbol BTCUSDT is not enabled for trading失败时,该工具作为代理人转发给代理人 isError 结果它可以读取和反应.
- 🛠️ 5个被看守的工具 —— 说
get_status, (中文(简体) ),open_position, (中文(简体) ),close_position, (中文(简体) ),average_position, (中文(简体) ),notify_user; 没有其他的暴露,和--tools连那个都缩小了. - 🧷 发动机所属水平 ——月包TP/SL和入站成本由服务器侧计算;代理机无法覆盖.
- 💬 人可读组合 ——每个同义词有明确空位的文本消息;图像支持.
- 🔌 进程隔离 —— stdio服务器 QQ HTTP Bridge QQ交易引擎;stdout只搭载了JSON-RPC.
- ✅ 最多一次语义 命令再利用 backtest-kit's
commitCreateSignal编号 :commitClosePending机制. - 🧪 可测试 —— 说
IMCPCallbacks(单位:千美元)onStatus, (中文(简体) ),onPositionOpen, (中文(简体) ),onPositionClose在每次接受效果之后,用原始数据进行射击.
配置
明确参数和环境变量
import { setConfig } from '@backtest-kit/mcp';
setConfig({
CC_MCP_HOST: '127.0.0.1',
CC_MCP_PORT: 60051,
CC_MCP_NAME: 'my-mcp',
});
| 变量 | 默认 | 说明 |
|---|---|---|
CC_MCP_HOST | 127.0.0.1 | HTTP 桥主听 (交易过程) 并连接到 (stdio 过程) |
CC_MCP_PORT | 60051 | HTTP 桥口 |
CC_MCP_NAME | (空虚) | 多个注册时使用的 MCP 方案; 空 = 第一个注册的计划 |
转至的值 setConfig() 永远优于地狱之地.
命令行参数( stdio 服务器或 sse)
当软件包运行时 stdio MCP 服务器 (单位:千美元)npx @backtest-kit/mcp,则 backtest-kit-mcp 命令,或 node build/index.mjs而不是env vars:
npx -y @backtest-kit/mcp@latest --host 127.0.0.1 --port 60051
{
"mcpServers": {
"trading-signals": {
"command": "npx",
"args": ["@backtest-kit/mcp@latest", "--host", "127.0.0.1", "--port", "60051"]
}
}
}
或者说
npx -y @backtest-kit/mcp@latest --sse 8081
claude mcp add --transport sse trading-signals http://localhost:8081/sse
| 参数 | 覆盖 | 说明 |
|---|---|---|
--host | CC_MCP_HOST | 要连接的 HTTP 桥主机 |
--port | CC_MCP_PORT | HTTP 桥口; 忽略非数字值 |
--tools | —— 说 | 逗号分隔的工具名称以曝光; 省略所有五个 |
--sse [PORT] | —— 说 | 服务 MCP 协议于 SSE 而不是 stdio; 默认为端口 8080 |
主机和端口的解析命令 : CLI 论点 setConfig() 缺省数 (单位:千美元)127.0.0.1:60051) (中文(简体) ).
适用 CLI 参数 仅在二进制模式下 - 入口警卫(helpers/getEntry.ts)确保当软件包作为库导入时,主机进程 argv 永远不会泄露到配置中.
缩小工具表面 --tools
默认情况下 Stdio 服务器会登记所有五个工具 . --tools 使用逗号分隔的工具名称和注册列表 仅限 因此不需要迅速的工程 来让特工远离他们
# Read-only agent: it can watch the portfolio but not touch it
npx @backtest-kit/mcp --tools get_status
# Observe and exit, but never open or average
npx @backtest-kit/mcp --tools get_status,close_position,notify_user
{
"mcpServers": {
"trading-signals": {
"command": "npx",
"args": ["@backtest-kit/mcp", "--tools", "get_status,close_position"]
}
}
}
有效名称正是代理商看到的工具名称: get_status, (中文(简体) ), open_position, (中文(简体) ), close_position, (中文(简体) ), average_position, (中文(简体) ), notify_user。未知名称 启动失败 加上未知和可用的名称列表——一个无声地扔出一个工具的打字会只是后来的奇特代理行为而浮出水面.
这是运输层的收缩 独立于发动机的 permissions 字段在 MCP 计划中。 两者作曲: --tools 决定提供什么代理, permissions 决定引擎接受什么 在这里限制一个工具是方便的,可以运行几个代理商对一个具有不同授权的交易过程;对真实的边界执行属于计划,代理商无法绕过.
在网络上服务 --sse
默认情况下服务器会说话 静态: 毒剂产出这个过程,然后通过stdin/stdout与它交谈. --sse 换那个 SSE 通过 HTTP,因此客户端可以附加到整个网络,而不是拥有进程:
# Default port 8080
npx @backtest-kit/mcp --sse
# Explicit port
npx @backtest-kit/mcp --sse 9000
有两个终点被曝光:
| 终点 | 方法 | 目的 |
|---|---|---|
/sse | 获取 | 打开长寿事件流; 与 sessionId 将员额派往 |
/messages?sessionId=… | 邮政 | 提供1个客户端-服务器 JSON-RPC 消息 |
SSE是一个双通道运输: GET 流为整个会话保持开放,并携带每个服务器 客户端消息,而客户端 POSTs 自己给第二个终点的信息。 这个 sessionId 互相连接,所以 多个客户端可以同时附加 - 每个人有自己的会议,闭幕会议不会打扰其他会议.
将一个外部 MCP 端点连接到本地 HTTP 的连接器 http://localhost:8080/sse。启动行写给 标准永远不要脱口而出,所以同样的二进制可以被管道 无论是哪种方式,而不腐败 JSON-RPC流.
--sse 由其他一切组成—— --tools 仍然缩小地表, --host 编号 : --port 仍然指向交易桥(说明 引擎 生活,这与 代理人 连接 :
npx @backtest-kit/mcp --tools get_status --sse 9000
可选值为位置,所以在国旗被读作"端口"之后立即有一个路径:
npx @backtest-kit/mcp --sse ./strategy.ts # ✗ fails: "./strategy.ts" is not a port
npx @backtest-kit/mcp ./strategy.ts --sse # ✓ path first, then the flag
非端口值 启动失败 而不是被忽略——默默地将它视为"没有给定的港口"会吞噬战略路径,从没有加载开始.
API 参考
| 导出 | 说明 |
|---|---|
serve(callback?) | 在交易过程中启动HTTP桥(Singshot;安全可打两次电话). |
getRouter() | 基本请求处理器 — 将其挂入您自己的 HTTP 服务器, 而不是 serve()。 。 。 . |
setConfig(config) | 运行时覆盖主机/端口/名. |
getConfig() | 当前合并配置( env + 任何) setConfig (原始内容存档于2017-03-25). overse. |
setLogger(logger) | 用您自己的执行替换内部的无记录器 . |
lib | IoC集装箱mcpCommandService, (中文(简体) ), mcpPublicService, (中文(简体) ), mcpPrivateService用于高级接线和测试. |
运行软件包二进制( R)npx @backtest-kit/mcp,已安装 backtest-kit-mcp 命令,或 node build/index.mjs开始 stdio MCP 服务器 - 那边不需要进口,只要 CC_MCP_HOST编号 :CC_MCP_PORT 指出交易过程.
5个工具
| 工具 | 参数 | 经纪人得到什么 |
|---|---|---|
| 获取状态( s) | —— 说 | 每个交易符号一个消息:当期价格,投资余额,队列入列顺序,未实现的PnL(%和$)活动位置,队列关闭顺序. |
| 打开位置 | symbol, (中文(简体) ), position (单位:千美元)long | short, (中文(简体) ), description | 以由引擎计算出TP/SL/成本的市场价格开放. 如果符号没有活化或已经具有活性位置,则失败. |
| 关闭位置 | symbol, (中文(简体) ), description | 查询活跃位置的市场关闭情况. 如果没有什么可以关闭. |
| 平均位置 | symbol | 以市场价格添加一个 DCA 条目, 并附带配置的条目成本。 如果没有主动位置,则失败. |
| 通知用户 | symbol, (中文(简体) ), description | 附加对活动位置的描述, 浮出水面 get_status。如果没有积极的立场,则失败. |
每个命令都排入队列并在活盘上执行,所以其效果出现在 get_status 在大约5分钟之后——工具描述告诉代理人不要同时重新提交. 这个 description 参数转换为标记下,因此鼓励在单行线上添加详细的多行写入.
使用 --tools (见配置)只暴露其中的一个子集.
每一次失败都以代理身份到达 isError 工具结果, 包含引擎的准确错误信息 —— 代理机需要调用 get_status 首先对拒绝作出反应,而不是盲目重试.
如何运作
双进程架构
agent (Claude / any MCP client)
└─ stdio JSON-RPC ─ backtest-kit-mcp (this package, binary)
tools/*.tool.ts
└─ MCPCommandService ── HTTP POST ──► serve() (this package, imported)
routes/mcp.ts
└─ MCPPublicService ─► MCP.* (backtest-kit)
└─ Live.commitCreateSignal / commitClosePending
Stdio过程从不触及交易状态——它只会说HTTP. 交易过程登记计划,运行 Live,并回答 /api/v1/mcp/*。两个角色在一个包里: 导入它给你 serve(),执行它启动 stdio 服务器(一个入门点的守护使副作用在库模式下导入了禁用).
总是200个信封
HTTP处理器从不通过状态代码信号操作失败. 每一个反应都是 200 改为:
{ "data": …, "status": "ok", "error": "", "requestId": "…", "serviceName": "…" }
{ "status": "error", "error": "MCP Error: no active position for BTCUSDT" }
MCPCommandService 抛出时 error 非空; 工具抓取并返回消息为 isError. 运输级别的故障(引擎向下,错误的端口)同样通过 fetchApi这是例外.
终点
| 终点 | 方法 | 体质 data | 地图到 |
|---|---|---|---|
/api/v1/mcp/get_status | 邮政 | —— 说 | MCP.getStatus(mcpName) |
/api/v1/mcp/commit_position_open | 邮政 | { symbol, position, note } | MCP.commitPositionOpen(dto) |
/api/v1/mcp/commit_position_close | 邮政 | { symbol, note } | MCP.commitPositionClose(dto) |
/api/v1/mcp/commit_average_buy | 邮政 | { symbol } | MCP.commitAverageBuy(dto) |
/api/v1/mcp/commit_signal_notify | 邮政 | { symbol, note } | MCP.commitSignalNotify(dto) |
/api/v1/health/health_check | 获取 | —— 说 | 升起时间/ 内存/ CPU快照 |
请求信封 : { clientId, serviceName, userId, requestId, data }编辑 mcpName 已解析服务器侧 : CC_MCP_NAME 如果设置了, 否则第一个注册的计程器—— 代理人从不需要知道它.
建筑
图层文件( F)
公众表面 —— 说 functions/serve.function.ts (单位:千美元)serve编号 :getRouter, (中文(简体) ), functions/setup.function.ts (单位:千美元)setLogger, (中文(简体) ), config/params.ts (单位:千美元)setConfig编号 :getConfig, (中文(简体) ), index.ts 再出口+ lib 集装箱.
Stdio 服务器 —— 说 main/entry.ts (McpServer + StdioServer Transport,通过 helpers/getEntry.ts, (中文(简体) ), --tools 选择通过 helpers/getArgs.ts, (中文(简体) ), tools/get_status.tool.ts, (中文(简体) ), tools/open_position.tool.ts, (中文(简体) ), tools/close_position.tool.ts, (中文(简体) ), tools/average_position.tool.ts, (中文(简体) ), tools/notify_user.tool.ts (经批判的论据, isError 绘制地图).
HTTP 桥 —— 说 config/router.ts (微分+路由器+CORS, /api/v1/mcp/* 挂载, routes/mcp.ts (5个POST处理器,总是 -200信封), routes/health.ts。 。 。 .
服务层 (单位:千美元)lib/services/:
command/MCPCommandService.ts工具使用的HTTP客户端(fetchApi反对CC_MCP_HOST:CC_MCP_PORT) (中文(简体) ).public/MCPPublicService.ts——服务器端条目:解析mcpName(单位:千美元)CC_MCP_NAME或第一个计划,验证论点,代表下来.private/MCPPrivateService.ts- 薄薄的伐木代理在后台测试设备上MCP单通.base/LoggerService.ts默认不操作(保持 stdio stdout 干净);通过setLogger。 。 。 .
DI 配置 —— 说 lib/core/{di,provide,types}.ts, (中文(简体) ), lib/index.ts (集装箱靴子), utils/omit.ts (log有效载荷修剪).
* 贡献
叉/ PR 打开 GitHub 图像。 。 。 .
许可证
麻省理工学院 特立奥尔斯基平板电脑