mcp-golang
用几行Go代码编写Model Context Protocol服务器。
简介
mcp-golang 是 Model Context Protocol 的 Go 语言实现,让您能够轻松创建 MCP 服务端和客户端。
主要特性
- 🛡️ 类型安全 - 使用 Go 结构体定义工具参数
- 🚛 自定义传输 - 支持 stdio、HTTP 等多种传输方式
- ⚡ 低样板代码 - 自动生成 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"
)
// 定义工具参数结构体
type Content struct {
Title string `json:"title" jsonschema:"required,description=要提交的标题"`
Description *string `json:"description" jsonschema:"description=要提交的描述"`
}
type MyFunctionsArguments struct {
Submitter string `json:"submitter" jsonschema:"required,description=调用此工具的名称"`
Content Content `json:"content" jsonschema:"required,description=消息的内容"`
}
func main() {
// 创建服务器
server := mcp_golang.NewServer(stdio.NewStdioServerTransport())
// 注册工具
err := server.RegisterTool("hello", "向某人问好", func(arguments MyFunctionsArguments) (*mcp_golang.ToolResponse, error) {
return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %s!", arguments.Submitter))), nil
})
if err != nil {
panic(err)
}
// 注册提示
err = server.RegisterPrompt("prompt_test", "这是一个测试提示", func(arguments Content) (*mcp_golang.PromptResponse, error) {
return mcp_golang.NewPromptResponse("description", mcp_golang.NewPromptMessage(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %s!", arguments.Title)), mcp_golang.RoleUser)), nil
})
if err != nil {
panic(err)
}
// 启动服务
if err := server.Serve(); err != nil {
panic(err)
}
}
HTTP 服务端
// 标准 HTTP
transport := http.NewHTTPTransport("/mcp")
transport.WithAddr(":8080")
server := mcp_golang.NewServer(transport)
// 使用 Gin 框架
transport := http.NewGinTransport()
router := gin.Default()
router.POST("/mcp", transport.Handler())
server := mcp_golang.NewServer(transport)
创建客户端
package main
import (
"context"
"log"
"os/exec"
mcp "github.com/metoro-io/mcp-golang"
"github.com/metoro-io/mcp-golang/transport/stdio"
)
// 定义参数结构体
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, _ := cmd.StdinPipe()
stdout, _ := cmd.StdoutPipe()
cmd.Start()
defer cmd.Process.Kill()
// 创建客户端
transport := stdio.NewStdioServerTransportWithIO(stdout, stdin)
client := mcp.NewClient(transport)
// 初始化
if _, err := client.Initialize(context.Background()); err != nil {
log.Fatalf("初始化失败: %v", err)
}
// 调用工具
args := CalculateArgs{
Operation: "add",
A: 10,
B: 5,
}
response, err := client.CallTool(context.Background(), "calculate", args)
if err != nil {
log.Fatalf("工具调用失败: %v", err)
}
if response != nil && len(response.Content) > 0 {
log.Printf("结果: %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": {}
}
}
}
更多资源
- 完整文档: https://mcpgolang.com
- GitHub 仓库: https://github.com/metoro-io/mcp-golang
- Discord: https://discord.gg/33saRwE3pT