Fix SSE server crash by starting notification timers only after client connects

- 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 <olaservo@users.noreply.github.com>
This commit is contained in:
claude[bot]
2025-08-17 17:20:36 +00:00
parent fcb550ec3d
commit 9da43bc355
2 changed files with 29 additions and 21 deletions

View File

@@ -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 =

View File

@@ -10,7 +10,7 @@ const transports: Map<string, SSEServerTransport> = new Map<string, SSEServerTra
app.get("/sse", async (req, res) => {
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);