@@ -65,6 +65,7 @@ import (
6565 "connectrpc.com/connect"
6666 grpc "google.golang.org/grpc"
6767 "github.com/redpanda-data/protoc-gen-go-mcp/pkg/runtime"
68+ "net/url"
6869)
6970
7071
@@ -88,13 +89,35 @@ type {{$serviceName}}Server interface {
8889
8990{{- range $key, $val := .Services }}
9091// Register{{$key}}Handler registers standard MCP handlers for {{$key}}
91- func Register{{$key}}Handler(s *mcpserver.MCPServer, srv {{$key}}Server) {
92+ func Register{{$key}}Handler(s *mcpserver.MCPServer, srv {{$key}}Server, opts ...runtime.Option) {
93+ config := runtime.NewConfig()
94+ for _, opt := range opts {
95+ opt(config)
96+ }
97+
9298 {{- range $tool_name, $tool_val := $val }}
93- s.AddTool({{$key}}_{{$tool_name}}Tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
99+ {{$tool_name}}Tool := {{$key}}_{{$tool_name}}Tool
100+ // Add URL field to schema if ExtractURL is enabled
101+ if config.ExtractURL {
102+ {{$tool_name}}Tool = runtime.AddURLFieldToTool({{$tool_name}}Tool, config.URLFieldName, config.URLDescription)
103+ }
104+
105+ s.AddTool({{$tool_name}}Tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
94106 var req {{$tool_val.RequestType}}
95107
96108 message := request.Params.Arguments
97109
110+ // Extract URL if option is enabled
111+ if config.ExtractURL {
112+ if urlVal, ok := message[config.URLFieldName]; ok {
113+ if urlStr, ok := urlVal.(string); ok {
114+ if parsedURL, err := url.Parse(urlStr); err == nil {
115+ ctx = context.WithValue(ctx, runtime.URLOverrideKey{}, parsedURL)
116+ }
117+ }
118+ }
119+ }
120+
98121 marshaled, err := json.Marshal(message)
99122 if err != nil {
100123 return nil, err
@@ -120,12 +143,35 @@ func Register{{$key}}Handler(s *mcpserver.MCPServer, srv {{$key}}Server) {
120143}
121144
122145// Register{{$key}}HandlerOpenAI registers OpenAI-compatible MCP handlers for {{$key}}
123- func Register{{$key}}HandlerOpenAI(s *mcpserver.MCPServer, srv {{$key}}Server) {
146+ func Register{{$key}}HandlerOpenAI(s *mcpserver.MCPServer, srv {{$key}}Server, opts ...runtime.Option) {
147+ config := runtime.NewConfig()
148+ for _, opt := range opts {
149+ opt(config)
150+ }
151+
124152 {{- range $tool_name, $tool_val := $val }}
125- s.AddTool({{$key}}_{{$tool_name}}ToolOpenAI, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
153+ {{$tool_name}}ToolOpenAI := {{$key}}_{{$tool_name}}ToolOpenAI
154+ // Add URL field to schema if ExtractURL is enabled
155+ if config.ExtractURL {
156+ {{$tool_name}}ToolOpenAI = runtime.AddURLFieldToTool({{$tool_name}}ToolOpenAI, config.URLFieldName, config.URLDescription)
157+ }
158+
159+ s.AddTool({{$tool_name}}ToolOpenAI, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
126160 var req {{$tool_val.RequestType}}
127161
128162 message := request.Params.Arguments
163+
164+ // Extract URL if option is enabled
165+ if config.ExtractURL {
166+ if urlVal, ok := message[config.URLFieldName]; ok {
167+ if urlStr, ok := urlVal.(string); ok {
168+ if parsedURL, err := url.Parse(urlStr); err == nil {
169+ ctx = context.WithValue(ctx, runtime.URLOverrideKey{}, parsedURL)
170+ }
171+ }
172+ }
173+ }
174+
129175 runtime.FixOpenAI(req.ProtoReflect().Descriptor(), message)
130176
131177 marshaled, err := json.Marshal(message)
@@ -153,14 +199,14 @@ func Register{{$key}}HandlerOpenAI(s *mcpserver.MCPServer, srv {{$key}}Server) {
153199}
154200
155201// Register{{$key}}HandlerWithProvider registers handlers for the specified LLM provider
156- func Register{{$key}}HandlerWithProvider(s *mcpserver.MCPServer, srv {{$key}}Server, provider runtime.LLMProvider) {
202+ func Register{{$key}}HandlerWithProvider(s *mcpserver.MCPServer, srv {{$key}}Server, provider runtime.LLMProvider, opts ...runtime.Option ) {
157203 switch provider {
158204 case runtime.LLMProviderOpenAI:
159- Register{{$key}}HandlerOpenAI(s, srv)
205+ Register{{$key}}HandlerOpenAI(s, srv, opts... )
160206 case runtime.LLMProviderStandard:
161207 fallthrough
162208 default:
163- Register{{$key}}Handler(s, srv)
209+ Register{{$key}}Handler(s, srv, opts... )
164210 }
165211}
166212{{- end }}
@@ -186,13 +232,35 @@ type Connect{{$serviceName}}Client interface {
186232
187233{{- range $key, $val := .Services }}
188234// ForwardToConnect{{$key}}Client registers a connectrpc client, to forward MCP calls to it.
189- func ForwardToConnect{{$key}}Client(s *mcpserver.MCPServer, client Connect{{$key}}Client) {
235+ func ForwardToConnect{{$key}}Client(s *mcpserver.MCPServer, client Connect{{$key}}Client, opts ...runtime.Option) {
236+ config := runtime.NewConfig()
237+ for _, opt := range opts {
238+ opt(config)
239+ }
240+
190241 {{- range $tool_name, $tool_val := $val }}
191- s.AddTool({{$key}}_{{$tool_name}}Tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
242+ {{$tool_name}}Tool := {{$key}}_{{$tool_name}}Tool
243+ // Add URL field to schema if ExtractURL is enabled
244+ if config.ExtractURL {
245+ {{$tool_name}}Tool = runtime.AddURLFieldToTool({{$tool_name}}Tool, config.URLFieldName, config.URLDescription)
246+ }
247+
248+ s.AddTool({{$tool_name}}Tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
192249 var req {{$tool_val.RequestType}}
193250
194251 message := request.Params.Arguments
195252
253+ // Extract URL if option is enabled
254+ if config.ExtractURL {
255+ if urlVal, ok := message[config.URLFieldName]; ok {
256+ if urlStr, ok := urlVal.(string); ok {
257+ if parsedURL, err := url.Parse(urlStr); err == nil {
258+ ctx = context.WithValue(ctx, runtime.URLOverrideKey{}, parsedURL)
259+ }
260+ }
261+ }
262+ }
263+
196264 marshaled, err := json.Marshal(message)
197265 if err != nil {
198266 return nil, err
@@ -219,13 +287,35 @@ func ForwardToConnect{{$key}}Client(s *mcpserver.MCPServer, client Connect{{$key
219287
220288{{- range $key, $val := .Services }}
221289// ForwardTo{{$key}}Client registers a gRPC client, to forward MCP calls to it.
222- func ForwardTo{{$key}}Client(s *mcpserver.MCPServer, client {{$key}}Client) {
290+ func ForwardTo{{$key}}Client(s *mcpserver.MCPServer, client {{$key}}Client, opts ...runtime.Option) {
291+ config := runtime.NewConfig()
292+ for _, opt := range opts {
293+ opt(config)
294+ }
295+
223296 {{- range $tool_name, $tool_val := $val }}
224- s.AddTool({{$key}}_{{$tool_name}}Tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
297+ {{$tool_name}}Tool := {{$key}}_{{$tool_name}}Tool
298+ // Add URL field to schema if ExtractURL is enabled
299+ if config.ExtractURL {
300+ {{$tool_name}}Tool = runtime.AddURLFieldToTool({{$tool_name}}Tool, config.URLFieldName, config.URLDescription)
301+ }
302+
303+ s.AddTool({{$tool_name}}Tool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
225304 var req {{$tool_val.RequestType}}
226305
227306 message := request.Params.Arguments
228307
308+ // Extract URL if option is enabled
309+ if config.ExtractURL {
310+ if urlVal, ok := message[config.URLFieldName]; ok {
311+ if urlStr, ok := urlVal.(string); ok {
312+ if parsedURL, err := url.Parse(urlStr); err == nil {
313+ ctx = context.WithValue(ctx, runtime.URLOverrideKey{}, parsedURL)
314+ }
315+ }
316+ }
317+ }
318+
229319 marshaled, err := json.Marshal(message)
230320 if err != nil {
231321 return nil, err
0 commit comments