@modelcontextprotocol/server-everything 2025.8.4 → 2025.9.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -89,6 +89,13 @@ This MCP server attempts to exercise all the features of the MCP protocol. It is
89
89
  - `structuredContent` field conformant to the output schema
90
90
  - A backward compatible Text Content field, a SHOULD advisory in the specification
91
91
 
92
+ 11. `listRoots`
93
+ - Lists the current MCP roots provided by the client
94
+ - Demonstrates the roots protocol capability even though this server doesn't access files
95
+ - No inputs required
96
+ - Returns: List of current roots with their URIs and names, or a message if no roots are set
97
+ - Shows how servers can interact with the MCP roots protocol
98
+
92
99
  ### Resources
93
100
 
94
101
  The server provides 100 test resources in two formats:
@@ -117,7 +124,7 @@ Resource features:
117
124
  2. `complex_prompt`
118
125
  - Advanced prompt demonstrating argument handling
119
126
  - Required arguments:
120
- - `temperature` (number): Temperature setting
127
+ - `temperature` (string): Temperature setting
121
128
  - Optional arguments:
122
129
  - `style` (string): Output style preference
123
130
  - Returns: Multi-turn conversation with images
@@ -129,6 +136,18 @@ Resource features:
129
136
  - Returns: Multi-turn conversation with an embedded resource reference
130
137
  - Shows how to include resources directly in prompt messages
131
138
 
139
+ ### Roots
140
+
141
+ The server demonstrates the MCP roots protocol capability:
142
+
143
+ - Declares `roots: { listChanged: true }` capability to indicate support for roots
144
+ - Handles `roots/list_changed` notifications from clients
145
+ - Requests initial roots during server initialization
146
+ - Provides a `listRoots` tool to display current roots
147
+ - Logs roots-related events for demonstration purposes
148
+
149
+ Note: This server doesn't actually access files, but demonstrates how servers can interact with the roots protocol for clients that need to understand which directories are available for file operations.
150
+
132
151
  ### Logging
133
152
 
134
153
  The server sends random-leveled log messages every 15 seconds, e.g.:
@@ -169,22 +188,24 @@ For quick installation, use of of the one-click install buttons below...
169
188
 
