@modelcontextprotocol/sdk 1.8.0 → 1.10.0

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.
Files changed (188) hide show
  1. package/README.md +339 -38
  2. package/dist/cjs/client/auth.d.ts +2 -1
  3. package/dist/cjs/client/auth.d.ts.map +1 -1
  4. package/dist/cjs/client/auth.js +3 -1
  5. package/dist/cjs/client/auth.js.map +1 -1
  6. package/dist/cjs/client/index.d.ts +49 -1
  7. package/dist/cjs/client/index.d.ts.map +1 -1
  8. package/dist/cjs/client/index.js +9 -4
  9. package/dist/cjs/client/index.js.map +1 -1
  10. package/dist/cjs/client/streamableHttp.d.ts +124 -0
  11. package/dist/cjs/client/streamableHttp.d.ts.map +1 -0
  12. package/dist/cjs/client/streamableHttp.js +353 -0
  13. package/dist/cjs/client/streamableHttp.js.map +1 -0
  14. package/dist/cjs/examples/client/simpleStreamableHttp.d.ts +2 -0
  15. package/dist/cjs/examples/client/simpleStreamableHttp.d.ts.map +1 -0
  16. package/dist/cjs/examples/client/simpleStreamableHttp.js +448 -0
  17. package/dist/cjs/examples/client/simpleStreamableHttp.js.map +1 -0
  18. package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.d.ts +2 -0
  19. package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.d.ts.map +1 -0
  20. package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js +168 -0
  21. package/dist/cjs/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -0
  22. package/dist/cjs/examples/server/jsonResponseStreamableHttp.d.ts +2 -0
  23. package/dist/cjs/examples/server/jsonResponseStreamableHttp.d.ts.map +1 -0
  24. package/dist/cjs/examples/server/jsonResponseStreamableHttp.js +139 -0
  25. package/dist/cjs/examples/server/jsonResponseStreamableHttp.js.map +1 -0
  26. package/dist/cjs/examples/server/simpleSseServer.d.ts +2 -0
  27. package/dist/cjs/examples/server/simpleSseServer.d.ts.map +1 -0
  28. package/dist/cjs/examples/server/simpleSseServer.js +148 -0
  29. package/dist/cjs/examples/server/simpleSseServer.js.map +1 -0
  30. package/dist/cjs/examples/server/simpleStreamableHttp.d.ts +2 -0
  31. package/dist/cjs/examples/server/simpleStreamableHttp.d.ts.map +1 -0
  32. package/dist/cjs/examples/server/simpleStreamableHttp.js +250 -0
  33. package/dist/cjs/examples/server/simpleStreamableHttp.js.map +1 -0
  34. package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.d.ts +2 -0
  35. package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.d.ts.map +1 -0
  36. package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js +229 -0
  37. package/dist/cjs/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -0
  38. package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.d.ts +2 -0
  39. package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.d.ts.map +1 -0
  40. package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js +112 -0
  41. package/dist/cjs/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -0
  42. package/dist/cjs/examples/shared/inMemoryEventStore.d.ts +31 -0
  43. package/dist/cjs/examples/shared/inMemoryEventStore.d.ts.map +1 -0
  44. package/dist/cjs/examples/shared/inMemoryEventStore.js +69 -0
  45. package/dist/cjs/examples/shared/inMemoryEventStore.js.map +1 -0
  46. package/dist/cjs/inMemory.d.ts +13 -3
  47. package/dist/cjs/inMemory.d.ts.map +1 -1
  48. package/dist/cjs/inMemory.js +9 -7
  49. package/dist/cjs/inMemory.js.map +1 -1
  50. package/dist/cjs/server/auth/handlers/token.d.ts.map +1 -1
  51. package/dist/cjs/server/auth/handlers/token.js +10 -5
  52. package/dist/cjs/server/auth/handlers/token.js.map +1 -1
  53. package/dist/cjs/server/auth/provider.d.ts +9 -1
  54. package/dist/cjs/server/auth/provider.d.ts.map +1 -1
  55. package/dist/cjs/server/auth/providers/proxyProvider.d.ts +43 -0
  56. package/dist/cjs/server/auth/providers/proxyProvider.d.ts.map +1 -0
  57. package/dist/cjs/server/auth/providers/proxyProvider.js +145 -0
  58. package/dist/cjs/server/auth/providers/proxyProvider.js.map +1 -0
  59. package/dist/cjs/server/auth/router.d.ts +6 -0
  60. package/dist/cjs/server/auth/router.d.ts.map +1 -1
  61. package/dist/cjs/server/auth/router.js +5 -4
  62. package/dist/cjs/server/auth/router.js.map +1 -1
  63. package/dist/cjs/server/auth/types.d.ts +5 -0
  64. package/dist/cjs/server/auth/types.d.ts.map +1 -1
  65. package/dist/cjs/server/index.d.ts +12 -0
  66. package/dist/cjs/server/index.d.ts.map +1 -1
  67. package/dist/cjs/server/mcp.d.ts +100 -19
  68. package/dist/cjs/server/mcp.d.ts.map +1 -1
  69. package/dist/cjs/server/mcp.js +154 -12
  70. package/dist/cjs/server/mcp.js.map +1 -1
  71. package/dist/cjs/server/sse.d.ts +10 -3
  72. package/dist/cjs/server/sse.d.ts.map +1 -1
  73. package/dist/cjs/server/sse.js +14 -5
  74. package/dist/cjs/server/sse.js.map +1 -1
  75. package/dist/cjs/server/streamableHttp.d.ts +146 -0
  76. package/dist/cjs/server/streamableHttp.d.ts.map +1 -0
  77. package/dist/cjs/server/streamableHttp.js +538 -0
  78. package/dist/cjs/server/streamableHttp.js.map +1 -0
  79. package/dist/cjs/shared/protocol.d.ts +31 -5
  80. package/dist/cjs/shared/protocol.d.ts.map +1 -1
  81. package/dist/cjs/shared/protocol.js +29 -19
  82. package/dist/cjs/shared/protocol.js.map +1 -1
  83. package/dist/cjs/shared/stdio.js +1 -1
  84. package/dist/cjs/shared/stdio.js.map +1 -1
  85. package/dist/cjs/shared/transport.d.ts +32 -3
  86. package/dist/cjs/shared/transport.d.ts.map +1 -1
  87. package/dist/cjs/shared/uriTemplate.d.ts +1 -0
  88. package/dist/cjs/shared/uriTemplate.d.ts.map +1 -1
  89. package/dist/cjs/shared/uriTemplate.js +3 -0
  90. package/dist/cjs/shared/uriTemplate.js.map +1 -1
  91. package/dist/cjs/types.d.ts +1990 -35
  92. package/dist/cjs/types.d.ts.map +1 -1
  93. package/dist/cjs/types.js +38 -4
  94. package/dist/cjs/types.js.map +1 -1
  95. package/dist/esm/client/auth.d.ts +2 -1
  96. package/dist/esm/client/auth.d.ts.map +1 -1
  97. package/dist/esm/client/auth.js +3 -1
  98. package/dist/esm/client/auth.js.map +1 -1
  99. package/dist/esm/client/index.d.ts +49 -1
  100. package/dist/esm/client/index.d.ts.map +1 -1
  101. package/dist/esm/client/index.js +9 -4
  102. package/dist/esm/client/index.js.map +1 -1
  103. package/dist/esm/client/streamableHttp.d.ts +124 -0
  104. package/dist/esm/client/streamableHttp.d.ts.map +1 -0
  105. package/dist/esm/client/streamableHttp.js +348 -0
  106. package/dist/esm/client/streamableHttp.js.map +1 -0
  107. package/dist/esm/examples/client/simpleStreamableHttp.d.ts +2 -0
  108. package/dist/esm/examples/client/simpleStreamableHttp.d.ts.map +1 -0
  109. package/dist/esm/examples/client/simpleStreamableHttp.js +446 -0
  110. package/dist/esm/examples/client/simpleStreamableHttp.js.map +1 -0
  111. package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.d.ts +2 -0
  112. package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.d.ts.map +1 -0
  113. package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js +166 -0
  114. package/dist/esm/examples/client/streamableHttpWithSseFallbackClient.js.map +1 -0
  115. package/dist/esm/examples/server/jsonResponseStreamableHttp.d.ts +2 -0
  116. package/dist/esm/examples/server/jsonResponseStreamableHttp.d.ts.map +1 -0
  117. package/dist/esm/examples/server/jsonResponseStreamableHttp.js +134 -0
  118. package/dist/esm/examples/server/jsonResponseStreamableHttp.js.map +1 -0
  119. package/dist/esm/examples/server/simpleSseServer.d.ts +2 -0
  120. package/dist/esm/examples/server/simpleSseServer.d.ts.map +1 -0
  121. package/dist/esm/examples/server/simpleSseServer.js +143 -0
  122. package/dist/esm/examples/server/simpleSseServer.js.map +1 -0
  123. package/dist/esm/examples/server/simpleStreamableHttp.d.ts +2 -0
  124. package/dist/esm/examples/server/simpleStreamableHttp.d.ts.map +1 -0
  125. package/dist/esm/examples/server/simpleStreamableHttp.js +245 -0
  126. package/dist/esm/examples/server/simpleStreamableHttp.js.map +1 -0
  127. package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.d.ts +2 -0
  128. package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.d.ts.map +1 -0
  129. package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js +224 -0
  130. package/dist/esm/examples/server/sseAndStreamableHttpCompatibleServer.js.map +1 -0
  131. package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.d.ts +2 -0
  132. package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.d.ts.map +1 -0
  133. package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js +107 -0
  134. package/dist/esm/examples/server/standaloneSseWithGetStreamableHttp.js.map +1 -0
  135. package/dist/esm/examples/shared/inMemoryEventStore.d.ts +31 -0
  136. package/dist/esm/examples/shared/inMemoryEventStore.d.ts.map +1 -0
  137. package/dist/esm/examples/shared/inMemoryEventStore.js +65 -0
  138. package/dist/esm/examples/shared/inMemoryEventStore.js.map +1 -0
  139. package/dist/esm/inMemory.d.ts +13 -3
  140. package/dist/esm/inMemory.d.ts.map +1 -1
  141. package/dist/esm/inMemory.js +9 -7
  142. package/dist/esm/inMemory.js.map +1 -1
  143. package/dist/esm/server/auth/handlers/token.d.ts.map +1 -1
  144. package/dist/esm/server/auth/handlers/token.js +10 -5
  145. package/dist/esm/server/auth/handlers/token.js.map +1 -1
  146. package/dist/esm/server/auth/provider.d.ts +9 -1
  147. package/dist/esm/server/auth/provider.d.ts.map +1 -1
  148. package/dist/esm/server/auth/providers/proxyProvider.d.ts +43 -0
  149. package/dist/esm/server/auth/providers/proxyProvider.d.ts.map +1 -0
  150. package/dist/esm/server/auth/providers/proxyProvider.js +141 -0
  151. package/dist/esm/server/auth/providers/proxyProvider.js.map +1 -0
  152. package/dist/esm/server/auth/router.d.ts +6 -0
  153. package/dist/esm/server/auth/router.d.ts.map +1 -1
  154. package/dist/esm/server/auth/router.js +5 -4
  155. package/dist/esm/server/auth/router.js.map +1 -1
  156. package/dist/esm/server/auth/types.d.ts +5 -0
  157. package/dist/esm/server/auth/types.d.ts.map +1 -1
  158. package/dist/esm/server/index.d.ts +12 -0
  159. package/dist/esm/server/index.d.ts.map +1 -1
  160. package/dist/esm/server/mcp.d.ts +100 -19
  161. package/dist/esm/server/mcp.d.ts.map +1 -1
  162. package/dist/esm/server/mcp.js +154 -12
  163. package/dist/esm/server/mcp.js.map +1 -1
  164. package/dist/esm/server/sse.d.ts +10 -3
  165. package/dist/esm/server/sse.d.ts.map +1 -1
  166. package/dist/esm/server/sse.js +14 -5
  167. package/dist/esm/server/sse.js.map +1 -1
  168. package/dist/esm/server/streamableHttp.d.ts +146 -0
  169. package/dist/esm/server/streamableHttp.d.ts.map +1 -0
  170. package/dist/esm/server/streamableHttp.js +531 -0
  171. package/dist/esm/server/streamableHttp.js.map +1 -0
  172. package/dist/esm/shared/protocol.d.ts +31 -5
  173. package/dist/esm/shared/protocol.d.ts.map +1 -1
  174. package/dist/esm/shared/protocol.js +30 -20
  175. package/dist/esm/shared/protocol.js.map +1 -1
  176. package/dist/esm/shared/stdio.js +1 -1
  177. package/dist/esm/shared/stdio.js.map +1 -1
  178. package/dist/esm/shared/transport.d.ts +32 -3
  179. package/dist/esm/shared/transport.d.ts.map +1 -1
  180. package/dist/esm/shared/uriTemplate.d.ts +1 -0
  181. package/dist/esm/shared/uriTemplate.d.ts.map +1 -1
  182. package/dist/esm/shared/uriTemplate.js +3 -0
  183. package/dist/esm/shared/uriTemplate.js.map +1 -1
  184. package/dist/esm/types.d.ts +1990 -35
  185. package/dist/esm/types.d.ts.map +1 -1
  186. package/dist/esm/types.js +30 -2
  187. package/dist/esm/types.js.map +1 -1
  188. package/package.json +2 -2
