apifox-workspace-mcp 1.2.0 → 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 (54) hide show
  1. package/dist/core/cache/unified-cache-manager.d.ts.map +1 -1
  2. package/dist/core/cache/unified-cache-manager.js +25 -3
  3. package/dist/core/cache/unified-cache-manager.js.map +1 -1
  4. package/dist/core/index.d.ts +0 -2
  5. package/dist/core/index.d.ts.map +1 -1
  6. package/dist/core/index.js +0 -2
  7. package/dist/core/index.js.map +1 -1
  8. package/dist/lib/project-root.d.ts.map +1 -1
  9. package/dist/lib/project-root.js +8 -5
  10. package/dist/lib/project-root.js.map +1 -1
  11. package/dist/server/handlers/error-handler.d.ts.map +1 -1
  12. package/dist/server/handlers/error-handler.js +27 -18
  13. package/dist/server/handlers/error-handler.js.map +1 -1
  14. package/dist/server/handlers/generate-artifacts.d.ts.map +1 -1
  15. package/dist/server/handlers/generate-artifacts.js +49 -4
  16. package/dist/server/handlers/generate-artifacts.js.map +1 -1
  17. package/dist/server/handlers/get-interface-detail.d.ts.map +1 -1
  18. package/dist/server/handlers/get-interface-detail.js +5 -1
  19. package/dist/server/handlers/get-interface-detail.js.map +1 -1
  20. package/dist/server/handlers/index.d.ts +0 -1
  21. package/dist/server/handlers/index.d.ts.map +1 -1
  22. package/dist/server/handlers/index.js +0 -1
  23. package/dist/server/handlers/index.js.map +1 -1
  24. package/dist/server/handlers/list-project-interfaces.d.ts.map +1 -1
  25. package/dist/server/handlers/list-project-interfaces.js +12 -6
  26. package/dist/server/handlers/list-project-interfaces.js.map +1 -1
  27. package/dist/server/handlers/list-projects.d.ts.map +1 -1
  28. package/dist/server/handlers/list-projects.js +9 -2
  29. package/dist/server/handlers/list-projects.js.map +1 -1
  30. package/dist/server/handlers/parse-and-add-project.d.ts.map +1 -1
  31. package/dist/server/handlers/parse-and-add-project.js +11 -3
  32. package/dist/server/handlers/parse-and-add-project.js.map +1 -1
  33. package/dist/server/handlers/query-interfaces.d.ts.map +1 -1
  34. package/dist/server/handlers/query-interfaces.js +15 -13
  35. package/dist/server/handlers/query-interfaces.js.map +1 -1
  36. package/dist/server/handlers/select-interfaces.d.ts +13 -1
  37. package/dist/server/handlers/select-interfaces.d.ts.map +1 -1
  38. package/dist/server/handlers/select-interfaces.js +13 -4
  39. package/dist/server/handlers/select-interfaces.js.map +1 -1
  40. package/dist/server/index.js +29 -43
  41. package/dist/server/index.js.map +1 -1
  42. package/package.json +1 -1
  43. package/dist/__tests__/intent.test.d.ts +0 -2
  44. package/dist/__tests__/intent.test.d.ts.map +0 -1
  45. package/dist/__tests__/intent.test.js +0 -58
  46. package/dist/__tests__/intent.test.js.map +0 -1
  47. package/dist/core/intent.d.ts +0 -28
  48. package/dist/core/intent.d.ts.map +0 -1
  49. package/dist/core/intent.js +0 -307
  50. package/dist/core/intent.js.map +0 -1
  51. package/dist/server/handlers/assistant.d.ts +0 -20
  52. package/dist/server/handlers/assistant.d.ts.map +0 -1
  53. package/dist/server/handlers/assistant.js +0 -308
  54. package/dist/server/handlers/assistant.js.map +0 -1
