"Everything Server crashes when multiple clients reconnect"

* In index.ts
  - added a variable to hold the initialize timeout
  - store the timeout in the oninitialized handler
  - clear the timeout in the cleanup callback

* In roots.ts
  - In the catch block of syncRoots, log the error to the console via .error rather than attempting to send to the client because the most probable case here is that we don't have a connection.
This commit is contained in:
cliffhall 2026-01-23 13:35:32 -05:00
commit ae1e7a5500
2 changed files with 8 additions and 10 deletions

View file

@ -40,6 +40,8 @@ export const createServer: () => ServerFactoryResponse = () => {
const taskStore = new InMemoryTaskStore(); const taskStore = new InMemoryTaskStore();
const taskMessageQueue = new InMemoryTaskMessageQueue(); const taskMessageQueue = new InMemoryTaskMessageQueue();
let initializeTimeout: NodeJS.Timeout | null = null;
// Create the server // Create the server
const server = new McpServer( const server = new McpServer(
{ {
@ -98,7 +100,7 @@ export const createServer: () => ServerFactoryResponse = () => {
// This is delayed until after the `notifications/initialized` handler finishes, // This is delayed until after the `notifications/initialized` handler finishes,
// otherwise, the request gets lost. // otherwise, the request gets lost.
const sessionId = server.server.transport?.sessionId; const sessionId = server.server.transport?.sessionId;
setTimeout(() => syncRoots(server, sessionId), 350); initializeTimeout = setTimeout(() => syncRoots(server, sessionId), 350);
}; };
// Return the ServerFactoryResponse // Return the ServerFactoryResponse
@ -110,6 +112,7 @@ export const createServer: () => ServerFactoryResponse = () => {
stopSimulatedResourceUpdates(sessionId); stopSimulatedResourceUpdates(sessionId);
// Clean up task store timers // Clean up task store timers
taskStore.cleanup(); taskStore.cleanup();
if (initializeTimeout) clearTimeout(initializeTimeout);
}, },
} satisfies ServerFactoryResponse; } satisfies ServerFactoryResponse;
}; };

View file

@ -63,15 +63,10 @@ export const syncRoots = async (server: McpServer, sessionId?: string) => {
); );
} }
} catch (error) { } catch (error) {
await server.sendLoggingMessage( console.error(
{ `Failed to request roots from client ${sessionId}: ${
level: "error", error instanceof Error ? error.message : String(error)
logger: "everything-server", }`
data: `Failed to request roots from client: ${
error instanceof Error ? error.message : String(error)
}`,
},
sessionId
); );
} }
}; };