关于 grpcmcp
grpcmcp 是一个 MCP 服务,可根据 protobuf 描述文件或 gRPC 反射将请求代理到 gRPC 后端。适合希望让 AI 助手调用现有 gRPC 服务的开发者。
主要功能
- 01将一元 gRPC 方法暴露为 MCP 工具
- 02支持描述文件或 gRPC 反射两种方式
- 03支持 Streamable HTTP、SSE 与 STDIN 传输
- 04可按完全限定服务名过滤
- 05支持 Bearer 令牌与自定义请求头
- 06可将 64 位整数字段以字符串形式输出
适用场景
- 01让 AI 助手调用内部 gRPC 微服务
- 02在开发环境中测试 gRPC 接口
- 03将 gRPC 服务嵌入 Go 应用作为 MCP 处理器
MCP 相关
grpcmcp 是 MCP 服务,将后端 gRPC 的一元方法以 MCP 工具形式提供给 MCP 客户端。客户端流、服务端流和双向流方法会被跳过。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
grpcmcp
一个简单的 MCP 服务,可根据提供的描述符文件或使用反射,将请求代理到 gRPC 后端。
快速开始
-
安装二进制文件:
go install .或go install github.com/adiom-data/grpcmcp。确保 Go 二进制文件目录已添加到 PATH 中。 -
在终端中运行示例 gRPC 服务
go run example/main.go。这会在端口 8090 上启动一个启用了服务反射的 gRPC 健康检查服务。请注意,该服务使用 grpcmcp 默认连接的端口。 -
Streamable HTTP 传输 在另一个终端中运行
grpcmcp --hostport=localhost:3000 --reflect。指定hostport后,默认会使用 Streamable HTTP。MCP 端点将在http://localhost:3000/mcp提供服务。 -
旧版 SSE 传输 对于较旧的客户端,请运行
grpcmcp --hostport=localhost:3000 --transport=sse --reflect。SSE 端点将在http://localhost:3000/sse提供服务。 -
STDIN 传输 设置 MCP 配置,例如:
"grpcmcp": {
"command": "grpcmcp",
"args": ["--reflect"]
}
选项 / 功能
运行 grpcmcp --help 查看完整的选项列表。
-
hostport字符串 — 设置后,通过 HTTP 提供 MCP 服务,并将其用作服务端的主机:端口。 -
transport字符串 — 设置hostport时使用的传输方式。默认使用http,通过/mcp提供 Streamable HTTP。设置为sse可使用旧版 SSE 传输,通过/sse提供服务。 -
descriptors字符串 — 指定由buf build -o protos.pb或protoc --descriptor_set_out=protos.pb生成的 protobuf 定义文件的位置,以替代 gRPC 反射。 -
reflect— 设置后,使用反射获取 gRPC 端点,而不是使用描述符文件。 -
url字符串 — 指定后端服务的 URL。 -
services字符串 — 以逗号分隔的完整限定 gRPC 服务名称列表,用于筛选。 -
bearer字符串 — 要添加到Authorization: Bearer标头中的令牌。 -
bearer-env字符串 — 用于获取要添加到Authorization: Bearer标头中的令牌的环境变量。优先级高于bearer。 -
header字符串(可重复)— 要添加的标头,格式为Key: Value。 -
string64— 设置后,仅在 MCP JSON 架构中将 64 位 protobuf 整数字段(int64、uint64、sint64、fixed64、sfixed64)作为字符串公开。这样可避免基于 JavaScript 的客户端和 Agent 遇到精度歧义。默认情况下,为保持兼容性,架构仍允许使用 JSON 数字或字符串。
grpcmcp 当前会将一元 gRPC 方法公开为 MCP 工具。后端 gRPC 客户端流式、服务端流式和双向流式方法会被跳过。这与 MCP 传输方式无关:支持客户端通过 Streamable HTTP 和旧版 SSE 连接到 grpcmcp。
库用法
grpcmcp 也可作为 Go 库嵌入使用。该库直接接受描述符集,因此应用程序可以自行决定如何加载描述符,以及如何封装 MCP HTTP 处理器。
descriptors, err := grpcmcp.LoadDescriptorsFromReflection(ctx, backendURL, headers, false)
if err != nil {
return err
}
srv, err := grpcmcp.NewServer(grpcmcp.Config{
ServerName: "gRPC MCP Server",
Version: "1.0.0",
BaseURL: backendURL,
Descriptors: descriptors,
Headers: grpcmcp.StaticHeaders(headers),
})
if err != nil {
return err
}
handler := server.NewStreamableHTTPServer(srv)
要通过自定义传输路由后端调用,请提供 HTTPClient。例如,嵌入式应用程序可以使用内存 HTTP 传输,例如 go.akshayshah.org/memhttp,方法是传入内存服务器的 URL 和客户端:
backend, err := memhttp.New(backendHandler)
if err != nil {
return err
}
defer backend.Close()
srv, err := grpcmcp.NewServer(grpcmcp.Config{
BaseURL: backend.URL(),
HTTPClient: backend.Client(),
Descriptors: descriptors,
})
要使用动态后端身份验证,请提供 ToolHeaderProvider。其中可以获取完整的 mcp.CallToolRequest,包括受支持的 MCP 传输方式提供的入站 HTTP 标头。
srv, err := grpcmcp.NewServer(grpcmcp.Config{
BaseURL: backendURL,
Descriptors: descriptors,
Headers: func(ctx context.Context, req mcp.CallToolRequest) (http.Header, error) {
h := make(http.Header)
h.Set("Authorization", req.Header.Get("Authorization"))
return h, nil
},
})
入站 MCP 身份验证应通过使用标准 Go 中间件封装 HTTP 处理器来处理。出站后端身份验证由配置的标头提供器控制。
帮助
加入我们的 Discord:https://discord.gg/hDjx3DehwG
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。