Skip to content

Commit 91505fe

Browse files
committed
[session-resources] fixes
1 parent 5fe23ec commit 91505fe

File tree

2 files changed

+25
-40
lines changed

2 files changed

+25
-40
lines changed

server/server.go

Lines changed: 11 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
package server
33

44
import (
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,

server/streamable_http.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/json"
77
"fmt"
88
"io"
9+
"maps"
910
"mime"
1011
"net/http"
1112
"net/http/httptest"
@@ -798,13 +799,17 @@ func newSessionResourcesStore() *sessionResourcesStore {
798799
func (s *sessionResourcesStore) get(sessionID string) map[string]ServerResource {
799800
s.mu.RLock()
800801
defer s.mu.RUnlock()
801-
return s.resources[sessionID]
802+
cloned := make(map[string]ServerResource, len(s.resources[sessionID]))
803+
maps.Copy(cloned, s.resources[sessionID])
804+
return cloned
802805
}
803806

804807
func (s *sessionResourcesStore) set(sessionID string, resources map[string]ServerResource) {
805808
s.mu.Lock()
806809
defer s.mu.Unlock()
807-
s.resources[sessionID] = resources
810+
cloned := make(map[string]ServerResource, len(resources))
811+
maps.Copy(cloned, resources)
812+
s.resources[sessionID] = cloned
808813
}
809814

810815
func (s *sessionResourcesStore) delete(sessionID string) {
@@ -827,13 +832,17 @@ func newSessionToolsStore() *sessionToolsStore {
827832
func (s *sessionToolsStore) get(sessionID string) map[string]ServerTool {
828833
s.mu.RLock()
829834
defer s.mu.RUnlock()
830-
return s.tools[sessionID]
835+
cloned := make(map[string]ServerTool, len(s.tools[sessionID]))
836+
maps.Copy(cloned, s.tools[sessionID])
837+
return cloned
831838
}
832839

833840
func (s *sessionToolsStore) set(sessionID string, tools map[string]ServerTool) {
834841
s.mu.Lock()
835842
defer s.mu.Unlock()
836-
s.tools[sessionID] = tools
843+
cloned := make(map[string]ServerTool, len(tools))
844+
maps.Copy(cloned, tools)
845+
s.tools[sessionID] = cloned
837846
}
838847

839848
func (s *sessionToolsStore) delete(sessionID string) {
@@ -886,7 +895,7 @@ func newStreamableHttpSession(sessionID string, toolStore *sessionToolsStore, re
886895
sessionID: sessionID,
887896
notificationChannel: make(chan mcp.JSONRPCNotification, 100),
888897
tools: toolStore,
889-
resources: resourcesStore,
898+
resources: resourcesStore,
890899
logLevels: levels,
891900
samplingRequestChan: make(chan samplingRequestItem, 10),
892901
elicitationRequestChan: make(chan elicitationRequestItem, 10),

0 commit comments

Comments
 (0)