New builds an MCP server that exposes every gRPC method on `grpcSrv` whose proto annotation has `(authorizer.v1.mcp_tool).exposed = true`. The gRPC server is served over an in-process bufconn — same pattern as the REST gateway — so MCP tool invocations become local method calls with no extra network
(log *zerolog.Logger, grpcSrv *grpc.Server, opts Options)
| 81 | // the REST gateway — so MCP tool invocations become local method calls with |
| 82 | // no extra network hop. |
| 83 | func New(log *zerolog.Logger, grpcSrv *grpc.Server, opts Options) (*Server, error) { |
| 84 | bindings, err := Scan(grpcSrv) |
| 85 | if err != nil { |
| 86 | return nil, fmt.Errorf("mcp: scan tools: %w", err) |
| 87 | } |
| 88 | log.Info(). |
| 89 | Int("tools", len(bindings)). |
| 90 | Bool("authenticated", opts.Bearer != ""). |
| 91 | Msg("MCP: discovered tools from proto annotations") |
| 92 | |
| 93 | // Same bufconn dance as the REST gateway. |
| 94 | lis := bufconn.Listen(bufSize) |
| 95 | go func() { _ = grpcSrv.Serve(lis) }() |
| 96 | conn, err := grpc.NewClient( |
| 97 | "passthrough:///bufconn", |
| 98 | grpc.WithContextDialer(func(_ context.Context, _ string) (net.Conn, error) { return lis.Dial() }), |
| 99 | grpc.WithTransportCredentials(insecure.NewCredentials()), |
| 100 | ) |
| 101 | if err != nil { |
| 102 | _ = lis.Close() |
| 103 | return nil, fmt.Errorf("mcp: dial in-process grpc: %w", err) |
| 104 | } |
| 105 | |
| 106 | mcpSrv := mcp.NewServer(&mcp.Implementation{ |
| 107 | Name: opts.Name, |
| 108 | Version: opts.Version, |
| 109 | }, nil) |
| 110 | |
| 111 | s := &Server{ |
| 112 | log: log, |
| 113 | mcpSrv: mcpSrv, |
| 114 | gwConn: conn, |
| 115 | lis: lis, |
| 116 | grpcSrv: grpcSrv, |
| 117 | bearer: opts.Bearer, |
| 118 | authorizerURL: opts.AuthorizerURL, |
| 119 | } |
| 120 | for _, b := range bindings { |
| 121 | s.registerTool(b) |
| 122 | } |
| 123 | return s, nil |
| 124 | } |
| 125 | |
| 126 | // MCPServer exposes the underlying *mcp.Server. Used by tests to drive the |
| 127 | // server with an in-memory transport pair. |
no test coverage detected