@modelcontextprotocol/sdk 0.4.0 → 0.5.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 (44) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +13 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client/index.d.ts +23 -12
  5. package/dist/client/index.d.ts.map +1 -1
  6. package/dist/client/index.js +133 -37
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/client/index.test.js +301 -3
  9. package/dist/client/index.test.js.map +1 -1
  10. package/dist/client/stdio.d.ts +7 -0
  11. package/dist/client/stdio.d.ts.map +1 -1
  12. package/dist/client/stdio.js +6 -5
  13. package/dist/client/stdio.js.map +1 -1
  14. package/dist/inMemory.d.ts +20 -0
  15. package/dist/inMemory.d.ts.map +1 -0
  16. package/dist/inMemory.js +47 -0
  17. package/dist/inMemory.js.map +1 -0
  18. package/dist/inMemory.test.d.ts +2 -0
  19. package/dist/inMemory.test.d.ts.map +1 -0
  20. package/dist/inMemory.test.js +74 -0
  21. package/dist/inMemory.test.js.map +1 -0
  22. package/dist/server/index.d.ts +15 -5
  23. package/dist/server/index.d.ts.map +1 -1
  24. package/dist/server/index.js +99 -23
  25. package/dist/server/index.js.map +1 -1
  26. package/dist/server/index.test.js +310 -3
  27. package/dist/server/index.test.js.map +1 -1
  28. package/dist/shared/protocol.d.ts +64 -7
  29. package/dist/shared/protocol.d.ts.map +1 -1
  30. package/dist/shared/protocol.js +60 -11
  31. package/dist/shared/protocol.js.map +1 -1
  32. package/dist/types.d.ts +753 -362
  33. package/dist/types.d.ts.map +1 -1
  34. package/dist/types.js +55 -26
  35. package/dist/types.js.map +1 -1
  36. package/dist/utils.d.ts +5 -0
  37. package/dist/utils.d.ts.map +1 -0
  38. package/dist/utils.js +11 -0
  39. package/dist/utils.js.map +1 -0
  40. package/dist/utils.test.d.ts +2 -0
  41. package/dist/utils.test.d.ts.map +1 -0
  42. package/dist/utils.test.js +14 -0
  43. package/dist/utils.test.js.map +1 -0
  44. package/package.json +1 -1
@@ -3,10 +3,267 @@
3
3
  /* eslint-disable @typescript-eslint/no-unused-expressions */
4
4
  import { Client } from "./index.js";
5
5
  import { z } from "zod";
