From c88c59db84d714ec152c9b029315a4f6e18ea620 Mon Sep 17 00:00:00 2001 From: roboomp Date: Tue, 28 Jul 2026 15:05:15 +0000 Subject: [PATCH] fix(coding-agent): surfaced MCP resource templates in resource summary formatAvailableResources only listed concrete resources, so the assistant-facing summary shown on a failed mcp:// read understated the server's contract even though template routing and /mcp resources already handle them. Now templates are listed alongside concrete resources. Fixes #6911 (cherry picked from commit 254f35bb04cda8a615bbe1291d73b13cac0eabaa) --- packages/coding-agent/CHANGELOG.md | 4 ++++ .../coding-agent/src/internal-urls/mcp-protocol.ts | 5 ++++- .../test/internal-urls/mcp-protocol.test.ts | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index d97a1f633..baa0b09ea 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fixed the assistant-facing available-resource summary omitting parameterized MCP resource templates, so a failed `mcp://` read now lists templates alongside concrete resources ([#6911](https://github.com/can1357/oh-my-pi/issues/6911)). + ## [17.1.8] - 2026-07-28 ### Breaking Changes diff --git a/packages/coding-agent/src/internal-urls/mcp-protocol.ts b/packages/coding-agent/src/internal-urls/mcp-protocol.ts index 2dbc72f13..82a38f391 100644 --- a/packages/coding-agent/src/internal-urls/mcp-protocol.ts +++ b/packages/coding-agent/src/internal-urls/mcp-protocol.ts @@ -97,7 +97,10 @@ function formatAvailableResources(mcpManager: MCPManager): string { .getConnectedServers() .flatMap(name => { const serverResources = mcpManager.getServerResources(name); - return (serverResources?.resources ?? []).map(r => ` ${r.uri} (${name})`); + if (!serverResources) return []; + const concrete = serverResources.resources.map(r => ` ${r.uri} (${name})`); + const templates = serverResources.templates.map(t => ` ${t.uriTemplate} (${name}, template)`); + return [...concrete, ...templates]; }) .join("\n"); return available || " (none)"; diff --git a/packages/coding-agent/test/internal-urls/mcp-protocol.test.ts b/packages/coding-agent/test/internal-urls/mcp-protocol.test.ts index 96c3b43ca..4ad4e2856 100644 --- a/packages/coding-agent/test/internal-urls/mcp-protocol.test.ts +++ b/packages/coding-agent/test/internal-urls/mcp-protocol.test.ts @@ -73,6 +73,20 @@ describe("McpProtocolHandler", () => { await expect(router.resolve("mcp://test://missing")).rejects.toThrow("server-a"); }); + it("lists resource templates alongside concrete resources when no server matches", async () => { + const resources = new Map(); + resources.set("server-a", { + resources: [{ uri: "example://items/open", name: "open-item" }], + templates: [{ uriTemplate: "example://items/{id}", name: "item-template" }], + }); + const manager = createMockManager({ servers: ["server-a"], resources }); + MCPManager.setInstance(manager); + const router = InternalUrlRouter.instance(); + + await expect(router.resolve("mcp://example://missing")).rejects.toThrow("example://items/open"); + await expect(router.resolve("mcp://example://missing")).rejects.toThrow("example://items/{id}"); + }); + it("reads resource by exact URI match", async () => { const resources = new Map(); resources.set("my-server", {