mingpan 0.1.5 → 0.1.7

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.
Files changed (42) hide show
  1. package/README.en.md +15 -12
  2. package/README.ja.md +16 -13
  3. package/README.md +33 -13
  4. package/dist/index.js +2 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/server.d.ts +10 -3
  7. package/dist/server.d.ts.map +1 -1
  8. package/dist/server.js +7 -5
  9. package/dist/server.js.map +1 -1
  10. package/dist/services/bazi/BaziService.d.ts.map +1 -1
  11. package/dist/services/bazi/BaziService.js +9 -12
  12. package/dist/services/bazi/BaziService.js.map +1 -1
  13. package/dist/services/ziwei/ZiweiService.d.ts.map +1 -1
  14. package/dist/services/ziwei/ZiweiService.js +2 -4
  15. package/dist/services/ziwei/ZiweiService.js.map +1 -1
  16. package/dist/shared/logger.d.ts +0 -25
  17. package/dist/shared/logger.d.ts.map +1 -1
  18. package/dist/shared/logger.js +13 -72
  19. package/dist/shared/logger.js.map +1 -1
  20. package/dist/tools/baziTools.d.ts +5 -2
  21. package/dist/tools/baziTools.d.ts.map +1 -1
  22. package/dist/tools/baziTools.js +7 -2
  23. package/dist/tools/baziTools.js.map +1 -1
  24. package/dist/tools/calendarTools.d.ts +1 -1
  25. package/dist/tools/calendarTools.d.ts.map +1 -1
  26. package/dist/tools/divinationTools.d.ts +1 -1
  27. package/dist/tools/divinationTools.d.ts.map +1 -1
  28. package/dist/tools/divinationTools.js +4 -2
  29. package/dist/tools/divinationTools.js.map +1 -1
  30. package/dist/tools/qimenTools.d.ts +1 -1
  31. package/dist/tools/qimenTools.d.ts.map +1 -1
  32. package/dist/tools/schemas.d.ts +1 -1
  33. package/dist/tools/schemas.d.ts.map +1 -1
  34. package/dist/tools/ziweiTools.d.ts +1 -1
  35. package/dist/tools/ziweiTools.d.ts.map +1 -1
  36. package/dist/tools/ziweiTools.js +3 -1
  37. package/dist/tools/ziweiTools.js.map +1 -1
  38. package/dist/worker.d.ts +17 -13
  39. package/dist/worker.d.ts.map +1 -1
  40. package/dist/worker.js +183 -32
  41. package/dist/worker.js.map +1 -1
  42. package/package.json +14 -6
package/dist/worker.js CHANGED
@@ -1,47 +1,198 @@
1
1
  "use strict";
2
2
  /**
3
- * Cloudflare Workers 入口(远程 MCP,Streamable HTTP 无状态模式)
3
+ * Cloudflare Workers 入口(MCP v2 · 2026-07-28 无状态协议)
4
4
  *
5
- * 部署:`npx wrangler deploy`(wrangler 配置见 wrangler.toml)。
6
- * 客户端:Claude 网页版/桌面版「自定义连接器」直接填部署后的
7
- * `https://<worker域名>/mcp` 即可,无需任何本地安装。
8
- *
9
- * 说明:
10
- * - 无状态模式(sessionIdGenerator: undefined):每个请求独立处理,
11
- * 正适合本项目无会话的纯计算特性,且无需 Durable Objects。
12
- * - 引擎与 stdio 形态共用 createMingpanServer(),输出逐字节一致。
13
- * - 代码已去本地时区化(Date.UTC 载体约定),Workers 恒 UTC 运行时下
14
- * 排盘结果与本地形态一致(三时区 CI 矩阵看守)。
5
+ * 公网边界职责:
6
+ * - 只在 /mcp 暴露 MCP handler;/healthz 提供轻量健康检查
7
+ * - 在 SDK handler 前校验 Host / Origin,限制请求体和调用频率
8
+ * - 每个 MCP 请求创建独立服务实例,并关闭出生资料缓存
15
9
  */
