gRPC代理服务器

一个简单的MCP服务器,可根据提供的描述符文件或使用反射代理到gRPC后端。

  • by adiom-data
  • Go
  • 混合部署
  • 29 星标
  • 更新于
在 GitHub 查看 adiom-data/grpcmcp

使用说明

grpcmcp

一个简单的MCP服务器,它将根据提供的描述符文件或使用反射代理到grpc后端。

快速开始

  1. 安装二进制文件: go install . 或 go install github.com/adiom-data/grpcmcp 确保go-bin目录在您的PATH中。

  2. 在终端中,运行示例grpc服务器 go run example/main.go。这将在启用服务器反射的情况下在端口8090上启动grpc健康服务。请注意,这将在grpcmcp将连接到的默认端口上运行。

  3. 可流式HTTP传输 在另一个终端中,运行 grpcmcp --hostport=localhost:3000 --reflect.指定 hostport 默认情况下将使用Streamable HTTP。MCP端点将在 http://localhost:3000/mcp.

  4. 传统苏格兰和南方能源公司运输 对于老客户,运行 grpcmcp --hostport=localhost:3000 --transport=sse --reflectSSE端点将在 http://localhost:3000/sse.

  5. STDIN运输 设置MCP配置。例如

"grpcmcp": {
    "command": "grpcmcp",
    "args": ["--reflect"]
}

选项/功能

grpcmcp --help 查看完整的选项列表。

  • hostport string-设置后,通过HTTP为MCP提供服务,并将其用作服务器主机端口。

  • transport string-传输时使用 hostport 已设置。默认为 http 对于流式HTTP,请访问 /mcp。设置为 sse 对于传统的SSE传输 /sse.

  • descriptors string-指定从生成的protobuf定义的文件位置 buf build -o protos.pb 或 protoc --descriptor_set_out=protos.pb 而不是使用gRPC反射。

  • reflect -如果已设置,请使用反射来检索gRPC端点,而不是描述符文件。

  • url string-指定后端服务器的url。

  • services string-以逗号分隔的要筛选的完全限定的gRPC服务名称列表。

  • bearer string-要附加的令牌 Authorization: Bearer 头球

  • bearer-env string-用于附加令牌的环境变量 Authorization: Bearer 头球覆盖 bearer.

  • header string(可重复)-要添加的标头 Key: Value 格式。

  • string64 -如果设置,则暴露64位protobuf整数字段(int64, uint64, sint64, fixed64, sfixed64)仅在MCP JSON模式中作为字符串。这避免了基于JavaScript的客户端和代理的精度模糊。默认情况下,模式继续允许JSON数字或字符串兼容。

grpcmcp目前将一元gRPC方法作为MCP工具公开。跳过后端gRPC客户端流、服务器流和双向流方法。这与MCP传输是分开的:与grpcmcp的客户端连接支持流式HTTP和传统SSE。

图书馆使用情况

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处理程序来处理。出站后端身份验证由配置的标头提供程序控制。

帮助

加入我们的Discordhttps://discord.gg/hDjx3DehwG