@zltquant/zlt-mcp 0.1.0-rc.0 → 0.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.json +30 -3
- package/package.json +1 -1
- package/zlt-mcp-proxy.bundle.cjs +34 -4
package/config.json
CHANGED
|
@@ -507,7 +507,7 @@
|
|
|
507
507
|
},
|
|
508
508
|
{
|
|
509
509
|
"name": "mcp-create-and-run-backtest",
|
|
510
|
-
"description": "创建并启动回测。strategyId 必须来自 mcp-create-strategy 返回的策略ID;runType 固定为 2;普通日线回测只传 strategyId,其余参数 MCP 补齐。未指定周期时 end 取自然日 T-1、start 从 end 往前推半年;ZLTAF 按实际交易日执行,非交易日不产生行情或策略调用。run/create 失败直接报错,不要去复用策略里自动生成的 debug runId(建策略时已回显为 debugRunId,跑它等于跑创建那一刻的模板快照)。\n\n日线类频率只可见到 context.previous_date:要用交易日 T 的收盘,end 必须设成 T 的下一个交易日;end 落在未来不报错但结果为空。展开见返回的 dailyVisibilityNote / endWarning。\n\n返回 Data 回显 resolvedStart/resolvedEnd/resolvedCapital——向用户汇报区间和初始资金时一律以这些字段为准,不要自行推算或臆测。**基准不在此列**:回显的 requestedBenchmark 只是请求值,策略 initialize 里的 set_benchmark() 会覆盖它,收益产物里的「基准收益」按策略实际用的基准算。说基准是什么之前先读策略代码里的 set_benchmark,否则会把一只个股的涨跌报成指数的。\n\n**期货回测要同时改三处,少一处引擎就按股票跑**:runParams.marketIds 加上对应期货交易所(zj 中金所、zs 郑商所、ds 大商所、sq 上期所、gq 广期所),account_list 的 account_type 改成 2(实测用 6 直接废单),费率用 ratio_tpl_obj.future。合约代码形如 zjIM2605。基准保持默认 sz399300 即可,它对期货策略只是业绩比较基准。数据前置见 mcp-download-data:除行情外还必须有市场规则 mr。",
|
|
510
|
+
"description": "创建并启动回测。strategyId 必须来自 mcp-create-strategy 返回的策略ID;runType 固定为 2;普通日线回测只传 strategyId,其余参数 MCP 补齐。未指定周期时 end 取自然日 T-1、start 从 end 往前推半年;ZLTAF 按实际交易日执行,非交易日不产生行情或策略调用。run/create 失败直接报错,不要去复用策略里自动生成的 debug runId(建策略时已回显为 debugRunId,跑它等于跑创建那一刻的模板快照)。\n\n**返回 runId 后立即调用 mcp-wait(kind=backtest,id=runId)阻塞等待回测结束,不要用 mcp-get-backtest-state 轮询。**\n\n日线类频率只可见到 context.previous_date:要用交易日 T 的收盘,end 必须设成 T 的下一个交易日;end 落在未来不报错但结果为空。展开见返回的 dailyVisibilityNote / endWarning。\n\n返回 Data 回显 resolvedStart/resolvedEnd/resolvedCapital——向用户汇报区间和初始资金时一律以这些字段为准,不要自行推算或臆测。**基准不在此列**:回显的 requestedBenchmark 只是请求值,策略 initialize 里的 set_benchmark() 会覆盖它,收益产物里的「基准收益」按策略实际用的基准算。说基准是什么之前先读策略代码里的 set_benchmark,否则会把一只个股的涨跌报成指数的。\n\n**期货回测要同时改三处,少一处引擎就按股票跑**:runParams.marketIds 加上对应期货交易所(zj 中金所、zs 郑商所、ds 大商所、sq 上期所、gq 广期所),account_list 的 account_type 改成 2(实测用 6 直接废单),费率用 ratio_tpl_obj.future。合约代码形如 zjIM2605。基准保持默认 sz399300 即可,它对期货策略只是业绩比较基准。数据前置见 mcp-download-data:除行情外还必须有市场规则 mr。",
|
|
511
511
|
"inputSchema": {
|
|
512
512
|
"type": "object",
|
|
513
513
|
"properties": {
|
|
@@ -907,7 +907,7 @@
|
|
|
907
907
|
},
|
|
908
908
|
{
|
|
909
909
|
"name": "mcp-re-backtest",
|
|
910
|
-
"description": "重新运行会话中最新的回测:用同一个 runId 重跑**该次回测已生成的代码快照**(策略工程 backtest/ 目录下那份副本)。\n\n**它不会把你在策略源工程里刚改过的 main.py 拷进去**——刚编辑过源代码就必须改用 mcp-create-and-run-backtest 生成新的代码快照,否则会重复运行修改前的旧代码,表现为「源码已修复却仍报同样的错误」。所以本工具只适合调整 runParams(回测区间、资金等)后重跑。\n\nstrategyId、strategyName、runId、runType、runParams 从当前会话最近一次 mcp-create-and-run-backtest 的成功结果里取得并传入本工具,不需要用户手动输入;会话中没有运行结果就提示无回测,无法重新回测。runParams 默认沿用最近一次创建回测的条件,允许用户修改部分回测参数;MCP 重启后这份上下文会丢失,届时必须传完整 runParams。返回的 resolved*
|
|
910
|
+
"description": "重新运行会话中最新的回测:用同一个 runId 重跑**该次回测已生成的代码快照**(策略工程 backtest/ 目录下那份副本)。\n\n**它不会把你在策略源工程里刚改过的 main.py 拷进去**——刚编辑过源代码就必须改用 mcp-create-and-run-backtest 生成新的代码快照,否则会重复运行修改前的旧代码,表现为「源码已修复却仍报同样的错误」。所以本工具只适合调整 runParams(回测区间、资金等)后重跑。\n\nstrategyId、strategyName、runId、runType、runParams 从当前会话最近一次 mcp-create-and-run-backtest 的成功结果里取得并传入本工具,不需要用户手动输入;会话中没有运行结果就提示无回测,无法重新回测。runParams 默认沿用最近一次创建回测的条件,允许用户修改部分回测参数;MCP 重启后这份上下文会丢失,届时必须传完整 runParams。返回的 resolved* 是本次实际生效的区间、资金与基准,向用户报告时以它为准。\n\n重跑启动后同样立即调用 mcp-wait(kind=backtest,id=runId)阻塞等待结束,不要轮询状态。",
|
|
911
911
|
"inputSchema": {
|
|
912
912
|
"type": "object",
|
|
913
913
|
"properties": {
|
|
@@ -1128,7 +1128,7 @@
|
|
|
1128
1128
|
},
|
|
1129
1129
|
{
|
|
1130
1130
|
"name": "mcp-get-backtest-state",
|
|
1131
|
-
"description": "
|
|
1131
|
+
"description": "查询回测运行状态与进度,是手动/兜底查询入口:适用于用户主动询问进度,或 mcp-wait 异常中断后复查。**等回测结束请用 mcp-wait(kind=backtest,id=runId),不要用本工具循环轮询。** 立即返回:只做一次查询,不会阻塞等待状态变化。status:0 准备中/1 运行中/2 失败/3 取消/4 终止/5 完成;status=5 前不要调用收益查询。\n\n兜底查询时未进终态的返回一定带 nextPollAfterMs,那是 wait 不可用时的节奏参考;终态不带该字段。数据准备阶段的进度取自磁盘 result.json,只要 download_update_time 仍在推进就视为有进展;durationSeconds 变化不算进展。若实际工作状态连续无变化但数据准备刚更新,返回 dataPrepInProgress=true;若数据准备也已停滞,返回 pollingStopped=true、stopAutoPolling=true 和 manualRecheckAfterMs,此时停止查询、约 1 分钟后手动再查一次。若磁盘 result.json 已确认数据准备或策略引擎启动失败,即使 IPC 仍报 status=1,也会返回 ErrNo 10043 让你停止。",
|
|
1132
1132
|
"inputSchema": {
|
|
1133
1133
|
"type": "object",
|
|
1134
1134
|
"properties": {
|
|
@@ -1334,6 +1334,33 @@
|
|
|
1334
1334
|
},
|
|
1335
1335
|
"ipcUri": "/zltaf_slave/v1/strategy/open-vscode",
|
|
1336
1336
|
"bodyFromParams": true
|
|
1337
|
+
},
|
|
1338
|
+
{
|
|
1339
|
+
"name": "mcp-wait",
|
|
1340
|
+
"description": "阻塞等待一个异步任务结束,直到需要 agent 行动的状态才返回。kind=backtest 等回测,id 传 mcp-create-and-run-backtest / mcp-re-backtest 返回的 runId;kind=download 等数据下载,id 传 mcp-download-data 返回的 uuid(传 \"0\" 等本机当前最新下载任务)。拿到任务 id 后应立即调用本工具,等待期间不要做任何其他事、不要轮询状态。\n\nkind=backtest 返回与 mcp-get-backtest-state 相同的终态结果(status 2 失败/3 取消/4 终止/5 完成;status=5 才能查收益)。\n\nkind=download 返回与 mcp-get-download-progress 相同的结果,按其中 nextAction 行动。除下载中以外的任何状态都会立即返回:resume-required / await-credential / report-stopped 表示任务不会自己结束,需要用户决定。\n\n任一 kind 带 waitStopped=no-progress 表示约 3 分钟毫无进展、先交回现状(回测可能仍在准备数据);可用对应状态工具复查一次,再调用本工具继续等。",
|
|
1341
|
+
"inputSchema": {
|
|
1342
|
+
"type": "object",
|
|
1343
|
+
"properties": {
|
|
1344
|
+
"kind": {
|
|
1345
|
+
"type": "string",
|
|
1346
|
+
"enum": [
|
|
1347
|
+
"backtest",
|
|
1348
|
+
"download"
|
|
1349
|
+
],
|
|
1350
|
+
"description": "任务类别:backtest 回测,download 数据下载。"
|
|
1351
|
+
},
|
|
1352
|
+
"id": {
|
|
1353
|
+
"type": "string",
|
|
1354
|
+
"description": "任务标识:kind=backtest 传 runId;kind=download 传 uuid(\"0\" 表示本机当前最新下载任务)。"
|
|
1355
|
+
}
|
|
1356
|
+
},
|
|
1357
|
+
"required": [
|
|
1358
|
+
"kind",
|
|
1359
|
+
"id"
|
|
1360
|
+
],
|
|
1361
|
+
"additionalProperties": false
|
|
1362
|
+
},
|
|
1363
|
+
"timeoutMs": 15000
|
|
1337
1364
|
}
|
|
1338
1365
|
]
|
|
1339
1366
|
}
|
package/package.json
CHANGED
package/zlt-mcp-proxy.bundle.cjs
CHANGED
|
@@ -20838,7 +20838,18 @@ var UNIVERSAL_AGENT_IPC_TOOL_NAMES = Object.freeze([
|
|
|
20838
20838
|
"mcp-stop-backtest",
|
|
20839
20839
|
"mcp-get-backtest-state",
|
|
20840
20840
|
"mcp-get-backtest-profit",
|
|
20841
|
-
"mcp-delete-strategy"
|
|
20841
|
+
"mcp-delete-strategy",
|
|
20842
|
+
// Data workflow + blocking wait, opened to the universal lane 2026-08-26.
|
|
20843
|
+
// The six ship together: download-data's contract points at data-range
|
|
20844
|
+
// (gap check), disk-space (mr/etf confirmation), and mcp-wait (blocking
|
|
20845
|
+
// wait); get-download-progress is wait's early-return fallback; stop-download
|
|
20846
|
+
// is the cancel valve. Listing a subset ships guidance at unreachable tools.
|
|
20847
|
+
"mcp-get-data-range",
|
|
20848
|
+
"mcp-download-data",
|
|
20849
|
+
"mcp-get-download-progress",
|
|
20850
|
+
"mcp-get-data-disk-space",
|
|
20851
|
+
"mcp-stop-download",
|
|
20852
|
+
"mcp-wait"
|
|
20842
20853
|
]);
|
|
20843
20854
|
var UNIVERSAL_AGENT_TOOL_NAMES = Object.freeze([
|
|
20844
20855
|
...UNIVERSAL_AGENT_RUNTIME_TOOL_NAMES,
|
|
@@ -20867,7 +20878,8 @@ var NPM_PACKAGE_CONFIG_TOOL_NAMES = Object.freeze([
|
|
|
20867
20878
|
"mcp-get-strategy-list",
|
|
20868
20879
|
"mcp-get-st-for-backtest-list",
|
|
20869
20880
|
"mcp-delete-strategy",
|
|
20870
|
-
"mcp-open-vscode"
|
|
20881
|
+
"mcp-open-vscode",
|
|
20882
|
+
"mcp-wait"
|
|
20871
20883
|
]);
|
|
20872
20884
|
|
|
20873
20885
|
// src/tool-pipeline.ts
|
|
@@ -23941,8 +23953,19 @@ async function startMcpServer() {
|
|
|
23941
23953
|
inputSchema: t.inputSchema
|
|
23942
23954
|
}))
|
|
23943
23955
|
}));
|
|
23944
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
23956
|
+
server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
|
|
23945
23957
|
const { name, arguments: args } = request.params;
|
|
23958
|
+
const progressToken = request.params._meta?.progressToken;
|
|
23959
|
+
const waitControl = {
|
|
23960
|
+
heartbeat: progressToken === void 0 ? void 0 : (progress) => {
|
|
23961
|
+
void extra.sendNotification({
|
|
23962
|
+
method: "notifications/progress",
|
|
23963
|
+
params: { progressToken, progress, total: 100 }
|
|
23964
|
+
}).catch(() => {
|
|
23965
|
+
});
|
|
23966
|
+
},
|
|
23967
|
+
abortSignal: extra.signal
|
|
23968
|
+
};
|
|
23946
23969
|
const tool = callableTools.find((t) => t.name === name);
|
|
23947
23970
|
if (!tool) {
|
|
23948
23971
|
return {
|
|
@@ -24022,7 +24045,14 @@ async function startMcpServer() {
|
|
|
24022
24045
|
repairHint: withRuntimeRepairHint
|
|
24023
24046
|
};
|
|
24024
24047
|
const dataRoots = tool.responseTransform === "dataRange" ? resolveDataRoots(readiness.clientRootDir) : void 0;
|
|
24025
|
-
const special = await dispatchSpecialTool(
|
|
24048
|
+
const special = await dispatchSpecialTool(
|
|
24049
|
+
tool,
|
|
24050
|
+
toolArgs,
|
|
24051
|
+
ipcClient,
|
|
24052
|
+
timeout,
|
|
24053
|
+
session,
|
|
24054
|
+
tool.name === "mcp-wait" ? waitControl : void 0
|
|
24055
|
+
);
|
|
24026
24056
|
if (special) return special;
|
|
24027
24057
|
if (tool.steps && tool.steps.length > 0) {
|
|
24028
24058
|
const result = await executeSteps(tool.steps, ipcClient, stripControlParams(toolArgs), timeout, withRuntimeRepairHint);
|