Go 开发者必看:一行代码让 AI 调用你的 Gin API

0 阅读3分钟

背景

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/…

它能做什么

一句话:让 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/usersget_api_v1_users
GET /api/v1/users/:idget_api_v1_users_by_id(id = 必填参数)
POST /api/v1/userspost_api_v1_users(body = JSON 参数)
DELETE /api/v1/users/:iddelete_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
定位SDKSDK框架
Schema 生成手动jsonschema tagmcp 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+。

链接

Apache 2.0 开源,欢迎 Star ⭐