mcpField
M
mcp-golang

mcp-golang

本地服务
mcpgolang.com开发工具1.2k60 周前更新

关于 mcp-golang

mcp-golang 是一个非官方的 Go 语言 Model Context Protocol 实现,用于用少量代码编写 MCP 服务和客户端。工具参数可直接定义为 Go 结构体,库会自动生成 schema 并处理反序列化与错误。

主要功能

  1. 01Go 结构体作为工具参数
  2. 02自动生成 schema 与反序列化
  3. 03内置 stdio 与 HTTP 传输
  4. 04可自定义传输层
  5. 05支持工具、提示词和资源
  6. 06提供客户端调用能力

适用场景

  1. 01用 Go 编写 MCP 工具服务
  2. 02构建可调用 MCP 服务的 Go 客户端
  3. 03为 Claude Desktop 提供本地 Go 服务

MCP 相关

该项目是 MCP 的 Go 实现,可作为服务端向 MCP 客户端暴露工具、提示词和资源,也可作为客户端调用 MCP 服务。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Statusphere 徽标

GitHub stars GitHub forks GitHub issues GitHub pull requests GitHub license GitHub contributors GitHub last commit GoDoc Go Report Card Tests

mcp-golang

mcp-golang 是用 Go 实现的非官方 Model Context Protocol。

只需几行代码,即可使用 Go 编写 MCP 服务和客户端。

文档见 https://mcpgolang.com

亮点

  • 🛡️类型安全 - 将工具参数定义为原生 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 提问。 维护者很乐意为你提供帮助。

示例

这里还有一些使用该库的扩展示例:

  • README 配图 Metoro - 查询并与 Metoro 监控的 kubernetes 环境交互

提交 PR,添加你自己的项目!

服务端功能实现

工具
  • 工具调用
  • 使用原生 Go 结构体作为参数
  • 以编程方式生成工具列表端点
  • 变更通知
  • 分页
提示词
  • 提示词调用
  • 以编程方式生成提示词列表端点
  • 变更通知
  • 分页
资源
  • 资源调用
  • 以编程方式生成资源列表端点
  • 变更通知
  • 分页
传输方式
  • Stdio - 全面支持所有功能,包括双向通信
  • HTTP - 适用于简单请求-响应场景的无状态传输(不支持通知)
  • Gin - 与 Gin 框架集成的 HTTP 传输(无状态,不支持通知)
  • SSE
  • 支持自定义传输方式
  • 支持自定义身份验证的 HTTPS - 正在进行中。目前尚未纳入规范,但我们将添加实验性支持。
客户端
  • 调用工具
  • 调用提示词
  • 调用资源
  • 列出工具
  • 列出提示词
  • 列出资源

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。