mcpgen 是一个命令行工具,能够无缝地从你的OpenAPI规范生成生产就绪的Model Context Protocol (MCP)服务器样板代码,使你可以轻松地将现有的API暴露为强大的AI代理工具。
oneOf/anyOf/allOf组合器minimum,maximum,maxLength,pattern)go install github.com/lyeslabs/mcpgen/cmd/mcpgen@latest
默认情况下,二进制文件安装在 $HOME/go/bin(Windows上为 %USERPROFILE%\go\bin)。确保该目录在你的PATH中。
mcpgen --input openapi.yaml --output generated-server
--input
指向你的OpenAPI规范文件路径(YAML或JSON)。
--output
生成的MCP服务器样板代码的目标目录。
--validation
启用OpenAPI验证(默认:false)。
--package
生成的Go包名称(默认:mcpgen)。
--includes
用于生成代码的附加包含项的逗号分隔列表。使用httpclient,types来生成HTTP客户端和类型。
mcpgen --input api/openapi.yaml --output ./generated-server --validation --package myserver --includes=httpclient,types
mcpgen充当你的声明式OpenAPI规范和MCP服务器所需程序化Go代码之间的桥梁。它读取你的OpenAPI定义并自动生成必要的样板代码,包括对有效AI代理交互至关重要的结构化模式和提示。
让我们通过一个在OpenAPI中定义的中等复杂度的端点示例来说明这一点:
# 这是你的OpenAPI规范的一部分
/todos:
get:
tags:
- Todos
summary: 列出所有待办事项
description: 获取待办事项列表,可选地按状态过滤。
operationId: listTodos
parameters:
- name: status
in: query
description: 按状态过滤待办事项(例如:"pending","completed")
required: false
schema:
type: string
enum: [pending, completed, in-progress]
- name: token
in: cookie
description: 认证令牌
required: false
schema:
type: integer
format: int32
minimum: 1
default: 20
- name: limit
in: query
description: 返回的最大待办事项数
required: false
schema:
type: integer
format: int32
minimum: 1
default: 20
- name: offset
in: query
description: 为分页跳过的待办事项数
required: false
schema:
type: integer
format: int32
minimum: 0
default: 0
responses:
'200':
description: 待办事项列表。
content:
application/json:
schema:
type: array
items:
oneOf:
- $ref: '#/components/schemas/Todo'
- $ref: '#/components/schemas/NewTodo'
'400':
$ref: '#/components/responses/BadRequest'
'500':
$ref: '#/components/responses/InternalServerError'
# ... (完整的规范应包括组件如#/components/schemas/Todo,
# #/components/schemas/NewTodo,#/components/responses/BadRequest等)
当你运行mcpgen --input your_openapi.yaml --output generated-server(可选加上--includes=httpclient,types),mcpgen分析这个操作(operationId: listTodos)并生成Go代码。这包括:
输入的JSON模式: 包含listTodos工具所需和可选参数的JSON模式的常量字符串:
// ListTodos工具的输入模式
const listTodosInputSchema = `{
"properties": {
"limit": {
"default": 20,
"description": "返回的最大待办事项数",
"format": "int32",
"minimum": 1,
"type": "integer"
},
"offset": {
"default": 0,
"description": "为分页跳过的待办事项数",
"format": "int32",
"minimum": 0,
"type": "integer"
},
"status": {
"description": "按状态过滤待办事项(例如:\"pending\",\"completed\")",
"enum": [
"pending",
"completed",
"in-progress"
],
"type": "string"
},
"token": {
"default": 20,
"description": "认证令牌",
"format": "int32",
"minimum": 1,
"type": "integer"
}
},
"type": "object"
}`
响应的Markdown模板: 包含每个潜在响应的详细markdown提示的常量字符串(基于状态码和内容类型),描述数据的结构和意义。这对于LLMs理解工具的输出至关重要:
// ListTodos工具的响应模板(状态:200,内容类型:application/json)
const ListTodosResponseTemplate_A = `# API响应信息
...(详细markdown描述200响应结构,包括Todo和NewTodo模式的oneOf组合)...
`
// ListTodos工具的响应模板(状态:400,内容类型:application/json)
const ListTodosResponseTemplate_B = `# API响应信息
...(详细markdown描述400错误响应结构)...
`
// ListTodos工具的响应模板(状态:500,内容类型:application/json)
const ListTodosResponseTemplate_C = `# API响应信息
...(详细markdown描述500错误响应结构)...
`
注意:完整的markdown模板内容非常详尽,并基于OpenAPI响应模式生成。
MCP工具注册: 创建和配置mcp.Tool实例的函数,嵌入操作描述和生成的输入模式:
// NewListTodosMCPTool创建ListTodos的MCP工具实例
func NewListTodosMCPTool() mcp.Tool {
return mcp.NewToolWithRawSchema(
"ListTodos", // 操作ID成为工具名称
"列出所有待办事项 - 获取待办事项列表,可选地按状态过滤。", // 摘要+描述
[]byte(listTodosInputSchema), // 嵌入的输入模式
)
}
处理器函数骨架: 一个占位函数,你将在其中编写处理工具调用的代码。此函数接收mcp.CallToolRequest(包含作为JSON的输入负载),在这里你将与实际的后端API集成:
// ListTodosHandler是ListTodos工具的处理器函数。
// 此函数自动生成。用户应在函数体内实现实际逻辑以与后端API集成。
// 你可以生成类型、HTTP客户端和辅助函数来解析请求参数,以简化实现。
func ListTodosHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
// 重要:用你的实际逻辑替换以下占位实现。
// 使用'request'参数访问工具调用参数。
// 根据需要进行HTTP调用或与服务交互。
// 返回带有响应负载的*mcp.CallToolResult,或错误。
// 示例占位实现:
// 从请求中提取参数并解析它们。
// 调用你的后端API或使用'params'执行必要的操作。
// 根据情况处理响应和错误。
return nil, fmt.Errorf("ListTodos处理器未实现") // 直到你添加你的逻辑为止的占位符
}
通过生成所有这些结构化的样板代码,mcpgen允许你专注于在生成的处理器函数内实现核心集成逻辑——解析输入负载(可能由生成的类型简化)、调用现有的后端API(可能由生成的客户端简化),并将后端响应映射到预期的MCP CallToolResult格式。
本项目采用MIT许可证。