@modelcontextprotocol/sdk 1.1.1 → 1.3.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 (157) hide show
  1. package/README.md +358 -58
  2. package/dist/cjs/cli.d.ts.map +1 -0
  3. package/dist/cjs/cli.js +134 -0
  4. package/dist/cjs/cli.js.map +1 -0
  5. package/dist/{client → cjs/client}/index.d.ts +8 -2
  6. package/dist/cjs/client/index.d.ts.map +1 -0
  7. package/dist/cjs/client/index.js +222 -0
  8. package/dist/cjs/client/index.js.map +1 -0
  9. package/dist/cjs/client/sse.d.ts.map +1 -0
  10. package/dist/cjs/client/sse.js +99 -0
  11. package/dist/cjs/client/sse.js.map +1 -0
  12. package/dist/cjs/client/stdio.d.ts.map +1 -0
  13. package/dist/cjs/client/stdio.js +156 -0
  14. package/dist/cjs/client/stdio.js.map +1 -0
  15. package/dist/cjs/client/websocket.d.ts.map +1 -0
  16. package/dist/cjs/client/websocket.js +65 -0
  17. package/dist/cjs/client/websocket.js.map +1 -0
  18. package/dist/cjs/inMemory.d.ts.map +1 -0
  19. package/dist/cjs/inMemory.js +51 -0
  20. package/dist/cjs/inMemory.js.map +1 -0
  21. package/dist/cjs/package.json +1 -0
  22. package/dist/cjs/server/completable.d.ts +22 -0
  23. package/dist/cjs/server/completable.d.ts.map +1 -0
  24. package/dist/cjs/server/completable.js +65 -0
  25. package/dist/cjs/server/completable.js.map +1 -0
  26. package/dist/{server → cjs/server}/index.d.ts +13 -2
  27. package/dist/cjs/server/index.d.ts.map +1 -0
  28. package/dist/cjs/server/index.js +200 -0
  29. package/dist/cjs/server/index.js.map +1 -0
  30. package/dist/cjs/server/mcp.d.ts +150 -0
  31. package/dist/cjs/server/mcp.d.ts.map +1 -0
  32. package/dist/cjs/server/mcp.js +365 -0
  33. package/dist/cjs/server/mcp.js.map +1 -0
  34. package/dist/cjs/server/sse.d.ts.map +1 -0
  35. package/dist/cjs/server/sse.js +123 -0
  36. package/dist/cjs/server/sse.js.map +1 -0
  37. package/dist/cjs/server/stdio.d.ts.map +1 -0
  38. package/dist/cjs/server/stdio.js +85 -0
  39. package/dist/cjs/server/stdio.js.map +1 -0
  40. package/dist/{shared → cjs/shared}/protocol.d.ts +6 -1
  41. package/dist/cjs/shared/protocol.d.ts.map +1 -0
  42. package/dist/cjs/shared/protocol.js +321 -0
  43. package/dist/cjs/shared/protocol.js.map +1 -0
  44. package/dist/cjs/shared/stdio.d.ts.map +1 -0
  45. package/dist/cjs/shared/stdio.js +37 -0
  46. package/dist/cjs/shared/stdio.js.map +1 -0
  47. package/dist/cjs/shared/transport.d.ts.map +1 -0
  48. package/dist/cjs/shared/transport.js +3 -0
  49. package/dist/{shared → cjs/shared}/transport.js.map +1 -1
  50. package/dist/cjs/shared/uriTemplate.d.ts +24 -0
  51. package/dist/cjs/shared/uriTemplate.d.ts.map +1 -0
  52. package/dist/cjs/shared/uriTemplate.js +242 -0
  53. package/dist/cjs/shared/uriTemplate.js.map +1 -0
  54. package/dist/cjs/types.d.ts.map +1 -0
  55. package/dist/cjs/types.js +1002 -0
  56. package/dist/cjs/types.js.map +1 -0
  57. package/dist/esm/cli.d.ts +2 -0
  58. package/dist/esm/cli.d.ts.map +1 -0
  59. package/dist/esm/cli.js.map +1 -0
  60. package/dist/esm/client/index.d.ts +779 -0
  61. package/dist/esm/client/index.d.ts.map +1 -0
  62. package/dist/{client → esm/client}/index.js +14 -2
  63. package/dist/esm/client/index.js.map +1 -0
  64. package/dist/esm/client/sse.d.ts +27 -0
  65. package/dist/esm/client/sse.d.ts.map +1 -0
  66. package/dist/esm/client/sse.js.map +1 -0
  67. package/dist/esm/client/stdio.d.ts +63 -0
  68. package/dist/esm/client/stdio.d.ts.map +1 -0
  69. package/dist/esm/client/stdio.js.map +1 -0
  70. package/dist/esm/client/websocket.d.ts +17 -0
  71. package/dist/esm/client/websocket.d.ts.map +1 -0
  72. package/dist/esm/client/websocket.js.map +1 -0
  73. package/dist/esm/inMemory.d.ts +20 -0
  74. package/dist/esm/inMemory.d.ts.map +1 -0
  75. package/dist/esm/inMemory.js.map +1 -0
  76. package/dist/esm/package.json +1 -0
  77. package/dist/esm/server/completable.d.ts +22 -0
  78. package/dist/esm/server/completable.d.ts.map +1 -0
  79. package/dist/esm/server/completable.js +60 -0
  80. package/dist/esm/server/completable.js.map +1 -0
  81. package/dist/esm/server/index.d.ts +123 -0
  82. package/dist/esm/server/index.d.ts.map +1 -0
  83. package/dist/{server → esm/server}/index.js +16 -2
  84. package/dist/esm/server/index.js.map +1 -0
  85. package/dist/esm/server/mcp.d.ts +150 -0
  86. package/dist/esm/server/mcp.d.ts.map +1 -0
  87. package/dist/esm/server/mcp.js +360 -0
  88. package/dist/esm/server/mcp.js.map +1 -0
  89. package/dist/esm/server/sse.d.ts +46 -0
  90. package/dist/esm/server/sse.d.ts.map +1 -0
  91. package/dist/esm/server/sse.js.map +1 -0
  92. package/dist/esm/server/stdio.d.ts +28 -0
  93. package/dist/esm/server/stdio.d.ts.map +1 -0
  94. package/dist/esm/server/stdio.js.map +1 -0
  95. package/dist/esm/shared/protocol.d.ts +162 -0
  96. package/dist/esm/shared/protocol.d.ts.map +1 -0
  97. package/dist/{shared → esm/shared}/protocol.js +19 -0
  98. package/dist/esm/shared/protocol.js.map +1 -0
  99. package/dist/esm/shared/stdio.d.ts +13 -0
  100. package/dist/esm/shared/stdio.d.ts.map +1 -0
  101. package/dist/esm/shared/stdio.js.map +1 -0
  102. package/dist/esm/shared/transport.d.ts +39 -0
  103. package/dist/esm/shared/transport.d.ts.map +1 -0
  104. package/dist/esm/shared/transport.js.map +1 -0
  105. package/dist/esm/shared/uriTemplate.d.ts +24 -0
  106. package/dist/esm/shared/uriTemplate.d.ts.map +1 -0
  107. package/dist/esm/shared/uriTemplate.js +238 -0
  108. package/dist/esm/shared/uriTemplate.js.map +1 -0
  109. package/dist/esm/types.d.ts +26431 -0
  110. package/dist/esm/types.d.ts.map +1 -0
  111. package/dist/esm/types.js.map +1 -0
  112. package/package.json +12 -6
  113. package/dist/cli.d.ts.map +0 -1
  114. package/dist/cli.js.map +0 -1
  115. package/dist/client/index.d.ts.map +0 -1
  116. package/dist/client/index.js.map +0 -1
  117. package/dist/client/sse.d.ts.map +0 -1
  118. package/dist/client/sse.js.map +0 -1
  119. package/dist/client/stdio.d.ts.map +0 -1
  120. package/dist/client/stdio.js.map +0 -1
  121. package/dist/client/websocket.d.ts.map +0 -1
  122. package/dist/client/websocket.js.map +0 -1
  123. package/dist/inMemory.d.ts.map +0 -1
  124. package/dist/inMemory.js.map +0 -1
  125. package/dist/server/index.d.ts.map +0 -1
  126. package/dist/server/index.js.map +0 -1
  127. package/dist/server/sse.d.ts.map +0 -1
  128. package/dist/server/sse.js.map +0 -1
  129. package/dist/server/stdio.d.ts.map +0 -1
  130. package/dist/server/stdio.js.map +0 -1
  131. package/dist/shared/protocol.d.ts.map +0 -1
  132. package/dist/shared/protocol.js.map +0 -1
  133. package/dist/shared/stdio.d.ts.map +0 -1
  134. package/dist/shared/stdio.js.map +0 -1
  135. package/dist/shared/transport.d.ts.map +0 -1
  136. package/dist/types.d.ts.map +0 -1
  137. package/dist/types.js.map +0 -1
  138. /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
  139. /package/dist/{client → cjs/client}/sse.d.ts +0 -0
  140. /package/dist/{client → cjs/client}/stdio.d.ts +0 -0
  141. /package/dist/{client → cjs/client}/websocket.d.ts +0 -0
  142. /package/dist/{inMemory.d.ts → cjs/inMemory.d.ts} +0 -0
  143. /package/dist/{server → cjs/server}/sse.d.ts +0 -0
  144. /package/dist/{server → cjs/server}/stdio.d.ts +0 -0
  145. /package/dist/{shared → cjs/shared}/stdio.d.ts +0 -0
  146. /package/dist/{shared → cjs/shared}/transport.d.ts +0 -0
  147. /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
  148. /package/dist/{cli.js → esm/cli.js} +0 -0
  149. /package/dist/{client → esm/client}/sse.js +0 -0
  150. /package/dist/{client → esm/client}/stdio.js +0 -0
  151. /package/dist/{client → esm/client}/websocket.js +0 -0
  152. /package/dist/{inMemory.js → esm/inMemory.js} +0 -0
  153. /package/dist/{server → esm/server}/sse.js +0 -0
  154. /package/dist/{server → esm/server}/stdio.js +0 -0
  155. /package/dist/{shared → esm/shared}/stdio.js +0 -0
  156. /package/dist/{shared → esm/shared}/transport.js +0 -0
  157. /package/dist/{types.js → esm/types.js} +0 -0
