@modelcontextprotocol/server-everything 2025.4.25 → 2025.5.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
@@ -126,7 +126,7 @@ The server sends random-leveled log messages every 15 seconds, e.g.:
126
126
  }
127
127
  ```
128
128
 
129
- ## Usage with Claude Desktop
129
+ ## Usage with Claude Desktop (uses [stdio Transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#stdio))
130
130
 
131
131
  Add to your `claude_desktop_config.json`:
132
132
 
@@ -172,3 +172,46 @@ Optionally, you can add it to a file called `.vscode/mcp.json` in your workspace
172
172
  }
173
173
  }
174
174
  ```
175
+
176
+ ## Running from source with [HTTP+SSE Transport](https://modelcontextprotocol.io/specification/2024-11-05/basic/transports#http-with-sse) (deprecated as of [2025-03-26](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports))
177
+
178
+ ```shell
179
+ cd src/everything
180
+ npm install
181
+ npm run start:sse
182
+ ```
183
+
184
+ ## Run from source with [Streamable HTTP Transport](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http)
185
+
186
+ ```shell
187
+ cd src/everything
188
+ npm install
189
+ npm run start:streamableHttp
190
+ ```
191
+
192
+ ## Running as an installed package
193
+ ### Install
194
+ ```shell
195
+ npm install -g @modelcontextprotocol/server-everything@latest
196
+ ````
197
+
198
+ ### Run the default (stdio) server
199
+ ```shell
200
+ npx @modelcontextprotocol/server-everything
201
+ ```
202
+
203
+ ### Or specify stdio explicitly
204
+ ```shell
205
+ npx @modelcontextprotocol/server-everything stdio
206
+ ```
207
+
208
+ ### Run the SSE server
209
+ ```shell
210
+ npx @modelcontextprotocol/server-everything sse
211
+ ```
212
+
213
+ ### Run the streamable HTTP server
214
+ ```shell
215
+ npx @modelcontextprotocol/server-everything streamableHttp
216
+ ```
217
+
package/dist/index.js CHANGED
@@ -1,18 +1,36 @@
1
1
  #!/usr/bin/env node
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
- import { createServer } from "./everything.js";
4
- async function main() {
5
- const transport = new StdioServerTransport();
6
- const { server, cleanup } = createServer();
7
- await server.connect(transport);
8
- // Cleanup on exit
9
- process.on("SIGINT", async () => {
10
- await cleanup();
11
- await server.close();
12
- process.exit(0);
13
- });
2
+ // Parse command line arguments first
3
+ const args = process.argv.slice(2);
4
+ const scriptName = args[0] || 'stdio';
5
+ async function run() {
6
+ try {
7
+ // Dynamically import only the requested module to prevent all modules from initializing
8
+ switch (scriptName) {
9
+ case 'stdio':
10
+ // Import and run the default server
11
+ await import('./stdio.js');
12
+ break;
13
+ case 'sse':
14
+ // Import and run the SSE server
15
+ await import('./sse.js');
16
+ break;
17
+ case 'streamableHttp':
18
+ // Import and run the streamable HTTP server
19
+ await import('./streamableHttp.js');
20
+ break;
21
+ default:
22
+ console.error(`Unknown script: ${scriptName}`);
23
+ console.log('Available scripts:');
24
+ console.log('- stdio');
25
+ console.log('- sse');
26
+ console.log('- streamableHttp');
27
+ process.exit(1);
28
+ }
29
+ }
30
+ catch (error) {
31
+ console.error('Error running script:', error);
32
+ process.exit(1);
33
+ }
14
34
  }
15
- main().catch((error) => {
16
- console.error("Server error:", error);
17
- process.exit(1);
18
- });
35
+ run();
36
+ export {};
package/dist/sse.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
2
2
  import express from "express";
3
3
  import { createServer } from "./everything.js";
4
+ console.error('Starting SSE server...');
4
5
  const app = express();
5
6
  const { server, cleanup } = createServer();
6
7
  let transport;
package/dist/stdio.js ADDED
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./everything.js";
4
+ console.error('Starting default (STDIO) server...');
5
+ async function main() {
6
+ const transport = new StdioServerTransport();
7
+ const { server, cleanup } = createServer();
8
+ await server.connect(transport);
9
+ // Cleanup on exit
10
+ process.on("SIGINT", async () => {
11
+ await cleanup();
12
+ await server.close();
13
+ process.exit(0);
14
+ });
15
+ }
16
+ main().catch((error) => {
17
+ console.error("Server error:", error);
18
+ process.exit(1);
19
+ });
@@ -0,0 +1,161 @@
1
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
2
+ import { InMemoryEventStore } from '@modelcontextprotocol/sdk/examples/shared/inMemoryEventStore.js';
3
+ import express from "express";
4
+ import { createServer } from "./everything.js";
5
+ import { randomUUID } from 'node:crypto';
6
+ console.error('Starting Streamable HTTP server...');
7
+ const app = express();
8
+ const { server, cleanup } = createServer();
9
+ const transports = {};
10
+ app.post('/mcp', async (req, res) => {
11
+ console.log('Received MCP POST request');
12
+ try {
13
+ // Check for existing session ID
14
+ const sessionId = req.headers['mcp-session-id'];
15
+ let transport;
16
+ if (sessionId && transports[sessionId]) {
17
+ // Reuse existing transport
18
+ transport = transports[sessionId];
19
+ }
20
+ else if (!sessionId) {
21
+ // New initialization request
22
+ const eventStore = new InMemoryEventStore();
23
+ transport = new StreamableHTTPServerTransport({
24
+ sessionIdGenerator: () => randomUUID(),
25
+ eventStore, // Enable resumability
26
+ onsessioninitialized: (sessionId) => {
27
+ // Store the transport by session ID when session is initialized
28
+ // This avoids race conditions where requests might come in before the session is stored
29
+ console.log(`Session initialized with ID: ${sessionId}`);
30
+ transports[sessionId] = transport;
31
+ }
32
+ });
33
+ // Set up onclose handler to clean up transport when closed
34
+ transport.onclose = () => {
35
+ const sid = transport.sessionId;
36
+ if (sid && transports[sid]) {
37
+ console.log(`Transport closed for session ${sid}, removing from transports map`);
38
+ delete transports[sid];
39
+ }
40
+ };
41
+ // Connect the transport to the MCP server BEFORE handling the request
42
+ // so responses can flow back through the same transport
43
+ await server.connect(transport);
44
+ await transport.handleRequest(req, res);
45
+ return; // Already handled
46
+ }
47
+ else {
48
+ // Invalid request - no session ID or not initialization request
49
+ res.status(400).json({
50
+ jsonrpc: '2.0',
51
+ error: {
52
+ code: -32000,
53
+ message: 'Bad Request: No valid session ID provided',
54
+ },
55
+ id: req?.body?.id,
56
+ });
57
+ return;
58
+ }
59
+ // Handle the request with existing transport - no need to reconnect
60
+ // The existing transport is already connected to the server
61
+ await transport.handleRequest(req, res);
62
+ }
63
+ catch (error) {
64
+ console.error('Error handling MCP request:', error);
65
+ if (!res.headersSent) {
66
+ res.status(500).json({
67
+ jsonrpc: '2.0',
68
+ error: {
69
+ code: -32603,
70
+ message: 'Internal server error',
71
+ },
72
+ id: req?.body?.id,
73
+ });
74
+ return;
75
+ }
76
+ }
77
+ });
78
+ // Handle GET requests for SSE streams (using built-in support from StreamableHTTP)
79
+ app.get('/mcp', async (req, res) => {
80
+ console.log('Received MCP GET request');
81
+ const sessionId = req.headers['mcp-session-id'];
82
+ if (!sessionId || !transports[sessionId]) {
83
+ res.status(400).json({
84
+ jsonrpc: '2.0',
85
+ error: {
86
+ code: -32000,
87
+ message: 'Bad Request: No valid session ID provided',
88
+ },
89
+ id: req?.body?.id,
90
+ });
91
+ return;
92
+ }
93
+ // Check for Last-Event-ID header for resumability
94
+ const lastEventId = req.headers['last-event-id'];
95
+ if (lastEventId) {
96
+ console.log(`Client reconnecting with Last-Event-ID: ${lastEventId}`);
97
+ }
98
+ else {
99
+ console.log(`Establishing new SSE stream for session ${sessionId}`);
100
+ }
101
+ const transport = transports[sessionId];
102
+ await transport.handleRequest(req, res);
103
+ });
104
+ // Handle DELETE requests for session termination (according to MCP spec)
105
+ app.delete('/mcp', async (req, res) => {
106
+ const sessionId = req.headers['mcp-session-id'];
107
+ if (!sessionId || !transports[sessionId]) {
108
+ res.status(400).json({
109
+ jsonrpc: '2.0',
110
+ error: {
111
+ code: -32000,
112
+ message: 'Bad Request: No valid session ID provided',
113
+ },
114
+ id: req?.body?.id,
115
+ });
116
+ return;
117
+ }
118
+ console.log(`Received session termination request for session ${sessionId}`);
119
+ try {
120
+ const transport = transports[sessionId];
121
+ await transport.handleRequest(req, res);
122
+ }
123
+ catch (error) {
124
+ console.error('Error handling session termination:', error);
125
+ if (!res.headersSent) {
126
+ res.status(500).json({
127
+ jsonrpc: '2.0',
128
+ error: {
129
+ code: -32603,
130
+ message: 'Error handling session termination',
131
+ },
132
+ id: req?.body?.id,
133
+ });
134
+ return;
135
+ }
136
+ }
137
+ });
138
+ // Start the server
139
+ const PORT = process.env.PORT || 3001;
140
+ app.listen(PORT, () => {
141
+ console.log(`MCP Streamable HTTP Server listening on port ${PORT}`);
142
+ });
143
+ // Handle server shutdown
144
+ process.on('SIGINT', async () => {
145
+ console.log('Shutting down server...');
146
+ // Close all active transports to properly clean up resources
147
+ for (const sessionId in transports) {
148
+ try {
149
+ console.log(`Closing transport for session ${sessionId}`);
150
+ await transports[sessionId].close();
151
+ delete transports[sessionId];
152
+ }
153
+ catch (error) {
154
+ console.error(`Error closing transport for session ${sessionId}:`, error);
155
+ }
156
+ }
157
+ await cleanup();
158
+ await server.close();
159
+ console.log('Server shutdown complete');
160
+ process.exit(0);
161
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelcontextprotocol/server-everything",
3
- "version": "2025.4.25",
3
+ "version": "2025.5.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)",
@@ -18,10 +18,11 @@
18
18
  "prepare": "npm run build",
19
19
  "watch": "tsc --watch",
20
20
  "start": "node dist/index.js",
21
- "start:sse": "node dist/sse.js"
21
+ "start:sse": "node dist/sse.js",
22
+ "start:streamableHttp": "node dist/streamableHttp.js"
22
23
  },
23
24
  "dependencies": {
24
- "@modelcontextprotocol/sdk": "^1.9.0",
25
+ "@modelcontextprotocol/sdk": "^1.11.0",
25
26
  "express": "^4.21.1",
26
27
  "zod": "^3.23.8",
27
28
  "zod-to-json-schema": "^3.23.5"