From 2ba960ca13c426b8296c53a5e80abade0d432a35 Mon Sep 17 00:00:00 2001 From: cliffhall Date: Thu, 13 Mar 2025 15:23:52 -0400 Subject: [PATCH 1/4] In the Inspector, log messages from the server were not being displayed. https://github.com/modelcontextprotocol/inspector/issues/184 The user who created the issue provided a python test server to send dummy messages, but I expected that the 'everything server' would be exercising this capability, but it wasn't. So I decided to add that functionality at the same time as fixing the inspector. In src/everything/everything.ts - add logsUpdateInterval - use setInterval to send a random-leveled log message every 15 seconds --- src/everything/everything.ts | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/everything/everything.ts b/src/everything/everything.ts index c0553693fa..d40948a40a 100644 --- a/src/everything/everything.ts +++ b/src/everything/everything.ts @@ -99,10 +99,11 @@ export const createServer = () => { ); let subscriptions: Set = new Set(); - let updateInterval: NodeJS.Timeout | undefined; + let subsUpdateInterval: NodeJS.Timeout | undefined; + let logsUpdateInterval: NodeJS.Timeout | undefined; // Set up update interval for subscribed resources - updateInterval = setInterval(() => { + subsUpdateInterval = setInterval(() => { for (const uri of subscriptions) { server.notification({ method: "notifications/resources/updated", @@ -111,6 +112,21 @@ export const createServer = () => { } }, 5000); + // Set up update interval for random log messages + logsUpdateInterval = setInterval(() => { + const messages = [ + {level: "info", data: "Information is good"}, + {level: "warning", data: "Warning is scary"}, + {level: "error", data: "Error is bad"}, + ] + server.notification({ + method: "notifications/message", + params: messages[Math.floor(Math.random()*3)], + }); + }, 15000); + + + // Helper method to request sampling from client const requestSampling = async ( context: string, @@ -451,7 +467,7 @@ export const createServer = () => { if (name === ToolName.ANNOTATED_MESSAGE) { const { messageType, includeImage } = AnnotatedMessageSchema.parse(args); - + const content = []; // Main message with different priorities/audiences based on type @@ -511,7 +527,7 @@ export const createServer = () => { if (!resourceId) return { completion: { values: [] } }; // Filter resource IDs that start with the input value - const values = EXAMPLE_COMPLETIONS.resourceId.filter(id => + const values = EXAMPLE_COMPLETIONS.resourceId.filter(id => id.startsWith(argument.value) ); return { completion: { values, hasMore: false, total: values.length } }; @@ -522,7 +538,7 @@ export const createServer = () => { const completions = EXAMPLE_COMPLETIONS[argument.name as keyof typeof EXAMPLE_COMPLETIONS]; if (!completions) return { completion: { values: [] } }; - const values = completions.filter(value => + const values = completions.filter(value => value.startsWith(argument.value) ); return { completion: { values, hasMore: false, total: values.length } }; @@ -548,9 +564,8 @@ export const createServer = () => { }); const cleanup = async () => { - if (updateInterval) { - clearInterval(updateInterval); - } + if (subsUpdateInterval) clearInterval(subsUpdateInterval); + if (logsUpdateInterval) clearInterval(logsUpdateInterval); }; return { server, cleanup }; From f41b117716c9998a2187620d58c4fba797b8c24a Mon Sep 17 00:00:00 2001 From: cliffhall Date: Thu, 13 Mar 2025 15:33:59 -0400 Subject: [PATCH 2/4] Update everything/README.md with info about the logging output --- src/everything/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/everything/README.md b/src/everything/README.md index f80848ee2c..56a0f4600a 100644 --- a/src/everything/README.md +++ b/src/everything/README.md @@ -96,6 +96,20 @@ Resource features: - `style` (string): Output style preference - Returns: Multi-turn conversation with images +### Logging + +The server sends random-leveled log messages every 15 seconds, e.g.: + +```json +{ + "method": "notifications/message", + "params": { + "level": "info", + "data": "Information is good" + } +} +``` + ## Usage with Claude Desktop Add to your `claude_desktop_config.json`: From 0f0ed351cb4b8660398449c69ed6110938f2ce7c Mon Sep 17 00:00:00 2001 From: cliffhall Date: Sat, 15 Mar 2025 16:39:14 -0400 Subject: [PATCH 3/4] Respect log level setting by client * This fixes #868 * In everything.ts - import LoggingLevel from sdk - add log messages for all levels - add isMessageIgnored function that checks the incoming level against the logLevel and returns false if it is a lower index than the logLevel - in the setInterval for sending dummy logs, only send the message if it is not ignored by the logLevel. --- src/everything/everything.ts | 40 ++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/everything/everything.ts b/src/everything/everything.ts index d40948a40a..8ee80bf23e 100644 --- a/src/everything/everything.ts +++ b/src/everything/everything.ts @@ -9,6 +9,7 @@ import { ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ListToolsRequestSchema, + LoggingLevel, ReadResourceRequestSchema, Resource, SetLevelRequestSchema, @@ -100,9 +101,8 @@ export const createServer = () => { let subscriptions: Set = new Set(); let subsUpdateInterval: NodeJS.Timeout | undefined; - let logsUpdateInterval: NodeJS.Timeout | undefined; - // Set up update interval for subscribed resources + subsUpdateInterval = setInterval(() => { for (const uri of subscriptions) { server.notification({ @@ -112,21 +112,34 @@ export const createServer = () => { } }, 5000); + let logLevel: LoggingLevel = "debug"; + let logsUpdateInterval: NodeJS.Timeout | undefined; + const messages = [ + {level: "debug", data: "Debug-level message"}, + {level: "info", data: "Info-level message"}, + {level: "notice", data: "Notice-level message"}, + {level: "warning", data: "Warning-level message"}, + {level: "error", data: "Error-level message"}, + {level: "critical", data: "Critical-level message"}, + {level: "alert", data: "Alert level-message"}, + {level: "emergency", data: "Emergency-level message"} + ] + + const isMessageIgnored = (level:LoggingLevel):boolean => { + const currentLevel = messages.findIndex((msg) => logLevel === msg.level); + const messageLevel = messages.findIndex((msg) => level === msg.level); + return messageLevel < currentLevel; + } + // Set up update interval for random log messages logsUpdateInterval = setInterval(() => { - const messages = [ - {level: "info", data: "Information is good"}, - {level: "warning", data: "Warning is scary"}, - {level: "error", data: "Error is bad"}, - ] - server.notification({ + let message = { method: "notifications/message", - params: messages[Math.floor(Math.random()*3)], - }); + params: messages[Math.floor(Math.random() * messages.length)], + } + if (!isMessageIgnored(message.params.level as LoggingLevel)) server.notification(message); }, 15000); - - // Helper method to request sampling from client const requestSampling = async ( context: string, @@ -549,6 +562,7 @@ export const createServer = () => { server.setRequestHandler(SetLevelRequestSchema, async (request) => { const { level } = request.params; + logLevel = level; // Demonstrate different log levels await server.notification({ @@ -556,7 +570,7 @@ export const createServer = () => { params: { level: "debug", logger: "test-server", - data: `Logging level set to: ${level}`, + data: `Logging level set to: ${logLevel}`, }, }); From 487fe0237c8b112269c1253157c030d59c540810 Mon Sep 17 00:00:00 2001 From: cliffhall Date: Mon, 17 Mar 2025 10:32:57 -0400 Subject: [PATCH 4/4] Update README.md --- src/everything/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/everything/README.md b/src/everything/README.md index 56a0f4600a..ff854ae75f 100644 --- a/src/everything/README.md +++ b/src/everything/README.md @@ -105,7 +105,7 @@ The server sends random-leveled log messages every 15 seconds, e.g.: "method": "notifications/message", "params": { "level": "info", - "data": "Information is good" + "data": "Info-level message" } } ```