ictrp-mcp-server 0.1.0
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/CHANGELOG.md +65 -0
- package/LICENSE +37 -0
- package/README.md +208 -0
- package/README_ZH.md +189 -0
- package/dist/cli/setup-cli.d.ts +14 -0
- package/dist/cli/setup-cli.js +230 -0
- package/dist/cli/setup-cli.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +477 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/bootstrap.d.ts +99 -0
- package/dist/runtime/bootstrap.js +350 -0
- package/dist/runtime/bootstrap.js.map +1 -0
- package/dist/runtime/env-probe.d.ts +108 -0
- package/dist/runtime/env-probe.js +479 -0
- package/dist/runtime/env-probe.js.map +1 -0
- package/dist/runtime/sidecar-client.d.ts +50 -0
- package/dist/runtime/sidecar-client.js +120 -0
- package/dist/runtime/sidecar-client.js.map +1 -0
- package/dist/runtime/supervisor.d.ts +47 -0
- package/dist/runtime/supervisor.js +248 -0
- package/dist/runtime/supervisor.js.map +1 -0
- package/package.json +60 -0
- package/sidecar/ictrp_sidecar.py +602 -0
- package/sidecar/vendor/ictrp_mcp/__init__.py +3 -0
- package/sidecar/vendor/ictrp_mcp/cache/__init__.py +0 -0
- package/sidecar/vendor/ictrp_mcp/cache/store.py +313 -0
- package/sidecar/vendor/ictrp_mcp/data/__init__.py +0 -0
- package/sidecar/vendor/ictrp_mcp/data/columns.py +108 -0
- package/sidecar/vendor/ictrp_mcp/data/jsonio.py +213 -0
- package/sidecar/vendor/ictrp_mcp/data/normalize.py +348 -0
- package/sidecar/vendor/ictrp_mcp/data/query.py +307 -0
- package/sidecar/vendor/ictrp_mcp/errors.py +123 -0
- package/sidecar/vendor/ictrp_mcp/ictrp/__init__.py +0 -0
- package/sidecar/vendor/ictrp_mcp/ictrp/export_guard.py +269 -0
- package/sidecar/vendor/ictrp_mcp/ictrp/htmlstate.py +143 -0
- package/sidecar/vendor/ictrp_mcp/ictrp/session.py +245 -0
- package/sidecar/vendor/ictrp_mcp/offline.py +133 -0
- package/sidecar/vendor/ictrp_mcp/provenance.py +182 -0
- package/sidecar/vendor/ictrp_mcp/server.py +368 -0
- package/sidecar/vendor/ictrp_mcp/tools.py +712 -0
- package/sidecar/vendor/pyproject.toml +25 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Setup CLI.
|
|
4
|
+
*
|
|
5
|
+
* Exit codes are contractual -- installers and desktop hosts branch on them,
|
|
6
|
+
* so they must not drift:
|
|
7
|
+
*
|
|
8
|
+
* 0 success, or the environment is ready
|
|
9
|
+
* 1 not ready, and the user needs to do something
|
|
10
|
+
* 2 self-setup failed with a definite error
|
|
11
|
+
*
|
|
12
|
+
* Every subcommand is read-only except `setup`, `sidecar` and `clean`.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, rmSync } from "node:fs";
|
|
15
|
+
import { formatEnvReport, getEnvReport, invalidateEnvReport, packageRoot, stateRoot, venvDir, venvPython, sidecarScript, } from "../runtime/env-probe.js";
|
|
16
|
+
import { bootstrapEnvironment, discoverPython, mirrorChain } from "../runtime/bootstrap.js";
|
|
17
|
+
import { ensureSidecar, stopSidecar } from "../runtime/supervisor.js";
|
|
18
|
+
const EXIT_OK = 0;
|
|
19
|
+
const EXIT_NOT_READY = 1;
|
|
20
|
+
const EXIT_BOOTSTRAP_FAILED = 2;
|
|
21
|
+
const HELP = `ictrp-setup — 环境自举与诊断
|
|
22
|
+
|
|
23
|
+
用法:
|
|
24
|
+
ictrp-setup doctor 只读体检,报告能否访问 ICTRP
|
|
25
|
+
ictrp-setup setup 创建私有 venv 并安装依赖
|
|
26
|
+
ictrp-setup sidecar 前台运行 Python sidecar(调试用)
|
|
27
|
+
ictrp-setup clean [--yes] 删除私有 venv 与缓存
|
|
28
|
+
ictrp-setup postinstall npm 安装后提示(只检查,不下载)
|
|
29
|
+
|
|
30
|
+
选项:
|
|
31
|
+
--mirror=<名称|URL> 首选 PyPI 镜像(默认 aliyun;可选 tencent/tsinghua/official)
|
|
32
|
+
--timeout=<秒> 单步超时(默认 1800)
|
|
33
|
+
--yes 跳过 clean 的确认
|
|
34
|
+
-h, --help 显示本帮助
|
|
35
|
+
|
|
36
|
+
退出码:
|
|
37
|
+
0 就绪 / 成功
|
|
38
|
+
1 未就绪,需要用户操作
|
|
39
|
+
2 自举失败
|
|
40
|
+
|
|
41
|
+
环境变量:
|
|
42
|
+
ICTRP_HOME 可写状态目录覆盖(虚拟环境、快照)
|
|
43
|
+
ICTRP_VENV venv 路径(默认 <root>/.venv)
|
|
44
|
+
ICTRP_SIDECAR_PORT sidecar 端口(默认 8849)
|
|
45
|
+
ICTRP_SIDECAR_URL sidecar 地址
|
|
46
|
+
ICTRP_PIP_MIRROR 首选镜像
|
|
47
|
+
ICTRP_AUTOSTART_SIDECAR 设为 0 则永不自动拉起 sidecar
|
|
48
|
+
`;
|
|
49
|
+
function parseFlags(argv) {
|
|
50
|
+
const flags = { timeoutSec: 1800, yes: false };
|
|
51
|
+
for (const arg of argv) {
|
|
52
|
+
if (arg.startsWith("--mirror="))
|
|
53
|
+
flags.mirror = arg.slice("--mirror=".length);
|
|
54
|
+
else if (arg.startsWith("--timeout=")) {
|
|
55
|
+
const n = Number(arg.slice("--timeout=".length));
|
|
56
|
+
if (Number.isFinite(n) && n > 0)
|
|
57
|
+
flags.timeoutSec = n;
|
|
58
|
+
}
|
|
59
|
+
else if (arg === "--yes" || arg === "-y")
|
|
60
|
+
flags.yes = true;
|
|
61
|
+
}
|
|
62
|
+
return flags;
|
|
63
|
+
}
|
|
64
|
+
function progressLine(message, percent) {
|
|
65
|
+
const prefix = percent === undefined ? " " : ` [${String(percent).padStart(3)}%] `;
|
|
66
|
+
process.stdout.write(`${prefix}${message}\n`);
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
async function cmdDoctor() {
|
|
70
|
+
const report = await getEnvReport(true);
|
|
71
|
+
process.stdout.write(`${formatEnvReport(report)}\n`);
|
|
72
|
+
const ping = await import("../runtime/sidecar-client.js").then((m) => m.pingSidecar());
|
|
73
|
+
if (ping.ok) {
|
|
74
|
+
process.stdout.write(`\nsidecar: 运行中(python ${ping.data.python},持有 ${ping.data.sets_held} 个结果集)\n`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
process.stdout.write(`\nsidecar: 未运行(${ping.code})\n`);
|
|
78
|
+
}
|
|
79
|
+
return report.ready ? EXIT_OK : EXIT_NOT_READY;
|
|
80
|
+
}
|
|
81
|
+
async function cmdSetup(flags) {
|
|
82
|
+
const chain = mirrorChain(flags.mirror);
|
|
83
|
+
process.stdout.write(`包根目录: ${packageRoot()}\n`);
|
|
84
|
+
process.stdout.write(`状态目录: ${stateRoot()}\n`);
|
|
85
|
+
process.stdout.write(`镜像顺序: ${chain.map((m) => m.name).join(" -> ")}\n`);
|
|
86
|
+
const python = await discoverPython();
|
|
87
|
+
if (!python) {
|
|
88
|
+
process.stdout.write("\n未找到 Python 3.10+。请先安装 Python,然后重新运行 `ictrp-setup setup`。\n");
|
|
89
|
+
return EXIT_NOT_READY;
|
|
90
|
+
}
|
|
91
|
+
process.stdout.write(`系统 Python: ${python.cmd} (${python.version})\n\n`);
|
|
92
|
+
const controller = new AbortController();
|
|
93
|
+
const timer = setTimeout(() => controller.abort(), flags.timeoutSec * 1000);
|
|
94
|
+
try {
|
|
95
|
+
const result = await bootstrapEnvironment({
|
|
96
|
+
...(flags.mirror !== undefined ? { mirror: flags.mirror } : {}),
|
|
97
|
+
onProgress: (event) => progressLine(`${event.step}: ${event.message}`, event.percent),
|
|
98
|
+
signal: controller.signal,
|
|
99
|
+
});
|
|
100
|
+
process.stdout.write("\n");
|
|
101
|
+
for (const step of result.steps) {
|
|
102
|
+
const icon = step.outcome === "ok" ? "✅" : step.outcome === "skipped" ? "➖" : "❌";
|
|
103
|
+
process.stdout.write(`${icon} ${step.step}: ${step.message}\n`);
|
|
104
|
+
}
|
|
105
|
+
if (!result.ok) {
|
|
106
|
+
process.stdout.write("\n");
|
|
107
|
+
for (const err of result.errors)
|
|
108
|
+
process.stdout.write(`❌ ${err}\n`);
|
|
109
|
+
return EXIT_BOOTSTRAP_FAILED;
|
|
110
|
+
}
|
|
111
|
+
invalidateEnvReport();
|
|
112
|
+
const report = await getEnvReport(true);
|
|
113
|
+
process.stdout.write(`\n${report.summary}\n`);
|
|
114
|
+
if (!report.ready) {
|
|
115
|
+
process.stdout.write("\n");
|
|
116
|
+
for (const action of report.actions)
|
|
117
|
+
process.stdout.write(` - ${action}\n`);
|
|
118
|
+
return EXIT_NOT_READY;
|
|
119
|
+
}
|
|
120
|
+
return EXIT_OK;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
clearTimeout(timer);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function cmdSidecar() {
|
|
127
|
+
const python = venvPython();
|
|
128
|
+
const script = sidecarScript();
|
|
129
|
+
if (!existsSync(python)) {
|
|
130
|
+
process.stderr.write(`❌ 未找到虚拟环境解释器: ${python}\n 先运行: ictrp-setup setup\n`);
|
|
131
|
+
return EXIT_BOOTSTRAP_FAILED;
|
|
132
|
+
}
|
|
133
|
+
if (!existsSync(script)) {
|
|
134
|
+
process.stderr.write(`❌ 未找到 sidecar 脚本: ${script}\n`);
|
|
135
|
+
return EXIT_BOOTSTRAP_FAILED;
|
|
136
|
+
}
|
|
137
|
+
process.stdout.write(`启动 sidecar: ${python} ${script}\n`);
|
|
138
|
+
// Run through the supervisor so the foreground path and the auto-start path
|
|
139
|
+
// share one implementation, including the readiness wait.
|
|
140
|
+
const started = await ensureSidecar({ autoStart: true });
|
|
141
|
+
if (!started.ok) {
|
|
142
|
+
process.stderr.write(`❌ ${started.code}: ${started.message}\n`);
|
|
143
|
+
if (started.hint)
|
|
144
|
+
process.stderr.write(` ${started.hint}\n`);
|
|
145
|
+
return EXIT_BOOTSTRAP_FAILED;
|
|
146
|
+
}
|
|
147
|
+
process.stdout.write(`✅ sidecar 就绪:python ${started.data.python},端口来自 ${process.env.ICTRP_SIDECAR_URL ?? "http://127.0.0.1:8849"}\n`);
|
|
148
|
+
process.stdout.write("按 Ctrl-C 停止。\n");
|
|
149
|
+
await new Promise((resolve) => {
|
|
150
|
+
const stop = () => resolve();
|
|
151
|
+
process.once("SIGINT", stop);
|
|
152
|
+
process.once("SIGTERM", stop);
|
|
153
|
+
});
|
|
154
|
+
await stopSidecar();
|
|
155
|
+
return EXIT_OK;
|
|
156
|
+
}
|
|
157
|
+
async function cmdClean(flags) {
|
|
158
|
+
const dir = venvDir();
|
|
159
|
+
if (!existsSync(dir)) {
|
|
160
|
+
process.stdout.write(`无需清理:${dir} 不存在。\n`);
|
|
161
|
+
return EXIT_OK;
|
|
162
|
+
}
|
|
163
|
+
if (!flags.yes) {
|
|
164
|
+
process.stdout.write(`将删除: ${dir}\n确认请加 --yes。\n`);
|
|
165
|
+
return EXIT_NOT_READY;
|
|
166
|
+
}
|
|
167
|
+
await stopSidecar();
|
|
168
|
+
rmSync(dir, { recursive: true, force: true });
|
|
169
|
+
invalidateEnvReport();
|
|
170
|
+
process.stdout.write(`✅ 已删除 ${dir}\n`);
|
|
171
|
+
return EXIT_OK;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* npm's postinstall hook.
|
|
175
|
+
*
|
|
176
|
+
* Check and print. It never downloads and never fails: a postinstall that can
|
|
177
|
+
* fail turns an ordinary "you don't have Python yet" into a broken npm install
|
|
178
|
+
* that the user cannot get past.
|
|
179
|
+
*/
|
|
180
|
+
async function cmdPostinstall() {
|
|
181
|
+
try {
|
|
182
|
+
const report = await getEnvReport(true);
|
|
183
|
+
if (report.ready) {
|
|
184
|
+
process.stdout.write("ictrp-mcp-server: 环境就绪。\n");
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
process.stdout.write("ictrp-mcp-server: 首次使用前需要创建私有 Python 环境。\n" +
|
|
188
|
+
"运行: npx ictrp-setup setup\n");
|
|
189
|
+
for (const action of report.actions)
|
|
190
|
+
process.stdout.write(` - ${action}\n`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
// Absolutely nothing here may fail an install.
|
|
195
|
+
}
|
|
196
|
+
return EXIT_OK;
|
|
197
|
+
}
|
|
198
|
+
async function main() {
|
|
199
|
+
const argv = process.argv.slice(2);
|
|
200
|
+
const command = argv[0];
|
|
201
|
+
if (!command || command === "-h" || command === "--help" || command === "help") {
|
|
202
|
+
process.stdout.write(HELP);
|
|
203
|
+
return EXIT_OK;
|
|
204
|
+
}
|
|
205
|
+
const flags = parseFlags(argv.slice(1));
|
|
206
|
+
switch (command) {
|
|
207
|
+
case "doctor":
|
|
208
|
+
return cmdDoctor();
|
|
209
|
+
case "setup":
|
|
210
|
+
return cmdSetup(flags);
|
|
211
|
+
case "sidecar":
|
|
212
|
+
return cmdSidecar();
|
|
213
|
+
case "clean":
|
|
214
|
+
return cmdClean(flags);
|
|
215
|
+
case "postinstall":
|
|
216
|
+
return cmdPostinstall();
|
|
217
|
+
default:
|
|
218
|
+
process.stderr.write(`未知命令: ${command}\n\n${HELP}`);
|
|
219
|
+
return EXIT_NOT_READY;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
main()
|
|
223
|
+
.then((code) => {
|
|
224
|
+
process.exit(code);
|
|
225
|
+
})
|
|
226
|
+
.catch((err) => {
|
|
227
|
+
process.stderr.write(`${err instanceof Error ? (err.stack ?? err.message) : String(err)}\n`);
|
|
228
|
+
process.exit(EXIT_BOOTSTRAP_FAILED);
|
|
229
|
+
});
|
|
230
|
+
//# sourceMappingURL=setup-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-cli.js","sourceRoot":"","sources":["../../src/cli/setup-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MCP server for the WHO ICTRP, over stdio.
|
|
4
|
+
*
|
|
5
|
+
* This file is the MCP surface and nothing else. It validates arguments,
|
|
6
|
+
* ensures the Python sidecar is up, forwards the call, and shapes the result.
|
|
7
|
+
* All domain logic -- the postback chain, the incompleteness accounting, the
|
|
8
|
+
* local query engine -- lives in Python, where it is tested.
|
|
9
|
+
*
|
|
10
|
+
* The one rule that shapes every handler here: **a failure must never be
|
|
11
|
+
* presented as a successful empty result.** ICTRP's export silently omits
|
|
12
|
+
* records, so an empty answer and a failed answer are dangerously easy to
|
|
13
|
+
* confuse. Failures are therefore reported with `isError: true` and a
|
|
14
|
+
* machine-readable `error_code`, and the incompleteness notice is attached to
|
|
15
|
+
* every successful result that carries rows.
|
|
16
|
+
*/
|
|
17
|
+
import { toErrorText } from "./runtime/sidecar-client.js";
|
|
18
|
+
export { toErrorText };
|