diff --git a/src/everything/README.md b/src/everything/README.md index c4255f6fd7..f80848ee2c 100644 --- a/src/everything/README.md +++ b/src/everything/README.md @@ -45,6 +45,24 @@ This MCP server attempts to exercise all the features of the MCP protocol. It is - No inputs required - Returns: JSON string of all environment variables +7. `annotatedMessage` + - Demonstrates how annotations can be used to provide metadata about content + - Inputs: + - `messageType` (enum: "error" | "success" | "debug"): Type of message to demonstrate different annotation patterns + - `includeImage` (boolean, default: false): Whether to include an example image + - Returns: Content with varying annotations: + - Error messages: High priority (1.0), visible to both user and assistant + - Success messages: Medium priority (0.7), user-focused + - Debug messages: Low priority (0.3), assistant-focused + - Optional image: Medium priority (0.5), user-focused + - Example annotations: + ```json + { + "priority": 1.0, + "audience": ["user", "assistant"] + } + ``` + ### Resources The server provides 100 test resources in two formats: diff --git a/src/everything/everything.ts b/src/everything/everything.ts index 84beb942aa..c0553693fa 100644 --- a/src/everything/everything.ts +++ b/src/everything/everything.ts @@ -60,6 +60,13 @@ const EXAMPLE_COMPLETIONS = { const GetTinyImageSchema = z.object({}); +const AnnotatedMessageSchema = z.object({ + messageType: z.enum(["error", "success", "debug"]) + .describe("Type of message to demonstrate different annotation patterns"), + includeImage: z.boolean().default(false) + .describe("Whether to include an example image") +}); + enum ToolName { ECHO = "echo", ADD = "add", @@ -67,6 +74,7 @@ enum ToolName { PRINT_ENV = "printEnv", SAMPLE_LLM = "sampleLLM", GET_TINY_IMAGE = "getTinyImage", + ANNOTATED_MESSAGE = "annotatedMessage", } enum PromptName { @@ -329,6 +337,11 @@ export const createServer = () => { description: "Returns the MCP_TINY_IMAGE", inputSchema: zodToJsonSchema(GetTinyImageSchema) as ToolInput, }, + { + name: ToolName.ANNOTATED_MESSAGE, + description: "Demonstrates how annotations can be used to provide metadata about content", + inputSchema: zodToJsonSchema(AnnotatedMessageSchema) as ToolInput, + }, ]; return { tools }; @@ -436,6 +449,57 @@ 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 + if (messageType === "error") { + content.push({ + type: "text", + text: "Error: Operation failed", + annotations: { + priority: 1.0, // Errors are highest priority + audience: ["user", "assistant"] // Both need to know about errors + } + }); + } else if (messageType === "success") { + content.push({ + type: "text", + text: "Operation completed successfully", + annotations: { + priority: 0.7, // Success messages are important but not critical + audience: ["user"] // Success mainly for user consumption + } + }); + } else if (messageType === "debug") { + content.push({ + type: "text", + text: "Debug: Cache hit ratio 0.95, latency 150ms", + annotations: { + priority: 0.3, // Debug info is low priority + audience: ["assistant"] // Technical details for assistant + } + }); + } + + // Optional image with its own annotations + if (includeImage) { + content.push({ + type: "image", + data: MCP_TINY_IMAGE, + mimeType: "image/png", + annotations: { + priority: 0.5, + audience: ["user"] // Images primarily for user visualization + } + }); + } + + return { content }; + } + throw new Error(`Unknown tool: ${name}`); });