// 引入必要的模块 import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; import { ApifoxService } from './apifox' process.env.APIFOX_TOKEN = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MzQ1MTIwLCJ0cyI6IjUyOGZiZDMwNGM3MjU2NDMiLCJpYXQiOjE3NjQxNTQyODEzMzB9.IZvoCb3pN5AUl375c4Dhpur1GdYBqyHWVkJ94bDQ6BQ'; // 创建 MCP 服务器实例 // 为其设置一个名字和版本 const server = new McpServer({ name: "apifox-mcp-server", version: "1.0.0", }); const apifoxService = new ApifoxService({ projectId: process.env.APIFOX_PROJECT_ID, token: process.env.APIFOX_TOKEN }); server.registerTool( 'get_api_by_path', { description: "根据接口path获取Apifox接口定义数据", inputSchema: z.object({ path: z.string().describe("接口路径"), }), }, async ({ path }) => { try { const apiData = apifoxService.getApiDetailByPath(path); return { content: [ { type: "text", text: JSON.stringify(apiData, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: `获取接口详情失败: ${error.message}`, }, ], isError: true, }; } } ) server.registerTool( 'get_apis_by_folder', { description: "根据接口目录获取Apifox目录下所有接口定义数据", inputSchema: z.object({ folderName: z.string().describe("接口路径"), }), }, async ({ folderName }) => { try { const apiData = apifoxService.getApiListByFolderName(folderName); return { content: [ { type: "text", text: JSON.stringify(apiData, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: `获取接口数据失败: ${error.message}`, }, ], isError: true, }; } } ) // 定义 prompts 列表 server.setRequestHandler(ListPromptsRequestSchema, async () => { return { prompts: [ { name: "gen-api-by-path", description: "根据输入的接口路径获取Apifox接口文档定义,然后根据定义生成 api 接口代码定义", arguments: [ ], }, { name: "gen-api-by-folder", description: "根据输入的接口文件夹获取Apifox相关文件夹下所有的接口文档定义,然后根据定义生成 api 接口代码定义", arguments: [ ], }, ], }; }); // 处理获取具体 prompt 的请求 server.setRequestHandler(GetPromptRequestSchema, async (request) => { const { name, arguments: args } = request.params; switch (name) { case "gen-api-by-path": return { messages: [ { role: "user", content: { type: "text", text: `请根据以下步骤获取Apifox的接口定义并生成 api 定义代码。 步骤: 1. 使用 get_api_by_path 工具获取对应的接口定义schema 2. 根据返回的 path,method, requestSchema, responseSchema 和其他必要字段,生成 api 定义代码 3. 接口的参数和返回值的类型定义,可以分别参考 requestSchema 和 responseSchema 里面的jsonSchema定义,要补充相关的注释 4. 所有字段先定义为可空类型 5. 请根据当前项目的项目接口和代码风格生成 api 接口代码 请开始执行这些步骤。`, }, }, ], }; case "gen-api-by-folder": return { messages: [ { role: "user", content: { type: "text", text: `请根据以下步骤获取Apifox的接口定义并生成 api 定义代码。 步骤: 1. 使用 get_api_by_folder 工具获取对应的接口定义schema,可能会返回多条接口的数据 2. 根据返回的 path,method, requestSchema, responseSchema 和其他必要字段,生成 api 定义代码 3. 接口的参数和返回值的类型定义,可以分别参考 requestSchema 和 responseSchema 里面的jsonSchema定义,要补充相关的注释 4. 所有字段先定义为可空类型 5. 请根据当前项目的项目接口和代码风格生成 api 接口代码 请开始执行这些步骤。`, }, }, ], }; default: throw new Error(`未知的 prompt: ${name}`); } }); // 启动服务器,使用标准输入/输出(stdio)与客户端通信 async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error("Apifox MCP 服务器已通过 stdio 启动"); // 日志输出到 stderr } // 运行主函数,并捕获可能的错误 main().catch((error) => { console.error("服务器运行出现致命错误:", error); process.exit(1); }); export { server };