3 分钟把你的 Gin API 接入 Claude Desktop —— GoMCP 框架实战
背景
MCP(Model Context Protocol)是 Anthropic 发布的开放协议,让 AI 应用(Claude Desktop、Cursor、Kiro)能调用你的服务。简单说,就是给 AI 装上”手”,让它能操作你的系统。
问题是:Go 生态里现有的 MCP 库(mcp-go、官方 go-sdk)都是 SDK 级别的,写一个 Tool 要 30 行样板代码,手动定义 JSON Schema,接入现有项目更是要重写一遍接口层。
所以我们做了 GoMCP —— 一个类似 Gin 风格的 MCP Server 框架。
GitHub: github.com/zhangpanda/gomcp
它能做什么
一句话:让 Go 开发者用最少的代码构建 MCP Server,并能一行代码把现有 Gin/OpenAPI/gRPC 服务接入 AI。
快速体验
场景一:5 行代码写一个 MCP Tool
package main
import (
"fmt"
"github.com/zhangpanda/gomcp"
)
type SearchInput struct {
Query string `json:"query" mcp:"required,desc=搜索关键词"`
Limit int `json:"limit" mcp:"default=10,min=1,max=100"`
}
type SearchResult struct {
Items []string `json:"items"`
Total int `json:"total"`
}
func main() {
s := gomcp.New("my-server", "1.0.0")
s.ToolFunc("search", "搜索文档", func(ctx *gomcp.Context, in SearchInput) (SearchResult, error) {
items := []string{fmt.Sprintf("搜索 %q 的结果", in.Query)}
return SearchResult{Items: items, Total: len(items)}, nil
})
s.Stdio()
}
SearchInput 的 struct tag 会自动生成 JSON Schema:
{
"type": "object",
"properties": {
"query": { "type": "string", "description": "搜索关键词" },
"limit": { "type": "integer", "default": 10, "minimum": 1, "maximum": 100 }
},
"required": ["query"]
}
参数校验也是自动的。客户端传了 {"limit": 200} 但没传 query,直接返回:
validation failed: query: required; limit: must be <= 100
不需要手动写 mcp.WithString("name", mcp.Required(), mcp.Description(...)) 这种冗长的代码。
场景二:一行代码把 Gin API 接入 MCP(核心卖点)
这是最实用的场景。你已经有一个 Gin 项目,100 个接口,老板说”让 AI 能调这些接口”。
以前:重写一遍接口层,至少一周。
现在:
ginRouter := setupYourExistingGinApp() // 你已有的 Gin 应用
s := gomcp.New("my-api", "1.0.0")
adapter.ImportGin(s, ginRouter, adapter.ImportOptions{
IncludePaths: []string{"/api/v1/"},
})
s.Stdio()
就这样。 自动转换规则:
| Gin 路由 | MCP Tool |
|---|---|
GET /api/v1/users |
get_api_v1_users |
GET /api/v1/users/:id |
get_api_v1_users_by_id(id = 必填参数) |
POST /api/v1/users |
post_api_v1_users(body = JSON 参数) |
DELETE /api/v1/users/:id |
delete_api_v1_users_by_id |
你原有的 Gin 中间件(认证、日志)照常执行。
场景三:从 Swagger 文档生成 MCP Server
有 OpenAPI 文档?更简单:
s := gomcp.New("petstore", "1.0.0")
adapter.ImportOpenAPI(s, "./swagger.yaml", adapter.OpenAPIOptions{
TagFilter: []string{"pets"},
ServerURL: "https://api.example.com",
})
s.Stdio()
和现有方案对比
| mcp-go (8.6k star) | 官方 Go SDK (4.4k star) | GoMCP | |
|---|---|---|---|
| 定位 | SDK | SDK | 框架 |
| Schema 生成 | 手动 | jsonschema tag | mcp tag + 自动校验 |
| 中间件 | 基础钩子 | 无 | Logger、Auth、限流、OTel |
| 工具分组 | 无 | 无 | 支持 |
| 导入 Gin 路由 | 无 | 无 | 一行代码 |
| 导入 OpenAPI | 无 | 无 | 一行代码 |
| 导入 gRPC | 无 | 无 | 支持 |
| 内置认证 | 无 | 无 | Bearer / API Key / Basic + RBAC |
完整功能列表
框架能力:
struct tag 自动 JSON Schema 生成 + 参数校验
中间件链:Logger、Recovery、RequestID、Timeout、RateLimit、OpenTelemetry
认证中间件:BearerAuth、APIKeyAuth、BasicAuth + 角色/权限授权
工具分组(类似 Gin 的 RouterGroup)
组件版本化 + 废弃标记
异步任务(长时间运行的工具)
适配器:
Gin 适配器 —— 现有 Gin 路由一键转 MCP 工具
OpenAPI 适配器 —— 从 Swagger 文档自动生成
gRPC 适配器
生产就绪:
stdio + Streamable HTTP 双传输层
MCP Inspector 内置调试界面
YAML 热加载 Provider
mcptest 测试包 + 快照测试
中间件示例
s := gomcp.New("platform", "1.0.0")
// 全局中间件
s.Use(gomcp.Logger())
s.Use(gomcp.Recovery())
s.Use(gomcp.RateLimit(100))
s.Use(gomcp.OpenTelemetry())
// 分组 + 认证
user := s.Group("user", gomcp.BearerAuth(jwtValidator))
user.Tool("get", "获取用户", getUser) // → user.get
user.Tool("update", "更新用户", updateUser) // → user.update
// 管理员分组
admin := user.Group("admin", gomcp.RequireRole("admin"))
admin.Tool("delete", "删除用户", deleteUser) // → user.admin.delete
配合 Claude Desktop 使用
编译后配置 claude_desktop_config.json:
{
"mcpServers": {
"my-server": {
"command": "/path/to/your/binary"
}
}
}
重启 Claude Desktop,就能在对话中调用你的工具了。
安装
go get github.com/zhangpanda/gomcp
需要 Go 1.25+。
链接
GitHub: github.com/zhangpanda/gomcp
Gitee: gitee.com/rilegouasas/gomcp
MCP 协议: modelcontextprotocol.io
Apache 2.0 开源,欢迎 Star ⭐
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: