22package server
33
44import (
5+ "cmp"
56 "context"
67 "encoding/base64"
78 "encoding/json"
89 "fmt"
10+ "maps"
911 "slices"
1012 "sort"
1113 "sync"
@@ -826,20 +828,9 @@ func (s *MCPServer) handleListResources(
826828 request mcp.ListResourcesRequest ,
827829) (* mcp.ListResourcesResult , * requestError ) {
828830 s .resourcesMu .RLock ()
829- resources := make ([]mcp.Resource , 0 , len (s .resources ))
830-
831- // Get all resource URIs for consistent ordering
832- resourceURIs := make ([]string , 0 , len (s .resources ))
833- for uri := range s .resources {
834- resourceURIs = append (resourceURIs , uri )
835- }
836-
837- // Sort the resource URIs for consistent ordering
838- sort .Strings (resourceURIs )
839-
840- // Add resources in sorted order
841- for _ , uri := range resourceURIs {
842- resources = append (resources , s .resources [uri ].resource )
831+ resourceMap := make (map [string ]mcp.Resource , len (s .resources ))
832+ for uri , entry := range s .resources {
833+ resourceMap [uri ] = entry .resource
843834 }
844835 s .resourcesMu .RUnlock ()
845836
@@ -848,34 +839,19 @@ func (s *MCPServer) handleListResources(
848839 if session != nil {
849840 if sessionWithResources , ok := session .(SessionWithResources ); ok {
850841 if sessionResources := sessionWithResources .GetSessionResources (); sessionResources != nil {
851- // Override or add session-specific resources
852- // We need to create a map first to merge the resources properly
853- resourceMap := make (map [string ]mcp.Resource )
854-
855- // Add global resources first
856- for _ , resource := range resources {
857- resourceMap [resource .URI ] = resource
858- }
859-
860- // Then override with session-specific resources
842+ // Merge session-specific resources with global resources
861843 for uri , serverResource := range sessionResources {
862844 resourceMap [uri ] = serverResource .Resource
863845 }
864-
865- // Convert back to slice
866- resources = make ([]mcp.Resource , 0 , len (resourceMap ))
867- for _ , resource := range resourceMap {
868- resources = append (resources , resource )
869- }
870-
871- // Sort again to maintain consistent ordering
872- sort .Slice (resources , func (i , j int ) bool {
873- return resources [i ].URI < resources [j ].URI
874- })
875846 }
876847 }
877848 }
878849
850+ // Sort the resources by name
851+ resources := slices .SortedFunc (maps .Values (resourceMap ), func (a , b mcp.Resource ) int {
852+ return cmp .Compare (a .Name , b .Name )
853+ })
854+
879855 // Apply pagination
880856 resourcesToReturn , nextCursor , err := listByPagination (
881857 ctx ,
0 commit comments