MCPcopy Create free account
hub / github.com/authorizerdev/authorizer / New

Function New

internal/mcp/server.go:83–124  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

81// the REST gateway — so MCP tool invocations become local method calls with
82// no extra network hop.
83func 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.

Callers 1

runMCPFunction · 0.92

Calls 3

registerToolMethod · 0.95
ScanFunction · 0.85
CloseMethod · 0.65

Tested by

no test coverage detected