aform-mcp 0.0.2

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/README.md ADDED
@@ -0,0 +1,321 @@
1
+ # aform-mcp
2
+
3
+ `@web_qiang/aform` 的 MCP 服务(npm 包名:`aform-mcp`):把表单组件库的能力(组件查询、配置生成、字典检索)暴露给 LLM 客户端。基于 **MCP TypeScript SDK v2**(`@modelcontextprotocol/server` + `@modelcontextprotocol/node`)实现,同时支持 **stdio** 与 **Streamable HTTP** 两种传输。
4
+
5
+ ## 能力一览
6
+
7
+ ### Tools(工具)
8
+
9
+ | 名称 | 说明 | 入参 |
10
+ | --- | --- | --- |
11
+ | `list_components` | 列出全部组件 / 控件,可按 `category` 过滤。 | `category?`: container/control/table/search/display |
12
+ | `get_component_doc` | 查询某个组件 / 控件的说明与关键配置项(RawConfig 字段)。 | `name`: string(必填) |
13
+ | `generate_form_config` | 根据字段清单生成 aform 的 `RawConfig` 配置数组(JSON)。 | `fields`: 字段数组 |
14
+ | `search_dict` | 在内置字典中按关键词(label 或 value)模糊检索选项。 | `keyword`: string(必填), `dict?`: string |
15
+ | `list_control_types` | 列出全部「写控件」与「展示组件」类型名。 | 无 |
16
+ | `list_dicts` | 列出全部内置字典名及其选项数量。 | 无 |
17
+ | `get_control_snippet` | 为指定控件生成一段可运行的 Vue SFC 片段(AForm + 单个 configs 项)。 | `type`: string(必填) |
18
+
19
+ ### Resources(资源)
20
+
21
+ 客户端可像读文件一样读取知识库:
22
+
23
+ - `aform://components` —— 全部组件清单(JSON)。
24
+ - `aform://dicts` —— 全部内置字典选项(JSON)。
25
+ - `aform://components/{name}` —— 单个组件详情(URI 模板,可在 `resources/list` 中枚举,如 `aform://components/AForm`)。
26
+
27
+ ### Prompts(提示词)
28
+
29
+ | 名称 | 说明 | 入参 |
30
+ | --- | --- | --- |
31
+ | `generate-form` | 根据自然语言描述编排「查组件 → 选字典 → 生成配置」的流程。 | `description`: string(必填), `fields?`: string |
32
+ | `explain-component` | 讲解某组件配置项与用法示例。 | `name`: string(必填) |
33
+ | `pick-dict` | 在字典中检索合适的选项,用于 select / radioGroup 等控件。 | `keyword`: string(必填), `dict?`: string |
34
+
35
+ ## 快速开始
36
+
37
+ ```bash
38
+ cd mcp
39
+ pnpm install
40
+ pnpm build # tsc 编译到 dist/
41
+ ```
42
+
43
+ ### 方式一:stdio(本地子进程,Claude Desktop / Cursor 等接入)
44
+
45
+ ```bash
46
+ pnpm start:stdio
47
+ # 等价于:node dist/stdio.js
48
+ ```
49
+
50
+ `bin` 已注册为 `aform-mcp`,也可直接 `node dist/stdio.js`。
51
+
52
+ ### 方式一(推荐,免安装):`npx -y aform-mcp`
53
+
54
+ 无需 clone 仓库、无需 `pnpm install`,只要装了 Node 18+,客户端(或终端)直接:
55
+
56
+ ```bash
57
+ npx -y aform-mcp
58
+ ```
59
+
60
+ `npx` 会自动从 npm 拉取 `aform-mcp` 并运行其 `bin`(即 `dist/stdio.js` 的 stdio 服务)。首次较慢(需下载),之后 `npx` 会命中本地缓存。
61
+
62
+ > 本地开发时想先用未发布的源码体验,可在 `mcp/` 目录执行 `pnpm build` 后 `pnpm link --global`(或 `npm link`),把 `aform-mcp` bin 链到全局;之后同样可用 `npx -y aform-mcp` / 直接 `aform-mcp` 调用当前源码产物。要发布到 npm 则在 `mcp/` 执行 `npm publish`(`prepublishOnly` 会自动先 `pnpm build`)。
63
+
64
+ ### 方式二:Streamable HTTP
65
+
66
+ ```bash
67
+ PORT=3000 pnpm start:http
68
+ # 监听 http://127.0.0.1:3000/mcp
69
+ ```
70
+
71
+ HTTP 模式使用 v2 官方的 `createMcpHandler` + `@modelcontextprotocol/node` 的 `toNodeHandler`,并默认开启 `localhostHostValidation` / `localhostOriginValidation` 守卫,仅允许本机 Host 与 Origin,防止 DNS 重绑定与跨站请求。
72
+
73
+ ## 使用方法
74
+
75
+ MCP 协议基于 JSON-RPC 2.0。下面给出「客户端实际发送什么、会收到什么」的完整示例。所有请求体均为 JSON-RPC 对象,需带 `jsonrpc: "2.0"` 与自增 `id`。
76
+
77
+ ### 1. 初始化(initialize)
78
+
79
+ 任何客户端接入第一步都是 `initialize`,拿到服务端能力声明:
80
+
81
+ ```json
82
+ {
83
+ "jsonrpc": "2.0",
84
+ "id": 1,
85
+ "method": "initialize",
86
+ "params": {
87
+ "protocolVersion": "2026-07-28",
88
+ "capabilities": {},
89
+ "clientInfo": { "name": "my-client", "version": "1.0.0" }
90
+ }
91
+ }
92
+ ```
93
+
94
+ 响应(节选)会声明本服务支持 `tools` / `resources` / `prompts`:
95
+
96
+ ```json
97
+ {
98
+ "jsonrpc": "2.0",
99
+ "id": 1,
100
+ "result": {
101
+ "protocolVersion": "2025-11-25",
102
+ "capabilities": {
103
+ "tools": { "listChanged": true },
104
+ "resources": { "listChanged": true },
105
+ "prompts": { "listChanged": true }
106
+ },
107
+ "serverInfo": { "name": "@web_qiang/aform-mcp", "version": "0.0.1" }
108
+ }
109
+ }
110
+ ```
111
+
112
+ 初始化后需补一条通知(无需应答):
113
+
114
+ ```json
115
+ { "jsonrpc": "2.0", "method": "notifications/initialized", "params": {} }
116
+ ```
117
+
118
+ ### 2. 调用 Tools(stdio 与 HTTP 通用)
119
+
120
+ #### list_components(按分类过滤)
121
+
122
+ ```json
123
+ {
124
+ "jsonrpc": "2.0",
125
+ "id": 2,
126
+ "method": "tools/call",
127
+ "params": { "name": "list_components", "arguments": { "category": "control" } }
128
+ }
129
+ ```
130
+
131
+ 返回 `content[0].text` 为 JSON 字符串,列出所有「写控件」(el-input / number / price / radioGroup / select …)。不带 `category` 则返回全部 24 个组件。
132
+
133
+ #### get_component_doc
134
+
135
+ ```json
136
+ {
137
+ "jsonrpc": "2.0",
138
+ "id": 3,
139
+ "method": "tools/call",
140
+ "params": { "name": "get_component_doc", "arguments": { "name": "select" } }
141
+ }
142
+ ```
143
+
144
+ 返回 `select` 的 `category: "control"`、`description` 与 `config: ["dict","attrs","rules"]` 等。
145
+
146
+ #### list_dicts / search_dict
147
+
148
+ ```json
149
+ { "jsonrpc": "2.0", "id": 4, "method": "tools/call",
150
+ "params": { "name": "list_dicts", "arguments": {} } }
151
+
152
+ { "jsonrpc": "2.0", "id": 5, "method": "tools/call",
153
+ "params": { "name": "search_dict", "arguments": { "keyword": "研发", "dict": "dept" } } }
154
+ ```
155
+
156
+ `search_dict` 返回 `{ dept: [{ label: "研发部", value: "rd" }, ...] }`;不带 `dict` 则在全部字典里模糊匹配 `keyword`。
157
+
158
+ #### generate_form_config
159
+
160
+ ```json
161
+ {
162
+ "jsonrpc": "2.0",
163
+ "id": 6,
164
+ "method": "tools/call",
165
+ "params": {
166
+ "name": "generate_form_config",
167
+ "arguments": {
168
+ "fields": [
169
+ { "label": "姓名", "props": "name", "required": true },
170
+ { "label": "性别", "props": "sex", "type": "radioGroup", "dict": [{ "label": "男", "value": "1" }, { "label": "女", "value": "2" }] },
171
+ { "label": "入职日期", "props": "hireDate", "type": "date" }
172
+ ]
173
+ }
174
+ }
175
+ }
176
+ ```
177
+
178
+ 返回 `RawConfig[]` JSON(必填字段自动带 `rules: true`)。
179
+
180
+ #### get_control_snippet
181
+
182
+ ```json
183
+ { "jsonrpc": "2.0", "id": 7, "method": "tools/call",
184
+ "params": { "name": "get_control_snippet", "arguments": { "type": "select" } } }
185
+ ```
186
+
187
+ 返回一段最小可运行的 Vue SFC(`<script setup>`),演示把 `select` 挂到 `<AForm>`。
188
+
189
+ ### 3. 读取 Resources
190
+
191
+ 非工具类知识可通过资源协议读取(适合让客户端把知识库当「文件」缓存):
192
+
193
+ ```json
194
+ { "jsonrpc": "2.0", "id": 8, "method": "resources/read",
195
+ "params": { "uri": "aform://components/AForm" } }
196
+
197
+ { "jsonrpc": "2.0", "id": 9, "method": "resources/read",
198
+ "params": { "uri": "aform://dicts" } }
199
+ ```
200
+
201
+ `resources/list` 会枚举出静态资源与模板实例(如 `aform://components/AForm`、`aform://components/select` …)。
202
+
203
+ ### 4. 使用 Prompts
204
+
205
+ 提示词用于把常见任务编排成可复用的对话起点,`prompts/get` 返回一段 `messages`:
206
+
207
+ ```json
208
+ { "jsonrpc": "2.0", "id": 10, "method": "prompts/get",
209
+ "params": { "name": "generate-form",
210
+ "arguments": { "description": "员工信息录入表单", "fields": "姓名,性别,部门" } } }
211
+ ```
212
+
213
+ 返回 `messages[0]` 是一条 `user` 文本,要求模型依次调用 `list_components` / `get_component_doc` / `list_dicts` / `search_dict` / `generate_form_config` 完成任务。客户端可直接把这条 message 投入对话上下文。
214
+
215
+ ### 5. 端到端:搭一个「员工信息表单」
216
+
217
+ 典型工作流(模型自动编排,等价于依次调用):
218
+
219
+ 1. `list_components({ category: "control" })` → 确认可用控件。
220
+ 2. `search_dict({ keyword: "", dict: "dept" })` → 拿到部门选项。
221
+ 3. `generate_form_config({ fields: [...] })` → 生成配置。
222
+ 4. `get_control_snippet({ type: "select" })` → 取单控件示例核对写法。
223
+ 5. 把第 3 步的 `RawConfig[]` 交给前端 `<AForm :configs="..." />` 渲染。
224
+
225
+ ### 6. 通过 HTTP 调用(curl 示例)
226
+
227
+ Streamable HTTP 端点 `POST /mcp` 接收 JSON-RPC,`Accept` 头带上 `text/event-stream` 可让服务端以 SSE 流式返回:
228
+
229
+ ```bash
230
+ # 调用 list_dicts
231
+ curl -s -X POST http://127.0.0.1:3000/mcp \
232
+ -H "Content-Type: application/json" \
233
+ -H "Accept: application/json, text/event-stream" \
234
+ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_dicts","arguments":{}}}'
235
+
236
+ # 打开 SSE 流(接收服务端主动推送的通知,如 listChanged)
237
+ curl -N -X GET http://127.0.0.1:3000/mcp -H "Accept: text/event-stream"
238
+ ```
239
+
240
+ > 用 HTTP 时需先完成 `initialize`(建议用支持会话的 MCP 客户端,如 Inspector / Claude Desktop 的 HTTP 接入),手工 curl 多步调用要自行维护 `Mcp-Session-Id` 会话头。
241
+
242
+ ## 客户端接入
243
+
244
+ ### 方式 A:`npx -y aform-mcp`(推荐,免安装)
245
+
246
+ 适合 Claude Desktop / Cursor / Cline 等支持 MCP 的客户端。直接让客户端用 `npx` 拉起 stdio 子进程,无需本地构建:
247
+
248
+ ```json
249
+ {
250
+ "mcpServers": {
251
+ "aform-mcp": {
252
+ "command": "npx",
253
+ "args": ["-y", "aform-mcp"],
254
+ "env": {},
255
+ "disabled": false
256
+ }
257
+ }
258
+ }
259
+ ```
260
+
261
+ > 该配置与 `node dist/stdio.js` 等价,区别仅在于 `npx` 会自动确保 `aform-mcp` 已安装并运行其 stdio `bin`。需联网首次下载;若处于内网,请改用方式 B 本地指向构建产物。
262
+
263
+ ### 方式 B:本地构建产物(Claude Desktop `claude_desktop_config.json`)
264
+
265
+ ```json
266
+ {
267
+ "mcpServers": {
268
+ "aform": {
269
+ "command": "node",
270
+ "args": ["/绝对路径/form/mcp/dist/stdio.js"]
271
+ }
272
+ }
273
+ }
274
+ ```
275
+
276
+ ### Cursor / 其它 stdio 客户端
277
+
278
+ 同样以子进程方式指定 `node dist/stdio.js`,或 `npx -y aform-mcp` 即可。
279
+
280
+ ### MCP Inspector 调试
281
+
282
+ ```bash
283
+ npx @modelcontextprotocol/inspector npx -y aform-mcp
284
+ # 或调试本地构建产物
285
+ npx @modelcontextprotocol/inspector node ./dist/stdio.js
286
+ # 或调试 HTTP 模式
287
+ npx @modelcontextprotocol/inspector http://127.0.0.1:3000/mcp
288
+ ```
289
+
290
+ ## 安全与部署
291
+
292
+ - **stdio 模式**:进程由客户端本地拉起,无网络暴露,默认安全。
293
+ - **HTTP 模式**:默认开启 `localhostHostValidation` + `localhostOriginValidation`,仅本机可连。若要跨机访问:
294
+ - 生产环境务必放在反向代理(Nginx / Caddy)后,启用 HTTPS,并在代理层做认证(如 Bearer Token / mTLS)。
295
+ - 关闭 localhost 守卫前,确认网络可信;相关守卫在 `src/http.ts` 中通过 `toNodeHandler(handler, { guards: [...] })` 配置。
296
+ - `protocolVersion` 采用 v2 协商;旧版只支持 SSE 的客户端(v1)不兼容此 Streamable HTTP 实现。
297
+
298
+ ## 目录结构
299
+
300
+ ```
301
+ mcp/
302
+ ├── src/
303
+ │ ├── index.ts # 对外导出 createAformServer 与知识库
304
+ │ ├── server.ts # 装配 McpServer,注册 tools/resources/prompts
305
+ │ ├── tools.ts # 7 个工具
306
+ │ ├── resources.ts # 组件清单 / 字典 / 单组件详情资源
307
+ │ ├── prompts.ts # 3 个提示词
308
+ │ ├── knowledge.ts # aform 静态知识库(组件文档 + 示例字典)
309
+ │ ├── stdio.ts # stdio 传输入口(serveStdio)
310
+ │ └── http.ts # Streamable HTTP 传输入口
311
+ ├── package.json
312
+ └── tsconfig.json
313
+ ```
314
+
315
+ ## 依赖说明
316
+
317
+ - `@modelcontextprotocol/server`(v2):MCP 服务端 SDK,提供 `McpServer` / `registerTool` / `registerResource` / `registerPrompt` / `serveStdio` / `createMcpHandler`。
318
+ - `@modelcontextprotocol/node`(v2):Node 适配,提供 `toNodeHandler` 与 Host/Origin 校验守卫。
319
+ - `zod`(v4):工具 / 提示词的参数 schema(`import * as z from 'zod/v4'`)。
320
+
321
+ > 注:旧的 `@modelcontextprotocol/sdk`(v1)与 `express` 已被移除;v2 用 `createMcpHandler` + `toNodeHandler` 取代 v1 的 `SSEServerTransport` + `express` 方案。
package/dist/http.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/http.js ADDED
@@ -0,0 +1,23 @@
1
+ import { createServer } from 'node:http';
2
+ import { createMcpHandler } from '@modelcontextprotocol/server';
3
+ import { toNodeHandler, localhostHostValidation, localhostOriginValidation, } from '@modelcontextprotocol/node';
4
+ import { createAformServer } from './server.js';
5
+ // v2 Streamable HTTP:每请求新建 McpServer 实例(无状态工厂)
6
+ const handler = createMcpHandler(() => createAformServer());
7
+ const nodeHandler = toNodeHandler(handler);
8
+ // 防 DNS 重绑定 / 跨站:仅允许本机 Host 与 Origin
9
+ const validateHost = localhostHostValidation();
10
+ const validateOrigin = localhostOriginValidation();
11
+ const PORT = Number(process.env.PORT ?? 3000);
12
+ createServer((req, res) => {
13
+ if (!validateHost(req, res) || !validateOrigin(req, res))
14
+ return;
15
+ void nodeHandler(req, res);
16
+ }).listen(PORT, '127.0.0.1', () => {
17
+ console.error(`aform-mcp HTTP (Streamable) server listening on http://127.0.0.1:${PORT}/mcp`);
18
+ });
19
+ process.on('SIGINT', async () => {
20
+ await handler.close();
21
+ process.exit(0);
22
+ });
23
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,+CAA+C;AAC/C,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAA;AAC3D,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;AAE1C,qCAAqC;AACrC,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAA;AAC9C,MAAM,cAAc,GAAG,yBAAyB,EAAE,CAAA;AAElD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAA;AAE7C,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;QAAE,OAAM;IAChE,KAAK,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;IAChC,OAAO,CAAC,KAAK,CAAC,oEAAoE,IAAI,MAAM,CAAC,CAAA;AAC/F,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { createAformServer } from './server.js';
2
+ export { registerTools } from './tools.js';
3
+ export { registerResources } from './resources.js';
4
+ export { registerPrompts } from './prompts.js';
5
+ export { COMPONENTS, DICTS, CONTROL_TYPES, DISPLAY_TYPES, DICT_NAMES, getComponentDoc, } from './knowledge.js';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { createAformServer } from './server.js';
2
+ export { registerTools } from './tools.js';
3
+ export { registerResources } from './resources.js';
4
+ export { registerPrompts } from './prompts.js';
5
+ export { COMPONENTS, DICTS, CONTROL_TYPES, DISPLAY_TYPES, DICT_NAMES, getComponentDoc, } from './knowledge.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EACL,UAAU,EACV,KAAK,EACL,aAAa,EACb,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * aform 静态知识库。
3
+ *
4
+ * 当前为内置快照,足以驱动 MCP 工具;后续可改为直接读取 @web_qiang/aform 的
5
+ * 类型定义 / README 动态生成,避免与库版本脱节。
6
+ */
7
+ export interface ComponentDoc {
8
+ /** 组件 / 控件名 */
9
+ name: string;
10
+ /** 分类:容器 / 控件 / 表格 / 搜索 / 展示 */
11
+ category: 'container' | 'control' | 'table' | 'search' | 'display';
12
+ /** 一句话说明 */
13
+ description: string;
14
+ /** 关键配置项(RawConfig 字段) */
15
+ config: string[];
16
+ }
17
+ export declare const COMPONENTS: ComponentDoc[];
18
+ export declare const CONTROL_TYPES: string[];
19
+ export declare const DISPLAY_TYPES: string[];
20
+ /** 按名称(不区分大小写)查找组件文档 */
21
+ export declare function getComponentDoc(name: string): ComponentDoc | undefined;
22
+ /** 示例字典(与 demo 对齐),search_dict 工具按 label/value 模糊匹配 */
23
+ export declare const DICTS: Record<string, {
24
+ label: string;
25
+ value: string;
26
+ }[]>;
27
+ /** 所有内置字典名(在 DICTS 声明之后,避免 TDZ) */
28
+ export declare const DICT_NAMES: string[];
@@ -0,0 +1,193 @@
1
+ /**
2
+ * aform 静态知识库。
3
+ *
4
+ * 当前为内置快照,足以驱动 MCP 工具;后续可改为直接读取 @web_qiang/aform 的
5
+ * 类型定义 / README 动态生成,避免与库版本脱节。
6
+ */
7
+ export const COMPONENTS = [
8
+ {
9
+ name: 'AForm',
10
+ category: 'container',
11
+ description: '表单容器:v-model 绑定模型,按 configs 数组渲染栅格表单,下发表单级 state。',
12
+ config: ['modelValue', 'configs', 'column', 'state', 'gap', 'labelWidth', 'labelPosition', 'size', 'group', 'scope', 'overrideConfig'],
13
+ },
14
+ {
15
+ name: 'AFormItem',
16
+ category: 'container',
17
+ description: '单个表单项:可独立挂在原生 el-form 下,自动把 props 收敛成 prop、rules 收敛成校验器。',
18
+ config: ['config', 'model', 'prop', 'state', 'scope', 'from'],
19
+ },
20
+ {
21
+ name: 'ASearch',
22
+ category: 'search',
23
+ description: '搜索栏:与 AForm 同构的轻量表单,常用于表格顶部筛选,@search 抛出查询参数。',
24
+ config: ['modelValue', 'configs', 'column', 'state'],
25
+ },
26
+ {
27
+ name: 'ATable',
28
+ category: 'table',
29
+ description: '配置驱动的表格:列配置与表单配置同构,支持 request 异步分页、行内编辑、行级 state。',
30
+ config: ['configs', 'request', 'query', 'pageSize', 'pageNum', 'height', 'border', 'stripe', 'toolbar', 'empty'],
31
+ },
32
+ {
33
+ name: 'ATableColumn',
34
+ category: 'table',
35
+ description: '命令式列定义(备选方案),与 configs 数组写法二选一。',
36
+ config: ['config'],
37
+ },
38
+ {
39
+ name: 'AContent',
40
+ category: 'container',
41
+ description: '多控件容器:一个 label 下挂多个控件(content 数组),由 formItem 统一校验。',
42
+ config: ['configs', 'model', 'state'],
43
+ },
44
+ {
45
+ name: 'el-input',
46
+ category: 'control',
47
+ description: '文本输入(含 type=password/textarea、clearable、maxlength 等)。',
48
+ config: ['type', 'attrs', 'slots', 'rules', 'on'],
49
+ },
50
+ {
51
+ name: 'number',
52
+ category: 'control',
53
+ description: '自研数字控件:边输入边清洗 + 失焦格式化,attrs.unit 显示单位。',
54
+ config: ['attrs.min', 'attrs.max', 'attrs.precision', 'attrs.unit'],
55
+ },
56
+ {
57
+ name: 'price',
58
+ category: 'control',
59
+ description: '金额控件:复用 number,固定 2 位小数 + 千分位。',
60
+ config: ['attrs'],
61
+ },
62
+ {
63
+ name: 'radioGroup',
64
+ category: 'control',
65
+ description: '单选组,dict 提供选项,button=true 为按钮样式。',
66
+ config: ['dict', 'button', 'options.toString'],
67
+ },
68
+ {
69
+ name: 'checkboxGroup',
70
+ category: 'control',
71
+ description: '多选组,options.toString 指定存回模型的分隔符(默认逗号)。',
72
+ config: ['dict', 'button', 'options.toString'],
73
+ },
74
+ {
75
+ name: 'select',
76
+ category: 'control',
77
+ description: '下拉选择,dict 提供选项。',
78
+ config: ['dict', 'attrs', 'rules'],
79
+ },
80
+ {
81
+ name: 'cascader',
82
+ category: 'control',
83
+ description: '级联选择,dict 为带 children 的树。',
84
+ config: ['dict', 'attrs.emitPath'],
85
+ },
86
+ {
87
+ name: 'dict',
88
+ category: 'display',
89
+ description: '字典展示:把值按 dict 渲染成 ElTag,attrs.tagType 配颜色。',
90
+ config: ['dict', 'attrs.tagType', 'attrs.separator'],
91
+ },
92
+ {
93
+ name: 'date',
94
+ category: 'control',
95
+ description: '日期控件:按 attrs.type 自动处理 date/datetime/month/year/daterange。',
96
+ config: ['attrs.type', 'attrs.placeholder'],
97
+ },
98
+ {
99
+ name: 'el-rate',
100
+ category: 'control',
101
+ description: '评分。',
102
+ config: ['attrs.max', 'attrs.allowHalf', 'attrs.showText'],
103
+ },
104
+ {
105
+ name: 'el-slider',
106
+ category: 'control',
107
+ description: '滑块。',
108
+ config: ['attrs.min', 'attrs.max', 'attrs.showStops'],
109
+ },
110
+ {
111
+ name: 'el-switch',
112
+ category: 'control',
113
+ description: '开关。',
114
+ config: ['attrs'],
115
+ },
116
+ {
117
+ name: 'el-color-picker',
118
+ category: 'control',
119
+ description: '颜色选择。',
120
+ config: ['attrs'],
121
+ },
122
+ {
123
+ name: 'upload',
124
+ category: 'display',
125
+ description: '附件上传 / 只读态渲染为文件链接列表。',
126
+ config: ['attrs.limit', 'attrs.accept'],
127
+ },
128
+ {
129
+ name: 'tooltip',
130
+ category: 'display',
131
+ description: '带 hover 提示的展示组件。',
132
+ config: ['attrs.placement'],
133
+ },
134
+ {
135
+ name: 'format',
136
+ category: 'display',
137
+ description: '自定义渲染:format 返回字符串或 VNode(如计算列、操作列)。',
138
+ config: ['format', 'label'],
139
+ },
140
+ {
141
+ name: 'common',
142
+ category: 'display',
143
+ description: '纯文本展示,自动溢出 tooltip。',
144
+ config: ['label'],
145
+ },
146
+ {
147
+ name: 'empty',
148
+ category: 'display',
149
+ description: '空状态展示。',
150
+ config: ['label'],
151
+ },
152
+ ];
153
+ export const CONTROL_TYPES = COMPONENTS.filter((c) => c.category === 'control').map((c) => c.name);
154
+ export const DISPLAY_TYPES = COMPONENTS.filter((c) => c.category === 'display').map((c) => c.name);
155
+ /** 按名称(不区分大小写)查找组件文档 */
156
+ export function getComponentDoc(name) {
157
+ const key = name.toLowerCase();
158
+ return COMPONENTS.find((c) => c.name.toLowerCase() === key);
159
+ }
160
+ /** 示例字典(与 demo 对齐),search_dict 工具按 label/value 模糊匹配 */
161
+ export const DICTS = {
162
+ sex: [
163
+ { label: '男', value: '1' },
164
+ { label: '女', value: '2' },
165
+ ],
166
+ priority: [
167
+ { label: '低', value: 'low' },
168
+ { label: '中', value: 'medium' },
169
+ { label: '高', value: 'high' },
170
+ ],
171
+ dept: [
172
+ { label: '产品部', value: 'product' },
173
+ { label: '研发部', value: 'rd' },
174
+ { label: '运营部', value: 'ops' },
175
+ { label: '市场部', value: 'market' },
176
+ ],
177
+ skill: [
178
+ { label: 'Vue', value: 'vue' },
179
+ { label: 'React', value: 'react' },
180
+ { label: 'TypeScript', value: 'ts' },
181
+ { label: 'Node.js', value: 'node' },
182
+ { label: 'Rust', value: 'rust' },
183
+ ],
184
+ orderStatus: [
185
+ { label: '待付款', value: '0' },
186
+ { label: '待发货', value: '1' },
187
+ { label: '已完成', value: '2' },
188
+ { label: '已取消', value: '3' },
189
+ ],
190
+ };
191
+ /** 所有内置字典名(在 DICTS 声明之后,避免 TDZ) */
192
+ export const DICT_NAMES = Object.keys(DICTS);
193
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../src/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { McpServer } from '@modelcontextprotocol/server';
2
+ /**
3
+ * 注册提示词(Prompts),用于把常见任务编排成可复用的对话起点:
4
+ * - generate-form:根据自然语言描述生成表单配置
5
+ * - explain-component:讲解某组件用法
6
+ * - pick-dict:在字典里挑选项
7
+ */
8
+ export declare function registerPrompts(server: McpServer): void;
@@ -0,0 +1,76 @@
1
+ import * as z from 'zod/v4';
2
+ import { DICT_NAMES } from './knowledge.js';
3
+ /**
4
+ * 注册提示词(Prompts),用于把常见任务编排成可复用的对话起点:
5
+ * - generate-form:根据自然语言描述生成表单配置
6
+ * - explain-component:讲解某组件用法
7
+ * - pick-dict:在字典里挑选项
8
+ */
9
+ export function registerPrompts(server) {
10
+ server.registerPrompt('generate-form', {
11
+ title: '生成表单配置',
12
+ description: '根据自然语言描述,产出 aform 的 RawConfig 配置数组。',
13
+ argsSchema: z.object({
14
+ description: z.string().describe('表单用途的自然语言描述,例如「一个员工信息录入表单」。'),
15
+ fields: z
16
+ .string()
17
+ .optional()
18
+ .describe('可选:逗号分隔的字段清单提示,例如「姓名, 性别, 部门, 入职日期」。'),
19
+ }),
20
+ }, ({ description, fields }) => ({
21
+ messages: [
22
+ {
23
+ role: 'user',
24
+ content: {
25
+ type: 'text',
26
+ text: `请为以下需求生成 aform 表单配置:\n\n` +
27
+ `需求:${description}\n` +
28
+ (fields ? `已知字段:${fields}\n` : '') +
29
+ `\n要求:\n` +
30
+ `1. 先用 list_components / get_component_doc 确认每个字段该用哪个 type;\n` +
31
+ `2. 需要下拉 / 单选 / 多选时,先用 list_dicts 查看有哪些字典,再用 search_dict 检索合适选项,把选项填进 dict;\n` +
32
+ `3. 最后调用 generate_form_config 工具,传入字段数组,输出 RawConfig JSON。`,
33
+ },
34
+ },
35
+ ],
36
+ }));
37
+ server.registerPrompt('explain-component', {
38
+ title: '讲解组件',
39
+ description: '讲解某组件 / 控件的配置项与用法示例。',
40
+ argsSchema: z.object({
41
+ name: z.string().describe('组件或控件名,如 AForm、number、dict。'),
42
+ }),
43
+ }, ({ name }) => ({
44
+ messages: [
45
+ {
46
+ role: 'user',
47
+ content: {
48
+ type: 'text',
49
+ text: `请调用 get_component_doc 工具查询「${name}」的配置项,并用中文讲解它的作用、关键 config 字段,以及一个最小使用示例。`,
50
+ },
51
+ },
52
+ ],
53
+ }));
54
+ server.registerPrompt('pick-dict', {
55
+ title: '挑选字典选项',
56
+ description: '在 aform 内置字典中检索合适的选项,用于 select / radioGroup 等控件。',
57
+ argsSchema: z.object({
58
+ keyword: z.string().describe('要匹配的关键词(label 或 value 的子串)。'),
59
+ dict: z
60
+ .string()
61
+ .optional()
62
+ .describe(`可选:限定字典名,如 ${DICT_NAMES.slice(0, 3).join(' / ')}。不填则在全部字典中检索。`),
63
+ }),
64
+ }, ({ keyword, dict }) => ({
65
+ messages: [
66
+ {
67
+ role: 'user',
68
+ content: {
69
+ type: 'text',
70
+ text: `请在${dict ? `「${dict}」字典` : '全部内置字典(含 ' + DICT_NAMES.join('、') + ')'}中检索与「${keyword}」相关的选项,并给出可直接填进控件 dict 字段的 [{label,value}] 数组。`,
71
+ },
72
+ },
73
+ ],
74
+ }));
75
+ }
76
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,UAAU,EAAgC,MAAM,gBAAgB,CAAA;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,qCAAqC;QAClD,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC/D,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sCAAsC,CAAC;SACpD,CAAC;KACH,EACD,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EACF,0BAA0B;wBAC1B,MAAM,WAAW,IAAI;wBACrB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;wBAClC,SAAS;wBACT,8DAA8D;wBAC9D,8EAA8E;wBAC9E,2DAA2D;iBAC9D;aACF;SACF;KACF,CAAC,CACH,CAAA;IAED,MAAM,CAAC,cAAc,CACnB,mBAAmB,EACnB;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,sBAAsB;QACnC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;SACzD,CAAC;KACH,EACD,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACb,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,IAAI,2CAA2C;iBACpF;aACF;SACF;KACF,CAAC,CACH,CAAA;IAED,MAAM,CAAC,cAAc,CACnB,WAAW,EACX;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,kDAAkD;QAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;YAC3D,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,cAAc,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC;SAC7E,CAAC;KACH,EACD,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACtB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,KACJ,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAC9D,QAAQ,OAAO,gDAAgD;iBAChE;aACF;SACF;KACF,CAAC,CACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ /**
3
+ * 注册 aform 知识库资源:让客户端可以像读文件一样读取组件清单、字典与单组件文档。
4
+ * - 静态资源:aform://components、aform://dicts
5
+ * - 资源模板:aform://components/{name}(可在 resources/list 中枚举)
6
+ */
7
+ export declare function registerResources(server: McpServer): void;
@@ -0,0 +1,68 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/server';
2
+ import { COMPONENTS, DICTS, getComponentDoc } from './knowledge.js';
3
+ /**
4
+ * 注册 aform 知识库资源:让客户端可以像读文件一样读取组件清单、字典与单组件文档。
5
+ * - 静态资源:aform://components、aform://dicts
6
+ * - 资源模板:aform://components/{name}(可在 resources/list 中枚举)
7
+ */
8
+ export function registerResources(server) {
9
+ server.registerResource('components', 'aform://components', {
10
+ title: '组件清单',
11
+ description: 'aform 全部组件 / 控件的结构化清单(名称、分类、说明)。',
12
+ mimeType: 'application/json',
13
+ }, async (uri) => ({
14
+ contents: [
15
+ {
16
+ uri: uri.href,
17
+ mimeType: 'application/json',
18
+ text: JSON.stringify(COMPONENTS.map((c) => ({
19
+ name: c.name,
20
+ category: c.category,
21
+ description: c.description,
22
+ config: c.config,
23
+ })), null, 2),
24
+ },
25
+ ],
26
+ }));
27
+ server.registerResource('dicts', 'aform://dicts', {
28
+ title: '内置字典',
29
+ description: 'aform 内置示例字典(sex / priority / dept / skill / orderStatus 等)的全部选项。',
30
+ mimeType: 'application/json',
31
+ }, async (uri) => ({
32
+ contents: [
33
+ {
34
+ uri: uri.href,
35
+ mimeType: 'application/json',
36
+ text: JSON.stringify(DICTS, null, 2),
37
+ },
38
+ ],
39
+ }));
40
+ server.registerResource('component', new ResourceTemplate('aform://components/{name}', {
41
+ list: async () => ({
42
+ resources: COMPONENTS.map((c) => ({
43
+ uri: `aform://components/${c.name}`,
44
+ name: c.name,
45
+ description: c.description,
46
+ })),
47
+ }),
48
+ }), {
49
+ title: '组件详情',
50
+ description: '单个组件 / 控件的完整文档(含 RawConfig 配置项)。',
51
+ mimeType: 'application/json',
52
+ }, async (uri, { name }) => {
53
+ const doc = getComponentDoc(Array.isArray(name) ? name[0] : name);
54
+ if (!doc) {
55
+ throw new Error(`未找到组件「${name}」`);
56
+ }
57
+ return {
58
+ contents: [
59
+ {
60
+ uri: uri.href,
61
+ mimeType: 'application/json',
62
+ text: JSON.stringify(doc, null, 2),
63
+ },
64
+ ],
65
+ };
66
+ });
67
+ }
68
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAEnE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,gBAAgB,CACrB,YAAY,EACZ,oBAAoB,EACpB;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,GAAG,CAAC,IAAI;gBACb,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,MAAM,EAAE,CAAC,CAAC,MAAM;iBACjB,CAAC,CAAC,EACH,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC,CACH,CAAA;IAED,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,eAAe,EACf;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,mEAAmE;QAChF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACd,QAAQ,EAAE;YACR;gBACE,GAAG,EAAE,GAAG,CAAC,IAAI;gBACb,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aACrC;SACF;KACF,CAAC,CACH,CAAA;IAED,MAAM,CAAC,gBAAgB,CACrB,WAAW,EACX,IAAI,gBAAgB,CAAC,2BAA2B,EAAE;QAChD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACjB,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,GAAG,EAAE,sBAAsB,CAAC,CAAC,IAAI,EAAE;gBACnC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;SACJ,CAAC;KACH,CAAC,EACF;QACE,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,CAAA;QACnC,CAAC;QACD,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;iBACnC;aACF;SACF,CAAA;IACH,CAAC,CACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ /**
3
+ * 创建一个配置好 aform 全部能力的 McpServer(v2 高阶层 API)。
4
+ * tools / resources / prompts 分别在各模块中注册,这里负责装配。
5
+ */
6
+ export declare function createAformServer(): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,17 @@
1
+ import { McpServer } from '@modelcontextprotocol/server';
2
+ import { registerTools } from './tools.js';
3
+ import { registerResources } from './resources.js';
4
+ import { registerPrompts } from './prompts.js';
5
+ const VERSION = '0.0.1';
6
+ /**
7
+ * 创建一个配置好 aform 全部能力的 McpServer(v2 高阶层 API)。
8
+ * tools / resources / prompts 分别在各模块中注册,这里负责装配。
9
+ */
10
+ export function createAformServer() {
11
+ const server = new McpServer({ name: '@web_qiang/aform-mcp', version: VERSION });
12
+ registerTools(server);
13
+ registerResources(server);
14
+ registerPrompts(server);
15
+ return server;
16
+ }
17
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,OAAO,GAAG,OAAO,CAAA;AAEvB;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAEhF,aAAa,CAAC,MAAM,CAAC,CAAA;IACrB,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACzB,eAAe,CAAC,MAAM,CAAC,CAAA;IAEvB,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/stdio.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { serveStdio } from '@modelcontextprotocol/server/stdio';
3
+ import { createAformServer } from './server.js';
4
+ // serveStdio 拥有传输层,每次连接调用工厂构建实例;stdout 仅承载 JSON-RPC,日志走 stderr
5
+ const handle = serveStdio(() => createAformServer());
6
+ console.error('aform-mcp stdio server running');
7
+ process.on('SIGINT', () => {
8
+ void handle.close();
9
+ });
10
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,+DAA+D;AAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAA;AAEpD,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;AAE/C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;AACrB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from '@modelcontextprotocol/server';
2
+ /**
3
+ * 注册 aform 的全部工具(v2 高层 API)。
4
+ * 每个工具用 zod/v4 声明 inputSchema,handler 返回 { content: [...] }。
5
+ */
6
+ export declare function registerTools(server: McpServer): void;
package/dist/tools.js ADDED
@@ -0,0 +1,175 @@
1
+ import * as z from 'zod/v4';
2
+ import { COMPONENTS, DICTS, DISPLAY_TYPES, CONTROL_TYPES, DICT_NAMES, getComponentDoc, } from './knowledge.js';
3
+ /**
4
+ * 注册 aform 的全部工具(v2 高层 API)。
5
+ * 每个工具用 zod/v4 声明 inputSchema,handler 返回 { content: [...] }。
6
+ */
7
+ export function registerTools(server) {
8
+ server.registerTool('list_components', {
9
+ title: '列出组件',
10
+ description: '列出 @web_qiang/aform 支持的所有组件 / 控件名(AForm、ATable、各类控件与展示组件)。可按 category 过滤。',
11
+ inputSchema: z.object({
12
+ category: z
13
+ .enum(['container', 'control', 'table', 'search', 'display'])
14
+ .optional()
15
+ .describe('可选:按分类过滤。'),
16
+ }),
17
+ }, async ({ category }) => {
18
+ const list = category
19
+ ? COMPONENTS.filter((c) => c.category === category)
20
+ : COMPONENTS;
21
+ return {
22
+ content: [
23
+ {
24
+ type: 'text',
25
+ text: JSON.stringify(list.map((c) => ({
26
+ name: c.name,
27
+ category: c.category,
28
+ description: c.description,
29
+ })), null, 2),
30
+ },
31
+ ],
32
+ };
33
+ });
34
+ server.registerTool('get_component_doc', {
35
+ title: '查询组件文档',
36
+ description: '查询某个组件 / 控件的说明与关键配置项(RawConfig 字段)。',
37
+ inputSchema: z.object({
38
+ name: z.string().describe('组件或控件名,如 AForm、number、dict。'),
39
+ }),
40
+ }, async ({ name }) => {
41
+ const doc = getComponentDoc(name);
42
+ if (!doc) {
43
+ throw new Error(`未找到组件「${name}」。可用:${COMPONENTS.map((c) => c.name).join(', ')}`);
44
+ }
45
+ return { content: [{ type: 'text', text: JSON.stringify(doc, null, 2) }] };
46
+ });
47
+ server.registerTool('generate_form_config', {
48
+ title: '生成表单配置',
49
+ description: '根据字段清单生成 aform 的 RawConfig 配置数组(JSON)。',
50
+ inputSchema: z.object({
51
+ fields: z
52
+ .array(z.object({
53
+ label: z.string().optional().describe('标签文字。'),
54
+ props: z.string().describe('模型字段名。'),
55
+ type: z.string().optional().describe('控件类型,默认 el-input。'),
56
+ required: z.boolean().optional().describe('是否必填。'),
57
+ dict: z
58
+ .array(z.object({ label: z.string(), value: z.string() }))
59
+ .optional()
60
+ .describe('选项列表 [{label,value}],用于 select/radioGroup 等。'),
61
+ }))
62
+ .describe('字段清单。'),
63
+ }),
64
+ }, async ({ fields }) => {
65
+ const configs = fields.map((f) => {
66
+ const cfg = {
67
+ label: f.label ?? f.props,
68
+ props: f.props,
69
+ type: f.type ?? 'el-input',
70
+ };
71
+ if (f.required)
72
+ cfg.rules = true;
73
+ if (Array.isArray(f.dict))
74
+ cfg.dict = f.dict;
75
+ return cfg;
76
+ });
77
+ return { content: [{ type: 'text', text: JSON.stringify(configs, null, 2) }] };
78
+ });
79
+ server.registerTool('search_dict', {
80
+ title: '检索字典',
81
+ description: '在 aform 内置示例字典中按关键词(label 或 value)模糊检索选项。',
82
+ inputSchema: z.object({
83
+ keyword: z.string().describe('匹配 label 或 value 的子串。'),
84
+ dict: z
85
+ .string()
86
+ .optional()
87
+ .describe('可选:限定字典名(如 sex / priority / dept)。'),
88
+ }),
89
+ }, async ({ keyword, dict }) => {
90
+ const kw = keyword.toLowerCase();
91
+ const scope = dict ? { [dict]: DICTS[dict] ?? [] } : DICTS;
92
+ const hits = {};
93
+ for (const [dictName, items] of Object.entries(scope)) {
94
+ const matched = items.filter((i) => i.label.toLowerCase().includes(kw) || i.value.toLowerCase().includes(kw));
95
+ if (matched.length)
96
+ hits[dictName] = matched;
97
+ }
98
+ return { content: [{ type: 'text', text: JSON.stringify(hits, null, 2) }] };
99
+ });
100
+ server.registerTool('list_control_types', {
101
+ title: '列出控件类型',
102
+ description: '列出所有可用的「写控件」与「展示组件」类型名,便于生成配置时选用。',
103
+ inputSchema: z.object({}),
104
+ }, async () => {
105
+ return {
106
+ content: [
107
+ {
108
+ type: 'text',
109
+ text: JSON.stringify({ control: CONTROL_TYPES, display: DISPLAY_TYPES }, null, 2),
110
+ },
111
+ ],
112
+ };
113
+ });
114
+ server.registerTool('list_dicts', {
115
+ title: '列出字典',
116
+ description: '列出全部内置字典名及其选项数量,便于用 search_dict 检索前先了解有哪些字典。',
117
+ inputSchema: z.object({}),
118
+ }, async () => {
119
+ const summary = DICT_NAMES.map((name) => ({
120
+ name,
121
+ count: DICTS[name].length,
122
+ }));
123
+ return {
124
+ content: [
125
+ {
126
+ type: 'text',
127
+ text: JSON.stringify(summary, null, 2),
128
+ },
129
+ ],
130
+ };
131
+ });
132
+ server.registerTool('get_control_snippet', {
133
+ title: '生成控件片段',
134
+ description: '为指定控件类型生成一段可运行的 Vue SFC 片段(AForm + 单个 configs 项),演示如何在表单中挂载该控件。',
135
+ inputSchema: z.object({
136
+ type: z
137
+ .string()
138
+ .describe('控件 / 展示组件类型名,如 el-input、select、dict、number。'),
139
+ }),
140
+ }, async ({ type }) => {
141
+ return { content: [{ type: 'text', text: buildSnippet(type) }] };
142
+ });
143
+ }
144
+ /** 生成一个最小可运行的 Vue SFC 片段,演示把某控件挂到 AForm 上 */
145
+ function buildSnippet(type) {
146
+ const doc = getComponentDoc(type);
147
+ if (!doc) {
148
+ throw new Error(`未知控件类型「${type}」。可用:${[...CONTROL_TYPES, ...DISPLAY_TYPES].join(', ')}`);
149
+ }
150
+ const isDict = doc.config.some((k) => k === 'dict' || k.startsWith('dict'));
151
+ const cfg = {
152
+ label: doc.name,
153
+ props: 'field',
154
+ type: doc.name,
155
+ };
156
+ if (isDict) {
157
+ cfg.dict = [
158
+ { label: '选项一', value: '1' },
159
+ { label: '选项二', value: '2' },
160
+ ];
161
+ }
162
+ const configsJson = JSON.stringify([cfg], null, 2);
163
+ return `<template>
164
+ <AForm v-model="form" :configs="configs" />
165
+ </template>
166
+
167
+ <script setup lang="ts">
168
+ import { reactive } from 'vue'
169
+ import { AForm } from '@web_qiang/aform'
170
+
171
+ const form = reactive<Record<string, unknown>>({})
172
+ const configs = ${configsJson}
173
+ </script>`;
174
+ }
175
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "aform-mcp",
3
+ "version": "0.0.2",
4
+ "type": "module",
5
+ "description": "MCP server for @web_qiang/aform: 组件查询、配置生成与字典检索(stdio + Streamable HTTP 双传输,基于 @modelcontextprotocol/server v2)。",
6
+ "license": "MIT",
7
+ "author": "web_qiang",
8
+ "bin": {
9
+ "aform-mcp": "./dist/stdio.js"
10
+ },
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "main": "./dist/index.js",
15
+ "scripts": {
16
+ "build": "tsc -p tsconfig.json",
17
+ "start:stdio": "node dist/stdio.js",
18
+ "start:http": "node dist/http.js",
19
+ "prepublishOnly": "pnpm build"
20
+ },
21
+ "dependencies": {
22
+ "@modelcontextprotocol/node": "^2.0.0",
23
+ "@modelcontextprotocol/server": "^2.0.0",
24
+ "zod": "^4.5.4"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^24.12.2",
28
+ "typescript": "^5.6.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=18"
32
+ }
33
+ }