@@ -320,7 +320,7 @@ func (us *UnifiedServer) registerToolsFromBackend(serverID string) error {
320320 toolArgs , err := parseToolArguments (req )
321321 if err != nil {
322322 logger .LogError ("client" , "Failed to unmarshal tool arguments, tool=%s, error=%v" , toolNameCopy , err )
323- return & sdk. CallToolResult { IsError : true }, nil , err
323+ return newErrorCallToolResult ( err )
324324 }
325325
326326 // Log the MCP tool call request
@@ -331,7 +331,7 @@ func (us *UnifiedServer) registerToolsFromBackend(serverID string) error {
331331 // Check session is initialized
332332 if err := us .requireSession (ctx ); err != nil {
333333 logger .LogError ("client" , "MCP tool call failed: session not initialized, session=%s, tool=%s" , sessionID , toolNameCopy )
334- return & sdk. CallToolResult { IsError : true }, nil , err
334+ return newErrorCallToolResult ( err )
335335 }
336336
337337 result , data , err := us .callBackendTool (ctx , serverIDCopy , toolNameCopy , toolArgs )
@@ -395,7 +395,7 @@ func (us *UnifiedServer) registerSysTools() error {
395395 toolArgs , err := parseToolArguments (req )
396396 if err != nil {
397397 logger .LogError ("client" , "Failed to unmarshal sys_init arguments, error=%v" , err )
398- return & sdk. CallToolResult { IsError : true }, nil , err
398+ return newErrorCallToolResult ( err )
399399 }
400400
401401 // Extract token from args
@@ -408,7 +408,7 @@ func (us *UnifiedServer) registerSysTools() error {
408408 sessionID := us .getSessionID (ctx )
409409 if sessionID == "" {
410410 logger .LogError ("client" , "MCP session initialization failed: no session ID provided" )
411- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("no session ID provided" )
411+ return newErrorCallToolResult ( fmt .Errorf ("no session ID provided" ) )
412412 }
413413
414414 logger .LogInfo ("client" , "MCP session initialization started, session=%s, has_token=%v" , sessionID , token != "" )
@@ -436,7 +436,7 @@ func (us *UnifiedServer) registerSysTools() error {
436436 result , err := us .sysServer .HandleRequest ("tools/call" , json .RawMessage (params ))
437437 if err != nil {
438438 logger .LogError ("client" , "MCP session initialization: sys_init call failed, session=%s, error=%v" , sessionID , err )
439- return & sdk. CallToolResult { IsError : true }, nil , err
439+ return newErrorCallToolResult ( err )
440440 }
441441
442442 resultJSON , _ := json .Marshal (result )
@@ -486,7 +486,7 @@ func (us *UnifiedServer) registerSysTools() error {
486486 // Check session is initialized
487487 if err := us .requireSession (ctx ); err != nil {
488488 logger .LogError ("client" , "MCP sys_list_servers failed: session not initialized, session=%s" , sessionID )
489- return & sdk. CallToolResult { IsError : true }, nil , err
489+ return newErrorCallToolResult ( err )
490490 }
491491
492492 params , _ := json .Marshal (map [string ]interface {}{
@@ -496,7 +496,7 @@ func (us *UnifiedServer) registerSysTools() error {
496496 result , err := us .sysServer .HandleRequest ("tools/call" , json .RawMessage (params ))
497497 if err != nil {
498498 logger .LogError ("client" , "MCP sys_list_servers error, session=%s, error=%v" , sessionID , err )
499- return & sdk. CallToolResult { IsError : true }, nil , err
499+ return newErrorCallToolResult ( err )
500500 }
501501
502502 resultJSON , _ := json .Marshal (result )
@@ -657,7 +657,7 @@ func (us *UnifiedServer) callBackendTool(ctx context.Context, serverID, toolName
657657 resource , operation , err := g .LabelResource (ctx , toolName , args , backendCaller , us .capabilities )
658658 if err != nil {
659659 log .Printf ("[DIFC] Guard labeling failed: %v" , err )
660- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("guard labeling failed: %w" , err )
660+ return newErrorCallToolResult ( fmt .Errorf ("guard labeling failed: %w" , err ) )
661661 }
662662
663663 log .Printf ("[DIFC] Resource: %s | Operation: %s | Secrecy: %v | Integrity: %v" ,
@@ -688,33 +688,33 @@ func (us *UnifiedServer) callBackendTool(ctx context.Context, serverID, toolName
688688 sessionID := us .getSessionID (ctx )
689689 conn , err := launcher .GetOrLaunchForSession (us .launcher , serverID , sessionID )
690690 if err != nil {
691- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("failed to connect: %w" , err )
691+ return newErrorCallToolResult ( fmt .Errorf ("failed to connect: %w" , err ) )
692692 }
693693
694694 response , err := conn .SendRequestWithServerID (ctx , "tools/call" , map [string ]interface {}{
695695 "name" : toolName ,
696696 "arguments" : args ,
697697 }, serverID )
698698 if err != nil {
699- return & sdk. CallToolResult { IsError : true }, nil , err
699+ return newErrorCallToolResult ( err )
700700 }
701701
702702 // Check if the backend returned an error
703703 if response .Error != nil {
704- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("backend error: code=%d, message=%s" , response .Error .Code , response .Error .Message )
704+ return newErrorCallToolResult ( fmt .Errorf ("backend error: code=%d, message=%s" , response .Error .Code , response .Error .Message ) )
705705 }
706706
707707 // Parse the backend result
708708 var backendResult interface {}
709709 if err := json .Unmarshal (response .Result , & backendResult ); err != nil {
710- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("failed to parse result: %w" , err )
710+ return newErrorCallToolResult ( fmt .Errorf ("failed to parse result: %w" , err ) )
711711 }
712712
713713 // **Phase 4: Guard labels the response data (for fine-grained filtering)**
714714 labeledData , err := g .LabelResponse (ctx , toolName , backendResult , backendCaller , us .capabilities )
715715 if err != nil {
716716 log .Printf ("[DIFC] Response labeling failed: %v" , err )
717- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("response labeling failed: %w" , err )
717+ return newErrorCallToolResult ( fmt .Errorf ("response labeling failed: %w" , err ) )
718718 }
719719
720720 // **Phase 5: Reference Monitor performs fine-grained filtering (if applicable)**
@@ -735,13 +735,13 @@ func (us *UnifiedServer) callBackendTool(ctx context.Context, serverID, toolName
735735 // Convert filtered data to result
736736 finalResult , err = filtered .ToResult ()
737737 if err != nil {
738- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("failed to convert filtered data: %w" , err )
738+ return newErrorCallToolResult ( fmt .Errorf ("failed to convert filtered data: %w" , err ) )
739739 }
740740 } else {
741741 // Simple labeled data - already passed coarse-grained check
742742 finalResult , err = labeledData .ToResult ()
743743 if err != nil {
744- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("failed to convert labeled data: %w" , err )
744+ return newErrorCallToolResult ( fmt .Errorf ("failed to convert labeled data: %w" , err ) )
745745 }
746746 }
747747
@@ -767,7 +767,7 @@ func (us *UnifiedServer) callBackendTool(ctx context.Context, serverID, toolName
767767 // Convert finalResult to SDK CallToolResult format
768768 callResult , err := convertToCallToolResult (finalResult )
769769 if err != nil {
770- return & sdk. CallToolResult { IsError : true }, nil , fmt .Errorf ("failed to convert result: %w" , err )
770+ return newErrorCallToolResult ( fmt .Errorf ("failed to convert result: %w" , err ) )
771771 }
772772
773773 return callResult , finalResult , nil
@@ -779,6 +779,13 @@ func (us *UnifiedServer) Run(transport sdk.Transport) error {
779779 return us .server .Run (us .ctx , transport )
780780}
781781
782+ // newErrorCallToolResult creates a standard error CallToolResult
783+ // This helper reduces code duplication for error returns following the pattern:
784+ // return &sdk.CallToolResult{IsError: true}, nil, err
785+ func newErrorCallToolResult (err error ) (* sdk.CallToolResult , interface {}, error ) {
786+ return & sdk.CallToolResult {IsError : true }, nil , err
787+ }
788+
782789// parseToolArguments extracts and unmarshals tool arguments from a CallToolRequest
783790// Returns the parsed arguments as a map, or an error if parsing fails
784791func parseToolArguments (req * sdk.CallToolRequest ) (map [string ]interface {}, error ) {
0 commit comments