Skip to content
Open
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
23 changes: 20 additions & 3 deletions src/everything/resources/session.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { McpServer, RegisteredResource } from "@modelcontextprotocol/sdk/server/mcp.js";
import { Resource, ResourceLink } from "@modelcontextprotocol/sdk/types.js";

/**
* Tracks registered session resources by URI to allow updating/removing on re-registration.
* This prevents "Resource already registered" errors when a tool creates a resource
* with the same URI multiple times during a session.
*/
const registeredResources = new Map<string, RegisteredResource>();

/**
* Generates a session-scoped resource URI string based on the provided resource name.
*
Expand Down Expand Up @@ -47,17 +54,27 @@ export const registerSessionResource = (
blob: payload,
};

// Check if a resource with this URI is already registered and remove it
const existingResource = registeredResources.get(uri);
if (existingResource) {
existingResource.remove();
registeredResources.delete(uri);
}

// Register file resource
server.registerResource(
const registeredResource = server.registerResource(
name,
uri,
{ mimeType, description, title, annotations, icons, _meta },
async (uri) => {
async () => {
return {
contents: [resourceContent],
};
}
);

// Track the registered resource for potential future removal
registeredResources.set(uri, registeredResource);

return { type: "resource_link", ...resource };
};