Files
apifox-mcp-server/index.js
T
zhangguoyun ad543045c7 refactor: Restructure ApifoxService with dependency injection and MCP integration
- Move APIFOX_TOKEN to index.js and pass via config object to ApifoxService
- Convert ApifoxService to accept config object with projectId, token, and baseUrl parameters
- Move axios instance creation from module level into ApifoxService constructor
- Replace global http client references with instance-based this.http throughout service methods
- Initialize ApifoxService in index.js with environment variables
- Remove GitLab API client code and replace with Apifox-focused tool implementations
- Simplify MCP server tool registration to use ApifoxService methods
- Add init() call in ApifoxService constructor for future initialization logic
- Improve code organization by centralizing API client configuration within service class
- Enable better testability and configuration flexibility through dependency injection pattern
2025-11-29 19:16:13 +08:00

185 lines
5.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 引入必要的模块
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 };