170
189
  [![Install with Docker in VS Code](https://img.shields.io/badge/VS_Code-Docker-0098FF?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=everything&config=%7B%22command%22%3A%22docker%22%2C%22args%22%3A%5B%22run%22%2C%22-i%22%2C%22--rm%22%2C%22mcp%2Feverything%22%5D%7D) [![Install with Docker in VS Code Insiders](https://img.shields.io/badge/VS_Code_Insiders-Docker-24bfa5?style=flat-square&logo=visualstudiocode&logoColor=white)](https://insiders.vscode.dev/redirect/mcp/install?name=everything&config=%7B%22command%22%3A%22docker%22%2C%22args%22%3A%5B%22run%22%2C%22-i%22%2C%22--rm%22%2C%22mcp%2Feverything%22%5D%7D&quality=insiders)
171
190
 
172
- For manual installation, add the following JSON block to your User Settings (JSON) file in VS Code. You can do this by pressing `Ctrl + Shift + P` and typing `Preferences: Open User Settings (JSON)`.
191
+ For manual installation, you can configure the MCP server using one of these methods:
192
+
193
+ **Method 1: User Configuration (Recommended)**
194
+ Add the configuration to your user-level MCP configuration file. Open the Command Palette (`Ctrl + Shift + P`) and run `MCP: Open User Configuration`. This will open your user `mcp.json` file where you can add the server configuration.
173
195
 
174
- Optionally, you can add it to a file called `.vscode/mcp.json` in your workspace. This will allow you to share the configuration with others.
196
+ **Method 2: Workspace Configuration**
197
+ Alternatively, you can add the configuration to a file called `.vscode/mcp.json` in your workspace. This will allow you to share the configuration with others.
175
198
 
176
- > Note that the `mcp` key is not needed in the `.vscode/mcp.json` file.
199
+ > For more details about MCP configuration in VS Code, see the [official VS Code MCP documentation](https://code.visualstudio.com/docs/copilot/mcp).
177
200
 
178
201
  #### NPX
179
202
 
180
203
  ```json
181
204
  {
182
- "mcp": {
183
- "servers": {
184
- "everything": {
185
- "command": "npx",
186
- "args": ["-y", "@modelcontextprotocol/server-everything"]
187
- }
205
+ "servers": {
206
+ "everything": {
207
+ "command": "npx",
208
+ "args": ["-y", "@modelcontextprotocol/server-everything"]
188
209
  }
189
210
  }
190
211
  }
@@ -1,5 +1,5 @@
1
1
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
- import { CallToolRequestSchema, CompleteRequestSchema, CreateMessageResultSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, SetLevelRequestSchema, SubscribeRequestSchema, ToolSchema, UnsubscribeRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
2
+ import { CallToolRequestSchema, CompleteRequestSchema, CreateMessageResultSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, RootsListChangedNotificationSchema, SubscribeRequestSchema, ToolSchema, UnsubscribeRequestSchema } from "@modelcontextprotocol/sdk/types.js";
3
3
  import { z } from "zod";
4
4
  import { zodToJsonSchema } from "zod-to-json-schema";
5
5
  import { readFileSync } from "fs";
@@ -62,6 +62,7 @@ const GetResourceLinksSchema = z.object({
62
62
  .default(3)
63
63
  .describe("Number of resource links to return (1-10)"),
64
64
  });
65
+ const ListRootsSchema = z.object({});
65
66
  const StructuredContentSchema = {
66
67
  input: z.object({
67
68
  location: z
@@ -95,6 +96,7 @@ var ToolName;
95
96
  ToolName["ELICITATION"] = "startElicitation";
96
97
  ToolName["GET_RESOURCE_LINKS"] = "getResourceLinks";
97
98
  ToolName["STRUCTURED_CONTENT"] = "structuredContent";
99
+ ToolName["LIST_ROOTS"] = "listRoots";
98
100
  })(ToolName || (ToolName = {}));
99
101
  var PromptName;
100
102
  (function (PromptName) {
@@ -119,49 +121,51 @@ export const createServer = () => {
119
121
  resources: { subscribe: true },
120
122
  tools: {},
121
123
  logging: {},
122
- completions: {},
123
- elicitation: {},
124
+ completions: {}
124
125
  },
125
126
  instructions
126
127
  });
127
128
  let subscriptions = new Set();
128
129
  let subsUpdateInterval;
129
130
  let stdErrUpdateInterval;
130
- // Set up update interval for subscribed resources
131
- subsUpdateInterval = setInterval(() => {
132
- for (const uri of subscriptions) {
133
- server.notification({
134
- method: "notifications/resources/updated",
135
- params: { uri },
136
- });
137
- }
138
- }, 10000);
139
- let logLevel = "debug";
140
131
  let logsUpdateInterval;
141
- const messages = [
142
- { level: "debug", data: "Debug-level message" },
143
- { level: "info", data: "Info-level message" },
144
- { level: "notice", data: "Notice-level message" },
145
- { level: "warning", data: "Warning-level message" },
146
- { level: "error", data: "Error-level message" },
147
- { level: "critical", data: "Critical-level message" },
148
- { level: "alert", data: "Alert level-message" },
149
- { level: "emergency", data: "Emergency-level message" },
150
- ];
151
- const isMessageIgnored = (level) => {
152
- const currentLevel = messages.findIndex((msg) => logLevel === msg.level);
153
- const messageLevel = messages.findIndex((msg) => level === msg.level);
154
- return messageLevel < currentLevel;
132
+ // Store client capabilities
133
+ let clientCapabilities;
134
+ // Roots state management
135
+ let currentRoots = [];
136
+ let clientSupportsRoots = false;
137
+ let sessionId;
138
+ // Function to start notification intervals when a client connects
139
+ const startNotificationIntervals = (sid) => {
140
+ sessionId = sid;
141
+ if (!subsUpdateInterval) {
142
+ subsUpdateInterval = setInterval(() => {
143
+ for (const uri of subscriptions) {
144
+ server.notification({
145
+ method: "notifications/resources/updated",
146
+ params: { uri },
147
+ });
148
+ }
149
+ }, 10000);
150
+ }
151
+ const maybeAppendSessionId = sessionId ? ` - SessionId ${sessionId}` : "";
152
+ const messages = [
153
+ { level: "debug", data: `Debug-level message${maybeAppendSessionId}` },
154
+ { level: "info", data: `Info-level message${maybeAppendSessionId}` },
155
+ { level: "notice", data: `Notice-level message${maybeAppendSessionId}` },
156
+ { level: "warning", data: `Warning-level message${maybeAppendSessionId}` },
157
+ { level: "error", data: `Error-level message${maybeAppendSessionId}` },
158
+ { level: "critical", data: `Critical-level message${maybeAppendSessionId}` },
159
+ { level: "alert", data: `Alert level-message${maybeAppendSessionId}` },
160
+ { level: "emergency", data: `Emergency-level message${maybeAppendSessionId}` },
161
+ ];
162
+ if (!logsUpdateInterval) {
163
+ console.error("Starting logs update interval");
164
+ logsUpdateInterval = setInterval(async () => {
165
+ await server.sendLoggingMessage(messages[Math.floor(Math.random() * messages.length)], sessionId);
166
+ }, 15000);
167
+ }
155
168
  };
156
- // Set up update interval for random log messages
157
- logsUpdateInterval = setInterval(() => {
158
- let message = {
159
- method: "notifications/message",
160
- params: messages[Math.floor(Math.random() * messages.length)],
161
- };
162
- if (!isMessageIgnored(message.params.level))
163
- server.notification(message);
164
- }, 20000);
165
169
  // Helper method to request sampling from client
166
170
  const requestSampling = async (context, uri, maxTokens = 100) => {
167
171
  const request = {
@@ -420,11 +424,6 @@ export const createServer = () => {
420
424
  description: "Returns a resource reference that can be used by MCP clients",
421
425
  inputSchema: zodToJsonSchema(GetResourceReferenceSchema),
422
426
  },
423
- {
424
- name: ToolName.ELICITATION,
425
- description: "Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.",
426
- inputSchema: zodToJsonSchema(ElicitationSchema),
427
- },
428
427
  {
429
428
  name: ToolName.GET_RESOURCE_LINKS,
430
429
  description: "Returns multiple resource links that reference different types of resources",
@@ -437,9 +436,21 @@ export const createServer = () => {
437
436
  outputSchema: zodToJsonSchema(StructuredContentSchema.output),
438
437
  },
439
438
  ];
439
+ if (clientCapabilities.roots)
440
+ tools.push({
441
+ name: ToolName.LIST_ROOTS,
442
+ description: "Lists the current MCP roots provided by the client. Demonstrates the roots protocol capability even though this server doesn't access files.",
443
+ inputSchema: zodToJsonSchema(ListRootsSchema),
444
+ });
445
+ if (clientCapabilities.elicitation)
446
+ tools.push({
447
+ name: ToolName.ELICITATION,
448
+ description: "Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.",
449
+ inputSchema: zodToJsonSchema(ElicitationSchema),
450
+ });
440
451
  return { tools };
441
452
  });
442
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
453
+ server.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
443
454
  const { name, arguments: args } = request.params;
444
455
  if (name === ToolName.ECHO) {
445
456
  const validatedArgs = EchoSchema.parse(args);
@@ -474,7 +485,7 @@ export const createServer = () => {
474
485
  total: steps,
475
486
  progressToken,
476
487
  },
477
- });
488
+ }, { relatedRequestId: extra.requestId });
478
489
  }
479
490
  }
480
491
  return {
@@ -687,6 +698,47 @@ export const createServer = () => {
687
698
  structuredContent: weather
688
699
  };
689
700
  }
701
+ if (name === ToolName.LIST_ROOTS) {
702
+ ListRootsSchema.parse(args);
703
+ if (!clientSupportsRoots) {
704
+ return {
705
+ content: [
706
+ {
707
+ type: "text",
708
+ text: "The MCP client does not support the roots protocol.\n\n" +
709
+ "This means the server cannot access information about the client's workspace directories or file system roots."
710
+ }
711
+ ]
712
+ };
713
+ }
714
+ if (currentRoots.length === 0) {
715
+ return {
716
+ content: [
717
+ {
718
+ type: "text",
719
+ text: "The client supports roots but no roots are currently configured.\n\n" +
720
+ "This could mean:\n" +
721
+ "1. The client hasn't provided any roots yet\n" +
722
+ "2. The client provided an empty roots list\n" +
723
+ "3. The roots configuration is still being loaded"
724
+ }
725
+ ]
726
+ };
727
+ }
728
+ const rootsList = currentRoots.map((root, index) => {
729
+ return `${index + 1}. ${root.name || 'Unnamed Root'}\n URI: ${root.uri}`;
730
+ }).join('\n\n');
731
+ return {
732
+ content: [
733
+ {
734
+ type: "text",
735
+ text: `Current MCP Roots (${currentRoots.length} total):\n\n${rootsList}\n\n` +
736
+ "Note: This server demonstrates the roots protocol capability but doesn't actually access files. " +
737
+ "The roots are provided by the MCP client and can be used by servers that need file system access."
738
+ }
739
+ ]
740
+ };
741
+ }
690
742
  throw new Error(`Unknown tool: ${name}`);
691
743
  });
692
744
  server.setRequestHandler(CompleteRequestSchema, async (request) => {
@@ -709,20 +761,68 @@ export const createServer = () => {
709
761
  }
710
762
  throw new Error(`Unknown reference type`);
711
763
  });
712
- server.setRequestHandler(SetLevelRequestSchema, async (request) => {
713
- const { level } = request.params;
714
- logLevel = level;
715
- // Demonstrate different log levels
716
- await server.notification({
717
- method: "notifications/message",
718
- params: {
719
- level: "debug",
720
- logger: "test-server",
721
- data: `Logging level set to: ${logLevel}`,
722
- },
723
- });
724
- return {};
764
+ // Roots protocol handlers
765
+ server.setNotificationHandler(RootsListChangedNotificationSchema, async () => {
766
+ try {
767
+ // Request the updated roots list from the client
768
+ const response = await server.listRoots();
769
+ if (response && 'roots' in response) {
770
+ currentRoots = response.roots;
771
+ // Log the roots update for demonstration
772
+ await server.sendLoggingMessage({
773
+ level: "info",
774
+ logger: "everything-server",
775
+ data: `Roots updated: ${currentRoots.length} root(s) received from client`,
776
+ }, sessionId);
777
+ }
778
+ }
779
+ catch (error) {
780
+ await server.sendLoggingMessage({
781
+ level: "error",
782
+ logger: "everything-server",
783
+ data: `Failed to request roots from client: ${error instanceof Error ? error.message : String(error)}`,
784
+ }, sessionId);
785
+ }
725
786
  });
787
+ // Handle post-initialization setup for roots
788
+ server.oninitialized = async () => {
789
+ clientCapabilities = server.getClientCapabilities();
790
+ if (clientCapabilities?.roots) {
791
+ clientSupportsRoots = true;
792
+ try {
793
+ const response = await server.listRoots();
794
+ if (response && 'roots' in response) {
795
+ currentRoots = response.roots;
796
+ await server.sendLoggingMessage({
797
+ level: "info",
798
+ logger: "everything-server",
799
+ data: `Initial roots received: ${currentRoots.length} root(s) from client`,
800
+ }, sessionId);
801
+ }
802
+ else {
803
+ await server.sendLoggingMessage({
804
+ level: "warning",
805
+ logger: "everything-server",
806
+ data: "Client returned no roots set",
807
+ }, sessionId);
808
+ }
809
+ }
810
+ catch (error) {
811
+ await server.sendLoggingMessage({
812
+ level: "error",
813
+ logger: "everything-server",
814
+ data: `Failed to request initial roots from client: ${error instanceof Error ? error.message : String(error)}`,
815
+ }, sessionId);
816
+ }
817
+ }
818
+ else {
819
+ await server.sendLoggingMessage({
820
+ level: "info",
821
+ logger: "everything-server",
822
+ data: "Client does not support MCP roots protocol",
823
+ }, sessionId);
824
+ }
825
+ };
726
826
  const cleanup = async () => {
727
827
  if (subsUpdateInterval)
728
828
  clearInterval(subsUpdateInterval);
@@ -731,6 +831,6 @@ export const createServer = () => {
731
831
  if (stdErrUpdateInterval)
732
832
  clearInterval(stdErrUpdateInterval);
733
833
  };
734
- return { server, cleanup };
834
+ return { server, cleanup, startNotificationIntervals };
735
835
  };
736
836
  const MCP_TINY_IMAGE = "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";
package/dist/sse.js CHANGED
@@ -6,7 +6,7 @@ const app = express();
6
6
  const transports = new Map();
7
7
  app.get("/sse", async (req, res) => {
8
8
  let transport;
9
- const { server, cleanup } = createServer();
9
+ const { server, cleanup, startNotificationIntervals } = createServer();
10
10
  if (req?.query?.sessionId) {
11
11
  const sessionId = req?.query?.sessionId;
12
12
  transport = transports.get(sessionId);
@@ -19,6 +19,8 @@ app.get("/sse", async (req, res) => {
19
19
  // Connect server to transport
20
20
  await server.connect(transport);
21
21
  console.error("Client Connected: ", transport.sessionId);
22
+ // Start notification intervals after client connects
23
+ startNotificationIntervals(transport.sessionId);
22
24
  // Handle close of connection
23
25
  server.onclose = async () => {
24
26
  console.error("Client Disconnected: ", transport.sessionId);
package/dist/stdio.js CHANGED
@@ -4,8 +4,9 @@ import { createServer } from "./everything.js";
4
4
  console.error('Starting default (STDIO) server...');
5
5
  async function main() {
6
6
  const transport = new StdioServerTransport();
7
- const { server, cleanup } = createServer();
7
+ const { server, cleanup, startNotificationIntervals } = createServer();
8
8
  await server.connect(transport);
9
+ startNotificationIntervals();
9
10
  // Cleanup on exit
10
11
  process.on("SIGINT", async () => {
11
12
  await cleanup();
@@ -17,7 +17,7 @@ app.post('/mcp', async (req, res) => {
17
17
  transport = transports.get(sessionId);
18
18
  }
19
19
  else if (!sessionId) {
20
- const { server, cleanup } = createServer();
20
+ const { server, cleanup, startNotificationIntervals } = createServer();
21
21
  // New initialization request
22
22
  const eventStore = new InMemoryEventStore();
23
23
  transport = new StreamableHTTPServerTransport({
@@ -43,6 +43,8 @@ app.post('/mcp', async (req, res) => {
43
43
  // so responses can flow back through the same transport
44
44
  await server.connect(transport);
45
45
  await transport.handleRequest(req, res);
46
+ // Wait until initialize is complete and transport will have a sessionId
47
+ startNotificationIntervals(transport.sessionId);
46
48
  return; // Already handled
47
49
  }
48
50
  else {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelcontextprotocol/server-everything",
3
- "version": "2025.8.4",
3
+ "version": "2025.9.12",
4
4
  "description": "MCP server that exercises all the features of the MCP protocol",
5
5
  "license": "MIT",
6
6
  "author": "Anthropic, PBC (https://anthropic.com)",
@@ -22,7 +22,7 @@
22
22
  "start:streamableHttp": "node dist/streamableHttp.js"
23
23
  },
24
24
  "dependencies": {
25
- "@modelcontextprotocol/sdk": "^1.12.0",
25
+ "@modelcontextprotocol/sdk": "^1.18.0",
26
26
  "express": "^4.21.1",
27
27
  "zod": "^3.23.8",
28
28
  "zod-to-json-schema": "^3.23.5"