关于 mcp-golang
mcp-golang 是一个非官方的 Go 语言 Model Context Protocol 实现,用于用少量代码编写 MCP 服务和客户端。工具参数可直接定义为 Go 结构体,库会自动生成 schema 并处理反序列化与错误。
主要功能
- 01Go 结构体作为工具参数
- 02自动生成 schema 与反序列化
- 03内置 stdio 与 HTTP 传输
- 04可自定义传输层
- 05支持工具、提示词和资源
- 06提供客户端调用能力
适用场景
- 01用 Go 编写 MCP 工具服务
- 02构建可调用 MCP 服务的 Go 客户端
- 03为 Claude Desktop 提供本地 Go 服务
MCP 相关
该项目是 MCP 的 Go 实现,可作为服务端向 MCP 客户端暴露工具、提示词和资源,也可作为客户端调用 MCP 服务。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
mcp-golang
mcp-golang 是用 Go 实现的非官方 Model Context Protocol。
只需几行代码,即可使用 Go 编写 MCP 服务和客户端。
亮点
- 🛡️类型安全 - 将工具参数定义为原生 Go 结构体,其余工作交给 mcp-golang 处理。自动生成架构、反序列化、错误处理等。
- 🚛 自定义传输 - 使用内置传输方式(stdio,支持完整功能;HTTP,用于无状态通信),也可以自行编写。
- ⚡ 减少样板代码 - mcp-golang 会为你生成所有 MCP 端点,工具、提示词和资源除外。
- 🧩 模块化 - 该库分为三个组件:传输、协议和服务端/客户端。可以全部使用,也可以按需选用。
- 🔄 双向通信 - 通过 stdio 传输方式,全面支持服务端和客户端实现。
使用示例
使用 go get github.com/metoro-io/mcp-golang 安装
服务端示例
package main
import (
"fmt"
"github.com/metoro-io/mcp-golang"
"github.com/metoro-io/mcp-golang/transport/stdio"
)
// Tool arguments are just structs, annotated with jsonschema tags
// More at https://mcpgolang.com/tools#schema-generation
type Content struct {
Title string `json:"title" jsonschema:"required,description=The title to submit"`
Description *string `json:"description" jsonschema:"description=The description to submit"`
}
type MyFunctionsArguments struct {
Submitter string `json:"submitter" jsonschema:"required,description=The name of the thing calling this tool (openai, google, claude, etc)"`
Content Content `json:"content" jsonschema:"required,description=The content of the message"`
}
func main() {
done := make(chan struct{})
server := mcp_golang.NewServer(stdio.NewStdioServerTransport())
err := server.RegisterTool("hello", "Say hello to a person", func(arguments MyFunctionsArguments) (*mcp_golang.ToolResponse, error) {
return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Submitter))), nil
})
if err != nil {
panic(err)
}
err = server.RegisterPrompt("promt_test", "This is a test prompt", func(arguments Content) (*mcp_golang.PromptResponse, error) {
return mcp_golang.NewPromptResponse("description", mcp_golang.NewPromptMessage(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Title)), mcp_golang.RoleUser)), nil
})
if err != nil {
panic(err)
}
err = server.RegisterResource("test://resource", "resource_test", "This is a test resource", "application/json", func() (*mcp_golang.ResourceResponse, error) {
return mcp_golang.NewResourceResponse(mcp_golang.NewTextEmbeddedResource("test://resource", "This is a test resource", "application/json")), nil
})
err = server.Serve()
if err != nil {
panic(err)
}
<-done
}
HTTP 服务端示例
你也可以使用标准 HTTP 传输方式或 Gin 框架创建基于 HTTP 的服务端:
// Standard HTTP
transport := http.NewHTTPTransport("/mcp")
transport.WithAddr(":8080")
server := mcp_golang.NewServer(transport)
// Or with Gin framework
transport := http.NewGinTransport()
router := gin.Default()
router.POST("/mcp", transport.Handler())
server := mcp_golang.NewServer(transport)
注意:HTTP 传输是无状态的,不支持通知等双向功能。如果需要这些功能,请使用 stdio 传输方式。
客户端示例
更完整的示例请查看 examples/client 目录。
package main
import (
"context"
"log"
mcp "github.com/metoro-io/mcp-golang"
"github.com/metoro-io/mcp-golang/transport/stdio"
)
// Define type-safe arguments
type CalculateArgs struct {
Operation string `json:"operation"`
A int `json:"a"`
B int `json:"b"`
}
func main() {
cmd := exec.Command("go", "run", "./server/main.go")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatalf("Failed to get stdin pipe: %v", err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatalf("Failed to get stdout pipe: %v", err)
}
if err := cmd.Start(); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
defer cmd.Process.Kill()
// Create and initialize client
transport := stdio.NewStdioServerTransportWithIO(stdout, stdin)
client := mcp.NewClient(transport)
if _, err := client.Initialize(context.Background()); err != nil {
log.Fatalf("Failed to initialize: %v", err)
}
// Call a tool with typed arguments
args := CalculateArgs{
Operation: "add",
A: 10,
B: 5,
}
response, err := client.CallTool(context.Background(), "calculate", args)
if err != nil {
log.Fatalf("Failed to call tool: %v", err)
}
if response != nil && len(response.Content) > 0 {
log.Printf("Result: %s", response.Content[0].TextContent.Text)
}
}
搭配 Claude Desktop 使用
在 ~/Library/Application Support/Claude/claude_desktop_config.json 中创建文件,并写入以下内容:
{
"mcpServers": {
"golang-mcp-server": {
"command": "<your path to golang MCP server go executable>",
"args": [],
"env": {}
}
}
}
贡献
非常欢迎你参与贡献!请查看贡献指南。
Discord
对 API 或用法有建议或疑问?欢迎在 discord server 提问。 维护者很乐意为你提供帮助。
示例
这里还有一些使用该库的扩展示例:
Metoro - 查询并与 Metoro 监控的 kubernetes 环境交互
提交 PR,添加你自己的项目!
服务端功能实现
工具
- 工具调用
- 使用原生 Go 结构体作为参数
- 以编程方式生成工具列表端点
- 变更通知
- 分页
提示词
- 提示词调用
- 以编程方式生成提示词列表端点
- 变更通知
- 分页
资源
- 资源调用
- 以编程方式生成资源列表端点
- 变更通知
- 分页
传输方式
- Stdio - 全面支持所有功能,包括双向通信
- HTTP - 适用于简单请求-响应场景的无状态传输(不支持通知)
- Gin - 与 Gin 框架集成的 HTTP 传输(无状态,不支持通知)
- SSE
- 支持自定义传输方式
- 支持自定义身份验证的 HTTPS - 正在进行中。目前尚未纳入规范,但我们将添加实验性支持。
客户端
- 调用工具
- 调用提示词
- 调用资源
- 列出工具
- 列出提示词
- 列出资源
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。