mcp-golang

mcp-golang

用几行Go代码编写Model Context Protocol服务器。

Statusphere logo

GitHub stars GoDoc Go Report Card

简介

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": {}
    }
  }
}

更多资源