pda-kit-mcp-server 2.0.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.
Files changed (81) hide show
  1. package/README.md +107 -0
  2. package/bin/pda-kit-mcp.js +35 -0
  3. package/dist/file-reader.d.ts +83 -0
  4. package/dist/file-reader.d.ts.map +1 -0
  5. package/dist/file-reader.js +170 -0
  6. package/dist/file-reader.js.map +1 -0
  7. package/dist/http-entry.d.ts +12 -0
  8. package/dist/http-entry.d.ts.map +1 -0
  9. package/dist/http-entry.js +149 -0
  10. package/dist/http-entry.js.map +1 -0
  11. package/dist/http-server.d.ts +5 -0
  12. package/dist/http-server.d.ts.map +1 -0
  13. package/dist/http-server.js +114 -0
  14. package/dist/http-server.js.map +1 -0
  15. package/dist/index.d.ts +8 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +90 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/paths.d.ts +37 -0
  20. package/dist/paths.d.ts.map +1 -0
  21. package/dist/paths.js +52 -0
  22. package/dist/paths.js.map +1 -0
  23. package/dist/server.d.ts +12 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +308 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/stdio-server.d.ts +8 -0
  28. package/dist/stdio-server.d.ts.map +1 -0
  29. package/dist/stdio-server.js +83 -0
  30. package/dist/stdio-server.js.map +1 -0
  31. package/dist/tools/generate-component.d.ts +54 -0
  32. package/dist/tools/generate-component.d.ts.map +1 -0
  33. package/dist/tools/generate-component.js +80 -0
  34. package/dist/tools/generate-component.js.map +1 -0
  35. package/dist/tools/get-component-spec.d.ts +70 -0
  36. package/dist/tools/get-component-spec.d.ts.map +1 -0
  37. package/dist/tools/get-component-spec.js +95 -0
  38. package/dist/tools/get-component-spec.js.map +1 -0
  39. package/dist/tools/get-global-rules.d.ts +42 -0
  40. package/dist/tools/get-global-rules.d.ts.map +1 -0
  41. package/dist/tools/get-global-rules.js +83 -0
  42. package/dist/tools/get-global-rules.js.map +1 -0
  43. package/dist/tools/list-components.d.ts +52 -0
  44. package/dist/tools/list-components.d.ts.map +1 -0
  45. package/dist/tools/list-components.js +104 -0
  46. package/dist/tools/list-components.js.map +1 -0
  47. package/dist/tools/search-components.d.ts +54 -0
  48. package/dist/tools/search-components.d.ts.map +1 -0
  49. package/dist/tools/search-components.js +124 -0
  50. package/dist/tools/search-components.js.map +1 -0
  51. package/dist/tools/validate-html.d.ts +43 -0
  52. package/dist/tools/validate-html.d.ts.map +1 -0
  53. package/dist/tools/validate-html.js +116 -0
  54. package/dist/tools/validate-html.js.map +1 -0
  55. package/package.json +59 -0
  56. package/spec-data/badge.md +461 -0
  57. package/spec-data/button.md +148 -0
  58. package/spec-data/camera.md +622 -0
  59. package/spec-data/dialog.md +419 -0
  60. package/spec-data/divider.md +208 -0
  61. package/spec-data/drawer.md +301 -0
  62. package/spec-data/empty-state.md +336 -0
  63. package/spec-data/home-page.md +352 -0
  64. package/spec-data/input-row.md +346 -0
  65. package/spec-data/layout-page.md +317 -0
  66. package/spec-data/list-item.md +128 -0
  67. package/spec-data/location-selector.md +630 -0
  68. package/spec-data/more-actions.md +427 -0
  69. package/spec-data/navbar.md +482 -0
  70. package/spec-data/photo-list.md +461 -0
  71. package/spec-data/picker-single.md +199 -0
  72. package/spec-data/picker.md +586 -0
  73. package/spec-data/scan-input.md +304 -0
  74. package/spec-data/section-heading.md +268 -0
  75. package/spec-data/selectable-list.md +331 -0
  76. package/spec-data/stepper.md +247 -0
  77. package/spec-data/tab-bar.md +254 -0
  78. package/spec-data/tab.md +349 -0
  79. package/spec-data/tag.md +363 -0
  80. package/spec-data/tooltip.md +202 -0
  81. package/spec-data/waybill-number.md +257 -0
