- 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
185 lines
5.0 KiB
JavaScript
185 lines
5.0 KiB
JavaScript
// 引入必要的模块
|
||
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 }; |