package/README.md CHANGED
@@ -1,6 +1,26 @@
1
- # MCP TypeScript SDK ![NPM Version](https://img.shields.io/npm/v/%40modelcontextprotocol%2Fsdk)
1
+ # MCP TypeScript SDK ![NPM Version](https://img.shields.io/npm/v/%40modelcontextprotocol%2Fsdk) ![MIT licensed](https://img.shields.io/npm/l/%40modelcontextprotocol%2Fsdk)
2
2
 
3
- TypeScript implementation of the [Model Context Protocol](https://modelcontextprotocol.io) (MCP), providing both client and server capabilities for integrating with LLM surfaces.
3
+ ## Table of Contents
4
+ - [Overview](#overview)
5
+ - [Installation](#installation)
6
+ - [Quickstart](#quickstart)
7
+ - [What is MCP?](#what-is-mcp)
8
+ - [Core Concepts](#core-concepts)
9
+ - [Server](#server)
10
+ - [Resources](#resources)
11
+ - [Tools](#tools)
12
+ - [Prompts](#prompts)
13
+ - [Running Your Server](#running-your-server)
14
+ - [Development Mode](#development-mode)
15
+ - [Claude Desktop Integration](#claude-desktop-integration)
16
+ - [Direct Execution](#direct-execution)
17
+ - [Examples](#examples)
18
+ - [Echo Server](#echo-server)
19
+ - [SQLite Explorer](#sqlite-explorer)
20
+ - [Advanced Usage](#advanced-usage)
21
+ - [Low-Level Server](#low-level-server)
22
+ - [Writing MCP Clients](#writing-mcp-clients)
23
+ - [Server Capabilities](#server-capabilities)
4
24
 
5
25
  ## Overview
6
26
 
@@ -19,97 +39,377 @@ npm install @modelcontextprotocol/sdk
19
39
 
20
40
  ## Quick Start
21
41
 
22
- ### Creating a Client
42
+ Let's create a simple MCP server that exposes a calculator tool and some data:
23
43
 
24
44
  ```typescript
25
- import { Client } from "@modelcontextprotocol/sdk/client/index.js";
26
- import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
27
- import {
28
- ListResourcesRequestSchema,
29
- ReadResourceRequestSchema,
30
- } from "@modelcontextprotocol/sdk/types.js";
45
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
46
+ import { z } from "zod";
31
47
 
32
- const transport = new StdioClientTransport({
33
- command: "path/to/server",
48
+ // Create an MCP server
49
+ const server = new McpServer({
50
+ name: "Demo",
51
+ version: "1.0.0"
34
52
  });
35
53
 
36
- const client = new Client({
37
- name: "example-client",
38
- version: "1.0.0",
39
- }, {
40
- capabilities: {}
54
+ // Add an addition tool
55
+ server.tool("add",
56
+ { a: z.number(), b: z.number() },
57
+ async ({ a, b }) => ({
58
+ content: [{ type: "text", text: String(a + b) }]
59
+ })
60
+ );
61
+
62
+ // Add a dynamic greeting resource
63
+ server.resource(
64
+ "greeting",
65
+ "greeting://{name}",
66
+ async (uri, { name }) => ({
67
+ contents: [{
68
+ uri: uri.href,
69
+ text: `Hello, ${name}!`
70
+ }]
71
+ })
72
+ );
73
+ ```
74
+
75
+ ## What is MCP?
76
+
77
+ The [Model Context Protocol (MCP)](https://modelcontextprotocol.io) lets you build servers that expose data and functionality to LLM applications in a secure, standardized way. Think of it like a web API, but specifically designed for LLM interactions. MCP servers can:
78
+
79
+ - Expose data through **Resources** (think of these sort of like GET endpoints; they are used to load information into the LLM's context)
80
+ - Provide functionality through **Tools** (sort of like POST endpoints; they are used to execute code or otherwise produce a side effect)
81
+ - Define interaction patterns through **Prompts** (reusable templates for LLM interactions)
82
+ - And more!
83
+
84
+ ## Core Concepts
85
+
86
+ ### Server
87
+
88
+ The McpServer is your core interface to the MCP protocol. It handles connection management, protocol compliance, and message routing:
89
+
90
+ ```typescript
91
+ const server = new McpServer({
92
+ name: "My App",
93
+ version: "1.0.0"
41
94
  });
95
+ ```
42
96
 
43
- await client.connect(transport);
97
+ ### Resources
98
+
99
+ Resources are how you expose data to LLMs. They're similar to GET endpoints in a REST API - they provide data but shouldn't perform significant computation or have side effects:
100
+
101
+ ```typescript
102
+ // Static resource
103
+ server.resource(
104
+ "config",
105
+ "config://app",
106
+ async (uri) => ({
107
+ contents: [{
108
+ uri: uri.href,
109
+ text: "App configuration here"
110
+ }]
111
+ })
112
+ );
44
113
 
45
- // List available resources
46
- const resources = await client.request(
47
- { method: "resources/list" },
48
- ListResourcesResultSchema
114
+ // Dynamic resource with parameters
115
+ server.resource(
116
+ "user-profile",
117
+ "users://{userId}/profile",
118
+ async (uri, { userId }) => ({
119
+ contents: [{
120
+ uri: uri.href,
121
+ text: `Profile data for user ${userId}`
122
+ }]
123
+ })
49
124
  );
125
+ ```
126
+
127
+ ### Tools
50
128
 
51
- // Read a specific resource
52
- const resourceContent = await client.request(
129
+ Tools let LLMs take actions through your server. Unlike resources, tools are expected to perform computation and have side effects:
130
+
131
+ ```typescript
132
+ // Simple tool with parameters
133
+ server.tool(
134
+ "calculate-bmi",
53
135
  {
54
- method: "resources/read",
55
- params: {
56
- uri: "file:///example.txt"
57
- }
136
+ weightKg: z.number(),
137
+ heightM: z.number()
58
138
  },
59
- ReadResourceResultSchema
139
+ async ({ weightKg, heightM }) => ({
140
+ content: [{
141
+ type: "text",
142
+ text: String(weightKg / (heightM * heightM))
143
+ }]
144
+ })
145
+ );
146
+
147
+ // Async tool with external API call
148
+ server.tool(
149
+ "fetch-weather",
150
+ { city: z.string() },
151
+ async ({ city }) => {
152
+ const response = await fetch(`https://api.weather.com/${city}`);
153
+ const data = await response.text();
154
+ return {
155
+ content: [{ type: "text", text: data }]
156
+ };
157
+ }
158
+ );
159
+ ```
160
+
161
+ ### Prompts
162
+
163
+ Prompts are reusable templates that help LLMs interact with your server effectively:
164
+
165
+ ```typescript
166
+ server.prompt(
167
+ "review-code",
168
+ { code: z.string() },
169
+ ({ code }) => ({
170
+ messages: [{
171
+ role: "user",
172
+ content: {
173
+ type: "text",
174
+ text: `Please review this code:\n\n${code}`
175
+ }
176
+ }]
177
+ })
60
178
  );
61
179
  ```
62
180
 
63
- ### Creating a Server
181
+ ## Examples
182
+
183
+ ### Echo Server
184
+
185
+ A simple server demonstrating resources, tools, and prompts:
186
+
187
+ ```typescript
188
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
189
+ import { z } from "zod";
190
+
191
+ const server = new McpServer({
192
+ name: "Echo",
193
+ version: "1.0.0"
194
+ });
195
+
196
+ server.resource(
197
+ "echo",
198
+ "echo://{message}",
199
+ async (uri, { message }) => ({
200
+ contents: [{
201
+ uri: uri.href,
202
+ text: `Resource echo: ${message}`
203
+ }]
204
+ })
205
+ );
206
+
207
+ server.tool(
208
+ "echo",
209
+ { message: z.string() },
210
+ async ({ message }) => ({
211
+ content: [{ type: "text", text: `Tool echo: ${message}` }]
212
+ })
213
+ );
214
+
215
+ server.prompt(
216
+ "echo",
217
+ { message: z.string() },
218
+ ({ message }) => ({
219
+ messages: [{
220
+ role: "user",
221
+ content: {
222
+ type: "text",
223
+ text: `Please process this message: ${message}`
224
+ }
225
+ }]
226
+ })
227
+ );
228
+ ```
229
+
230
+ ### SQLite Explorer
231
+
232
+ A more complex example showing database integration:
233
+
234
+ ```typescript
235
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
236
+ import sqlite3 from "sqlite3";
237
+ import { promisify } from "util";
238
+ import { z } from "zod";
239
+
240
+ const server = new McpServer({
241
+ name: "SQLite Explorer",
242
+ version: "1.0.0"
243
+ });
244
+
245
+ // Helper to create DB connection
246
+ const getDb = () => {
247
+ const db = new sqlite3.Database("database.db");
248
+ return {
249
+ all: promisify<string, any[]>(db.all.bind(db)),
250
+ close: promisify(db.close.bind(db))
251
+ };
252
+ };
253
+
254
+ server.resource(
255
+ "schema",
256
+ "schema://main",
257
+ async (uri) => {
258
+ const db = getDb();
259
+ try {
260
+ const tables = await db.all(
261
+ "SELECT sql FROM sqlite_master WHERE type='table'"
262
+ );
263
+ return {
264
+ contents: [{
265
+ uri: uri.href,
266
+ text: tables.map((t: {sql: string}) => t.sql).join("\n")
267
+ }]
268
+ };
269
+ } finally {
270
+ await db.close();
271
+ }
272
+ }
273
+ );
274
+
275
+ server.tool(
276
+ "query",
277
+ { sql: z.string() },
278
+ async ({ sql }) => {
279
+ const db = getDb();
280
+ try {
281
+ const results = await db.all(sql);
282
+ return {
283
+ content: [{
284
+ type: "text",
285
+ text: JSON.stringify(results, null, 2)
286
+ }]
287
+ };
288
+ } catch (err: unknown) {
289
+ const error = err as Error;
290
+ return {
291
+ content: [{
292
+ type: "text",
293
+ text: `Error: ${error.message}`
294
+ }],
295
+ isError: true
296
+ };
297
+ } finally {
298
+ await db.close();
299
+ }
300
+ }
301
+ );
302
+ ```
303
+
304
+ ## Advanced Usage
305
+
306
+ ### Low-Level Server
307
+
308
+ For more control, you can use the low-level Server class directly:
64
309
 
65
310
  ```typescript
66
311
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
67
312
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
68
313
  import {
69
- ListResourcesRequestSchema,
70
- ReadResourceRequestSchema,
314
+ ListPromptsRequestSchema,
315
+ GetPromptRequestSchema
71
316
  } from "@modelcontextprotocol/sdk/types.js";
72
317
 
73
- const server = new Server({
74
- name: "example-server",
75
- version: "1.0.0",
76
- }, {
77
- capabilities: {
78
- resources: {}
318
+ const server = new Server(
319
+ {
320
+ name: "example-server",
321
+ version: "1.0.0"
322
+ },
323
+ {
324
+ capabilities: {
325
+ prompts: {}
326
+ }
79
327
  }
80
- });
328
+ );
81
329
 
82
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
330
+ server.setRequestHandler(ListPromptsRequestSchema, async () => {
83
331
  return {
84
- resources: [
85
- {
86
- uri: "file:///example.txt",
87
- name: "Example Resource",
88
- },
89
- ],
332
+ prompts: [{
333
+ name: "example-prompt",
334
+ description: "An example prompt template",
335
+ arguments: [{
336
+ name: "arg1",
337
+ description: "Example argument",
338
+ required: true
339
+ }]
340
+ }]
90
341
  };
91
342
  });
92
343
 
93
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
94
- if (request.params.uri === "file:///example.txt") {
95
- return {
96
- contents: [
97
- {
98
- uri: "file:///example.txt",
99
- mimeType: "text/plain",
100
- text: "This is the content of the example resource.",
101
- },
102
- ],
103
- };
104
- } else {
105
- throw new Error("Resource not found");
344
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
345
+ if (request.params.name !== "example-prompt") {
346
+ throw new Error("Unknown prompt");
106
347
  }
348
+ return {
349
+ description: "Example prompt",
350
+ messages: [{
351
+ role: "user",
352
+ content: {
353
+ type: "text",
354
+ text: "Example prompt text"
355
+ }
356
+ }]
357
+ };
107
358
  });
108
359
 
109
360
  const transport = new StdioServerTransport();
110
361
  await server.connect(transport);
111
362
  ```
112
363
 
364
+ ### Writing MCP Clients
365
+
366
+ The SDK provides a high-level client interface:
367
+
368
+ ```typescript
369
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
370
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
371
+
372
+ const transport = new StdioClientTransport({
373
+ command: "node",
374
+ args: ["server.js"]
375
+ });
376
+
377
+ const client = new Client(
378
+ {
379
+ name: "example-client",
380
+ version: "1.0.0"
381
+ },
382
+ {
383
+ capabilities: {
384
+ prompts: {},
385
+ resources: {},
386
+ tools: {}
387
+ }
388
+ }
389
+ );
390
+
391
+ await client.connect(transport);
392
+
393
+ // List prompts
394
+ const prompts = await client.listPrompts();
395
+
396
+ // Get a prompt
397
+ const prompt = await client.getPrompt("example-prompt", {
398
+ arg1: "value"
399
+ });
400
+
401
+ // List resources
402
+ const resources = await client.listResources();
403
+
404
+ // Read a resource
405
+ const resource = await client.readResource("file:///example.txt");
406
+
407
+ // Call a tool
408
+ const result = await client.callTool("example-tool", {
409
+ arg1: "value"
410
+ });
411
+ ```
412
+
113
413
  ## Documentation
114
414
 
115
415
  - [Model Context Protocol documentation](https://modelcontextprotocol.io)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const eventsource_1 = __importDefault(require("eventsource"));
7
+ const ws_1 = __importDefault(require("ws"));
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ global.EventSource = eventsource_1.default;
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ global.WebSocket = ws_1.default;
12
+ const express_1 = __importDefault(require("express"));
13
+ const index_js_1 = require("./client/index.js");
14
+ const sse_js_1 = require("./client/sse.js");
15
+ const stdio_js_1 = require("./client/stdio.js");
16
+ const websocket_js_1 = require("./client/websocket.js");
17
+ const index_js_2 = require("./server/index.js");
18
+ const sse_js_2 = require("./server/sse.js");
19
+ const stdio_js_2 = require("./server/stdio.js");
20
+ const types_js_1 = require("./types.js");
21
+ async function runClient(url_or_command, args) {
22
+ const client = new index_js_1.Client({
23
+ name: "mcp-typescript test client",
24
+ version: "0.1.0",
25
+ }, {
26
+ capabilities: {
27
+ sampling: {},
28
+ },
29
+ });
30
+ let clientTransport;
31
+ let url = undefined;
32
+ try {
33
+ url = new URL(url_or_command);
34
+ }
35
+ catch (_a) {
36
+ // Ignore
37
+ }
38
+ if ((url === null || url === void 0 ? void 0 : url.protocol) === "http:" || (url === null || url === void 0 ? void 0 : url.protocol) === "https:") {
39
+ clientTransport = new sse_js_1.SSEClientTransport(new URL(url_or_command));
40
+ }
41
+ else if ((url === null || url === void 0 ? void 0 : url.protocol) === "ws:" || (url === null || url === void 0 ? void 0 : url.protocol) === "wss:") {
42
+ clientTransport = new websocket_js_1.WebSocketClientTransport(new URL(url_or_command));
43
+ }
44
+ else {
45
+ clientTransport = new stdio_js_1.StdioClientTransport({
46
+ command: url_or_command,
47
+ args,
48
+ });
49
+ }
50
+ console.log("Connected to server.");
51
+ await client.connect(clientTransport);
52
+ console.log("Initialized.");
53
+ await client.request({ method: "resources/list" }, types_js_1.ListResourcesResultSchema);
54
+ await client.close();
55
+ console.log("Closed.");
56
+ }
57
+ async function runServer(port) {
58
+ if (port !== null) {
59
+ const app = (0, express_1.default)();
60
+ let servers = [];
61
+ app.get("/sse", async (req, res) => {
62
+ console.log("Got new SSE connection");
63
+ const transport = new sse_js_2.SSEServerTransport("/message", res);
64
+ const server = new index_js_2.Server({
65
+ name: "mcp-typescript test server",
66
+ version: "0.1.0",
67
+ }, {
68
+ capabilities: {},
69
+ });
70
+ servers.push(server);
71
+ server.onclose = () => {
72
+ console.log("SSE connection closed");
73
+ servers = servers.filter((s) => s !== server);
74
+ };
75
+ await server.connect(transport);
76
+ });
77
+ app.post("/message", async (req, res) => {
78
+ console.log("Received message");
79
+ const sessionId = req.query.sessionId;
80
+ const transport = servers
81
+ .map((s) => s.transport)
82
+ .find((t) => t.sessionId === sessionId);
83
+ if (!transport) {
84
+ res.status(404).send("Session not found");
85
+ return;
86
+ }
87
+ await transport.handlePostMessage(req, res);
88
+ });
89
+ app.listen(port, () => {
90
+ console.log(`Server running on http://localhost:${port}/sse`);
91
+ });
92
+ }
93
+ else {
94
+ const server = new index_js_2.Server({
95
+ name: "mcp-typescript test server",
96
+ version: "0.1.0",
97
+ }, {
98
+ capabilities: {
99
+ prompts: {},
100
+ resources: {},
101
+ tools: {},
102
+ logging: {},
103
+ },
104
+ });
105
+ const transport = new stdio_js_2.StdioServerTransport();
106
+ await server.connect(transport);
107
+ console.log("Server running on stdio");
108
+ }
109
+ }
110
+ const args = process.argv.slice(2);
111
+ const command = args[0];
112
+ switch (command) {
113
+ case "client":
114
+ if (args.length < 2) {
115
+ console.error("Usage: client <server_url_or_command> [args...]");
116
+ process.exit(1);
117
+ }
118
+ runClient(args[1], args.slice(2)).catch((error) => {
119
+ console.error(error);
120
+ process.exit(1);
121
+ });
122
+ break;
123
+ case "server": {
124
+ const port = args[1] ? parseInt(args[1]) : null;
125
+ runServer(port).catch((error) => {
126
+ console.error(error);
127
+ process.exit(1);
128
+ });
129
+ break;
130
+ }
131
+ default:
132
+ console.error("Unrecognized command:", command);
133
+ }
134
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ export type ClientOptions = ProtocolOptions & {
5
5
  /**
6
6
  * Capabilities to advertise as being supported by this client.
7
7
  */
8
- capabilities: ClientCapabilities;
8
+ capabilities?: ClientCapabilities;
9
9
  };
10
10
  /**
11
11
  * An MCP client on top of a pluggable transport.
@@ -40,7 +40,13 @@ export declare class Client<RequestT extends Request = Request, NotificationT ex
40
40
  /**
41
41
  * Initializes this client with the given name and version information.
42
42
  */
43
- constructor(_clientInfo: Implementation, options: ClientOptions);
43
+ constructor(_clientInfo: Implementation, options?: ClientOptions);
44
+ /**
45
+ * Registers new capabilities. This can only be called before connecting to a transport.
46
+ *
47
+ * The new capabilities will be merged with any existing capabilities previously given (e.g., at initialization).
48
+ */
49
+ registerCapabilities(capabilities: ClientCapabilities): void;
44
50
  protected assertCapability(capability: keyof ServerCapabilities, method: string): void;
45
51
  connect(transport: Transport): Promise<void>;
46
52
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}