@@ -1,308 +0,0 @@
1
- import { parseIntent, UnifiedCacheManager, } from '../../core/index.js';
2
- import { readFileSync } from 'fs';
3
- import { join } from 'path';
4
- import { fileURLToPath } from 'url';
5
- import { dirname } from 'path';
6
- import { handleListProjects } from './list-projects.js';
7
- import { handleListProjectInterfaces } from './list-project-interfaces.js';
8
- import { handleQueryInterfaces } from './query-interfaces.js';
9
- import { handleGetInterfaceDetail } from './get-interface-detail.js';
10
- import { handleGenerateArtifacts } from './generate-artifacts.js';
11
- import { handleSelectInterfaces } from './select-interfaces.js';
12
- import { buildTextResponse, resolveProjectInfo } from './utils.js';
13
- import { findProjectRoot } from '../../lib/project-root.js';
14
- // 用于智能推断的关键词常量
15
- const GENERATE_KEYWORDS = ['生成', '导出', '输出', 'mock', '类型', '封装', '代码'];
16
- /**
17
- * 检测产物类型
18
- */
19
- function detectArtifactType(prompt) {
20
- if (prompt.includes('mock')) {
21
- return 'mock_data';
22
- }
23
- if (prompt.includes('封装') || prompt.toLowerCase().includes('request')) {
24
- return 'request_wrappers';
25
- }
26
- if (prompt.includes('测试')) {
27
- return 'test_scripts';
28
- }
29
- return 'ts_types';
30
- }
31
- /**
32
- * 从 prompt 中提取搜索关键词
33
- */
34
- function extractSearchKeyword(prompt) {
35
- // 移除常见的查询关键词
36
- const cleaned = prompt.replace(/查询|搜索|找|帮我|一下|接口/g, '').trim();
37
- return cleaned || undefined || '';
38
- }
39
- import { handleMissingProjectError, handleMissingInterfaceError, handleCacheNotFoundError, } from './error-handler.js';
40
- // 获取项目根目录(MCP Server 的根目录)
41
- // 从当前文件位置向上查找,直到找到包含 package.json 的目录
42
- const __filename = fileURLToPath(import.meta.url);
43
- const __dirname = dirname(__filename);
44
- // 从 dist/server/handlers 向上查找项目根目录
45
- const serverRoot = findProjectRoot(__dirname);
46
- /**
47
- * 处理自然语言助手请求
48
- */
49
- export async function handleAssistant(args, ctx) {
50
- const { projectRoot, configManager, mcpBridge, contextStore } = ctx;
51
- const lastProject = contextStore.getLastProject();
52
- const lastList = contextStore.getLastInterfaceList();
53
- const intent = parseIntent(args.prompt, {
54
- lastProjectName: lastProject?.projectName,
55
- lastInterfaceListNames: lastList?.list.map((item) => item.name),
56
- });
57
- switch (intent.action) {
58
- case 'listProjects':
59
- return handleListProjects(projectRoot);
60
- case 'countInterfaces': {
61
- // 查询接口数量
62
- let targetProjectName = intent.projectName || lastProject?.projectName;
63
- let targetProjectId = intent.projectId || lastProject?.projectId;
64
- // 如果还没有项目信息,尝试从缓存中查找
65
- if (!targetProjectId && !targetProjectName) {
66
- const cacheManager = new UnifiedCacheManager(projectRoot);
67
- const projects = cacheManager.listProjects();
68
- if (projects.length === 1) {
69
- // 如果只有一个项目,使用它
70
- targetProjectName = projects[0].name;
71
- targetProjectId = projects[0].id;
72
- }
73
- else if (projects.length > 1 && lastProject) {
74
- // 如果有多个项目,但上下文中有项目信息,使用上下文的
75
- targetProjectName = lastProject.projectName;
76
- targetProjectId = lastProject.projectId;
77
- }
78
- }
79
- if (!targetProjectId && !targetProjectName) {
80
- return buildTextResponse('无法确定项目信息。\n\n你可以:\n1. 提供项目 URL:直接粘贴项目的分享链接\n2. 或者先查询接口列表:说"列出所有接口"');
81
- }
82
- const cacheManager = new UnifiedCacheManager(projectRoot);
83
- const projectInfo = resolveProjectInfo(projectRoot, contextStore, targetProjectName, targetProjectId);
84
- if (!projectInfo || !projectInfo.projectId) {
85
- return handleMissingProjectError({
86
- lastProject,
87
- projectRoot,
88
- contextStore,
89
- });
90
- }
91
- const cachedProject = cacheManager.findProjectById(projectInfo.projectId);
92
- if (!cachedProject) {
93
- return handleCacheNotFoundError(projectInfo.projectName || projectInfo.projectId, {
94
- lastProject,
95
- projectRoot,
96
- contextStore,
97
- });
98
- }
99
- const interfaceCount = cachedProject.interfaces.length;
100
- return buildTextResponse(`**项目名称**: ${cachedProject.projectName}\n**项目 ID**: ${projectInfo.projectId}\n**接口数量**: ${interfaceCount} 个`);
101
- }
102
- case 'listProjectInterfaces':
103
- // 如果 intent 中没有指定项目,但上下文中有,使用上下文中的项目
104
- const targetProjectName = intent.projectName || lastProject?.projectName;
105
- const targetProjectId = intent.projectId || lastProject?.projectId;
106
- return handleListProjectInterfaces({
107
- shareId: intent.shareId,
108
- url: intent.url,
109
- projectName: targetProjectName,
110
- projectId: targetProjectId,
111
- }, { projectRoot, configManager, mcpBridge, contextStore });
112
- case 'searchInterfaces':
113
- return handleQueryInterfaces({
114
- projectName: intent.projectName ?? lastProject?.projectName,
115
- keyword: intent.keyword,
116
- }, { projectRoot, configManager, mcpBridge, contextStore });
117
- case 'getInterfaceDetail': {
118
- let targetId = intent.interfaceId;
119
- if (!targetId && intent.targetName && lastList) {
120
- const match = lastList.list.find((item) => item.name.toLowerCase().includes(intent.targetName.toLowerCase()));
121
- targetId = match?.id;
122
- }
123
- if (!targetId) {
124
- return handleMissingInterfaceError({
125
- lastProject,
126
- projectRoot,
127
- contextStore,
128
- }, intent.targetName);
129
- }
130
- return handleGetInterfaceDetail({
131
- projectName: intent.projectName ?? lastProject?.projectName,
132
- projectId: intent.projectId,
133
- shareId: intent.shareId,
134
- interfaceId: targetId,
135
- url: intent.url,
136
- }, { projectRoot, configManager, mcpBridge, contextStore });
137
- }
138
- case 'generateArtifacts': {
139
- const preselected = [];
140
- // 优先使用从 prompt 中提取的接口 ID
141
- if (intent.interfaceIds && intent.interfaceIds.length > 0) {
142
- preselected.push(...intent.interfaceIds);
143
- }
144
- // 如果没有提取到 ID,尝试从接口名称匹配
145
- if (preselected.length === 0 && intent.targetName && lastList) {
146
- const match = lastList.list.find((item) => item.name.toLowerCase().includes(intent.targetName.toLowerCase()));
147
- if (match) {
148
- preselected.push(match.id);
149
- }
150
- }
151
- return handleGenerateArtifacts({
152
- projectName: intent.projectName ?? lastProject?.projectName,
153
- interfaceIds: preselected.length > 0 ? preselected : undefined,
154
- artifactType: intent.artifactType ?? 'ts_types',
155
- }, { projectRoot, configManager, mcpBridge, contextStore });
156
- }
157
- case 'selectInterfaces':
158
- return handleSelectInterfaces({
159
- projectName: intent.projectName ?? lastProject?.projectName,
160
- selectionCriteria: intent.selectionCriteria,
161
- }, { projectRoot, configManager, contextStore });
162
- case 'getVersion': {
163
- // 读取 package.json 中的版本信息
164
- try {
165
- const packageJsonPath = join(serverRoot, 'package.json');
166
- const packageJsonContent = readFileSync(packageJsonPath, 'utf-8');
167
- const packageJson = JSON.parse(packageJsonContent);
168
- const version = packageJson.version || 'unknown';
169
- return buildTextResponse(`当前 Apifox Workspace MCP Server 版本: **${version}**`);
170
- }
171
- catch (error) {
172
- return buildTextResponse(`无法获取版本信息: ${error instanceof Error ? error.message : String(error)}`);
173
- }
174
- }
175
- case 'help':
176
- return buildTextResponse('我可以帮你:\n\n' +
177
- '1. 搜索接口:说"查询支付接口"或"搜索退款"(支持关键词搜索)\n' +
178
- '2. 查看接口详情:提供接口的分享链接,或从查询结果中选择接口\n' +
179
- '3. 生成接口类型:查询接口后选择,然后说"生成这些接口的类型"\n' +
180
- '4. 列出所有接口:说"列出所有接口"或"显示接口列表"');
181
- case 'unknown':
182
- default: {
183
- // 检查是否是无效的 URL
184
- if (intent.url && !intent.url.includes('/apidoc/shared/')) {
185
- return buildTextResponse(`❌ 检测到非 Apifox 链接: ${intent.url}\n\n请提供有效的 Apifox 分享链接。`);
186
- }
187
- // 智能推断用户意图并尝试处理
188
- const prompt = args.prompt.trim();
189
- // 1. 检查是否包含生成关键词 + 路径模式(如"生成/api/xxx的类型")
190
- const hasGenerateKeyword = GENERATE_KEYWORDS.some((kw) => prompt.includes(kw));
191
- const hasTypeKeyword = prompt.includes('类型') ||
192
- prompt.toLowerCase().includes('type') ||
193
- prompt.includes('mock') ||
194
- prompt.includes('封装') ||
195
- prompt.includes('测试');
196
- // 检测路径模式(如 /api/xxx 或 api/xxx)
197
- const pathPattern = /\/?api\/[^\s"']+/i;
198
- const pathMatch = prompt.match(pathPattern);
199
- if (hasGenerateKeyword && hasTypeKeyword && pathMatch) {
200
- // 用户想要生成某个路径的接口类型
201
- const path = pathMatch[0].replace(/^\/?/, '/'); // 确保以 / 开头
202
- if (lastProject?.projectName || lastProject?.projectId) {
203
- // 先搜索该路径的接口
204
- const searchResult = await handleQueryInterfaces({
205
- projectName: lastProject.projectName,
206
- projectId: lastProject.projectId,
207
- keyword: path,
208
- }, { projectRoot, configManager, mcpBridge, contextStore });
209
- // 如果搜索到接口,尝试自动生成
210
- if (searchResult.content && Array.isArray(searchResult.content)) {
211
- const textContent = searchResult.content[0];
212
- if (textContent.type === 'text' && textContent.text.includes('找到')) {
213
- // 提取第一个接口 ID(从搜索结果中)
214
- const lastList = contextStore.getLastInterfaceList();
215
- if (lastList && lastList.list.length > 0) {
216
- const firstInterface = lastList.list[0];
217
- // 自动生成第一个匹配接口的类型
218
- return handleGenerateArtifacts({
219
- projectName: lastProject.projectName,
220
- projectId: lastProject.projectId,
221
- interfaceIds: [firstInterface.id],
222
- artifactType: detectArtifactType(prompt),
223
- }, { projectRoot, configManager, mcpBridge, contextStore });
224
- }
225
- }
226
- }
227
- // 如果搜索失败,返回搜索结果让用户选择
228
- return searchResult;
229
- }
230
- }
231
- // 2. 如果上下文中有项目信息,尝试推断用户意图并处理
232
- if (lastProject?.projectName || lastProject?.projectId) {
233
- // 先检查是否是"查看所有接口"的变体表达
234
- const listAllPatterns = [
235
- /(?:我想|我要|帮我).*查看.*所有接口/i,
236
- /(?:我想|我要|帮我).*列出.*所有接口/i,
237
- /(?:我想|我要|帮我).*显示.*所有接口/i,
238
- /(?:我想|我要|帮我).*所有接口.*信息/i,
239
- ];
240
- if (listAllPatterns.some((pattern) => pattern.test(prompt))) {
241
- // 识别为列出所有接口
242
- return handleListProjectInterfaces({
243
- projectName: lastProject.projectName,
244
- projectId: lastProject.projectId,
245
- }, { projectRoot, configManager, mcpBridge, contextStore });
246
- }
247
- // 尝试作为接口查询处理
248
- return handleQueryInterfaces({
249
- projectName: lastProject.projectName,
250
- projectId: lastProject.projectId,
251
- keyword: prompt,
252
- }, { projectRoot, configManager, mcpBridge, contextStore });
253
- }
254
- // 3. 没有匹配到预置意图,返回结构化提示让 agent 自行调用工具
255
- // 分析用户请求,提供针对性的工具调用建议
256
- const promptLower = prompt.toLowerCase();
257
- let toolSuggestions = '';
258
- // 分析用户意图,提供针对性的建议
259
- if (promptLower.includes('生成') ||
260
- promptLower.includes('类型') ||
261
- promptLower.includes('mock')) {
262
- // 用户想要生成代码
263
- toolSuggestions =
264
- `**检测到您想要生成代码,建议操作流程:**\n` +
265
- `1. 如果请求中包含接口路径(如 /api/xxx),请先调用 \`query_interfaces\` 工具搜索接口\n` +
266
- ` - 参数:keyword: "${prompt.match(/\/?api\/[^\s"']+/i)?.[0] || '从请求中提取的路径'}"\n` +
267
- `2. 从搜索结果中获取 interfaceId,然后调用 \`generate_artifacts\` 工具生成类型\n` +
268
- ` - 参数:interfaceIds: ["从查询结果中获取"], artifactType: "ts_types"\n` +
269
- `3. 或者,如果用户提供了完整的 Apifox 接口 URL,可以直接调用 \`parse_and_add_project\` 然后 \`get_interface_detail\`\n\n`;
270
- }
271
- else if (promptLower.includes('查询') ||
272
- promptLower.includes('搜索') ||
273
- promptLower.includes('找')) {
274
- // 用户想要查询接口
275
- toolSuggestions =
276
- `**检测到您想要查询接口,建议操作:**\n` +
277
- `1. 调用 \`query_interfaces\` 工具搜索接口\n` +
278
- ` - 参数:keyword: "${extractSearchKeyword(prompt)}"\n` +
279
- `2. 如果找到接口,可以进一步调用 \`get_interface_detail\` 查看详情\n\n`;
280
- }
281
- else if (promptLower.includes('详情') || promptLower.includes('具体')) {
282
- // 用户想要查看详情
283
- toolSuggestions =
284
- `**检测到您想要查看接口详情,建议操作:**\n` +
285
- `1. 如果知道接口 ID,直接调用 \`get_interface_detail\`\n` +
286
- `2. 如果不知道接口 ID,先调用 \`query_interfaces\` 搜索,然后调用 \`get_interface_detail\`\n\n`;
287
- }
288
- else {
289
- // 通用建议
290
- toolSuggestions =
291
- `**可用工具:**\n` +
292
- `- \`query_interfaces\` - 查询接口(支持关键词、路径搜索)\n` +
293
- `- \`get_interface_detail\` - 获取接口详情(需要 projectName 和 interfaceId)\n` +
294
- `- \`generate_artifacts\` - 生成接口类型/Mock/封装(需要 interfaceIds)\n` +
295
- `- \`list_projects\` - 列出所有项目\n` +
296
- `- \`parse_and_add_project\` - 添加项目(需要 Apifox 分享链接)\n\n`;
297
- }
298
- return buildTextResponse(`**用户请求:** ${args.prompt}\n\n` +
299
- toolSuggestions +
300
- `**上下文信息:**\n` +
301
- (lastProject
302
- ? `- 当前项目:${lastProject.projectName || lastProject.projectId}\n`
303
- : `- 无项目上下文,建议先调用 \`list_projects\` 或 \`parse_and_add_project\`\n`) +
304
- `\n请根据用户意图和上下文,选择合适的工具进行处理。如果无法确定,可以尝试先调用 \`query_interfaces\` 搜索相关接口。`);
305
- }
306
- }
307
- }
308
- //# sourceMappingURL=assistant.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../../../src/server/handlers/assistant.ts"],"names":[],"mappings":"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"}