Skip to content

Commit 3c7e4cd

Browse files
committed
scope deferred cleanup in fetchRemoteToolCatalogue
1 parent bd23dee commit 3c7e4cd

1 file changed

Lines changed: 57 additions & 44 deletions

File tree

internal/node/mcp_handlers.go

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)