@@ -58,7 +58,7 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
5858 }
5959
6060 type componentClient struct {
61- serverContext
61+ messageContext
6262 * mcp.Client
6363 }
6464 var (
@@ -150,17 +150,12 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
150150 )
151151 if err != nil {
152152 log .Errorf ("Failed to get client for server %s: %v" , componentServer .mcpServer .Name , err )
153- if componentServer .enabled {
154- // Enabled components must initialize successfully
155- return
156- }
157- // Disabled components can fail silently
158- continue
153+ return
159154 }
160155
161156 clients [componentKey ] = componentClient {
162- serverContext : componentServer ,
163- Client : client ,
157+ messageContext : componentServer ,
158+ Client : client ,
164159 }
165160 }
166161
@@ -185,7 +180,6 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
185180 }
186181 return
187182 }
188-
189183 }
190184
191185 // All components responded, reply with the last result
@@ -248,6 +242,7 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
248242 Code : - 32603 ,
249243 Message : fmt .Sprintf ("failed to reply to composite server %s: %v" , m .mcpID , err ),
250244 }
245+ return
251246 }
252247
253248 result = compositeResult
@@ -265,7 +260,6 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
265260 compositePrompts = append (compositePrompts , m .toCompositePrompt (componentKey , prompt ))
266261 }
267262 }
268-
269263 compositeResult := nmcp.ListPromptsResult {
270264 Prompts : compositePrompts ,
271265 }
@@ -276,12 +270,11 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
276270 Message : fmt .Sprintf ("failed to reply to composite server %s: %v" , m .mcpID , err ),
277271 }
278272 }
279-
280273 result = compositeResult
281274 return
282275 case methodPromptsGet :
283276 var compositeRequest nmcp.GetPromptRequest
284- if err : = json .Unmarshal (msg .Params , & compositeRequest ); err != nil {
277+ if err = json .Unmarshal (msg .Params , & compositeRequest ); err != nil {
285278 err = & nmcp.RPCError {
286279 Code : - 32602 ,
287280 Message : fmt .Sprintf ("Failed to unmarshal get prompt request: %v" , err ),
@@ -309,11 +302,11 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
309302
310303 componentRequest := m .toComponentGetPromptRequest (componentKey , compositeRequest )
311304
312- b , err := json .Marshal (componentRequest )
313- if err != nil {
305+ b , marshalErr := json .Marshal (componentRequest )
306+ if marshalErr != nil {
314307 err = & nmcp.RPCError {
315308 Code : - 32603 ,
316- Message : fmt .Sprintf ("failed to marshal request for server %s: %v" , client .mcpServer .Name , err ),
309+ Message : fmt .Sprintf ("failed to marshal request for server %s: %v" , client .mcpServer .Name , marshalErr ),
317310 }
318311 return
319312 }
@@ -331,22 +324,23 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
331324 Code : - 32603 ,
332325 Message : fmt .Sprintf ("failed to reply to composite server %s: %v" , m .mcpID , err ),
333326 }
327+ return
334328 }
335329
336330 result = componentResult
337331 return
338332 case methodToolsList :
339333 var compositeTools []nmcp.Tool
340334 for componentKey , client := range clients {
341- var result nmcp.ListToolsResult
342- if err = client .Session .Exchange (ctx , methodToolsList , & msg , & result ); err != nil {
335+ var lr nmcp.ListToolsResult
336+ if err = client .Session .Exchange (ctx , methodToolsList , & msg , & lr ); err != nil {
343337 log .Errorf ("Failed to send %s message to server %s: %v" , msg .Method , client .mcpID , err )
344338 return
345339 }
346- for _ , tool := range result .Tools {
347- compositeTool , err := m .toCompositeTool (componentKey , tool )
348- if err != nil {
349- err = fmt .Errorf ("failed to override tool %s: %w" , tool .Name , err )
340+ for _ , tool := range lr .Tools {
341+ compositeTool , convErr := m .toCompositeTool (componentKey , tool )
342+ if convErr != nil {
343+ err = fmt .Errorf ("failed to override tool %s: %w" , tool .Name , convErr )
350344 return
351345 }
352346
@@ -370,13 +364,13 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
370364 Code : - 32603 ,
371365 Message : fmt .Sprintf ("failed to reply to composite server %s: %v" , m .mcpID , err ),
372366 }
367+ return
373368 }
374-
375369 result = compositeResult
376370 return
377371 case methodToolsCall :
378372 var compositeRequest nmcp.CallToolRequest
379- if err : = json .Unmarshal (msg .Params , & compositeRequest ); err != nil {
373+ if err = json .Unmarshal (msg .Params , & compositeRequest ); err != nil {
380374 err = & nmcp.RPCError {
381375 Code : - 32602 ,
382376 Message : fmt .Sprintf ("Failed to unmarshal tool call request: %v" , err ),
@@ -402,7 +396,8 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
402396 return
403397 }
404398
405- componentRequest , err := m .toComponentCallToolRequest (componentKey , compositeRequest )
399+ var componentRequest * nmcp.CallToolRequest
400+ componentRequest , err = m .toComponentCallToolRequest (componentKey , compositeRequest )
406401 if err != nil {
407402 log .Errorf ("Failed to convert tool call request to component tool call request: %v" , err )
408403 return
@@ -412,13 +407,14 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
412407 Code : - 32602 ,
413408 Message : fmt .Sprintf ("Unknown tool: %s" , compositeRequest .Name ),
414409 }
410+ return
415411 }
416412
417- b , err := json .Marshal (componentRequest )
418- if err != nil {
413+ b , marshalErr := json .Marshal (componentRequest )
414+ if marshalErr != nil {
419415 err = & nmcp.RPCError {
420416 Code : - 32603 ,
421- Message : fmt .Sprintf ("failed to marshal request for server %s: %v" , client .mcpServer .Name , err ),
417+ Message : fmt .Sprintf ("failed to marshal request for server %s: %v" , client .mcpServer .Name , marshalErr ),
422418 }
423419 return
424420 }
@@ -436,6 +432,7 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
436432 Code : - 32603 ,
437433 Message : fmt .Sprintf ("failed to reply to composite server %s: %v" , m .mcpID , err ),
438434 }
435+ return
439436 }
440437
441438 result = componentResult
@@ -446,8 +443,8 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
446443 result = nmcp.Notification {}
447444 for _ , client := range clients {
448445 if err = client .Session .Exchange (ctx , msg .Method , & msg , & result ); err != nil {
449- log .Errorf ("Failed to send %s message to server %s: %v" , msg .Method , client .mcpID , err )
450- return
446+ log .Warnf ("Failed to send %s message to server %s: %v" , msg .Method , client .mcpID , err )
447+ continue
451448 }
452449 }
453450
@@ -466,7 +463,6 @@ func (h *Handler) onCompositeMessage(ctx context.Context, msg nmcp.Message, m me
466463 Message : "Method not allowed" ,
467464 }
468465 }
469-
470466}
471467
472468func normalizeName (name string ) string {
@@ -505,15 +501,20 @@ func mergeInitializeResults(composite nmcp.InitializeResult, component nmcp.Init
505501 }
506502 }
507503
504+ // Merge Logging capability
505+ if component .Capabilities .Logging != nil {
506+ composite .Capabilities .Logging = & struct {}{}
507+ }
508+
508509 return composite
509510}
510511
511512type compositeContext struct {
512- componentServers []serverContext
513+ componentServers []messageContext
513514 toolOverrides map [string ]otypes.ToolOverride
514515}
515516
516- func newCompositeContext (config * otypes.CompositeRuntimeConfig , componentServers []serverContext ) compositeContext {
517+ func newCompositeContext (config * otypes.CompositeRuntimeConfig , componentServers []messageContext ) compositeContext {
517518 compositeContext := compositeContext {
518519 componentServers : componentServers ,
519520 toolOverrides : make (map [string ]otypes.ToolOverride ),
0 commit comments