Skip to main content
Glama
API_DOCUMENTATION.md11.6 kB
# MCP Swagger Parser API 文档 ## 快速开始 ### 安装 ```bash npm install mcp-swagger-parser ``` ### 基础使用 ```typescript import { parseFromUrl, parseFromFile, parseFromString, transformToMCPTools } from 'mcp-swagger-parser'; // 从 URL 解析 const result = await parseFromUrl('https://api.example.com/swagger.json'); // 从文件解析 const result = await parseFromFile('./swagger.json'); // 从字符串解析 const swaggerJson = '{"openapi": "3.0.0", ...}'; const result = await parseFromString(swaggerJson); // 转换为 MCP 工具 const tools = transformToMCPTools(result.spec); ``` ## 核心 API ### parseFromUrl(url, config?) 从 URL 解析 OpenAPI 规范。 **参数**: - `url: string` - OpenAPI 规范的 URL - `config?: ParserConfig` - 可选的解析器配置 **返回**: `Promise<ParseResult>` **示例**: ```typescript const result = await parseFromUrl('https://petstore.swagger.io/v2/swagger.json', { validateSchema: true, strictMode: false }); console.log(`解析了 ${result.metadata.endpointCount} 个端点`); ``` ### parseFromFile(filePath, config?) 从文件解析 OpenAPI 规范。 **参数**: - `filePath: string` - 文件路径 - `config?: ParserConfig` - 可选的解析器配置 **返回**: `Promise<ParseResult>` **示例**: ```typescript const result = await parseFromFile('./api/swagger.yaml', { validateSchema: true, resolveReferences: true }); ``` ### parseFromString(content, config?) 从字符串内容解析 OpenAPI 规范。 **参数**: - `content: string` - OpenAPI 规范内容(JSON 或 YAML) - `config?: ParserConfig` - 可选的解析器配置 **返回**: `Promise<ParseResult>` ### transformToMCPTools(spec, options?) 将 OpenAPI 规范转换为 MCP 工具。 **参数**: - `spec: OpenAPISpec` - 解析后的 OpenAPI 规范 - `options?: TransformerOptions` - 转换选项 **返回**: `MCPTool[]` **示例**: ```typescript const tools = transformToMCPTools(result.spec, { baseUrl: 'https://api.example.com', includeDeprecated: false, includeTags: ['user', 'order'] }); ``` ## 高级 API ### OpenAPIParser 类 主解析器类,提供更多控制选项。 ```typescript import { OpenAPIParser } from 'mcp-swagger-parser'; const parser = new OpenAPIParser({ validateSchema: true, resolveReferences: true, strictMode: false, customValidators: [] }); // 使用解析器 const result = await parser.parseFromUrl('https://api.example.com/swagger.json'); ``` ### OpenAPIToMCPTransformer 类 OpenAPI 到 MCP 的转换器类。 ```typescript import { OpenAPIToMCPTransformer } from 'mcp-swagger-parser'; const transformer = new OpenAPIToMCPTransformer(spec, { baseUrl: 'https://api.example.com', includeDeprecated: false, requestTimeout: 30000, defaultHeaders: { 'Authorization': 'Bearer token', 'Content-Type': 'application/json' } }); const tools = transformer.transformToMCPTools(); ``` ## 配置选项 ### ParserConfig ```typescript interface ParserConfig { validateSchema?: boolean; // 是否验证 OpenAPI schema,默认 true resolveReferences?: boolean; // 是否解析 $ref 引用,默认 true allowEmptyPaths?: boolean; // 是否允许空的 paths,默认 false strictMode?: boolean; // 严格模式,默认 false customValidators?: ValidationRule[]; // 自定义验证规则 } ``` ### TransformerOptions ```typescript interface TransformerOptions { baseUrl?: string; // API 基础 URL includeDeprecated?: boolean; // 是否包含废弃的 API,默认 false includeTags?: string[]; // 包含的标签列表 excludeTags?: string[]; // 排除的标签列表 requestTimeout?: number; // 请求超时时间,默认 30000ms defaultHeaders?: Record<string, string>; // 默认请求头 customHandlers?: Record<string, Function>; // 自定义处理器 pathPrefix?: string; // 路径前缀 stripBasePath?: boolean; // 是否移除基础路径 } ``` ## 类型定义 ### ParseResult ```typescript interface ParseResult { spec: ParsedApiSpec; // 解析后的 API 规范 validation: ValidationResult; // 验证结果 metadata: ParseMetadata; // 解析元数据 } ``` ### ValidationResult ```typescript interface ValidationResult { valid: boolean; // 是否有效 isValid: boolean; // 是否有效(兼容性) errors: ValidationError[]; // 错误列表 warnings: ValidationWarning[]; // 警告列表 metadata?: ValidationMetadata; // 验证元数据 } ``` ### MCPTool ```typescript interface MCPTool { name: string; // 工具名称 description: string; // 工具描述 inputSchema: { // 输入 schema type: 'object'; properties: Record<string, any>; required?: string[]; additionalProperties?: boolean; }; handler: (args: any) => Promise<MCPToolResponse>; // 处理函数 metadata?: { // 元数据 method: string; path: string; tags?: string[]; operationId?: string; deprecated?: boolean; }; } ``` ## 错误处理 ### 错误类型 ```typescript // 基础解析错误 class OpenAPIParseError extends Error { code: string; context?: any; } // 验证错误 class OpenAPIValidationError extends OpenAPIParseError { errors: ValidationError[]; warnings: ValidationWarning[]; } ``` ### 错误处理示例 ```typescript try { const result = await parseFromUrl('https://api.example.com/invalid.json'); } catch (error) { if (error instanceof OpenAPIValidationError) { console.log('验证错误:'); error.errors.forEach(err => { console.log(`- ${err.path}: ${err.message}`); }); } else if (error instanceof OpenAPIParseError) { console.log(`解析错误 (${error.code}): ${error.message}`); } else { console.log('未知错误:', error); } } ``` ## 实际使用案例 ### 1. 基础 API 转换 ```typescript import { parseFromUrl, transformToMCPTools } from 'mcp-swagger-parser'; async function convertPetstoreAPI() { try { // 解析 Petstore API const result = await parseFromUrl('https://petstore.swagger.io/v2/swagger.json'); // 检查验证结果 if (!result.validation.valid) { console.warn('API 规范有问题:'); result.validation.errors.forEach(error => { console.warn(`- ${error.message}`); }); } // 转换为 MCP 工具 const tools = transformToMCPTools(result.spec, { baseUrl: 'https://petstore.swagger.io/v2', excludeTags: ['store'], // 排除 store 相关 API includeDeprecated: false }); console.log(`生成了 ${tools.length} 个 MCP 工具`); // 输出工具信息 tools.forEach(tool => { console.log(`- ${tool.name}: ${tool.description}`); }); return tools; } catch (error) { console.error('转换失败:', error); throw error; } } ``` ### 2. 自定义验证规则 ```typescript import { OpenAPIParser, ValidationRule } from 'mcp-swagger-parser'; // 自定义验证规则:检查是否所有操作都有 operationId const requireOperationId: ValidationRule = { name: 'require-operation-id', validate: (spec) => { const errors = []; const warnings = []; for (const [path, pathItem] of Object.entries(spec.paths)) { for (const [method, operation] of Object.entries(pathItem)) { if (typeof operation === 'object' && !operation.operationId) { warnings.push({ code: 'MISSING_OPERATION_ID', message: `操作 ${method.toUpperCase()} ${path} 缺少 operationId`, path: `paths.${path}.${method}`, severity: 'warning' }); } } } return { valid: errors.length === 0, isValid: errors.length === 0, errors, warnings }; } }; // 使用自定义验证 const parser = new OpenAPIParser({ customValidators: [requireOperationId] }); const result = await parser.parseFromFile('./api.json'); ``` ### 3. 批量处理多个 API ```typescript import { parseFromUrl, transformToMCPTools } from 'mcp-swagger-parser'; async function processMultipleAPIs(apiUrls: string[]) { const results = []; for (const url of apiUrls) { try { console.log(`处理 ${url}...`); const result = await parseFromUrl(url); const tools = transformToMCPTools(result.spec); results.push({ url, success: true, toolCount: tools.length, tools, metadata: result.metadata }); } catch (error) { console.error(`处理 ${url} 失败:`, error.message); results.push({ url, success: false, error: error.message }); } } return results; } // 使用示例 const apiUrls = [ 'https://petstore.swagger.io/v2/swagger.json', 'https://api.example1.com/swagger.json', 'https://api.example2.com/openapi.yaml' ]; const results = await processMultipleAPIs(apiUrls); console.log(`成功处理 ${results.filter(r => r.success).length}/${results.length} 个 API`); ``` ### 4. 与 MCP 服务器集成 ```typescript import { McpServer } from '@modelcontextprotocol/sdk/server/mcp'; import { parseFromFile, transformToMCPTools } from 'mcp-swagger-parser'; async function setupMCPServer() { const server = new McpServer({ name: 'swagger-api-server', version: '1.0.0' }); // 解析 API 规范 const result = await parseFromFile('./api/swagger.json'); const tools = transformToMCPTools(result.spec, { baseUrl: process.env.API_BASE_URL, defaultHeaders: { 'Authorization': `Bearer ${process.env.API_TOKEN}` } }); // 注册工具到 MCP 服务器 for (const tool of tools) { server.addTool({ name: tool.name, description: tool.description, inputSchema: tool.inputSchema }, tool.handler); } console.log(`注册了 ${tools.length} 个工具到 MCP 服务器`); return server; } ``` ## 性能优化建议 ### 1. 缓存解析结果 ```typescript const cache = new Map<string, ParseResult>(); async function cachedParseFromUrl(url: string) { if (cache.has(url)) { return cache.get(url)!; } const result = await parseFromUrl(url); cache.set(url, result); return result; } ``` ### 2. 并行处理 ```typescript async function parseMultipleURLs(urls: string[]) { const promises = urls.map(url => parseFromUrl(url)); return Promise.allSettled(promises); } ``` ### 3. 流式处理大文件 ```typescript // 对于超大 OpenAPI 文件,考虑使用流式处理 import { createReadStream } from 'fs'; async function parseStreamFile(filePath: string) { // 实现流式解析逻辑 // 这个功能在后续版本中会添加 } ``` ## 故障排除 ### 常见问题 1. **解析失败**: 检查 OpenAPI 规范格式是否正确 2. **验证错误**: 使用 `strictMode: false` 跳过非关键验证 3. **内存不足**: 对大文件使用分块处理 4. **网络超时**: 调整请求超时设置 ### 调试模式 ```typescript // 启用详细日志 const parser = new OpenAPIParser({ validateSchema: true, strictMode: true // 在开发阶段启用严格模式 }); // 捕获所有错误和警告 const result = await parser.parseFromUrl(url); if (result.validation.warnings.length > 0) { console.warn('发现警告:'); result.validation.warnings.forEach(warning => { console.warn(`- ${warning.path}: ${warning.message}`); }); } ```

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/zaizaizhao/mcp-swagger-server'

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