@@ -591,56 +591,69 @@ func (n *SamNode) fetchRemoteToolCatalogue(ctx context.Context, targetPeer peer.
591591 connectService = api .MCPServicePrefix + connectService
592592 }
593593
594- n .preparePeerAddrs (ctx , targetPeer )
595- session , cleanup , err := n .ConnectMCPSession (ctx , targetPeer , connectService , nil )
596- if err != nil {
597- if errors .Is (err , ErrAuthRejected ) {
598- // Not authorized for this service: omit it entirely rather than
599- // leaking its existence ("what you see is what you can do", #176).
600- logger .Debugf ("Hiding unauthorized service %s from discovery: %v" , targetService , err )
601- continue
602- }
603- logger .Debugf ("Failed to connect MCP session for service %s: %v" , targetService , err )
604- if serviceNameFilter == "" || connectService == serviceNameFilter {
605- rows = append (rows , remoteToolRow {
606- PeerID : targetPeer .String (),
607- ToolName : connectService ,
608- Error : fmt .Sprintf ("failed to connect: %v" , err ),
609- })
610- }
611- continue
594+ rows = append (rows , n .fetchToolsForRemoteService (ctx , targetPeer , connectService , targetService , serviceNameFilter )... )
595+ }
596+
597+ return rows , nil
598+ }
599+
600+ // fetchToolsForRemoteService opens one MCP session to a single remote service,
601+ // lists its tools, and returns the matching rows. Per-service failures are
602+ // encoded as error rows (or omitted for AuthRejected); the session is always
603+ // closed when the function returns.
604+ func (n * SamNode ) fetchToolsForRemoteService (
605+ ctx context.Context ,
606+ targetPeer peer.ID ,
607+ connectService , targetService , serviceNameFilter string ,
608+ ) []remoteToolRow {
609+ n .preparePeerAddrs (ctx , targetPeer )
610+ session , cleanup , err := n .ConnectMCPSession (ctx , targetPeer , connectService , nil )
611+ if err != nil {
612+ if errors .Is (err , ErrAuthRejected ) {
613+ // Not authorized for this service: omit it entirely rather than
614+ // leaking its existence ("what you see is what you can do", #176).
615+ logger .Debugf ("Hiding unauthorized service %s from discovery: %v" , targetService , err )
616+ return nil
612617 }
618+ logger .Debugf ("Failed to connect MCP session for service %s: %v" , targetService , err )
619+ if serviceNameFilter == "" || connectService == serviceNameFilter {
620+ return []remoteToolRow {{
621+ PeerID : targetPeer .String (),
622+ ToolName : connectService ,
623+ Error : fmt .Sprintf ("failed to connect: %v" , err ),
624+ }}
625+ }
626+ return nil
627+ }
628+ defer cleanup ()
613629
614- listRes , err := session .ListTools (ctx , nil )
615- if err == nil && listRes != nil {
616- for _ , t := range listRes .Tools {
617- if t == nil {
618- continue
619- }
620- t .Name = connectService + "/" + t .Name
621- if serviceNameFilter != "" && ! strings .HasPrefix (t .Name , serviceNameFilter + "/" ) {
622- continue
623- }
624- rows = append (rows , remoteToolRow {
625- PeerID : targetPeer .String (),
626- ToolName : t .Name ,
627- Description : t .Description ,
628- })
630+ listRes , err := session .ListTools (ctx , nil )
631+ if err == nil && listRes != nil {
632+ var rows []remoteToolRow
633+ for _ , t := range listRes .Tools {
634+ if t == nil {
635+ continue
629636 }
630- } else {
631- if serviceNameFilter == "" || connectService == serviceNameFilter {
632- rows = append (rows , remoteToolRow {
633- PeerID : targetPeer .String (),
634- ToolName : targetService ,
635- Error : fmt .Sprintf ("failed to list tools: %v" , err ),
636- })
637+ t .Name = connectService + "/" + t .Name
638+ if serviceNameFilter != "" && ! strings .HasPrefix (t .Name , serviceNameFilter + "/" ) {
639+ continue
637640 }
641+ rows = append (rows , remoteToolRow {
642+ PeerID : targetPeer .String (),
643+ ToolName : t .Name ,
644+ Description : t .Description ,
645+ })
638646 }
639-
640- cleanup ()
647+ return rows
641648 }
642-
643- return rows , nil
649+ if serviceNameFilter == "" || connectService == serviceNameFilter {
650+ return []remoteToolRow {{
651+ PeerID : targetPeer .String (),
652+ ToolName : targetService ,
653+ Error : fmt .Sprintf ("failed to list tools: %v" , err ),
654+ }}
655+ }
656+ return nil
644657}
645658
646659// fanOutFetch queries each peer's tool catalogue concurrently with a
0 commit comments