6
- import { RequestSchema, NotificationSchema, ResultSchema } from "../types.js";
6
+ import { RequestSchema, NotificationSchema, ResultSchema, LATEST_PROTOCOL_VERSION, SUPPORTED_PROTOCOL_VERSIONS, InitializeRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, CreateMessageRequestSchema, ListRootsRequestSchema, } from "../types.js";
7
+ import { Server } from "../server/index.js";
8
+ import { InMemoryTransport } from "../inMemory.js";
9
+ test("should initialize with matching protocol version", async () => {
10
+ const clientTransport = {
11
+ start: jest.fn().mockResolvedValue(undefined),
12
+ close: jest.fn().mockResolvedValue(undefined),
13
+ send: jest.fn().mockImplementation((message) => {
14
+ var _a;
15
+ if (message.method === "initialize") {
16
+ (_a = clientTransport.onmessage) === null || _a === void 0 ? void 0 : _a.call(clientTransport, {
17
+ jsonrpc: "2.0",
18
+ id: message.id,
19
+ result: {
20
+ protocolVersion: LATEST_PROTOCOL_VERSION,
21
+ capabilities: {},
22
+ serverInfo: {
23
+ name: "test",
24
+ version: "1.0",
25
+ },
26
+ },
27
+ });
28
+ }
29
+ return Promise.resolve();
30
+ }),
31
+ };
32
+ const client = new Client({
33
+ name: "test client",
34
+ version: "1.0",
35
+ }, {
36
+ capabilities: {
37
+ sampling: {},
38
+ },
39
+ });
40
+ await client.connect(clientTransport);
41
+ // Should have sent initialize with latest version
42
+ expect(clientTransport.send).toHaveBeenCalledWith(expect.objectContaining({
43
+ method: "initialize",
44
+ params: expect.objectContaining({
45
+ protocolVersion: LATEST_PROTOCOL_VERSION,
46
+ }),
47
+ }));
48
+ });
49
+ test("should initialize with supported older protocol version", async () => {
50
+ const OLD_VERSION = SUPPORTED_PROTOCOL_VERSIONS[1];
51
+ const clientTransport = {
52
+ start: jest.fn().mockResolvedValue(undefined),
53
+ close: jest.fn().mockResolvedValue(undefined),
54
+ send: jest.fn().mockImplementation((message) => {
55
+ var _a;
56
+ if (message.method === "initialize") {
57
+ (_a = clientTransport.onmessage) === null || _a === void 0 ? void 0 : _a.call(clientTransport, {
58
+ jsonrpc: "2.0",
59
+ id: message.id,
60
+ result: {
61
+ protocolVersion: OLD_VERSION,
62
+ capabilities: {},
63
+ serverInfo: {
64
+ name: "test",
65
+ version: "1.0",
66
+ },
67
+ },
68
+ });
69
+ }
70
+ return Promise.resolve();
71
+ }),
72
+ };
73
+ const client = new Client({
74
+ name: "test client",
75
+ version: "1.0",
76
+ }, {
77
+ capabilities: {
78
+ sampling: {},
79
+ },
80
+ });
81
+ await client.connect(clientTransport);
82
+ // Connection should succeed with the older version
83
+ expect(client.getServerVersion()).toEqual({
84
+ name: "test",
85
+ version: "1.0",
86
+ });
87
+ });
88
+ test("should reject unsupported protocol version", async () => {
89
+ const clientTransport = {
90
+ start: jest.fn().mockResolvedValue(undefined),
91
+ close: jest.fn().mockResolvedValue(undefined),
92
+ send: jest.fn().mockImplementation((message) => {
93
+ var _a;
94
+ if (message.method === "initialize") {
95
+ (_a = clientTransport.onmessage) === null || _a === void 0 ? void 0 : _a.call(clientTransport, {
96
+ jsonrpc: "2.0",
97
+ id: message.id,
98
+ result: {
99
+ protocolVersion: "invalid-version",
100
+ capabilities: {},
101
+ serverInfo: {
102
+ name: "test",
103
+ version: "1.0",
104
+ },
105
+ },
106
+ });
107
+ }
108
+ return Promise.resolve();
109
+ }),
110
+ };
111
+ const client = new Client({
112
+ name: "test client",
113
+ version: "1.0",
114
+ }, {
115
+ capabilities: {
116
+ sampling: {},
117
+ },
118
+ });
119
+ await expect(client.connect(clientTransport)).rejects.toThrow("Server's protocol version is not supported: invalid-version");
120
+ expect(clientTransport.close).toHaveBeenCalled();
121
+ });
122
+ test("should respect server capabilities", async () => {
123
+ const server = new Server({
124
+ name: "test server",
125
+ version: "1.0",
126
+ }, {
127
+ capabilities: {
128
+ resources: {},
129
+ tools: {},
130
+ },
131
+ });
132
+ server.setRequestHandler(InitializeRequestSchema, (_request) => ({
133
+ protocolVersion: LATEST_PROTOCOL_VERSION,
134
+ capabilities: {
135
+ resources: {},
136
+ tools: {},
137
+ },
138
+ serverInfo: {
139
+ name: "test",
140
+ version: "1.0",
141
+ },
142
+ }));
143
+ server.setRequestHandler(ListResourcesRequestSchema, () => ({
144
+ resources: [],
145
+ }));
146
+ server.setRequestHandler(ListToolsRequestSchema, () => ({
147
+ tools: [],
148
+ }));
149
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
150
+ const client = new Client({
151
+ name: "test client",
152
+ version: "1.0",
153
+ }, {
154
+ capabilities: {
155
+ sampling: {},
156
+ },
157
+ enforceStrictCapabilities: true,
158
+ });
159
+ await Promise.all([
160
+ client.connect(clientTransport),
161
+ server.connect(serverTransport),
162
+ ]);
163
+ // Server supports resources and tools, but not prompts
164
+ expect(client.getServerCapabilities()).toEqual({
165
+ resources: {},
166
+ tools: {},
167
+ });
168
+ // These should work
169
+ await expect(client.listResources()).resolves.not.toThrow();
170
+ await expect(client.listTools()).resolves.not.toThrow();
171
+ // This should throw because prompts are not supported
172
+ await expect(client.listPrompts()).rejects.toThrow("Server does not support prompts");
173
+ });
174
+ test("should respect client notification capabilities", async () => {
175
+ const server = new Server({
176
+ name: "test server",
177
+ version: "1.0",
178
+ }, {
179
+ capabilities: {},
180
+ });
181
+ const client = new Client({
182
+ name: "test client",
183
+ version: "1.0",
184
+ }, {
185
+ capabilities: {
186
+ roots: {
187
+ listChanged: true,
188
+ },
189
+ },
190
+ });
191
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
192
+ await Promise.all([
193
+ client.connect(clientTransport),
194
+ server.connect(serverTransport),
195
+ ]);
196
+ // This should work because the client has the roots.listChanged capability
197
+ await expect(client.sendRootsListChanged()).resolves.not.toThrow();
198
+ // Create a new client without the roots.listChanged capability
199
+ const clientWithoutCapability = new Client({
200
+ name: "test client without capability",
201
+ version: "1.0",
202
+ }, {
203
+ capabilities: {},
204
+ enforceStrictCapabilities: true,
205
+ });
206
+ await clientWithoutCapability.connect(clientTransport);
207
+ // This should throw because the client doesn't have the roots.listChanged capability
208
+ await expect(clientWithoutCapability.sendRootsListChanged()).rejects.toThrow(/^Client does not support/);
209
+ });
210
+ test("should respect server notification capabilities", async () => {
211
+ const server = new Server({
212
+ name: "test server",
213
+ version: "1.0",
214
+ }, {
215
+ capabilities: {
216
+ logging: {},
217
+ resources: {
218
+ listChanged: true,
219
+ },
220
+ },
221
+ });
222
+ const client = new Client({
223
+ name: "test client",
224
+ version: "1.0",
225
+ }, {
226
+ capabilities: {},
227
+ });
228
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
229
+ await Promise.all([
230
+ client.connect(clientTransport),
231
+ server.connect(serverTransport),
232
+ ]);
233
+ // These should work because the server has the corresponding capabilities
234
+ await expect(server.sendLoggingMessage({ level: "info", data: "Test" })).resolves.not.toThrow();
235
+ await expect(server.sendResourceListChanged()).resolves.not.toThrow();
236
+ // This should throw because the server doesn't have the tools capability
237
+ await expect(server.sendToolListChanged()).rejects.toThrow("Server does not support notifying of tool list changes");
238
+ });
239
+ test("should only allow setRequestHandler for declared capabilities", () => {
240
+ const client = new Client({
241
+ name: "test client",
242
+ version: "1.0",
243
+ }, {
244
+ capabilities: {
245
+ sampling: {},
246
+ },
247
+ });
248
+ // This should work because sampling is a declared capability
249
+ expect(() => {
250
+ client.setRequestHandler(CreateMessageRequestSchema, () => ({
251
+ model: "test-model",
252
+ role: "assistant",
253
+ content: {
254
+ type: "text",
255
+ text: "Test response",
256
+ },
257
+ }));
258
+ }).not.toThrow();
259
+ // This should throw because roots listing is not a declared capability
260
+ expect(() => {
261
+ client.setRequestHandler(ListRootsRequestSchema, () => ({}));
262
+ }).toThrow("Client does not support roots capability");
263
+ });
7
264
  /*
8
- Test that custom request/notification/result schemas can be used with the Client class.
9
- */
265
+ Test that custom request/notification/result schemas can be used with the Client class.
266
+ */
10
267
  test("should typecheck", () => {
11
268
  const GetWeatherRequestSchema = RequestSchema.extend({
12
269
  method: z.literal("weather/get"),
@@ -38,6 +295,10 @@ test("should typecheck", () => {
38
295
  const weatherClient = new Client({
39
296
  name: "WeatherClient",
40
297
  version: "1.0.0",
298
+ }, {
299
+ capabilities: {
300
+ sampling: {},
301
+ },
41
302
  });
42
303
  // Typecheck that only valid weather requests/notifications/results are allowed
43
304
  false &&
@@ -56,4 +317,41 @@ test("should typecheck", () => {
56
317
  },
57
318
  });
58
319
  });
320
+ test("should handle client cancelling a request", async () => {
321
+ const server = new Server({
322
+ name: "test server",
323
+ version: "1.0",
324
+ }, {
325
+ capabilities: {
326
+ resources: {},
327
+ },
328
+ });
329
+ // Set up server to delay responding to listResources
330
+ server.setRequestHandler(ListResourcesRequestSchema, async (request, extra) => {
331
+ await new Promise((resolve) => setTimeout(resolve, 1000));
332
+ return {
333
+ resources: [],
334
+ };
335
+ });
336
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
337
+ const client = new Client({
338
+ name: "test client",
339
+ version: "1.0",
340
+ }, {
341
+ capabilities: {},
342
+ });
343
+ await Promise.all([
344
+ client.connect(clientTransport),
345
+ server.connect(serverTransport),
346
+ ]);
347
+ // Set up abort controller
348
+ const controller = new AbortController();
349
+ // Issue request but cancel it immediately
350
+ const listResourcesPromise = client.listResources(undefined, {
351
+ signal: controller.signal,
352
+ });
353
+ controller.abort("Cancelled by test");
354
+ // Request should be rejected
355
+ await expect(listResourcesPromise).rejects.toBe("Cancelled by test");
356
+ });
59
357
  //# sourceMappingURL=index.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/client/index.test.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,kDAAkD;AAClD,6DAA6D;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9E;;EAEE;AACF,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAC5B,MAAM,uBAAuB,GAAG,aAAa,CAAC,MAAM,CAAC;QACnD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,wBAAwB,GAAG,aAAa,CAAC,MAAM,CAAC;QACpD,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,iCAAiC,GAAG,kBAAkB,CAAC,MAAM,CAAC;QAClE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QAClC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,CAAC;KACH,CAAC,CAAC;IAEH,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,EAAE,CACrD,wBAAwB,CACzB,CAAC;IACF,MAAM,yBAAyB,GAAG,iCAAiC,CAAC;IACpE,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAC;QAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;IAMH,yCAAyC;IACzC,MAAM,aAAa,GAAG,IAAI,MAAM,CAI9B;QACA,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,+EAA+E;IAC/E,KAAK;QACH,aAAa,CAAC,OAAO,CACnB;YACE,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;aAChB;SACF,EACD,mBAAmB,CACpB,CAAC;IAEJ,KAAK;QACH,aAAa,CAAC,YAAY,CAAC;YACzB,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE;gBACN,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,mBAAmB;aAC7B;SACF,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/client/index.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { JSONRPCMessage } from "../types.js";
2
2
  import { Transport } from "../shared/transport.js";
3
+ import { Stream } from "node:stream";
3
4
  export type StdioServerParameters = {
4
5
  /**
5
6
  * The executable to run to start the server.
@@ -15,6 +16,12 @@ export type StdioServerParameters = {
15
16
  * If not specified, the result of getDefaultEnvironment() will be used.
16
17
  */
17
18
  env?: Record<string, string>;
19
+ /**
20
+ * How to handle stderr of the child process. This matches the semantics of Node's `child_process.spawn`.
21
+ *
22
+ * The default is "inherit", meaning messages to stderr will be printed to the parent process's stderr.
23
+ */
24
+ stderr?: "inherit" | "ignore" | Stream;
18
25
  };
19
26
  /**
20
27
  * Environment variables to inherit by default, if an environment is not explicitly given.
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/client/stdio.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAgBmB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB9D;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAAwB;IAE7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,MAAM,EAAE,qBAAqB;IAIzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD5B,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAc7C"}
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/client/stdio.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,qBAAqB,GAAG;IAClC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;CACxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,UAgBmB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB9D;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IACpD,OAAO,CAAC,QAAQ,CAAC,CAAe;IAChC,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,aAAa,CAAwB;IAE7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;gBAElC,MAAM,EAAE,qBAAqB;IAIzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD5B,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAc7C"}
@@ -57,10 +57,11 @@ export class StdioClientTransport {
57
57
  throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");
58
58
  }
59
59
  return new Promise((resolve, reject) => {
60
- var _a, _b, _c, _d, _e;
60
+ var _a, _b, _c, _d, _e, _f;
61
61
  this._process = spawn(this._serverParams.command, (_a = this._serverParams.args) !== null && _a !== void 0 ? _a : [], {
62
62
  env: (_b = this._serverParams.env) !== null && _b !== void 0 ? _b : getDefaultEnvironment(),
63
- stdio: ["pipe", "pipe", "inherit"],
63
+ stdio: ["pipe", "pipe", (_c = this._serverParams.stderr) !== null && _c !== void 0 ? _c : "inherit"],
64
+ shell: false,
64
65
  signal: this._abortController.signal,
65
66
  });
66
67
  this._process.on("error", (error) => {
@@ -81,15 +82,15 @@ export class StdioClientTransport {
81
82
  this._process = undefined;
82
83
  (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
83
84
  });
84
- (_c = this._process.stdin) === null || _c === void 0 ? void 0 : _c.on("error", (error) => {
85
+ (_d = this._process.stdin) === null || _d === void 0 ? void 0 : _d.on("error", (error) => {
85
86
  var _a;
86
87
  (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
87
88
  });
88
- (_d = this._process.stdout) === null || _d === void 0 ? void 0 : _d.on("data", (chunk) => {
89
+ (_e = this._process.stdout) === null || _e === void 0 ? void 0 : _e.on("data", (chunk) => {
89
90
  this._readBuffer.append(chunk);
90
91
  this.processReadBuffer();
91
92
  });
92
- (_e = this._process.stdout) === null || _e === void 0 ? void 0 : _e.on("error", (error) => {
93
+ (_f = this._process.stdout) === null || _f === void 0 ? void 0 : _f.on("error", (error) => {
93
94
  var _a;
94
95
  (_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
95
96
  });
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/client/stdio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/client/stdio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Transport } from "./shared/transport.js";
2
+ import { JSONRPCMessage } from "./types.js";
3
+ /**
4
+ * In-memory transport for creating clients and servers that talk to each other within the same process.
5
+ */
6
+ export declare class InMemoryTransport implements Transport {
7
+ private _otherTransport?;
8
+ private _messageQueue;
9
+ onclose?: () => void;
10
+ onerror?: (error: Error) => void;
11
+ onmessage?: (message: JSONRPCMessage) => void;
12
+ /**
13
+ * Creates a pair of linked in-memory transports that can communicate with each other. One should be passed to a Client and one to a Server.
14
+ */
15
+ static createLinkedPair(): [InMemoryTransport, InMemoryTransport];
16
+ start(): Promise<void>;
17
+ close(): Promise<void>;
18
+ send(message: JSONRPCMessage): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=inMemory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemory.d.ts","sourceRoot":"","sources":["../src/inMemory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,eAAe,CAAC,CAAoB;IAC5C,OAAO,CAAC,aAAa,CAAwB;IAE7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC;IAE9C;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAQ3D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAWnD"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * In-memory transport for creating clients and servers that talk to each other within the same process.
3
+ */
4
+ export class InMemoryTransport {
5
+ constructor() {
6
+ this._messageQueue = [];
7
+ }
8
+ /**
9
+ * Creates a pair of linked in-memory transports that can communicate with each other. One should be passed to a Client and one to a Server.
10
+ */
11
+ static createLinkedPair() {
12
+ const clientTransport = new InMemoryTransport();
13
+ const serverTransport = new InMemoryTransport();
14
+ clientTransport._otherTransport = serverTransport;
15
+ serverTransport._otherTransport = clientTransport;
16
+ return [clientTransport, serverTransport];
17
+ }
18
+ async start() {
19
+ var _a;
20
+ // Process any messages that were queued before start was called
21
+ while (this._messageQueue.length > 0) {
22
+ const message = this._messageQueue.shift();
23
+ if (message) {
24
+ (_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, message);
25
+ }
26
+ }
27
+ }
28
+ async close() {
29
+ var _a;
30
+ const other = this._otherTransport;
31
+ this._otherTransport = undefined;
32
+ await (other === null || other === void 0 ? void 0 : other.close());
33
+ (_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
34
+ }
35
+ async send(message) {
36
+ if (!this._otherTransport) {
37
+ throw new Error("Not connected");
38
+ }
39
+ if (this._otherTransport.onmessage) {
40
+ this._otherTransport.onmessage(message);
41
+ }
42
+ else {
43
+ this._otherTransport._messageQueue.push(message);
44
+ }
45
+ }
46
+ }
47
+ //# sourceMappingURL=inMemory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemory.js","sourceRoot":"","sources":["../src/inMemory.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,iBAAiB;IAA9B;QAEU,kBAAa,GAAqB,EAAE,CAAC;IA6C/C,CAAC;IAvCC;;OAEG;IACH,MAAM,CAAC,gBAAgB;QACrB,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAChD,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAChD,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC;QAClD,eAAe,CAAC,eAAe,GAAG,eAAe,CAAC;QAClD,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,gEAAgE;QAChE,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAA,IAAI,CAAC,SAAS,qDAAG,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,CAAA,CAAC;QACrB,MAAA,IAAI,CAAC,OAAO,oDAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=inMemory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemory.test.d.ts","sourceRoot":"","sources":["../src/inMemory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ import { InMemoryTransport } from "./inMemory.js";
2
+ describe("InMemoryTransport", () => {
3
+ let clientTransport;
4
+ let serverTransport;
5
+ beforeEach(() => {
6
+ [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
7
+ });
8
+ test("should create linked pair", () => {
9
+ expect(clientTransport).toBeDefined();
10
+ expect(serverTransport).toBeDefined();
11
+ });
12
+ test("should start without error", async () => {
13
+ await expect(clientTransport.start()).resolves.not.toThrow();
14
+ await expect(serverTransport.start()).resolves.not.toThrow();
15
+ });
16
+ test("should send message from client to server", async () => {
17
+ const message = {
18
+ jsonrpc: "2.0",
19
+ method: "test",
20
+ id: 1,
21
+ };
22
+ let receivedMessage;
23
+ serverTransport.onmessage = (msg) => {
24
+ receivedMessage = msg;
25
+ };
26
+ await clientTransport.send(message);
27
+ expect(receivedMessage).toEqual(message);
28
+ });
29
+ test("should send message from server to client", async () => {
30
+ const message = {
31
+ jsonrpc: "2.0",
32
+ method: "test",
33
+ id: 1,
34
+ };
35
+ let receivedMessage;
36
+ clientTransport.onmessage = (msg) => {
37
+ receivedMessage = msg;
38
+ };
39
+ await serverTransport.send(message);
40
+ expect(receivedMessage).toEqual(message);
41
+ });
42
+ test("should handle close", async () => {
43
+ let clientClosed = false;
44
+ let serverClosed = false;
45
+ clientTransport.onclose = () => {
46
+ clientClosed = true;
47
+ };
48
+ serverTransport.onclose = () => {
49
+ serverClosed = true;
50
+ };
51
+ await clientTransport.close();
52
+ expect(clientClosed).toBe(true);
53
+ expect(serverClosed).toBe(true);
54
+ });
55
+ test("should throw error when sending after close", async () => {
56
+ await clientTransport.close();
57
+ await expect(clientTransport.send({ jsonrpc: "2.0", method: "test", id: 1 })).rejects.toThrow("Not connected");
58
+ });
59
+ test("should queue messages sent before start", async () => {
60
+ const message = {
61
+ jsonrpc: "2.0",
62
+ method: "test",
63
+ id: 1,
64
+ };
65
+ let receivedMessage;
66
+ serverTransport.onmessage = (msg) => {
67
+ receivedMessage = msg;
68
+ };
69
+ await clientTransport.send(message);
70
+ await serverTransport.start();
71
+ expect(receivedMessage).toEqual(message);
72
+ });
73
+ });
74
+ //# sourceMappingURL=inMemory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inMemory.test.js","sourceRoot":"","sources":["../src/inMemory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,eAAkC,CAAC;IACvC,IAAI,eAAkC,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC7D,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAmB;YAC9B,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,CAAC;SACN,CAAC;QAEF,IAAI,eAA2C,CAAC;QAChD,eAAe,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE;YAClC,eAAe,GAAG,GAAG,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAmB;YAC9B,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,CAAC;SACN,CAAC;QAEF,IAAI,eAA2C,CAAC;QAChD,eAAe,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE;YAClC,eAAe,GAAG,GAAG,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACrC,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,eAAe,CAAC,OAAO,GAAG,GAAG,EAAE;YAC7B,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC;QAEF,eAAe,CAAC,OAAO,GAAG,GAAG,EAAE;YAC7B,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,MAAM,CACV,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAChE,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,OAAO,GAAmB;YAC9B,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,MAAM;YACd,EAAE,EAAE,CAAC;SACN,CAAC;QAEF,IAAI,eAA2C,CAAC;QAChD,eAAe,CAAC,SAAS,GAAG,CAAC,GAAG,EAAE,EAAE;YAClC,eAAe,GAAG,GAAG,CAAC;QACxB,CAAC,CAAC;QAEF,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;QAC9B,MAAM,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,5 +1,11 @@
1
- import { ProgressCallback, Protocol } from "../shared/protocol.js";
2
- import { ClientCapabilities, CreateMessageRequest, Implementation, ListRootsRequest, LoggingMessageNotification, Notification, Request, ResourceUpdatedNotification, Result, ServerNotification, ServerRequest, ServerResult } from "../types.js";
1
+ import { Protocol, ProtocolOptions, RequestOptions } from "../shared/protocol.js";
2
+ import { ClientCapabilities, CreateMessageRequest, Implementation, ListRootsRequest, LoggingMessageNotification, Notification, Request, ResourceUpdatedNotification, Result, ServerCapabilities, ServerNotification, ServerRequest, ServerResult } from "../types.js";
3
+ export type ServerOptions = ProtocolOptions & {
4
+ /**
5
+ * Capabilities to advertise as being supported by this server.
6
+ */
7
+ capabilities: ServerCapabilities;
8
+ };
3
9
  /**
4
10
  * An MCP server on top of a pluggable transport.
5
11
  *
@@ -29,6 +35,7 @@ export declare class Server<RequestT extends Request = Request, NotificationT ex
29
35
  private _serverInfo;
30
36
  private _clientCapabilities?;
31
37
  private _clientVersion?;
38
+ private _capabilities;
32
39
  /**
33
40
  * Callback for when initialization has fully completed (i.e., the client has sent an `initialized` notification).
34
41
  */
@@ -36,7 +43,10 @@ export declare class Server<RequestT extends Request = Request, NotificationT ex
36
43
  /**
37
44
  * Initializes this server with the given name and version information.
38
45
  */
39
- constructor(_serverInfo: Implementation);
46
+ constructor(_serverInfo: Implementation, options: ServerOptions);
47
+ protected assertCapabilityForMethod(method: RequestT["method"]): void;
48
+ protected assertNotificationCapability(method: (ServerNotification | NotificationT)["method"]): void;
49
+ protected assertRequestHandlerCapability(method: string): void;
40
50
  private _oninitialize;
41
51
  /**
42
52
  * After initialization has completed, this will be populated with the client's reported capabilities.
@@ -50,7 +60,7 @@ export declare class Server<RequestT extends Request = Request, NotificationT ex
50
60
  ping(): Promise<{
51
61
  _meta?: import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough"> | undefined;
52
62
  }>;
53
- createMessage(params: CreateMessageRequest["params"], onprogress?: ProgressCallback): Promise<import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
63
+ createMessage(params: CreateMessageRequest["params"], options?: RequestOptions): Promise<import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
54
64
  _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
55
65
  }, {
56
66
  model: import("zod").ZodString;
@@ -79,7 +89,7 @@ export declare class Server<RequestT extends Request = Request, NotificationT ex
79
89
  mimeType: import("zod").ZodString;
80
90
  }, import("zod").ZodTypeAny, "passthrough">>]>;
81
91
  }>, import("zod").ZodTypeAny, "passthrough">>;
82
- listRoots(params?: ListRootsRequest["params"], onprogress?: ProgressCallback): Promise<import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
92
+ listRoots(params?: ListRootsRequest["params"], options?: RequestOptions): Promise<import("zod").objectOutputType<import("zod").objectUtil.extendShape<{
83
93
  _meta: import("zod").ZodOptional<import("zod").ZodObject<{}, "passthrough", import("zod").ZodTypeAny, import("zod").objectOutputType<{}, import("zod").ZodTypeAny, "passthrough">, import("zod").objectInputType<{}, import("zod").ZodTypeAny, "passthrough">>>;
84
94
  }, {
85
95
  roots: import("zod").ZodArray<import("zod").ZodObject<{