From 9da43bc35519692e1b8472590fb2bfa5abeb76b8 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Sun, 17 Aug 2025 17:20:36 +0000 Subject: [PATCH] Fix SSE server crash by starting notification timers only after client connects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move setInterval calls from server creation to startNotificationIntervals function - Only start notification timers when a client actually connects to the SSE server - Prevents 'Not connected' error when server tries to send notifications before client connection - Fixes issue where server crashes after 5 seconds when running 'npx @modelcontextprotocol/server-everything sse' 🤖 Generated with [Claude Code](https://claude.ai/code) Co-authored-by: Ola Hungerford --- src/everything/everything.ts | 45 ++++++++++++++++++++---------------- src/everything/sse.ts | 5 +++- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/src/everything/everything.ts b/src/everything/everything.ts index 26e4352193..19dd646cad 100644 --- a/src/everything/everything.ts +++ b/src/everything/everything.ts @@ -169,16 +169,6 @@ export const createServer = () => { let subsUpdateInterval: NodeJS.Timeout | undefined; let stdErrUpdateInterval: NodeJS.Timeout | undefined; - // Set up update interval for subscribed resources - subsUpdateInterval = setInterval(() => { - for (const uri of subscriptions) { - server.notification({ - method: "notifications/resources/updated", - params: { uri }, - }); - } - }, 10000); - let logLevel: LoggingLevel = "debug"; let logsUpdateInterval: NodeJS.Timeout | undefined; const messages = [ @@ -198,15 +188,30 @@ export const createServer = () => { return messageLevel < currentLevel; }; - // Set up update interval for random log messages - logsUpdateInterval = setInterval(() => { - let message = { - method: "notifications/message", - params: messages[Math.floor(Math.random() * messages.length)], - }; - if (!isMessageIgnored(message.params.level as LoggingLevel)) - server.notification(message); - }, 20000); + // Function to start notification intervals when a client connects + const startNotificationIntervals = () => { + if (!subsUpdateInterval) { + subsUpdateInterval = setInterval(() => { + for (const uri of subscriptions) { + server.notification({ + method: "notifications/resources/updated", + params: { uri }, + }); + } + }, 10000); + } + + if (!logsUpdateInterval) { + logsUpdateInterval = setInterval(() => { + let message = { + method: "notifications/message", + params: messages[Math.floor(Math.random() * messages.length)], + }; + if (!isMessageIgnored(message.params.level as LoggingLevel)) + server.notification(message); + }, 20000); + } + }; @@ -874,7 +879,7 @@ export const createServer = () => { if (stdErrUpdateInterval) clearInterval(stdErrUpdateInterval); }; - return { server, cleanup }; + return { server, cleanup, startNotificationIntervals }; }; const MCP_TINY_IMAGE = diff --git a/src/everything/sse.ts b/src/everything/sse.ts index a657af75be..f414e02f2f 100644 --- a/src/everything/sse.ts +++ b/src/everything/sse.ts @@ -10,7 +10,7 @@ const transports: Map = new Map { let transport: SSEServerTransport; - const { server, cleanup } = createServer(); + const { server, cleanup, startNotificationIntervals } = createServer(); if (req?.query?.sessionId) { const sessionId = (req?.query?.sessionId as string); @@ -25,6 +25,9 @@ app.get("/sse", async (req, res) => { await server.connect(transport); console.error("Client Connected: ", transport.sessionId); + // Start notification intervals after client connects + startNotificationIntervals(); + // Handle close of connection server.onclose = async () => { console.error("Client Disconnected: ", transport.sessionId);