Apifox MCP Server
Official
by apifox
- src
- server
import { z } from 'zod';
import { apifoxRequest } from '../shared/apifoxRequest';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
export class EndpointMCPServer {
protected mcpServer: McpServer;
private token: string;
public constructor(mcpServer: McpServer, token: string) {
this.mcpServer = mcpServer;
this.token = token;
}
public registerTools = () => {
this.mcpServer.tool(
'get_endpoint_oas_by_link',
'通过 Apifox 的协作链接来获取此接口的 OpenAPI Specification 格式定义,协作链接格式如下:https://app.apifox.com/link/project/{projectId}/apis/api-{endpointId} ,{projectId} 为 Apifox 的项目 ID,{endpointId} 为接口(Endpoint)的 ID,由于该链接是无法直接访问的,所以需要通过本工具来获取。如发现有符合条件的链接,则调用本工具',
{
projectId: z.number().describe('Apifox 的项目 ID'),
endpointId: z.number().describe('接口(Endpoint)的 ID'),
},
async ({ projectId, endpointId }) => {
const url = `/v1/projects/${projectId}/export-openapi`;
try {
// console.log('Fetching openapi url', projectId, endpointId);
const file = await apifoxRequest(url, {
projectId,
method: 'POST',
body: JSON.stringify({
projectId,
type: 2,
format: 'json',
version: '3.0',
apiDetailId: [Number(endpointId)],
includeTags: [],
excludeTags: [],
checkedFolder: [],
selectedEnvironments: [],
excludeExtension: true,
excludeTagsWithFolder: true,
}),
}, this.token);
// console.log(`Successfully fetched apifox openapi url: ${url}`);
return {
content: [{ type: 'text', text: JSON.stringify(file, null, 2) }],
};
} catch (error) {
// console.error(`Error fetching url ${url}:`, error);
return {
content: [{ type: 'text', text: `Error fetching file: ${error}` }],
};
}
},
);
}
}