Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions pkg/inventory/filters.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,17 +203,6 @@ func (r *Inventory) filterToolsByName(name string) []ServerTool {
return result
}

// filterResourcesByURI returns resource templates matching the given URI pattern.
// Uses linear scan - optimized for single-lookup per-request scenarios (ForMCPRequest).
func (r *Inventory) filterResourcesByURI(uri string) []ServerResourceTemplate {
for i := range r.resourceTemplates {
if r.resourceTemplates[i].Template.URITemplate == uri {
return []ServerResourceTemplate{r.resourceTemplates[i]}
}
}
return []ServerResourceTemplate{}
}

// filterPromptsByName returns prompts matching the given name.
// Uses linear scan - optimized for single-lookup per-request scenarios (ForMCPRequest).
func (r *Inventory) filterPromptsByName(name string) []ServerPrompt {
Expand Down
6 changes: 2 additions & 4 deletions pkg/inventory/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ const (
// - MCPMethodToolsList: All available tools (no resources/prompts)
// - MCPMethodToolsCall: Only the named tool
// - MCPMethodResourcesList, MCPMethodResourcesTemplatesList: All available resources (no tools/prompts)
// - MCPMethodResourcesRead: Only the named resource template
// - MCPMethodResourcesRead: All resources (SDK handles URI template matching)
// - MCPMethodPromptsList: All available prompts (no tools/resources)
// - MCPMethodPromptsGet: Only the named prompt
// - Unknown methods: Empty (no items registered)
Expand Down Expand Up @@ -134,10 +134,8 @@ func (r *Inventory) ForMCPRequest(method string, itemName string) *Inventory {
case MCPMethodResourcesList, MCPMethodResourcesTemplatesList:
result.tools, result.prompts = nil, nil
case MCPMethodResourcesRead:
// Keep all resources registered - SDK handles URI template matching internally
result.tools, result.prompts = nil, nil
if itemName != "" {
result.resourceTemplates = r.filterResourcesByURI(itemName)
}
case MCPMethodPromptsList:
result.tools, result.resourceTemplates = nil, nil
case MCPMethodPromptsGet:
Expand Down
12 changes: 5 additions & 7 deletions pkg/inventory/registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -775,17 +775,15 @@ func TestForMCPRequest_ResourcesRead(t *testing.T) {
}

reg := NewBuilder().SetResources(resources).WithToolsets([]string{"all"}).Build()
filtered := reg.ForMCPRequest(MCPMethodResourcesRead, "repo://{owner}/{repo}")
// Pass a concrete URI - all resources remain registered, SDK handles matching
filtered := reg.ForMCPRequest(MCPMethodResourcesRead, "repo://owner/repo")

// All resources should be available - SDK handles URI template matching internally
available := filtered.AvailableResourceTemplates(context.Background())
if len(available) != 1 {
t.Fatalf("Expected 1 resource for resources/read, got %d", len(available))
}
if available[0].Template.URITemplate != "repo://{owner}/{repo}" {
t.Errorf("Expected URI template 'repo://{owner}/{repo}', got %q", available[0].Template.URITemplate)
if len(available) != 2 {
t.Fatalf("Expected 2 resources for resources/read (SDK handles matching), got %d", len(available))
}
}

func TestForMCPRequest_PromptsList(t *testing.T) {
tools := []ServerTool{
mockTool("tool1", "repos", true),
Expand Down