Skip to content

Commit ad3e660

Browse files
authored
Merge pull request #3252 from dotsetgreg/fix/session-resource-reregistration
fix(everything): allow re-registration of session resources
2 parents 6d977dd + 3e1be88 commit ad3e660

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

src/everything/resources/session.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1+
import { McpServer, RegisteredResource } from "@modelcontextprotocol/sdk/server/mcp.js";
22
import { Resource, ResourceLink } from "@modelcontextprotocol/sdk/types.js";
33

4+
/**
5+
* Tracks registered session resources by URI to allow updating/removing on re-registration.
6+
* This prevents "Resource already registered" errors when a tool creates a resource
7+
* with the same URI multiple times during a session.
8+
*/
9+
const registeredResources = new Map<string, RegisteredResource>();
10+
411
/**
512
* Generates a session-scoped resource URI string based on the provided resource name.
613
*
@@ -47,17 +54,27 @@ export const registerSessionResource = (
4754
blob: payload,
4855
};
4956

57+
// Check if a resource with this URI is already registered and remove it
58+
const existingResource = registeredResources.get(uri);
59+
if (existingResource) {
60+
existingResource.remove();
61+
registeredResources.delete(uri);
62+
}
63+
5064
// Register file resource
51-
server.registerResource(
65+
const registeredResource = server.registerResource(
5266
name,
5367
uri,
5468
{ mimeType, description, title, annotations, icons, _meta },
55-
async (uri) => {
69+
async () => {
5670
return {
5771
contents: [resourceContent],
5872
};
5973
}
6074
);
6175

76+
// Track the registered resource for potential future removal
77+
registeredResources.set(uri, registeredResource);
78+
6279
return { type: "resource_link", ...resource };
6380
};

0 commit comments

Comments
 (0)