16
10
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.handleMcpRequest = handleMcpRequest;
18
- const webStandardStreamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js");
19
- const server_1 = require("./server");
20
- /** 可测试的请求处理函数(Node 测试与 Workers 共用) */
21
- async function handleMcpRequest(request, _env) {
11
+ exports.handleWorkerRequest = handleWorkerRequest;
12
+ const server_1 = require("@modelcontextprotocol/server");
13
+ const server_2 = require("./server");
14
+ const MCP_PATH = "/mcp";
15
+ const HEALTH_PATH = "/healthz";
16
+ const MAX_BODY_BYTES = 256 * 1024;
17
+ const DEFAULT_ALLOWED_HOSTS = [
18
+ "mingpan.bzwai.com",
19
+ "localhost",
20
+ "127.0.0.1",
21
+ "[::1]",
22
+ ];
23
+ const DEFAULT_ALLOWED_ORIGINS = [
24
+ "bzwai.com",
25
+ "www.bzwai.com",
26
+ "mingpan.bzwai.com",
27
+ "localhost",
28
+ "127.0.0.1",
29
+ "[::1]",
30
+ ];
31
+ const handler = (0, server_1.createMcpHandler)(() => (0, server_2.createMingpanServer)({ enableCalculationCache: false }), {
32
+ onerror: (error) => {
33
+ // 只记录错误类型,不记录可能包含用户输入的 message/stack。
34
+ console.error(`[MCP] ${error.name || "Error"}`);
35
+ },
36
+ });
37
+ function parseAllowlist(value) {
38
+ return (value ?? "")
39
+ .split(",")
40
+ .map((item) => item.trim().toLowerCase())
41
+ .filter(Boolean);
42
+ }
43
+ function getAllowedHosts(request, env) {
44
+ const hosts = new Set([
45
+ ...DEFAULT_ALLOWED_HOSTS,
46
+ ...parseAllowlist(env.ALLOWED_HOSTS),
47
+ ]);
48
+ // workers.dev 与版本预览域名均由 Cloudflare 控制;只接受包含本 Worker
49
+ // 名称的主机,供维护者诊断正式部署,不把任意 workers.dev 加入白名单。
50
+ const requestHostname = new URL(request.url).hostname.toLowerCase();
51
+ if (requestHostname.endsWith(".workers.dev") &&
52
+ requestHostname.includes("mingpan-mcp")) {
53
+ hosts.add(requestHostname);
54
+ }
55
+ return [...hosts];
56
+ }
57
+ function getAllowedOrigins(env) {
58
+ return [
59
+ ...new Set([
60
+ ...DEFAULT_ALLOWED_ORIGINS,
61
+ ...parseAllowlist(env.ALLOWED_ORIGINS),
62
+ ]),
63
+ ];
64
+ }
65
+ function withResponseHeaders(response, request, includeCors = true) {
66
+ const headers = new Headers(response.headers);
67
+ headers.set("cache-control", "no-store");
68
+ headers.set("x-content-type-options", "nosniff");
69
+ headers.set("referrer-policy", "no-referrer");
70
+ const origin = request.headers.get("origin");
71
+ if (origin && includeCors) {
72
+ headers.set("access-control-allow-origin", origin);
73
+ headers.set("access-control-allow-methods", "POST, OPTIONS");
74
+ headers.set("access-control-allow-headers", "Content-Type, Accept, MCP-Protocol-Version, Mcp-Method, Mcp-Name");
75
+ const vary = headers.get("vary");
76
+ if (!vary?.split(",").some((value) => value.trim().toLowerCase() === "origin")) {
77
+ headers.set("vary", vary ? `${vary}, Origin` : "Origin");
78
+ }
79
+ }
80
+ return new Response(response.body, {
81
+ status: response.status,
82
+ statusText: response.statusText,
83
+ headers,
84
+ });
85
+ }
86
+ function jsonResponse(body, status = 200) {
87
+ return new Response(JSON.stringify(body), {
88
+ status,
89
+ headers: { "content-type": "application/json; charset=utf-8" },
90
+ });
91
+ }
92
+ async function isBodyTooLarge(request) {
93
+ if (request.method !== "POST" || request.body === null) {
94
+ return false;
95
+ }
96
+ const declaredLength = Number(request.headers.get("content-length"));
97
+ if (Number.isFinite(declaredLength) && declaredLength > MAX_BODY_BYTES) {
98
+ return true;
99
+ }
100
+ // Content-Length 可能缺失或不可信。读取 clone 可在不消耗原请求体的前提下
101
+ // 对分块请求执行真实上限,并在越界时尽早停止。
102
+ const reader = request.clone().body?.getReader();
103
+ if (!reader) {
104
+ return false;
105
+ }
106
+ let bytesRead = 0;
107
+ while (true) {
108
+ const { done, value } = await reader.read();
109
+ if (done) {
110
+ return false;
111
+ }
112
+ bytesRead += value.byteLength;
113
+ if (bytesRead > MAX_BODY_BYTES) {
114
+ await reader.cancel();
115
+ return true;
116
+ }
117
+ }
118
+ }
119
+ async function isRateLimited(request, env) {
120
+ const clientIp = request.headers.get("cf-connecting-ip");
121
+ if (!env.RATE_LIMITER || !clientIp) {
122
+ return false;
123
+ }
124
+ try {
125
+ const result = await env.RATE_LIMITER.limit({ key: `mcp:${clientIp}` });
126
+ return !result.success;
127
+ }
128
+ catch {
129
+ // 防滥用设施异常时保持计算服务可用;不输出请求或用户标识。
130
+ console.error("[MCP] RateLimitUnavailable");
131
+ return false;
132
+ }
133
+ }
134
+ async function handleWorkerRequest(request, env = {}) {
135
+ const hostRejected = (0, server_1.hostHeaderValidationResponse)(request, getAllowedHosts(request, env));
136
+ if (hostRejected) {
137
+ return withResponseHeaders(hostRejected, request, false);
138
+ }
139
+ const originRejected = (0, server_1.originValidationResponse)(request, getAllowedOrigins(env));
140
+ if (originRejected) {
141
+ return withResponseHeaders(originRejected, request, false);
142
+ }
22
143
  const url = new URL(request.url);
23
- if (url.pathname !== "/mcp") {
24
- return new Response("Not Found", { status: 404 });
144
+ if (url.pathname === HEALTH_PATH) {
145
+ if (request.method !== "GET" && request.method !== "HEAD") {
146
+ return withResponseHeaders(jsonResponse({ error: "Method not allowed" }, 405), request);
147
+ }
148
+ const response = jsonResponse({
149
+ status: "ok",
150
+ service: server_2.SERVER_NAME,
151
+ version: server_2.SERVER_VERSION,
152
+ protocol: "2026-07-28",
153
+ });
154
+ return withResponseHeaders(request.method === "HEAD"
155
+ ? new Response(null, { status: response.status, headers: response.headers })
156
+ : response, request);
25
157
  }
26
- if (request.method === "GET" || request.method === "DELETE") {
27
- // 无状态模式不支持 SSE 长连接与会话删除
28
- return new Response("Method Not Allowed", { status: 405 });
158
+ if (url.pathname === "/") {
159
+ if (request.method !== "GET" && request.method !== "HEAD") {
160
+ return withResponseHeaders(jsonResponse({ error: "Method not allowed" }, 405), request);
161
+ }
162
+ const response = jsonResponse({
163
+ name: server_2.SERVER_NAME,
164
+ version: server_2.SERVER_VERSION,
165
+ mcpEndpoint: `${url.origin}${MCP_PATH}`,
166
+ healthEndpoint: `${url.origin}${HEALTH_PATH}`,
167
+ website: "https://mingpan.bzwai.com",
168
+ source: "https://github.com/ChesterRa/mingpan",
169
+ privacy: "Inputs are processed in memory and are not stored or logged.",
170
+ });
171
+ return withResponseHeaders(request.method === "HEAD"
172
+ ? new Response(null, { status: response.status, headers: response.headers })
173
+ : response, request);
29
174
  }
30
- if (request.method !== "POST") {
31
- return new Response("Method Not Allowed", { status: 405, headers: { Allow: "POST" } });
175
+ if (url.pathname !== MCP_PATH) {
176
+ return withResponseHeaders(jsonResponse({ error: "Not found" }, 404), request);
32
177
  }
33
- // 无状态:每请求一组 server+transport
34
- const server = (0, server_1.createMingpanServer)();
35
- const transport = new webStandardStreamableHttp_js_1.WebStandardStreamableHTTPServerTransport({
36
- sessionIdGenerator: undefined,
37
- });
38
- await server.connect(transport);
39
- // Web 标准 transport:Request → Response,Workers/Node 通用
40
- return transport.handleRequest(request);
178
+ if (request.method === "OPTIONS") {
179
+ return withResponseHeaders(new Response(null, { status: 204 }), request);
180
+ }
181
+ if (request.method === "POST") {
182
+ if (await isRateLimited(request, env)) {
183
+ const response = jsonResponse({ error: "Rate limit exceeded" }, 429);
184
+ response.headers.set("retry-after", "60");
185
+ return withResponseHeaders(response, request);
186
+ }
187
+ if (await isBodyTooLarge(request)) {
188
+ return withResponseHeaders(jsonResponse({ error: "Request body too large" }, 413), request);
189
+ }
190
+ }
191
+ return withResponseHeaders(await handler.fetch(request), request);
41
192
  }
42
193
  exports.default = {
43
194
  fetch(request, env) {
44
- return handleMcpRequest(request, env);
195
+ return handleWorkerRequest(request, env);
45
196
  },
46
197
  };
47
198
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAUH,4CAyBC;AAjCD,gHAAyH;AACzH,qCAA+C;AAM/C,sCAAsC;AAC/B,KAAK,UAAU,gBAAgB,CAAC,OAAgB,EAAE,IAAU;IACjE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEjC,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5D,wBAAwB;QACxB,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,6BAA6B;IAC7B,MAAM,MAAM,GAAG,IAAA,4BAAmB,GAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,uEAAwC,CAAC;QAC7D,kBAAkB,EAAE,SAAS;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,sDAAsD;IACtD,OAAO,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,kBAAe;IACb,KAAK,CAAC,OAAgB,EAAE,GAAQ;QAC9B,OAAO,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mingpan",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "MCP service for Chinese metaphysics chart calculations: BaZi, ZiWei Dou Shu, LiuYao, MeiHua YiShu, DaLiuRen, and QiMen DunJia",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -14,18 +14,24 @@
14
14
  "type": "git",
15
15
  "url": "https://github.com/ChesterRa/mingpan.git"
16
16
  },
17
- "homepage": "https://github.com/ChesterRa/mingpan#readme",
17
+ "homepage": "https://mingpan.bzwai.com",
18
18
  "bugs": {
19
19
  "url": "https://github.com/ChesterRa/mingpan/issues"
20
20
  },
21
21
  "scripts": {
22
- "build": "tsc",
22
+ "build": "npm run build:site && tsc",
23
+ "build:site": "node scripts/build-site.mjs",
23
24
  "dev": "tsc --watch",
24
25
  "start": "node dist/index.js",
25
26
  "test": "vitest run",
26
27
  "test:watch": "vitest",
27
28
  "prepare": "npm run build",
28
- "deploy:worker": "npm run build && npx wrangler deploy"
29
+ "check": "npm run build && npm test && npm run smoke:stdio",
30
+ "deploy:worker:dry-run": "wrangler deploy --dry-run",
31
+ "deploy:worker": "npm run check && npm run deploy:worker:dry-run && wrangler deploy",
32
+ "smoke:stdio": "node scripts/smoke-stdio.mjs",
33
+ "smoke:remote": "node scripts/smoke-remote.mjs",
34
+ "verify:release-version": "node scripts/verify-release-version.mjs"
29
35
  },
30
36
  "keywords": [
31
37
  "mcp",
@@ -48,15 +54,17 @@
48
54
  "author": "ChesterRa",
49
55
  "license": "Apache-2.0",
50
56
  "dependencies": {
51
- "@modelcontextprotocol/sdk": "^1.30.0",
57
+ "@modelcontextprotocol/server": "^2.0.0",
52
58
  "iztro": "^2.6.0",
53
59
  "lunar-javascript": "^1.7.7",
54
60
  "zod": "^4.4.3"
55
61
  },
56
62
  "devDependencies": {
63
+ "@modelcontextprotocol/client": "^2.0.0",
57
64
  "@types/node": "^20.11.17",
58
65
  "typescript": "^5.3.3",
59
- "vitest": "^1.6.1"
66
+ "vitest": "4.1.11",
67
+ "wrangler": "4.127.1"
60
68
  },
61
69
  "engines": {
62
70
  "node": ">=20.0.0"