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
package/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # pda-kit-mcp-server
2
+
3
+ PDA Kit MCP Server - 让 AI 轻松使用 PDA Kit 设计系统
4
+
5
+ ## 🚀 零配置快速开始
6
+
7
+ ### 方式一:npx 直接运行(推荐,无需安装)
8
+
9
+ **Claude Desktop 配置:**
10
+ ```json
11
+ {
12
+ "mcpServers": {
13
+ "pda-kit": {
14
+ "command": "npx",
15
+ "args": ["-y", "pda-kit-mcp-server"]
16
+ }
17
+ }
18
+ }
19
+ ```
20
+
21
+ **Cursor 配置:**
22
+ ```json
23
+ {
24
+ "mcpServers": {
25
+ "pda-kit": {
26
+ "command": "npx",
27
+ "args": ["-y", "pda-kit-mcp-server"]
28
+ }
29
+ }
30
+ }
31
+ ```
32
+
33
+ **Trae 配置:**
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "pda-kit": {
38
+ "command": "npx",
39
+ "args": ["-y", "pda-kit-mcp-server"]
40
+ }
41
+ }
42
+ }
43
+ ```
44
+
45
+ > 💡 **只需复制上面的配置到 AI 客户端,即可直接使用!**
46
+
47
+ ---
48
+
49
+ ### 方式二:全局安装
50
+
51
+ ```bash
52
+ npm install -g pda-kit-mcp-server
53
+ ```
54
+
55
+ **配置(使用全局命令):**
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "pda-kit": {
60
+ "command": "pda-kit-mcp-server"
61
+ }
62
+ }
63
+ }
64
+ ```
65
+
66
+ ---
67
+
68
+ ## 💬 使用示例
69
+
70
+ 配置完成后,在 AI 对话中直接使用:
71
+
72
+ ```
73
+ 用户:帮我生成一个扫描输入框
74
+
75
+ AI:[调用 pda-kit/get_component_spec]
76
+ [调用 pda-kit/generate_component]
77
+
78
+ 这是符合 PDA Kit 规范的 ScanInput 组件代码:
79
+ ...
80
+ ```
81
+
82
+ ---
83
+
84
+ ## 📦 可用 Tools
85
+
86
+ | Tool | 功能 |
87
+ |------|------|
88
+ | `get_component_spec` | 获取组件规范文档 |
89
+ | `list_components` | 列出所有可用组件 |
90
+ | `search_components` | 搜索组件 |
91
+ | `validate_html` | 验证 HTML 代码规范 |
92
+ | `generate_component` | 生成组件代码 |
93
+ | `get_global_rules` | 获取全局约束规则 |
94
+
95
+ ---
96
+
97
+ ## 📚 文档
98
+
99
+ - [完整文档](https://github.com/Yuuuyi/pda-ai-project#readme)
100
+ - [组件规范](https://github.com/Yuuuyi/pda-ai-project/tree/main/PDAKit-规范/components)
101
+ - [更新日志](https://github.com/Yuuuyi/pda-ai-project/blob/main/CHANGELOG.md)
102
+
103
+ ---
104
+
105
+ ## 📄 许可证
106
+
107
+ MIT
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * PDA Kit MCP Server - 零配置启动脚本
5
+ *
6
+ * 自动检测环境并启动 MCP 服务
7
+ */
8
+
9
+ import { spawn } from 'child_process';
10
+ import { fileURLToPath } from 'url';
11
+ import { dirname, join } from 'path';
12
+
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+
16
+ // 服务器脚本路径
17
+ const serverPath = join(__dirname, '..', 'dist', 'stdio-server.js');
18
+
19
+ // 启动服务器
20
+ const child = spawn('node', [serverPath], {
21
+ stdio: ['inherit', 'inherit', 'inherit'],
22
+ env: {
23
+ ...process.env,
24
+ PDA_KIT_SPEC_PATH: join(__dirname, '..', 'spec-data')
25
+ }
26
+ });
27
+
28
+ child.on('error', (err) => {
29
+ console.error('启动失败:', err.message);
30
+ process.exit(1);
31
+ });
32
+
33
+ child.on('exit', (code) => {
34
+ process.exit(code);
35
+ });
@@ -0,0 +1,83 @@
1
+ /**
2
+ * 动态读取文件内容(每次调用都重新从磁盘读取)
3
+ */
4
+ export declare function readTextFile(filePath: string): Promise<string>;
5
+ /**
6
+ * 动态读取 JSON 文件
7
+ */
8
+ export declare function readJsonFile<T = any>(filePath: string): Promise<T>;
9
+ /**
10
+ * 列出目录下所有文件(实时读取,不缓存)
11
+ * @param dirPath 目录路径
12
+ * @param filter 文件过滤函数
13
+ */
14
+ export declare function listFiles(dirPath: string, filter?: (name: string) => boolean): Promise<string[]>;
15
+ export interface FrontmatterMeta {
16
+ id: string;
17
+ name: string;
18
+ category?: string;
19
+ level?: "atom" | "molecule" | "template";
20
+ source?: string;
21
+ source_url?: string;
22
+ source_doc_id?: string;
23
+ component_count?: number;
24
+ tags?: string[];
25
+ since?: string;
26
+ inherits?: string;
27
+ [key: string]: any;
28
+ }
29
+ export interface ParsedMarkdown {
30
+ meta: FrontmatterMeta;
31
+ content: string;
32
+ raw: string;
33
+ }
34
+ /**
35
+ * 解析 Markdown 文件的 Frontmatter + 正文
36
+ */
37
+ export declare function parseMarkdown(filePath: string): Promise<ParsedMarkdown>;
38
+ export interface ComponentMeta {
39
+ /** 文件名(不含扩展名) */
40
+ file: string;
41
+ /** 组件 ID */
42
+ id: string;
43
+ /** 组件中文名 */
44
+ name: string;
45
+ /** 层级 */
46
+ level?: "atom" | "molecule" | "template";
47
+ /** 变体数量 */
48
+ component_count?: number;
49
+ /** 来源 */
50
+ source?: string;
51
+ /** 标签 */
52
+ tags?: string[];
53
+ /** 相对路径 */
54
+ path: string;
55
+ }
56
+ /**
57
+ * 实时扫描 components/ 目录,返回所有组件的元数据列表
58
+ */
59
+ export declare function listComponents(): Promise<ComponentMeta[]>;
60
+ /**
61
+ * 实时扫描 templates/ 目录,返回所有模板元数据
62
+ */
63
+ export declare function listTemplates(): Promise<{
64
+ file: string;
65
+ path: string;
66
+ }[]>;
67
+ export interface IconEntry {
68
+ /** 语义名称 */
69
+ name: string;
70
+ /** 文件名 */
71
+ file: string;
72
+ /** 相对路径(相对于 PDAKit-规范) */
73
+ path: string;
74
+ /** 标签 */
75
+ tags?: string[];
76
+ /** 所属分类 */
77
+ category: string;
78
+ }
79
+ /**
80
+ * 实时扫描所有图标(通用 + 应用 + 标签栏)
81
+ */
82
+ export declare function listAllIcons(): Promise<IconEntry[]>;
83
+ //# sourceMappingURL=file-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-reader.d.ts","sourceRoot":"","sources":["../src/file-reader.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASpE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAOxE;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBnB;AAMD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAQ7E;AAMD,MAAM,WAAW,aAAa;IAC5B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,YAAY;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS;IACT,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IACzC,WAAW;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS;IACT,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS;IACT,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAiC/D;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAO/E;AAMD,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS;IACT,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0CD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAUzD"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * PDA Kit MCP Server — 动态文件读取器
3
+ *
4
+ * ⚠️ 核心设计原则:
5
+ * 1. 【严禁缓存】每次 AI 调用都重新 read 文件系统,绝不使用内存变量缓存
6
+ * 2. 【实时同步】修改 Markdown 规范后,AI 客户端下次对话秒级自动同步
7
+ * 3. 【容错处理】文件不存在时返回明确错误信息,不静默失败
8
+ */
9
+ import { readFile, readdir } from "node:fs/promises";
10
+ import { basename, join } from "node:path";
11
+ import matter from "gray-matter";
12
+ // ═══════════════════════════════════════════
13
+ // 基础读取操作
14
+ // ═══════════════════════════════════════════
15
+ /**
16
+ * 动态读取文件内容(每次调用都重新从磁盘读取)
17
+ */
18
+ export async function readTextFile(filePath) {
19
+ try {
20
+ return await readFile(filePath, "utf-8");
21
+ }
22
+ catch (error) {
23
+ if (error.code === "ENOENT") {
24
+ throw new Error(`文件不存在: ${filePath}`);
25
+ }
26
+ throw new Error(`读取文件失败: ${filePath} — ${error.message}`);
27
+ }
28
+ }
29
+ /**
30
+ * 动态读取 JSON 文件
31
+ */
32
+ export async function readJsonFile(filePath) {
33
+ const text = await readTextFile(filePath);
34
+ try {
35
+ return JSON.parse(text);
36
+ }
37
+ catch (error) {
38
+ throw new Error(`JSON 解析失败: ${filePath} — ${error.message}`);
39
+ }
40
+ }
41
+ /**
42
+ * 列出目录下所有文件(实时读取,不缓存)
43
+ * @param dirPath 目录路径
44
+ * @param filter 文件过滤函数
45
+ */
46
+ export async function listFiles(dirPath, filter) {
47
+ try {
48
+ const entries = await readdir(dirPath);
49
+ let files = entries.filter((name) => {
50
+ // 排除隐藏文件
51
+ if (name.startsWith("."))
52
+ return false;
53
+ if (filter)
54
+ return filter(name);
55
+ return true;
56
+ });
57
+ return files.sort();
58
+ }
59
+ catch (error) {
60
+ if (error.code === "ENOENT") {
61
+ throw new Error(`目录不存在: ${dirPath}`);
62
+ }
63
+ throw new Error(`列出目录失败: ${dirPath} — ${error.message}`);
64
+ }
65
+ }
66
+ /**
67
+ * 解析 Markdown 文件的 Frontmatter + 正文
68
+ */
69
+ export async function parseMarkdown(filePath) {
70
+ const raw = await readTextFile(filePath);
71
+ const { data, content } = matter(raw);
72
+ return {
73
+ meta: data,
74
+ content: content.trim(),
75
+ raw,
76
+ };
77
+ }
78
+ /**
79
+ * 实时扫描 components/ 目录,返回所有组件的元数据列表
80
+ */
81
+ export async function listComponents() {
82
+ const dir = join((await import("./paths.js")).PATHS.components);
83
+ const files = await listFiles(dir, (name) => name.endsWith(".md"));
84
+ const components = [];
85
+ for (const file of files) {
86
+ const filePath = join(dir, file);
87
+ try {
88
+ const { meta } = await parseMarkdown(filePath);
89
+ components.push({
90
+ file,
91
+ id: meta.id || basename(file, ".md"),
92
+ name: meta.name || basename(file, ".md"),
93
+ level: meta.level,
94
+ component_count: meta.component_count,
95
+ source: meta.source,
96
+ tags: meta.tags,
97
+ path: `components/${file}`,
98
+ });
99
+ }
100
+ catch {
101
+ // 跳过无法解析的文件
102
+ components.push({
103
+ file,
104
+ id: basename(file, ".md"),
105
+ name: basename(file, ".md"),
106
+ path: `components/${file}`,
107
+ });
108
+ }
109
+ }
110
+ return components;
111
+ }
112
+ /**
113
+ * 实时扫描 templates/ 目录,返回所有模板元数据
114
+ */
115
+ export async function listTemplates() {
116
+ const { PATHS } = await import("./paths.js");
117
+ const files = await listFiles(PATHS.templates);
118
+ return files.map((file) => ({
119
+ file,
120
+ path: `templates/${file}`,
121
+ }));
122
+ }
123
+ /**
124
+ * 递归扫描图标目录,收集所有 SVG 文件
125
+ */
126
+ async function scanSvgDir(baseDir, category, relativePrefix) {
127
+ const icons = [];
128
+ async function walk(dir, relPath) {
129
+ try {
130
+ const entries = await readdir(dir, { withFileTypes: true });
131
+ for (const entry of entries) {
132
+ if (entry.name.startsWith("."))
133
+ continue;
134
+ const fullPath = join(dir, entry.name);
135
+ const rel = relPath ? `${relPath}/${entry.name}` : entry.name;
136
+ if (entry.isDirectory()) {
137
+ await walk(fullPath, rel);
138
+ }
139
+ else if (entry.name.endsWith(".svg")) {
140
+ // 中文文件名转换为 snake_case 显示名
141
+ const baseName = basename(entry.name, ".svg");
142
+ icons.push({
143
+ name: baseName,
144
+ file: entry.name,
145
+ path: `${relativePrefix}/${rel}`,
146
+ category,
147
+ });
148
+ }
149
+ }
150
+ }
151
+ catch {
152
+ // 目录不存在时跳过
153
+ }
154
+ }
155
+ await walk(baseDir, "");
156
+ return icons;
157
+ }
158
+ /**
159
+ * 实时扫描所有图标(通用 + 应用 + 标签栏)
160
+ */
161
+ export async function listAllIcons() {
162
+ const { PATHS } = await import("./paths.js");
163
+ const [common, app, tabBar] = await Promise.all([
164
+ scanSvgDir(join(PATHS.icons, "assets"), "通用图标", "icons/assets"),
165
+ scanSvgDir(join(PATHS.iconsApp, "应用"), "应用入口图标", "icons-应用/应用"),
166
+ scanSvgDir(PATHS.iconsTabBar, "标签栏图标", "icons-标签栏"),
167
+ ]);
168
+ return [...common, ...app, ...tabBar];
169
+ }
170
+ //# sourceMappingURL=file-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-reader.js","sourceRoot":"","sources":["../src/file-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PDA Kit MCP Server — HTTP/SSE 入口
3
+ *
4
+ * 部署到内网服务器后,团队成员统一使用同一个 URL:
5
+ * http://<server>:3000/sse
6
+ *
7
+ * 启动方式:
8
+ * node dist/http-entry.js
9
+ * 或 npm run start:http
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=http-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-entry.d.ts","sourceRoot":"","sources":["../src/http-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * PDA Kit MCP Server — HTTP/SSE 入口
3
+ *
4
+ * 部署到内网服务器后,团队成员统一使用同一个 URL:
5
+ * http://<server>:3000/sse
6
+ *
7
+ * 启动方式:
8
+ * node dist/http-entry.js
9
+ * 或 npm run start:http
10
+ */
11
+ import express from "express";
12
+ import cors from "cors";
13
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
14
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
16
+ import { fileURLToPath } from 'url';
17
+ import { join, dirname } from 'path';
18
+ const __filename = fileURLToPath(import.meta.url);
19
+ const __dirname = dirname(__filename);
20
+ // 导入 tools
21
+ import { getComponentSpecTool } from './tools/get-component-spec.js';
22
+ import { listComponentsTool } from './tools/list-components.js';
23
+ import { searchComponentsTool } from './tools/search-components.js';
24
+ import { validateHtmlTool } from './tools/validate-html.js';
25
+ import { generateComponentTool } from './tools/generate-component.js';
26
+ import { getGlobalRulesTool } from './tools/get-global-rules.js';
27
+ const PORT = parseInt(process.env.PORT || "3000", 10);
28
+ const app = express();
29
+ app.use(cors());
30
+ app.use(express.json());
31
+ // 路径配置
32
+ const PATHS = {
33
+ root: process.env.PDA_KIT_ROOT || join(__dirname, '../..'),
34
+ };
35
+ // 自动 Git Pull 配置
36
+ const AUTO_PULL_INTERVAL_MS = 60 * 60 * 1000; // 1小时
37
+ function autoGitPull() {
38
+ // 简化版,实际使用时可以添加 git pull 逻辑
39
+ console.error('[PDA Kit] Git 自动同步检查');
40
+ }
41
+ // 注册所有 Tools
42
+ const tools = [
43
+ getComponentSpecTool,
44
+ listComponentsTool,
45
+ searchComponentsTool,
46
+ validateHtmlTool,
47
+ generateComponentTool,
48
+ getGlobalRulesTool,
49
+ ];
50
+ // 创建 MCP Server
51
+ const server = new Server({
52
+ name: 'pda-kit-mcp-server',
53
+ version: '1.0.0',
54
+ }, {
55
+ capabilities: {
56
+ tools: {},
57
+ },
58
+ });
59
+ // 处理工具列表请求
60
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
61
+ return {
62
+ tools: tools.map((tool) => ({
63
+ name: tool.name,
64
+ description: tool.description,
65
+ inputSchema: tool.inputSchema,
66
+ })),
67
+ };
68
+ });
69
+ // 处理工具调用请求
70
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
71
+ const { name, arguments: args } = request.params;
72
+ const tool = tools.find((t) => t.name === name);
73
+ if (!tool) {
74
+ throw new Error(`未知工具: ${name}`);
75
+ }
76
+ try {
77
+ const result = await tool.handler(args || {});
78
+ return {
79
+ content: [
80
+ {
81
+ type: 'text',
82
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
83
+ },
84
+ ],
85
+ };
86
+ }
87
+ catch (error) {
88
+ const errorMessage = error instanceof Error ? error.message : String(error);
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: JSON.stringify({ success: false, error: errorMessage }, null, 2),
94
+ },
95
+ ],
96
+ isError: true,
97
+ };
98
+ }
99
+ });
100
+ // 存储活跃的 transport 会话(按 sessionId)
101
+ const transports = new Map();
102
+ // SSE 端点 — AI 客户端通过 GET 建立长连接
103
+ app.get("/sse", async (_req, res) => {
104
+ console.error("[PDA Kit HTTP] 新 SSE 连接");
105
+ res.setHeader("Content-Type", "text/event-stream");
106
+ res.setHeader("Cache-Control", "no-cache");
107
+ res.setHeader("Connection", "keep-alive");
108
+ res.flushHeaders();
109
+ const transport = new SSEServerTransport("/messages", res);
110
+ transports.set(transport.sessionId, transport);
111
+ res.on("close", () => {
112
+ transports.delete(transport.sessionId);
113
+ console.error("[PDA Kit HTTP] SSE 连接关闭:", transport.sessionId);
114
+ });
115
+ await server.connect(transport);
116
+ });
117
+ // 消息端点 — AI 客户端通过 POST 发送请求
118
+ app.post("/messages", async (req, res) => {
119
+ const sessionId = req.query.sessionId;
120
+ if (!sessionId) {
121
+ res.status(400).json({ error: "缺少 sessionId 参数" });
122
+ return;
123
+ }
124
+ const transport = transports.get(sessionId);
125
+ if (!transport) {
126
+ res.status(404).json({ error: "未找到对应的 SSE 会话" });
127
+ return;
128
+ }
129
+ await transport.handlePostMessage(req, res);
130
+ });
131
+ // 健康检查
132
+ app.get("/health", (_req, res) => {
133
+ res.json({
134
+ status: "ok",
135
+ mode: "http/sse",
136
+ specRoot: PATHS.root,
137
+ activeSessions: transports.size,
138
+ });
139
+ });
140
+ app.listen(PORT, () => {
141
+ console.error(`[PDA Kit HTTP] 服务器已启动: http://localhost:${PORT}`);
142
+ console.error(`[PDA Kit HTTP] SSE 端点: http://localhost:${PORT}/sse`);
143
+ console.error(`[PDA Kit HTTP] 规范路径: ${PATHS.root}`);
144
+ console.error("[PDA Kit HTTP] 所有数据实时读取文件系统,无内存缓存。");
145
+ autoGitPull();
146
+ setInterval(autoGitPull, AUTO_PULL_INTERVAL_MS);
147
+ console.error(`[PDA Kit HTTP] Git 自动同步已启用(每 ${AUTO_PULL_INTERVAL_MS / 3600000} 小时一次)`);
148
+ });
149
+ //# sourceMappingURL=http-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-entry.js","sourceRoot":"","sources":["../src/http-entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,OAA8B,MAAM,SAAS,CAAC;AACrD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,WAAW;AACX,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAChB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB,OAAO;AACP,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;CAC3D,CAAC;AAEF,iBAAiB;AACjB,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AACpD,SAAS,WAAW;IAClB,4BAA4B;IAC5B,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACxC,CAAC;AAED,aAAa;AACb,MAAM,KAAK,GAAG;IACZ,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,gBAAgB;IAChB,qBAAqB;IACrB,kBAAkB;CACnB,CAAC;AAEF,gBAAgB;AAChB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,WAAW;AACX,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IAC1D,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,WAAW;AACX,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAS,CAAC,CAAC;QACrD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5E;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvE;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,kCAAkC;AAClC,MAAM,UAAU,GAAoC,IAAI,GAAG,EAAE,CAAC;AAE9D,8BAA8B;AAC9B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAa,EAAE,GAAa,EAAE,EAAE;IACrD,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAEzC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;IAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1C,GAAG,CAAC,YAAY,EAAE,CAAC;IAEnB,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC3D,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAE/C,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,4BAA4B;AAC5B,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IAC1D,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,SAAmB,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,OAAO;AACP,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;IAClD,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,KAAK,CAAC,IAAI;QACpB,cAAc,EAAE,UAAU,CAAC,IAAI;KAChC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,KAAK,CAAC,2CAA2C,IAAI,MAAM,CAAC,CAAC;IACrE,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAEpD,WAAW,EAAE,CAAC;IACd,WAAW,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,CACX,gCAAgC,qBAAqB,GAAG,OAAO,QAAQ,CACxE,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * PDA Kit MCP Server - HTTP/SSE 入口
3
+ */
4
+ export declare function startHttpServer(port?: number): Promise<void>;
5
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiFH,wBAAsB,eAAe,CAAC,IAAI,GAAE,MAAa,iBAsDxD"}