@@ -0,0 +1,114 @@
1
+ /**
2
+ * PDA Kit MCP Server - HTTP/SSE 入口
3
+ */
4
+ import express from "express";
5
+ import cors from "cors";
6
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
9
+ import { getComponentSpecTool } from './tools/get-component-spec.js';
10
+ import { listComponentsTool } from './tools/list-components.js';
11
+ import { searchComponentsTool } from './tools/search-components.js';
12
+ import { validateHtmlTool } from './tools/validate-html.js';
13
+ import { generateComponentTool } from './tools/generate-component.js';
14
+ import { getGlobalRulesTool } from './tools/get-global-rules.js';
15
+ const tools = [
16
+ getComponentSpecTool,
17
+ listComponentsTool,
18
+ searchComponentsTool,
19
+ validateHtmlTool,
20
+ generateComponentTool,
21
+ getGlobalRulesTool,
22
+ ];
23
+ const server = new Server({
24
+ name: 'pda-kit-mcp-server',
25
+ version: '2.0.0',
26
+ }, {
27
+ capabilities: {
28
+ tools: {},
29
+ },
30
+ });
31
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
32
+ return {
33
+ tools: tools.map((tool) => ({
34
+ name: tool.name,
35
+ description: tool.description,
36
+ inputSchema: tool.inputSchema,
37
+ })),
38
+ };
39
+ });
40
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
41
+ const { name, arguments: args } = request.params;
42
+ const tool = tools.find((t) => t.name === name);
43
+ if (!tool) {
44
+ throw new Error(`未知工具: ${name}`);
45
+ }
46
+ try {
47
+ const result = await tool.handler(args || {});
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
53
+ },
54
+ ],
55
+ };
56
+ }
57
+ catch (error) {
58
+ const errorMessage = error instanceof Error ? error.message : String(error);
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: JSON.stringify({ success: false, error: errorMessage }, null, 2),
64
+ },
65
+ ],
66
+ isError: true,
67
+ };
68
+ }
69
+ });
70
+ export async function startHttpServer(port = 3000) {
71
+ const app = express();
72
+ app.use(cors());
73
+ app.use(express.json());
74
+ const transports = new Map();
75
+ app.get("/sse", async (_req, res) => {
76
+ console.error("[PDA Kit HTTP] 新 SSE 连接");
77
+ res.setHeader("Content-Type", "text/event-stream");
78
+ res.setHeader("Cache-Control", "no-cache");
79
+ res.setHeader("Connection", "keep-alive");
80
+ res.flushHeaders();
81
+ const transport = new SSEServerTransport("/messages", res);
82
+ transports.set(transport.sessionId, transport);
83
+ res.on("close", () => {
84
+ transports.delete(transport.sessionId);
85
+ console.error("[PDA Kit HTTP] SSE 连接关闭:", transport.sessionId);
86
+ });
87
+ await server.connect(transport);
88
+ });
89
+ app.post("/messages", async (req, res) => {
90
+ const sessionId = req.query.sessionId;
91
+ if (!sessionId) {
92
+ res.status(400).json({ error: "缺少 sessionId 参数" });
93
+ return;
94
+ }
95
+ const transport = transports.get(sessionId);
96
+ if (!transport) {
97
+ res.status(404).json({ error: "未找到对应的 SSE 会话" });
98
+ return;
99
+ }
100
+ await transport.handlePostMessage(req, res);
101
+ });
102
+ app.get("/health", (_req, res) => {
103
+ res.json({
104
+ status: "ok",
105
+ mode: "http/sse",
106
+ activeSessions: transports.size,
107
+ });
108
+ });
109
+ app.listen(port, () => {
110
+ console.error(`[PDA Kit HTTP] 服务器已启动: http://localhost:${port}`);
111
+ console.error(`[PDA Kit HTTP] SSE 端点: http://localhost:${port}/sse`);
112
+ });
113
+ }
114
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PDA Kit MCP Server
4
+ *
5
+ * 让 AI 助手轻松使用 PDA Kit 设计系统规范
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
package/dist/index.js ADDED
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PDA Kit MCP Server
4
+ *
5
+ * 让 AI 助手轻松使用 PDA Kit 设计系统规范
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
10
+ import { getComponentSpecTool } from './tools/get-component-spec.js';
11
+ import { listComponentsTool } from './tools/list-components.js';
12
+ import { searchComponentsTool } from './tools/search-components.js';
13
+ import { validateHtmlTool } from './tools/validate-html.js';
14
+ import { generateComponentTool } from './tools/generate-component.js';
15
+ import { getGlobalRulesTool } from './tools/get-global-rules.js';
16
+ // 注册所有 Tools
17
+ const tools = [
18
+ getComponentSpecTool,
19
+ listComponentsTool,
20
+ searchComponentsTool,
21
+ validateHtmlTool,
22
+ generateComponentTool,
23
+ getGlobalRulesTool,
24
+ ];
25
+ // 创建 MCP Server
26
+ const server = new Server({
27
+ name: 'pda-kit-mcp-server',
28
+ version: '1.0.0',
29
+ }, {
30
+ capabilities: {
31
+ tools: {},
32
+ },
33
+ });
34
+ // 处理工具列表请求
35
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
36
+ return {
37
+ tools: tools.map((tool) => ({
38
+ name: tool.name,
39
+ description: tool.description,
40
+ inputSchema: tool.inputSchema,
41
+ })),
42
+ };
43
+ });
44
+ // 处理工具调用请求
45
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
46
+ const { name, arguments: args } = request.params;
47
+ // 查找对应的 tool
48
+ const tool = tools.find((t) => t.name === name);
49
+ if (!tool) {
50
+ throw new Error(`未知工具: ${name}`);
51
+ }
52
+ try {
53
+ // 执行 tool handler
54
+ const result = await tool.handler(args || {});
55
+ return {
56
+ content: [
57
+ {
58
+ type: 'text',
59
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
60
+ },
61
+ ],
62
+ };
63
+ }
64
+ catch (error) {
65
+ const errorMessage = error instanceof Error ? error.message : String(error);
66
+ return {
67
+ content: [
68
+ {
69
+ type: 'text',
70
+ text: JSON.stringify({
71
+ success: false,
72
+ error: errorMessage,
73
+ }, null, 2),
74
+ },
75
+ ],
76
+ isError: true,
77
+ };
78
+ }
79
+ });
80
+ // 启动服务器
81
+ async function main() {
82
+ const transport = new StdioServerTransport();
83
+ await server.connect(transport);
84
+ console.error('PDA Kit MCP Server running on stdio');
85
+ }
86
+ main().catch((error) => {
87
+ console.error('Fatal error:', error);
88
+ process.exit(1);
89
+ });
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /** 规范目录下的子目录路径 */
2
+ export declare const PATHS: {
3
+ /** PDAKit-规范/ 根 */
4
+ readonly root: string;
5
+ /** tokens/ — 设计令牌 */
6
+ readonly tokens: string;
7
+ /** components/ — 组件规范 */
8
+ readonly components: string;
9
+ /** patterns/ — 布局模式 */
10
+ readonly patterns: string;
11
+ /** templates/ — 页面模板 */
12
+ readonly templates: string;
13
+ /** icons/ — 通用图标 */
14
+ readonly icons: string;
15
+ /** icons-应用/ — 应用入口图标 */
16
+ readonly iconsApp: string;
17
+ /** icons-标签栏/ — 标签栏图标 */
18
+ readonly iconsTabBar: string;
19
+ /** demos/ — 演示文件 */
20
+ readonly demos: string;
21
+ /** README.md */
22
+ readonly readme: string;
23
+ };
24
+ /** 单个文件路径快捷引用 */
25
+ export declare const FILES: {
26
+ readonly colors: string;
27
+ readonly spacing: string;
28
+ readonly typography: string;
29
+ readonly variablesCss: string;
30
+ readonly tailwindConfig: string;
31
+ readonly layout: string;
32
+ readonly assemblyRules: string;
33
+ readonly baseHtml: string;
34
+ readonly iconRegistry: string;
35
+ readonly iconsDoc: string;
36
+ };
37
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAmBA,kBAAkB;AAClB,eAAO,MAAM,KAAK;IAChB,mBAAmB;;IAEnB,qBAAqB;;IAErB,yBAAyB;;IAEzB,uBAAuB;;IAEvB,wBAAwB;;IAExB,oBAAoB;;IAEpB,yBAAyB;;IAEzB,yBAAyB;;IAEzB,oBAAoB;;IAEpB,gBAAgB;;CAER,CAAC;AAEX,iBAAiB;AACjB,eAAO,MAAM,KAAK;;;;;;;;;;;CAWR,CAAC"}
package/dist/paths.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * PDA Kit MCP Server — 路径解析模块
3
+ *
4
+ * 所有路径均为【动态计算】,绝不硬编码绝对路径。
5
+ * 通过相对路径从 mcp-server/ 定位到上级 PDAKit-规范/ 目录。
6
+ */
7
+ import { fileURLToPath } from "node:url";
8
+ import { dirname, resolve } from "node:path";
9
+ // 当前文件所在目录: mcp-server/src/
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ // mcp-server/ 根目录
13
+ const SERVER_ROOT = resolve(__dirname, "..");
14
+ // PDAKit-规范/ 目录(与 mcp-server 平级)
15
+ const SPEC_ROOT = resolve(SERVER_ROOT, "..", "PDAKit-规范");
16
+ /** 规范目录下的子目录路径 */
17
+ export const PATHS = {
18
+ /** PDAKit-规范/ 根 */
19
+ root: SPEC_ROOT,
20
+ /** tokens/ — 设计令牌 */
21
+ tokens: resolve(SPEC_ROOT, "tokens"),
22
+ /** components/ — 组件规范 */
23
+ components: resolve(SPEC_ROOT, "components"),
24
+ /** patterns/ — 布局模式 */
25
+ patterns: resolve(SPEC_ROOT, "patterns"),
26
+ /** templates/ — 页面模板 */
27
+ templates: resolve(SPEC_ROOT, "templates"),
28
+ /** icons/ — 通用图标 */
29
+ icons: resolve(SPEC_ROOT, "icons"),
30
+ /** icons-应用/ — 应用入口图标 */
31
+ iconsApp: resolve(SPEC_ROOT, "icons-应用"),
32
+ /** icons-标签栏/ — 标签栏图标 */
33
+ iconsTabBar: resolve(SPEC_ROOT, "icons-标签栏"),
34
+ /** demos/ — 演示文件 */
35
+ demos: resolve(SPEC_ROOT, "demos"),
36
+ /** README.md */
37
+ readme: resolve(SPEC_ROOT, "README.md"),
38
+ };
39
+ /** 单个文件路径快捷引用 */
40
+ export const FILES = {
41
+ colors: resolve(PATHS.tokens, "colors.md"),
42
+ spacing: resolve(PATHS.tokens, "spacing.md"),
43
+ typography: resolve(PATHS.tokens, "typography.md"),
44
+ variablesCss: resolve(PATHS.tokens, "variables.css"),
45
+ tailwindConfig: resolve(PATHS.root, "tailwind.config.js"),
46
+ layout: resolve(PATHS.patterns, "layout.md"),
47
+ assemblyRules: resolve(PATHS.templates, "ASSEMBLY_RULES.md"),
48
+ baseHtml: resolve(PATHS.templates, "_base.html"),
49
+ iconRegistry: resolve(PATHS.icons, "icon-registry.json"),
50
+ iconsDoc: resolve(PATHS.icons, "icons.md"),
51
+ };
52
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,4BAA4B;AAC5B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,kBAAkB;AAClB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAE7C,iCAAiC;AACjC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE1D,kBAAkB;AAClB,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,mBAAmB;IACnB,IAAI,EAAE,SAAS;IACf,qBAAqB;IACrB,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;IACpC,yBAAyB;IACzB,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC;IAC5C,uBAAuB;IACvB,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC;IACxC,wBAAwB;IACxB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;IAC1C,oBAAoB;IACpB,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;IAClC,yBAAyB;IACzB,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC;IACxC,yBAAyB;IACzB,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;IAC5C,oBAAoB;IACpB,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC;IAClC,gBAAgB;IAChB,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;CAC/B,CAAC;AAEX,iBAAiB;AACjB,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;IAC5C,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC;IAClD,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC;IACpD,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACzD,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC5C,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,mBAAmB,CAAC;IAC5D,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC;IAChD,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACxD,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC;CAClC,CAAC"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PDAKit MCP Server - TypeScript Implementation
4
+ *
5
+ * 核心特性:
6
+ * 1. 动态文件读取 - 每次调用工具都实时 fs.readFile,无内存缓存
7
+ * 2. 最高宪法注入 - 自动拼接 ANTI_PATTERNS.md + DECISION_TREE.md 到上下文
8
+ * 3. 完整 Tools 接口 - get_global_tokens / list_all_available_components /
9
+ * fetch_component_spec / get_page_template
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG"}
package/dist/server.js ADDED
@@ -0,0 +1,308 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PDAKit MCP Server - TypeScript Implementation
4
+ *
5
+ * 核心特性:
6
+ * 1. 动态文件读取 - 每次调用工具都实时 fs.readFile,无内存缓存
7
+ * 2. 最高宪法注入 - 自动拼接 ANTI_PATTERNS.md + DECISION_TREE.md 到上下文
8
+ * 3. 完整 Tools 接口 - get_global_tokens / list_all_available_components /
9
+ * fetch_component_spec / get_page_template
10
+ */
11
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
14
+ import * as fs from "fs/promises";
15
+ import * as path from "path";
16
+ import { fileURLToPath } from "url";
17
+ // 获取当前文件目录(ESM 兼容)
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = path.dirname(__filename);
20
+ // 项目根目录(mcp-server 的父目录)
21
+ const PROJECT_ROOT = path.resolve(__dirname, "../..");
22
+ const SPEC_DIR = path.join(PROJECT_ROOT, "PDAKit-规范");
23
+ // 最高宪法文件路径
24
+ const CONSTITUTION_FILES = {
25
+ antiPatterns: path.join(SPEC_DIR, "ANTI_PATTERNS.md"),
26
+ decisionTree: path.join(SPEC_DIR, "DECISION_TREE.md"),
27
+ };
28
+ /**
29
+ * 动态读取文件 - 严禁缓存,每次必须磁盘 IO
30
+ */
31
+ async function readFileDynamic(filePath) {
32
+ try {
33
+ return await fs.readFile(filePath, "utf-8");
34
+ }
35
+ catch (error) {
36
+ const err = error;
37
+ if (err.code === "ENOENT") {
38
+ throw new Error(`文件不存在: ${path.relative(PROJECT_ROOT, filePath)}`);
39
+ }
40
+ throw new Error(`读取失败: ${err.message}`);
41
+ }
42
+ }
43
+ /**
44
+ * 读取最高宪法(ANTI_PATTERNS + DECISION_TREE)
45
+ * 在 initialization 和每次 tool 调用时注入
46
+ */
47
+ async function loadConstitution() {
48
+ const [antiPatterns, decisionTree] = await Promise.all([
49
+ readFileDynamic(CONSTITUTION_FILES.antiPatterns).catch(() => "# 反例对照表\n> 文件加载中..."),
50
+ readFileDynamic(CONSTITUTION_FILES.decisionTree).catch(() => "# 决策树\n> 文件加载中..."),
51
+ ]);
52
+ return `
53
+ ╔══════════════════════════════════════════════════════════════════╗
54
+ ║ PDAKit 最高宪法(强制遵循) ║
55
+ ╠══════════════════════════════════════════════════════════════════╣
56
+
57
+ ${antiPatterns}
58
+
59
+ ${decisionTree}
60
+
61
+ ╚══════════════════════════════════════════════════════════════════╝
62
+ `;
63
+ }
64
+ /**
65
+ * 列出目录下的所有 .md 文件(不含扩展名)
66
+ */
67
+ async function listMdFiles(dirPath) {
68
+ try {
69
+ const fullPath = path.join(SPEC_DIR, dirPath);
70
+ const entries = await fs.readdir(fullPath, { withFileTypes: true });
71
+ return entries
72
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
73
+ .map((entry) => entry.name.replace(".md", ""));
74
+ }
75
+ catch {
76
+ return [];
77
+ }
78
+ }
79
+ /**
80
+ * 定义所有可用 Tools
81
+ */
82
+ const TOOLS = [
83
+ {
84
+ name: "get_global_tokens",
85
+ description: "动态读取并返回 tokens/ 目录下的样式底座(colors, spacing, typography, variables)",
86
+ inputSchema: {
87
+ type: "object",
88
+ properties: {},
89
+ required: [],
90
+ },
91
+ },
92
+ {
93
+ name: "list_all_available_components",
94
+ description: "列出 components/ 目录下所有可用的 .md 组件文件名",
95
+ inputSchema: {
96
+ type: "object",
97
+ properties: {},
98
+ required: [],
99
+ },
100
+ },
101
+ {
102
+ name: "fetch_component_spec",
103
+ description: "动态读取对应组件的 .md 完整规范文本",
104
+ inputSchema: {
105
+ type: "object",
106
+ properties: {
107
+ component_name: {
108
+ type: "string",
109
+ description: "组件名称,如 'button', 'dialog', 'scan-input'",
110
+ },
111
+ },
112
+ required: ["component_name"],
113
+ },
114
+ },
115
+ {
116
+ name: "get_page_template",
117
+ description: "读取 templates/ 下的流式布局网格和页面骨架",
118
+ inputSchema: {
119
+ type: "object",
120
+ properties: {
121
+ template_name: {
122
+ type: "string",
123
+ description: "模板名称,如 'ASSEMBLY_RULES', '_base', 'AI_SPEC_TEMPLATE'",
124
+ },
125
+ },
126
+ required: ["template_name"],
127
+ },
128
+ },
129
+ {
130
+ name: "get_constitution",
131
+ description: "获取最高宪法(ANTI_PATTERNS.md + DECISION_TREE.md)",
132
+ inputSchema: {
133
+ type: "object",
134
+ properties: {},
135
+ required: [],
136
+ },
137
+ },
138
+ ];
139
+ /**
140
+ * 创建 MCP Server 实例
141
+ */
142
+ const server = new Server({
143
+ name: "pdakit-mcp-server",
144
+ version: "1.0.0",
145
+ }, {
146
+ capabilities: {
147
+ resources: {},
148
+ tools: {},
149
+ },
150
+ });
151
+ /**
152
+ * 处理 Tools 列表请求
153
+ */
154
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
155
+ return { tools: TOOLS };
156
+ });
157
+ /**
158
+ * 处理 Tool 调用请求 - 动态读取,注入宪法
159
+ */
160
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
161
+ const { name, arguments: args } = request.params;
162
+ // 每次调用都重新加载宪法(动态注入)
163
+ const constitution = await loadConstitution();
164
+ try {
165
+ switch (name) {
166
+ case "get_global_tokens": {
167
+ const tokens = await Promise.all([
168
+ readFileDynamic(path.join(SPEC_DIR, "tokens/colors.md")),
169
+ readFileDynamic(path.join(SPEC_DIR, "tokens/spacing.md")),
170
+ readFileDynamic(path.join(SPEC_DIR, "tokens/typography.md")),
171
+ readFileDynamic(path.join(SPEC_DIR, "tokens/variables.css")),
172
+ ]);
173
+ return {
174
+ content: [
175
+ {
176
+ type: "text",
177
+ text: `${constitution}\n\n## Global Tokens\n\n### Colors\n${tokens[0]}\n\n### Spacing\n${tokens[1]}\n\n### Typography\n${tokens[2]}\n\n### CSS Variables\n${tokens[3]}`,
178
+ },
179
+ ],
180
+ };
181
+ }
182
+ case "list_all_available_components": {
183
+ const components = await listMdFiles("components");
184
+ const businessScenarios = await listMdFiles("business/scenarios");
185
+ return {
186
+ content: [
187
+ {
188
+ type: "text",
189
+ text: `${constitution}\n\n## 可用组件列表\n\n### 原子组件 (components/)\n${components.map((c) => `- ${c}`).join("\n")}\n\n### 业务场景 (business/scenarios/)\n${businessScenarios.map((s) => `- ${s}`).join("\n")}\n\n共计: ${components.length} 个原子组件, ${businessScenarios.length} 个业务场景`,
190
+ },
191
+ ],
192
+ };
193
+ }
194
+ case "fetch_component_spec": {
195
+ const componentName = args.component_name;
196
+ // 先尝试从 components 目录读取
197
+ let filePath = path.join(SPEC_DIR, "components", `${componentName}.md`);
198
+ let content;
199
+ try {
200
+ content = await readFileDynamic(filePath);
201
+ }
202
+ catch {
203
+ // 如果失败,尝试从 business/scenarios 读取
204
+ filePath = path.join(SPEC_DIR, "business/scenarios", `${componentName}.md`);
205
+ content = await readFileDynamic(filePath);
206
+ }
207
+ return {
208
+ content: [
209
+ {
210
+ type: "text",
211
+ text: `${constitution}\n\n## 组件规范: ${componentName}\n\n${content}`,
212
+ },
213
+ ],
214
+ };
215
+ }
216
+ case "get_page_template": {
217
+ const templateName = args.template_name;
218
+ const filePath = path.join(SPEC_DIR, "templates", `${templateName}.md`);
219
+ const content = await readFileDynamic(filePath);
220
+ return {
221
+ content: [
222
+ {
223
+ type: "text",
224
+ text: `${constitution}\n\n## 页面模板: ${templateName}\n\n${content}`,
225
+ },
226
+ ],
227
+ };
228
+ }
229
+ case "get_constitution": {
230
+ return {
231
+ content: [
232
+ {
233
+ type: "text",
234
+ text: constitution,
235
+ },
236
+ ],
237
+ };
238
+ }
239
+ default:
240
+ throw new Error(`未知工具: ${name}`);
241
+ }
242
+ }
243
+ catch (error) {
244
+ const err = error;
245
+ return {
246
+ content: [
247
+ {
248
+ type: "text",
249
+ text: `错误: ${err.message}`,
250
+ },
251
+ ],
252
+ isError: true,
253
+ };
254
+ }
255
+ });
256
+ /**
257
+ * 处理资源列表请求
258
+ */
259
+ server.setRequestHandler(ListResourcesRequestSchema, async () => {
260
+ const components = await listMdFiles("components");
261
+ return {
262
+ resources: components.map((name) => ({
263
+ uri: `pdakit://components/${name}`,
264
+ mimeType: "text/markdown",
265
+ name: `${name} 组件规范`,
266
+ description: `PDAKit ${name} 组件的完整规范文档`,
267
+ })),
268
+ };
269
+ });
270
+ /**
271
+ * 处理资源读取请求
272
+ */
273
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
274
+ const uri = request.params.uri;
275
+ const match = uri.match(/^pdakit:\/\/components\/(.+)$/);
276
+ if (!match) {
277
+ throw new Error(`无效的资源 URI: ${uri}`);
278
+ }
279
+ const componentName = match[1];
280
+ const constitution = await loadConstitution();
281
+ const filePath = path.join(SPEC_DIR, "components", `${componentName}.md`);
282
+ const content = await readFileDynamic(filePath);
283
+ return {
284
+ contents: [
285
+ {
286
+ uri,
287
+ mimeType: "text/markdown",
288
+ text: `${constitution}\n\n${content}`,
289
+ },
290
+ ],
291
+ };
292
+ });
293
+ /**
294
+ * 启动服务器
295
+ */
296
+ async function main() {
297
+ const transport = new StdioServerTransport();
298
+ await server.connect(transport);
299
+ // 输出到 stderr 避免干扰 stdio 协议
300
+ console.error("PDAKit MCP Server 已启动 (stdio 模式)");
301
+ console.error(`项目根目录: ${PROJECT_ROOT}`);
302
+ console.error(`规范目录: ${SPEC_DIR}`);
303
+ }
304
+ main().catch((error) => {
305
+ console.error("服务器启动失败:", error);
306
+ process.exit(1);
307
+ });
308
+ //# sourceMappingURL=server.js.map