Skip to main content
Glama

export_openapi

Export API documentation from Apifox projects to OpenAPI format. Use summary mode to review structure before importing new APIs, or full mode for complete specifications.

Instructions

查看 Apifox 接口文档:从 Apifox 项目导出接口信息。重要:在导入新接口前,务必先使用 summary 模式查看现有目录结构和接口列表,以便将新接口放入合适的目录中,保持项目结构一致性。

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNo导出模式:summary=仅导出目录结构和接口列表(推荐,节省上下文),full=导出完整的 OpenAPI 规范。默认为 summary
oasVersionNoOpenAPI 规范版本,默认为 3.0(仅 full 模式有效)
exportFormatNo导出格式,默认为 JSON(仅 full 模式有效)
pathFilterNo路径过滤器,只导出匹配的接口路径(支持前缀匹配),如 "/api/user" 只导出用户相关接口

Implementation Reference

  • MCP server handler for the export_openapi tool. Handles input parameters, calls ApifoxClient.exportOpenApi, applies path filtering, and formats output in summary or full mode.
    case 'export_openapi': { const { mode, oasVersion, exportFormat, pathFilter } = args as { mode?: 'summary' | 'full'; oasVersion?: '2.0' | '3.0' | '3.1'; exportFormat?: 'JSON' | 'YAML'; pathFilter?: string; }; const exportMode = mode || 'summary'; const result = await apifoxClient.exportOpenApi({ oasVersion: oasVersion || '3.0', exportFormat: exportFormat || 'JSON' }); // 路径过滤 let filteredPaths = result.paths; if (pathFilter) { filteredPaths = {}; Object.keys(result.paths).forEach(path => { if (path.startsWith(pathFilter)) { filteredPaths[path] = result.paths[path]; } }); } // Summary 模式:只返回目录结构和接口列表 if (exportMode === 'summary') { let resultText = '✅ 接口文档概览(Summary 模式)\n\n'; // 统计信息 const pathsCount = Object.keys(filteredPaths).length; const totalCount = Object.keys(result.paths).length; resultText += `📊 统计信息:\n`; resultText += ` - 项目标题: ${result.info?.title || '未命名'}\n`; if (pathFilter) { resultText += ` - 过滤条件: ${pathFilter}\n`; resultText += ` - 匹配接口: ${pathsCount} / ${totalCount}\n`; } else { resultText += ` - 总接口数: ${pathsCount}\n`; } resultText += '\n'; // 按路径前缀分组(模拟目录结构) const groups: { [key: string]: any[] } = {}; Object.keys(filteredPaths).forEach(path => { const pathObj = filteredPaths[path]; const methods = Object.keys(pathObj).filter(m => m !== 'parameters'); methods.forEach(method => { const operation = pathObj[method]; const tags = operation.tags || ['未分类']; const tag = tags[0] || '未分类'; if (!groups[tag]) { groups[tag] = []; } groups[tag].push({ path, method: method.toUpperCase(), summary: operation.summary || '无描述' }); }); }); // 显示目录结构 resultText += '📁 目录结构和接口列表:\n\n'; const sortedGroups = Object.keys(groups).sort(); sortedGroups.forEach(groupName => { resultText += `📂 ${groupName}\n`; groups[groupName].forEach(api => { resultText += ` └─ [${api.method}] ${api.path}\n`; resultText += ` ${api.summary}\n`; }); resultText += '\n'; }); resultText += '\n💡 提示:\n'; resultText += ' - 导入新接口时,请参考上述目录结构\n'; resultText += ' - 将相关接口放入对应的目录(使用 tags 字段)\n'; resultText += ' - 保持接口路径命名风格一致\n'; if (!pathFilter) { resultText += ' - 如需查看特定接口详情,使用 pathFilter 参数过滤\n'; resultText += ' - 如需完整规范,使用 mode: "full"\n'; } return { content: [ { type: 'text', text: resultText } ] }; } // Full 模式:返回完整 OpenAPI 规范 let resultText = '✅ OpenAPI 规范导出成功(Full 模式)\n\n'; const pathsCount = Object.keys(filteredPaths).length; const schemasCount = result.components?.schemas ? Object.keys(result.components.schemas).length : 0; resultText += `📊 导出统计:\n`; resultText += ` - OpenAPI 版本: ${result.openapi || result.swagger}\n`; resultText += ` - 项目标题: ${result.info?.title || '未命名'}\n`; resultText += ` - 接口数量: ${pathsCount}\n`; resultText += ` - 数据模型数量: ${schemasCount}\n`; if (pathsCount > 0) { resultText += '\n📋 接口列表:\n'; const paths = Object.keys(filteredPaths); paths.slice(0, 10).forEach(path => { const methods = Object.keys(filteredPaths[path]).filter(m => m !== 'parameters'); resultText += ` - ${path} [${methods.join(', ').toUpperCase()}]\n`; }); if (paths.length > 10) { resultText += ` ... 还有 ${paths.length - 10} 个接口\n`; } } // 如果有过滤,返回过滤后的规范 let exportedSpec = result; if (pathFilter) { exportedSpec = { ...result, paths: filteredPaths }; } return { content: [ { type: 'text', text: resultText }, { type: 'text', text: `\n📄 完整 OpenAPI 规范:\n\`\`\`json\n${JSON.stringify(exportedSpec, null, 2)}\n\`\`\`` } ] }; }
  • Input schema and metadata definition for the export_openapi tool in the tools registry.
    { name: 'export_openapi', description: '查看 Apifox 接口文档:从 Apifox 项目导出接口信息。重要:在导入新接口前,务必先使用 summary 模式查看现有目录结构和接口列表,以便将新接口放入合适的目录中,保持项目结构一致性。', inputSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['summary', 'full'], description: '导出模式:summary=仅导出目录结构和接口列表(推荐,节省上下文),full=导出完整的 OpenAPI 规范。默认为 summary' }, oasVersion: { type: 'string', enum: ['2.0', '3.0', '3.1'], description: 'OpenAPI 规范版本,默认为 3.0(仅 full 模式有效)' }, exportFormat: { type: 'string', enum: ['JSON', 'YAML'], description: '导出格式,默认为 JSON(仅 full 模式有效)' }, pathFilter: { type: 'string', description: '路径过滤器,只导出匹配的接口路径(支持前缀匹配),如 "/api/user" 只导出用户相关接口' } } } }
  • ApifoxClient helper method implementing the core export logic by calling the Apifox /export-openapi API endpoint.
    async exportOpenApi(options?: { oasVersion?: '2.0' | '3.0' | '3.1'; exportFormat?: 'JSON' | 'YAML'; scope?: { type?: 'ALL' | 'SELECTED_FOLDERS' | 'SELECTED_ENDPOINTS'; excludedByTags?: string[]; }; options?: { includeApifoxExtensionProperties?: boolean; addFoldersToTags?: boolean; }; }): Promise<any> { const response = await this.client.post( `/v1/projects/${this.projectId}/export-openapi`, { oasVersion: options?.oasVersion || '3.0', exportFormat: options?.exportFormat || 'JSON', ...(options?.scope && { scope: options.scope }), ...(options?.options && { options: options.options }) } ); return response.data; }
  • src/index.ts:211-213 (registration)
    Registration of the tools list (including export_openapi) via MCP ListToolsRequestSchema handler.
    server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools }; });
Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Warren-W/apifox-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server