@web_qiang/aform-mcp 0.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.
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # @web_qiang/aform-mcp
2
+
3
+ `@web_qiang/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` 过滤(`container`/`control`/`table`/`search`/`display`)。 |
12
+ | `get_component_doc` | 查询某个组件 / 控件的说明与关键配置项(RawConfig 字段)。 |
13
+ | `generate_form_config` | 根据字段清单生成 aform 的 `RawConfig` 配置数组(JSON)。 |
14
+ | `search_dict` | 在内置字典中按关键词(label 或 value)模糊检索选项。 |
15
+ | `list_control_types` | 列出全部「写控件」与「展示组件」类型名。 |
16
+ | `list_dicts` | 列出全部内置字典名及其选项数量。 |
17
+ | `get_control_snippet` | 为指定控件生成一段可运行的 Vue SFC 片段(AForm + 单个 configs 项)。 |
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` | 根据自然语言描述编排「查组件 → 选字典 → 生成配置」的流程。 |
32
+ | `explain-component` | 讲解某组件配置项与用法示例。 |
33
+ | `pick-dict` | 在字典中检索合适的选项,用于 select / radioGroup 等控件。 |
34
+
35
+ ## 开发
36
+
37
+ ```bash
38
+ cd mcp
39
+ pnpm install
40
+ pnpm build # tsc 编译到 dist/
41
+ ```
42
+
43
+ ## 运行
44
+
45
+ ### stdio(本地子进程,Claude Desktop / Cursor 等接入)
46
+
47
+ ```bash
48
+ pnpm start:stdio
49
+ ```
50
+
51
+ `bin` 已注册为 `aform-mcp`,也可直接:
52
+
53
+ ```bash
54
+ node dist/stdio.js
55
+ ```
56
+
57
+ ### Streamable HTTP
58
+
59
+ ```bash
60
+ PORT=3000 pnpm start:http
61
+ # 端点:POST http://127.0.0.1:3000/mcp (同时支持 JSON 与 SSE 响应)
62
+ ```
63
+
64
+ HTTP 模式使用 v2 官方的 `createMcpHandler` + `@modelcontextprotocol/node` 的 `toNodeHandler`,并默认开启 `localhostHostValidation` / `localhostOriginValidation` 守卫,仅允许本机 Host 与 Origin,防止 DNS 重绑定与跨站请求。
65
+
66
+ ## 客户端接入示例
67
+
68
+ ### Claude Desktop(`claude_desktop_config.json`)
69
+
70
+ ```json
71
+ {
72
+ "mcpServers": {
73
+ "aform": {
74
+ "command": "node",
75
+ "args": ["/绝对路径/form/mcp/dist/stdio.js"]
76
+ }
77
+ }
78
+ }
79
+ ```
80
+
81
+ ### 用 MCP Inspector 调试
82
+
83
+ ```bash
84
+ npx @modelcontextprotocol/inspector node ./dist/stdio.js
85
+ # 或调试 HTTP 模式
86
+ npx @modelcontextprotocol/inspector http://127.0.0.1:3000/mcp
87
+ ```
88
+
89
+ ## 目录结构
90
+
91
+ ```
92
+ mcp/
93
+ ├── src/
94
+ │ ├── index.ts # 对外导出 createAformServer 与知识库
95
+ │ ├── server.ts # 装配 McpServer,注册 tools/resources/prompts
96
+ │ ├── tools.ts # 7 个工具
97
+ │ ├── resources.ts # 组件清单 / 字典 / 单组件详情资源
98
+ │ ├── prompts.ts # 3 个提示词
99
+ │ ├── knowledge.ts # aform 静态知识库(组件文档 + 示例字典)
100
+ │ ├── stdio.ts # stdio 传输入口(serveStdio)
101
+ │ └── http.ts # Streamable HTTP 传输入口
102
+ ├── package.json
103
+ └── tsconfig.json
104
+ ```
105
+
106
+ ## 依赖说明
107
+
108
+ - `@modelcontextprotocol/server`(v2):MCP 服务端 SDK,提供 `McpServer` / `registerTool` / `registerResource` / `registerPrompt` / `serveStdio` / `createMcpHandler`。
109
+ - `@modelcontextprotocol/node`(v2):Node 适配,提供 `toNodeHandler` 与 Host/Origin 校验守卫。
110
+ - `zod`(v4):工具 / 提示词的参数 schema(`import * as z from 'zod/v4'`)。
111
+
112
+ > 注:旧的 `@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 @@
1
+ export {};
package/dist/stdio.js ADDED
@@ -0,0 +1,9 @@
1
+ import { serveStdio } from '@modelcontextprotocol/server/stdio';
2
+ import { createAformServer } from './server.js';
3
+ // serveStdio 拥有传输层,每次连接调用工厂构建实例;stdout 仅承载 JSON-RPC,日志走 stderr
4
+ const handle = serveStdio(() => createAformServer());
5
+ console.error('aform-mcp stdio server running');
6
+ process.on('SIGINT', () => {
7
+ void handle.close();
8
+ });
9
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAAA,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,32 @@
1
+ {
2
+ "name": "@web_qiang/aform-mcp",
3
+ "version": "0.0.1",
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
+ },
20
+ "dependencies": {
21
+ "@modelcontextprotocol/node": "^2.0.0",
22
+ "@modelcontextprotocol/server": "^2.0.0",
23
+ "zod": "^4.5.4"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^24.12.2",
27
+ "typescript": "^5.6.0"
28
+ },
29
+ "engines": {
30
+ "node": ">=18"
31
+ }
32
+ }