@@ -0,0 +1,134 @@
1
+ import express from 'express';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { McpServer } from '../../server/mcp.js';
4
+ import { StreamableHTTPServerTransport } from '../../server/streamableHttp.js';
5
+ import { z } from 'zod';
6
+ import { isInitializeRequest } from '../../types.js';
7
+ // Create an MCP server with implementation details
8
+ const server = new McpServer({
9
+ name: 'json-response-streamable-http-server',
10
+ version: '1.0.0',
11
+ }, {
12
+ capabilities: {
13
+ logging: {},
14
+ }
15
+ });
16
+ // Register a simple tool that returns a greeting
17
+ server.tool('greet', 'A simple greeting tool', {
18
+ name: z.string().describe('Name to greet'),
19
+ }, async ({ name }) => {
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: `Hello, ${name}!`,
25
+ },
26
+ ],
27
+ };
28
+ });
29
+ // Register a tool that sends multiple greetings with notifications
30
+ server.tool('multi-greet', 'A tool that sends different greetings with delays between them', {
31
+ name: z.string().describe('Name to greet'),
32
+ }, async ({ name }, { sendNotification }) => {
33
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
34
+ await sendNotification({
35
+ method: "notifications/message",
36
+ params: { level: "debug", data: `Starting multi-greet for ${name}` }
37
+ });
38
+ await sleep(1000); // Wait 1 second before first greeting
39
+ await sendNotification({
40
+ method: "notifications/message",
41
+ params: { level: "info", data: `Sending first greeting to ${name}` }
42
+ });
43
+ await sleep(1000); // Wait another second before second greeting
44
+ await sendNotification({
45
+ method: "notifications/message",
46
+ params: { level: "info", data: `Sending second greeting to ${name}` }
47
+ });
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: `Good morning, ${name}!`,
53
+ }
54
+ ],
55
+ };
56
+ });
57
+ const app = express();
58
+ app.use(express.json());
59
+ // Map to store transports by session ID
60
+ const transports = {};
61
+ app.post('/mcp', async (req, res) => {
62
+ console.log('Received MCP request:', req.body);
63
+ try {
64
+ // Check for existing session ID
65
+ const sessionId = req.headers['mcp-session-id'];
66
+ let transport;
67
+ if (sessionId && transports[sessionId]) {
68
+ // Reuse existing transport
69
+ transport = transports[sessionId];
70
+ }
71
+ else if (!sessionId && isInitializeRequest(req.body)) {
72
+ // New initialization request - use JSON response mode
73
+ transport = new StreamableHTTPServerTransport({
74
+ sessionIdGenerator: () => randomUUID(),
75
+ enableJsonResponse: true, // Enable JSON response mode
76
+ onsessioninitialized: (sessionId) => {
77
+ // Store the transport by session ID when session is initialized
78
+ // This avoids race conditions where requests might come in before the session is stored
79
+ console.log(`Session initialized with ID: ${sessionId}`);
80
+ transports[sessionId] = transport;
81
+ }
82
+ });
83
+ // Connect the transport to the MCP server BEFORE handling the request
84
+ await server.connect(transport);
85
+ await transport.handleRequest(req, res, req.body);
86
+ return; // Already handled
87
+ }
88
+ else {
89
+ // Invalid request - no session ID or not initialization request
90
+ res.status(400).json({
91
+ jsonrpc: '2.0',
92
+ error: {
93
+ code: -32000,
94
+ message: 'Bad Request: No valid session ID provided',
95
+ },
96
+ id: null,
97
+ });
98
+ return;
99
+ }
100
+ // Handle the request with existing transport - no need to reconnect
101
+ await transport.handleRequest(req, res, req.body);
102
+ }
103
+ catch (error) {
104
+ console.error('Error handling MCP request:', error);
105
+ if (!res.headersSent) {
106
+ res.status(500).json({
107
+ jsonrpc: '2.0',
108
+ error: {
109
+ code: -32603,
110
+ message: 'Internal server error',
111
+ },
112
+ id: null,
113
+ });
114
+ }
115
+ }
116
+ });
117
+ // Handle GET requests for SSE streams according to spec
118
+ app.get('/mcp', async (req, res) => {
119
+ // Since this is a very simple example, we don't support GET requests for this server
120
+ // The spec requires returning 405 Method Not Allowed in this case
121
+ res.status(405).set('Allow', 'POST').send('Method Not Allowed');
122
+ });
123
+ // Start the server
124
+ const PORT = 3000;
125
+ app.listen(PORT, () => {
126
+ console.log(`MCP Streamable HTTP Server listening on port ${PORT}`);
127
+ });
128
+ // Handle server shutdown
129
+ process.on('SIGINT', async () => {
130
+ console.log('Shutting down server...');
131
+ await server.close();
132
+ process.exit(0);
133
+ });
134
+ //# sourceMappingURL=jsonResponseStreamableHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonResponseStreamableHttp.js","sourceRoot":"","sources":["../../../../src/examples/server/jsonResponseStreamableHttp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=simpleSseServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleSseServer.d.ts","sourceRoot":"","sources":["../../../../src/examples/server/simpleSseServer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,143 @@
1
+ import express from 'express';
2
+ import { McpServer } from '../../server/mcp.js';
3
+ import { SSEServerTransport } from '../../server/sse.js';
4
+ import { z } from 'zod';
5
+ /**
6
+ * This example server demonstrates the deprecated HTTP+SSE transport
7
+ * (protocol version 2024-11-05). It mainly used for testing backward compatible clients.
8
+ *
9
+ * The server exposes two endpoints:
10
+ * - /mcp: For establishing the SSE stream (GET)
11
+ * - /messages: For receiving client messages (POST)
12
+ *
13
+ */
14
+ // Create an MCP server instance
15
+ const server = new McpServer({
16
+ name: 'simple-sse-server',
17
+ version: '1.0.0',
18
+ }, { capabilities: { logging: {} } });
19
+ server.tool('start-notification-stream', 'Starts sending periodic notifications', {
20
+ interval: z.number().describe('Interval in milliseconds between notifications').default(1000),
21
+ count: z.number().describe('Number of notifications to send').default(10),
22
+ }, async ({ interval, count }, { sendNotification }) => {
23
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
24
+ let counter = 0;
25
+ // Send the initial notification
26
+ await sendNotification({
27
+ method: "notifications/message",
28
+ params: {
29
+ level: "info",
30
+ data: `Starting notification stream with ${count} messages every ${interval}ms`
31
+ }
32
+ });
33
+ // Send periodic notifications
34
+ while (counter < count) {
35
+ counter++;
36
+ await sleep(interval);
37
+ try {
38
+ await sendNotification({
39
+ method: "notifications/message",
40
+ params: {
41
+ level: "info",
42
+ data: `Notification #${counter} at ${new Date().toISOString()}`
43
+ }
44
+ });
45
+ }
46
+ catch (error) {
47
+ console.error("Error sending notification:", error);
48
+ }
49
+ }
50
+ return {
51
+ content: [
52
+ {
53
+ type: 'text',
54
+ text: `Completed sending ${count} notifications every ${interval}ms`,
55
+ }
56
+ ],
57
+ };
58
+ });
59
+ const app = express();
60
+ app.use(express.json());
61
+ // Store transports by session ID
62
+ const transports = {};
63
+ // SSE endpoint for establishing the stream
64
+ app.get('/mcp', async (req, res) => {
65
+ console.log('Received GET request to /sse (establishing SSE stream)');
66
+ try {
67
+ // Create a new SSE transport for the client
68
+ // The endpoint for POST messages is '/messages'
69
+ const transport = new SSEServerTransport('/messages', res);
70
+ // Store the transport by session ID
71
+ const sessionId = transport.sessionId;
72
+ transports[sessionId] = transport;
73
+ // Set up onclose handler to clean up transport when closed
74
+ transport.onclose = () => {
75
+ console.log(`SSE transport closed for session ${sessionId}`);
76
+ delete transports[sessionId];
77
+ };
78
+ // Connect the transport to the MCP server
79
+ await server.connect(transport);
80
+ // Start the SSE transport to begin streaming
81
+ // This sends an initial 'endpoint' event with the session ID in the URL
82
+ await transport.start();
83
+ console.log(`Established SSE stream with session ID: ${sessionId}`);
84
+ }
85
+ catch (error) {
86
+ console.error('Error establishing SSE stream:', error);
87
+ if (!res.headersSent) {
88
+ res.status(500).send('Error establishing SSE stream');
89
+ }
90
+ }
91
+ });
92
+ // Messages endpoint for receiving client JSON-RPC requests
93
+ app.post('/messages', async (req, res) => {
94
+ console.log('Received POST request to /messages');
95
+ // Extract session ID from URL query parameter
96
+ // In the SSE protocol, this is added by the client based on the endpoint event
97
+ const sessionId = req.query.sessionId;
98
+ if (!sessionId) {
99
+ console.error('No session ID provided in request URL');
100
+ res.status(400).send('Missing sessionId parameter');
101
+ return;
102
+ }
103
+ const transport = transports[sessionId];
104
+ if (!transport) {
105
+ console.error(`No active transport found for session ID: ${sessionId}`);
106
+ res.status(404).send('Session not found');
107
+ return;
108
+ }
109
+ try {
110
+ // Handle the POST message with the transport
111
+ await transport.handlePostMessage(req, res, req.body);
112
+ }
113
+ catch (error) {
114
+ console.error('Error handling request:', error);
115
+ if (!res.headersSent) {
116
+ res.status(500).send('Error handling request');
117
+ }
118
+ }
119
+ });
120
+ // Start the server
121
+ const PORT = 3000;
122
+ app.listen(PORT, () => {
123
+ console.log(`Simple SSE Server (deprecated protocol version 2024-11-05) listening on port ${PORT}`);
124
+ });
125
+ // Handle server shutdown
126
+ process.on('SIGINT', async () => {
127
+ console.log('Shutting down server...');
128
+ // Close all active transports to properly clean up resources
129
+ for (const sessionId in transports) {
130
+ try {
131
+ console.log(`Closing transport for session ${sessionId}`);
132
+ await transports[sessionId].close();
133
+ delete transports[sessionId];
134
+ }
135
+ catch (error) {
136
+ console.error(`Error closing transport for session ${sessionId}:`, error);
137
+ }
138
+ }
139
+ await server.close();
140
+ console.log('Server shutdown complete');
141
+ process.exit(0);
142
+ });
143
+ //# sourceMappingURL=simpleSseServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleSseServer.js","sourceRoot":"","sources":["../../../../src/examples/server/simpleSseServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=simpleStreamableHttp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleStreamableHttp.d.ts","sourceRoot":"","sources":["../../../../src/examples/server/simpleStreamableHttp.ts"],"names":[],"mappings":""}
@@ -0,0 +1,245 @@
1
+ import express from 'express';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { McpServer } from '../../server/mcp.js';
4
+ import { StreamableHTTPServerTransport } from '../../server/streamableHttp.js';
5
+ import { z } from 'zod';
6
+ import { isInitializeRequest } from '../../types.js';
7
+ import { InMemoryEventStore } from '../shared/inMemoryEventStore.js';
8
+ // Create an MCP server with implementation details
9
+ const server = new McpServer({
10
+ name: 'simple-streamable-http-server',
11
+ version: '1.0.0',
12
+ }, { capabilities: { logging: {} } });
13
+ // Register a simple tool that returns a greeting
14
+ server.tool('greet', 'A simple greeting tool', {
15
+ name: z.string().describe('Name to greet'),
16
+ }, async ({ name }) => {
17
+ return {
18
+ content: [
19
+ {
20
+ type: 'text',
21
+ text: `Hello, ${name}!`,
22
+ },
23
+ ],
24
+ };
25
+ });
26
+ // Register a tool that sends multiple greetings with notifications
27
+ server.tool('multi-greet', 'A tool that sends different greetings with delays between them', {
28
+ name: z.string().describe('Name to greet'),
29
+ }, async ({ name }, { sendNotification }) => {
30
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
31
+ await sendNotification({
32
+ method: "notifications/message",
33
+ params: { level: "debug", data: `Starting multi-greet for ${name}` }
34
+ });
35
+ await sleep(1000); // Wait 1 second before first greeting
36
+ await sendNotification({
37
+ method: "notifications/message",
38
+ params: { level: "info", data: `Sending first greeting to ${name}` }
39
+ });
40
+ await sleep(1000); // Wait another second before second greeting
41
+ await sendNotification({
42
+ method: "notifications/message",
43
+ params: { level: "info", data: `Sending second greeting to ${name}` }
44
+ });
45
+ return {
46
+ content: [
47
+ {
48
+ type: 'text',
49
+ text: `Good morning, ${name}!`,
50
+ }
51
+ ],
52
+ };
53
+ });
54
+ // Register a simple prompt
55
+ server.prompt('greeting-template', 'A simple greeting prompt template', {
56
+ name: z.string().describe('Name to include in greeting'),
57
+ }, async ({ name }) => {
58
+ return {
59
+ messages: [
60
+ {
61
+ role: 'user',
62
+ content: {
63
+ type: 'text',
64
+ text: `Please greet ${name} in a friendly manner.`,
65
+ },
66
+ },
67
+ ],
68
+ };
69
+ });
70
+ // Register a tool specifically for testing resumability
71
+ server.tool('start-notification-stream', 'Starts sending periodic notifications for testing resumability', {
72
+ interval: z.number().describe('Interval in milliseconds between notifications').default(100),
73
+ count: z.number().describe('Number of notifications to send (0 for 100)').default(50),
74
+ }, async ({ interval, count }, { sendNotification }) => {
75
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
76
+ let counter = 0;
77
+ while (count === 0 || counter < count) {
78
+ counter++;
79
+ try {
80
+ await sendNotification({
81
+ method: "notifications/message",
82
+ params: {
83
+ level: "info",
84
+ data: `Periodic notification #${counter} at ${new Date().toISOString()}`
85
+ }
86
+ });
87
+ }
88
+ catch (error) {
89
+ console.error("Error sending notification:", error);
90
+ }
91
+ // Wait for the specified interval
92
+ await sleep(interval);
93
+ }
94
+ return {
95
+ content: [
96
+ {
97
+ type: 'text',
98
+ text: `Started sending periodic notifications every ${interval}ms`,
99
+ }
100
+ ],
101
+ };
102
+ });
103
+ // Create a simple resource at a fixed URI
104
+ server.resource('greeting-resource', 'https://example.com/greetings/default', { mimeType: 'text/plain' }, async () => {
105
+ return {
106
+ contents: [
107
+ {
108
+ uri: 'https://example.com/greetings/default',
109
+ text: 'Hello, world!',
110
+ },
111
+ ],
112
+ };
113
+ });
114
+ const app = express();
115
+ app.use(express.json());
116
+ // Map to store transports by session ID
117
+ const transports = {};
118
+ app.post('/mcp', async (req, res) => {
119
+ console.log('Received MCP request:', req.body);
120
+ try {
121
+ // Check for existing session ID
122
+ const sessionId = req.headers['mcp-session-id'];
123
+ let transport;
124
+ if (sessionId && transports[sessionId]) {
125
+ // Reuse existing transport
126
+ transport = transports[sessionId];
127
+ }
128
+ else if (!sessionId && isInitializeRequest(req.body)) {
129
+ // New initialization request
130
+ const eventStore = new InMemoryEventStore();
131
+ transport = new StreamableHTTPServerTransport({
132
+ sessionIdGenerator: () => randomUUID(),
133
+ eventStore, // Enable resumability
134
+ onsessioninitialized: (sessionId) => {
135
+ // Store the transport by session ID when session is initialized
136
+ // This avoids race conditions where requests might come in before the session is stored
137
+ console.log(`Session initialized with ID: ${sessionId}`);
138
+ transports[sessionId] = transport;
139
+ }
140
+ });
141
+ // Set up onclose handler to clean up transport when closed
142
+ transport.onclose = () => {
143
+ const sid = transport.sessionId;
144
+ if (sid && transports[sid]) {
145
+ console.log(`Transport closed for session ${sid}, removing from transports map`);
146
+ delete transports[sid];
147
+ }
148
+ };
149
+ // Connect the transport to the MCP server BEFORE handling the request
150
+ // so responses can flow back through the same transport
151
+ await server.connect(transport);
152
+ await transport.handleRequest(req, res, req.body);
153
+ return; // Already handled
154
+ }
155
+ else {
156
+ // Invalid request - no session ID or not initialization request
157
+ res.status(400).json({
158
+ jsonrpc: '2.0',
159
+ error: {
160
+ code: -32000,
161
+ message: 'Bad Request: No valid session ID provided',
162
+ },
163
+ id: null,
164
+ });
165
+ return;
166
+ }
167
+ // Handle the request with existing transport - no need to reconnect
168
+ // The existing transport is already connected to the server
169
+ await transport.handleRequest(req, res, req.body);
170
+ }
171
+ catch (error) {
172
+ console.error('Error handling MCP request:', error);
173
+ if (!res.headersSent) {
174
+ res.status(500).json({
175
+ jsonrpc: '2.0',
176
+ error: {
177
+ code: -32603,
178
+ message: 'Internal server error',
179
+ },
180
+ id: null,
181
+ });
182
+ }
183
+ }
184
+ });
185
+ // Handle GET requests for SSE streams (using built-in support from StreamableHTTP)
186
+ app.get('/mcp', async (req, res) => {
187
+ const sessionId = req.headers['mcp-session-id'];
188
+ if (!sessionId || !transports[sessionId]) {
189
+ res.status(400).send('Invalid or missing session ID');
190
+ return;
191
+ }
192
+ // Check for Last-Event-ID header for resumability
193
+ const lastEventId = req.headers['last-event-id'];
194
+ if (lastEventId) {
195
+ console.log(`Client reconnecting with Last-Event-ID: ${lastEventId}`);
196
+ }
197
+ else {
198
+ console.log(`Establishing new SSE stream for session ${sessionId}`);
199
+ }
200
+ const transport = transports[sessionId];
201
+ await transport.handleRequest(req, res);
202
+ });
203
+ // Handle DELETE requests for session termination (according to MCP spec)
204
+ app.delete('/mcp', async (req, res) => {
205
+ const sessionId = req.headers['mcp-session-id'];
206
+ if (!sessionId || !transports[sessionId]) {
207
+ res.status(400).send('Invalid or missing session ID');
208
+ return;
209
+ }
210
+ console.log(`Received session termination request for session ${sessionId}`);
211
+ try {
212
+ const transport = transports[sessionId];
213
+ await transport.handleRequest(req, res);
214
+ }
215
+ catch (error) {
216
+ console.error('Error handling session termination:', error);
217
+ if (!res.headersSent) {
218
+ res.status(500).send('Error processing session termination');
219
+ }
220
+ }
221
+ });
222
+ // Start the server
223
+ const PORT = 3000;
224
+ app.listen(PORT, () => {
225
+ console.log(`MCP Streamable HTTP Server listening on port ${PORT}`);
226
+ });
227
+ // Handle server shutdown
228
+ process.on('SIGINT', async () => {
229
+ console.log('Shutting down server...');
230
+ // Close all active transports to properly clean up resources
231
+ for (const sessionId in transports) {
232
+ try {
233
+ console.log(`Closing transport for session ${sessionId}`);
234
+ await transports[sessionId].close();
235
+ delete transports[sessionId];
236
+ }
237
+ catch (error) {
238
+ console.error(`Error closing transport for session ${sessionId}:`, error);
239
+ }
240
+ }
241
+ await server.close();
242
+ console.log('Server shutdown complete');
243
+ process.exit(0);
244
+ });
245
+ //# sourceMappingURL=simpleStreamableHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleStreamableHttp.js","sourceRoot":"","sources":["../../../../src/examples/server/simpleStreamableHttp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sseAndStreamableHttpCompatibleServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sseAndStreamableHttpCompatibleServer.d.ts","sourceRoot":"","sources":["../../../../src/examples/server/sseAndStreamableHttpCompatibleServer.ts"],"names":[],"mappings":""}