@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.
- package/README.md +358 -58
- package/dist/cjs/cli.d.ts.map +1 -0
- package/dist/cjs/cli.js +134 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/{client → cjs/client}/index.d.ts +8 -2
- package/dist/cjs/client/index.d.ts.map +1 -0
- package/dist/cjs/client/index.js +222 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/client/sse.d.ts.map +1 -0
- package/dist/cjs/client/sse.js +99 -0
- package/dist/cjs/client/sse.js.map +1 -0
- package/dist/cjs/client/stdio.d.ts.map +1 -0
- package/dist/cjs/client/stdio.js +156 -0
- package/dist/cjs/client/stdio.js.map +1 -0
- package/dist/cjs/client/websocket.d.ts.map +1 -0
- package/dist/cjs/client/websocket.js +65 -0
- package/dist/cjs/client/websocket.js.map +1 -0
- package/dist/cjs/inMemory.d.ts.map +1 -0
- package/dist/cjs/inMemory.js +51 -0
- package/dist/cjs/inMemory.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/server/completable.d.ts +22 -0
- package/dist/cjs/server/completable.d.ts.map +1 -0
- package/dist/cjs/server/completable.js +65 -0
- package/dist/cjs/server/completable.js.map +1 -0
- package/dist/{server → cjs/server}/index.d.ts +13 -2
- package/dist/cjs/server/index.d.ts.map +1 -0
- package/dist/cjs/server/index.js +200 -0
- package/dist/cjs/server/index.js.map +1 -0
- package/dist/cjs/server/mcp.d.ts +150 -0
- package/dist/cjs/server/mcp.d.ts.map +1 -0
- package/dist/cjs/server/mcp.js +365 -0
- package/dist/cjs/server/mcp.js.map +1 -0
- package/dist/cjs/server/sse.d.ts.map +1 -0
- package/dist/cjs/server/sse.js +123 -0
- package/dist/cjs/server/sse.js.map +1 -0
- package/dist/cjs/server/stdio.d.ts.map +1 -0
- package/dist/cjs/server/stdio.js +85 -0
- package/dist/cjs/server/stdio.js.map +1 -0
- package/dist/{shared → cjs/shared}/protocol.d.ts +6 -1
- package/dist/cjs/shared/protocol.d.ts.map +1 -0
- package/dist/cjs/shared/protocol.js +321 -0
- package/dist/cjs/shared/protocol.js.map +1 -0
- package/dist/cjs/shared/stdio.d.ts.map +1 -0
- package/dist/cjs/shared/stdio.js +37 -0
- package/dist/cjs/shared/stdio.js.map +1 -0
- package/dist/cjs/shared/transport.d.ts.map +1 -0
- package/dist/cjs/shared/transport.js +3 -0
- package/dist/{shared → cjs/shared}/transport.js.map +1 -1
- package/dist/cjs/shared/uriTemplate.d.ts +24 -0
- package/dist/cjs/shared/uriTemplate.d.ts.map +1 -0
- package/dist/cjs/shared/uriTemplate.js +242 -0
- package/dist/cjs/shared/uriTemplate.js.map +1 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +1002 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/cli.d.ts +2 -0
- package/dist/esm/cli.d.ts.map +1 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/client/index.d.ts +779 -0
- package/dist/esm/client/index.d.ts.map +1 -0
- package/dist/{client → esm/client}/index.js +14 -2
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/sse.d.ts +27 -0
- package/dist/esm/client/sse.d.ts.map +1 -0
- package/dist/esm/client/sse.js.map +1 -0
- package/dist/esm/client/stdio.d.ts +63 -0
- package/dist/esm/client/stdio.d.ts.map +1 -0
- package/dist/esm/client/stdio.js.map +1 -0
- package/dist/esm/client/websocket.d.ts +17 -0
- package/dist/esm/client/websocket.d.ts.map +1 -0
- package/dist/esm/client/websocket.js.map +1 -0
- package/dist/esm/inMemory.d.ts +20 -0
- package/dist/esm/inMemory.d.ts.map +1 -0
- package/dist/esm/inMemory.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/server/completable.d.ts +22 -0
- package/dist/esm/server/completable.d.ts.map +1 -0
- package/dist/esm/server/completable.js +60 -0
- package/dist/esm/server/completable.js.map +1 -0
- package/dist/esm/server/index.d.ts +123 -0
- package/dist/esm/server/index.d.ts.map +1 -0
- package/dist/{server → esm/server}/index.js +16 -2
- package/dist/esm/server/index.js.map +1 -0
- package/dist/esm/server/mcp.d.ts +150 -0
- package/dist/esm/server/mcp.d.ts.map +1 -0
- package/dist/esm/server/mcp.js +360 -0
- package/dist/esm/server/mcp.js.map +1 -0
- package/dist/esm/server/sse.d.ts +46 -0
- package/dist/esm/server/sse.d.ts.map +1 -0
- package/dist/esm/server/sse.js.map +1 -0
- package/dist/esm/server/stdio.d.ts +28 -0
- package/dist/esm/server/stdio.d.ts.map +1 -0
- package/dist/esm/server/stdio.js.map +1 -0
- package/dist/esm/shared/protocol.d.ts +162 -0
- package/dist/esm/shared/protocol.d.ts.map +1 -0
- package/dist/{shared → esm/shared}/protocol.js +19 -0
- package/dist/esm/shared/protocol.js.map +1 -0
- package/dist/esm/shared/stdio.d.ts +13 -0
- package/dist/esm/shared/stdio.d.ts.map +1 -0
- package/dist/esm/shared/stdio.js.map +1 -0
- package/dist/esm/shared/transport.d.ts +39 -0
- package/dist/esm/shared/transport.d.ts.map +1 -0
- package/dist/esm/shared/transport.js.map +1 -0
- package/dist/esm/shared/uriTemplate.d.ts +24 -0
- package/dist/esm/shared/uriTemplate.d.ts.map +1 -0
- package/dist/esm/shared/uriTemplate.js +238 -0
- package/dist/esm/shared/uriTemplate.js.map +1 -0
- package/dist/esm/types.d.ts +26431 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +12 -6
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js.map +0 -1
- package/dist/client/sse.d.ts.map +0 -1
- package/dist/client/sse.js.map +0 -1
- package/dist/client/stdio.d.ts.map +0 -1
- package/dist/client/stdio.js.map +0 -1
- package/dist/client/websocket.d.ts.map +0 -1
- package/dist/client/websocket.js.map +0 -1
- package/dist/inMemory.d.ts.map +0 -1
- package/dist/inMemory.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/sse.d.ts.map +0 -1
- package/dist/server/sse.js.map +0 -1
- package/dist/server/stdio.d.ts.map +0 -1
- package/dist/server/stdio.js.map +0 -1
- package/dist/shared/protocol.d.ts.map +0 -1
- package/dist/shared/protocol.js.map +0 -1
- package/dist/shared/stdio.d.ts.map +0 -1
- package/dist/shared/stdio.js.map +0 -1
- package/dist/shared/transport.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
- /package/dist/{client → cjs/client}/sse.d.ts +0 -0
- /package/dist/{client → cjs/client}/stdio.d.ts +0 -0
- /package/dist/{client → cjs/client}/websocket.d.ts +0 -0
- /package/dist/{inMemory.d.ts → cjs/inMemory.d.ts} +0 -0
- /package/dist/{server → cjs/server}/sse.d.ts +0 -0
- /package/dist/{server → cjs/server}/stdio.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/stdio.d.ts +0 -0
- /package/dist/{shared → cjs/shared}/transport.d.ts +0 -0
- /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
- /package/dist/{cli.js → esm/cli.js} +0 -0
- /package/dist/{client → esm/client}/sse.js +0 -0
- /package/dist/{client → esm/client}/stdio.js +0 -0
- /package/dist/{client → esm/client}/websocket.js +0 -0
- /package/dist/{inMemory.js → esm/inMemory.js} +0 -0
- /package/dist/{server → esm/server}/sse.js +0 -0
- /package/dist/{server → esm/server}/stdio.js +0 -0
- /package/dist/{shared → esm/shared}/stdio.js +0 -0
- /package/dist/{shared → esm/shared}/transport.js +0 -0
- /package/dist/{types.js → esm/types.js} +0 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ResourceTemplate = exports.McpServer = void 0;
|
|
4
|
+
const index_js_1 = require("./index.js");
|
|
5
|
+
const zod_to_json_schema_1 = require("zod-to-json-schema");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const types_js_1 = require("../types.js");
|
|
8
|
+
const completable_js_1 = require("./completable.js");
|
|
9
|
+
const uriTemplate_js_1 = require("../shared/uriTemplate.js");
|
|
10
|
+
/**
|
|
11
|
+
* High-level MCP server that provides a simpler API for working with resources, tools, and prompts.
|
|
12
|
+
* For advanced usage (like sending notifications or setting custom request handlers), use the underlying
|
|
13
|
+
* Server instance available via the `server` property.
|
|
14
|
+
*/
|
|
15
|
+
class McpServer {
|
|
16
|
+
constructor(serverInfo, options) {
|
|
17
|
+
this._registeredResources = {};
|
|
18
|
+
this._registeredResourceTemplates = {};
|
|
19
|
+
this._registeredTools = {};
|
|
20
|
+
this._registeredPrompts = {};
|
|
21
|
+
this.server = new index_js_1.Server(serverInfo, options);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Attaches to the given transport, starts it, and starts listening for messages.
|
|
25
|
+
*
|
|
26
|
+
* The `server` object assumes ownership of the Transport, replacing any callbacks that have already been set, and expects that it is the only user of the Transport instance going forward.
|
|
27
|
+
*/
|
|
28
|
+
async connect(transport) {
|
|
29
|
+
return await this.server.connect(transport);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Closes the connection.
|
|
33
|
+
*/
|
|
34
|
+
async close() {
|
|
35
|
+
await this.server.close();
|
|
36
|
+
}
|
|
37
|
+
setToolRequestHandlers() {
|
|
38
|
+
this.server.assertCanSetRequestHandler(types_js_1.ListToolsRequestSchema.shape.method.value);
|
|
39
|
+
this.server.assertCanSetRequestHandler(types_js_1.CallToolRequestSchema.shape.method.value);
|
|
40
|
+
this.server.registerCapabilities({
|
|
41
|
+
tools: {},
|
|
42
|
+
});
|
|
43
|
+
this.server.setRequestHandler(types_js_1.ListToolsRequestSchema, () => ({
|
|
44
|
+
tools: Object.entries(this._registeredTools).map(([name, tool]) => {
|
|
45
|
+
return {
|
|
46
|
+
name,
|
|
47
|
+
description: tool.description,
|
|
48
|
+
inputSchema: tool.inputSchema
|
|
49
|
+
? (0, zod_to_json_schema_1.zodToJsonSchema)(tool.inputSchema)
|
|
50
|
+
: EMPTY_OBJECT_JSON_SCHEMA,
|
|
51
|
+
};
|
|
52
|
+
}),
|
|
53
|
+
}));
|
|
54
|
+
this.server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request, extra) => {
|
|
55
|
+
const tool = this._registeredTools[request.params.name];
|
|
56
|
+
if (!tool) {
|
|
57
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Tool ${request.params.name} not found`);
|
|
58
|
+
}
|
|
59
|
+
if (tool.inputSchema) {
|
|
60
|
+
const parseResult = await tool.inputSchema.safeParseAsync(request.params.arguments);
|
|
61
|
+
if (!parseResult.success) {
|
|
62
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Invalid arguments for tool ${request.params.name}: ${parseResult.error.message}`);
|
|
63
|
+
}
|
|
64
|
+
const args = parseResult.data;
|
|
65
|
+
const cb = tool.callback;
|
|
66
|
+
try {
|
|
67
|
+
return await Promise.resolve(cb(args, extra));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
return {
|
|
71
|
+
content: [
|
|
72
|
+
{
|
|
73
|
+
type: "text",
|
|
74
|
+
text: error instanceof Error ? error.message : String(error),
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const cb = tool.callback;
|
|
83
|
+
try {
|
|
84
|
+
return await Promise.resolve(cb(extra));
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return {
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: "text",
|
|
91
|
+
text: error instanceof Error ? error.message : String(error),
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
isError: true,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
setCompletionRequestHandler() {
|
|
101
|
+
this.server.assertCanSetRequestHandler(types_js_1.CompleteRequestSchema.shape.method.value);
|
|
102
|
+
this.server.setRequestHandler(types_js_1.CompleteRequestSchema, async (request) => {
|
|
103
|
+
switch (request.params.ref.type) {
|
|
104
|
+
case "ref/prompt":
|
|
105
|
+
return this.handlePromptCompletion(request, request.params.ref);
|
|
106
|
+
case "ref/resource":
|
|
107
|
+
return this.handleResourceCompletion(request, request.params.ref);
|
|
108
|
+
default:
|
|
109
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Invalid completion reference: ${request.params.ref}`);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
async handlePromptCompletion(request, ref) {
|
|
114
|
+
const prompt = this._registeredPrompts[ref.name];
|
|
115
|
+
if (!prompt) {
|
|
116
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Prompt ${request.params.ref.name} not found`);
|
|
117
|
+
}
|
|
118
|
+
if (!prompt.argsSchema) {
|
|
119
|
+
return EMPTY_COMPLETION_RESULT;
|
|
120
|
+
}
|
|
121
|
+
const field = prompt.argsSchema.shape[request.params.argument.name];
|
|
122
|
+
if (!(field instanceof completable_js_1.Completable)) {
|
|
123
|
+
return EMPTY_COMPLETION_RESULT;
|
|
124
|
+
}
|
|
125
|
+
const def = field._def;
|
|
126
|
+
const suggestions = await def.complete(request.params.argument.value);
|
|
127
|
+
return createCompletionResult(suggestions);
|
|
128
|
+
}
|
|
129
|
+
async handleResourceCompletion(request, ref) {
|
|
130
|
+
const template = Object.values(this._registeredResourceTemplates).find((t) => t.resourceTemplate.uriTemplate.toString() === ref.uri);
|
|
131
|
+
if (!template) {
|
|
132
|
+
if (this._registeredResources[ref.uri]) {
|
|
133
|
+
// Attempting to autocomplete a fixed resource URI is not an error in the spec (but probably should be).
|
|
134
|
+
return EMPTY_COMPLETION_RESULT;
|
|
135
|
+
}
|
|
136
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Resource template ${request.params.ref.uri} not found`);
|
|
137
|
+
}
|
|
138
|
+
const completer = template.resourceTemplate.completeCallback(request.params.argument.name);
|
|
139
|
+
if (!completer) {
|
|
140
|
+
return EMPTY_COMPLETION_RESULT;
|
|
141
|
+
}
|
|
142
|
+
const suggestions = await completer(request.params.argument.value);
|
|
143
|
+
return createCompletionResult(suggestions);
|
|
144
|
+
}
|
|
145
|
+
setResourceRequestHandlers() {
|
|
146
|
+
this.server.assertCanSetRequestHandler(types_js_1.ListResourcesRequestSchema.shape.method.value);
|
|
147
|
+
this.server.assertCanSetRequestHandler(types_js_1.ListResourceTemplatesRequestSchema.shape.method.value);
|
|
148
|
+
this.server.assertCanSetRequestHandler(types_js_1.ReadResourceRequestSchema.shape.method.value);
|
|
149
|
+
this.server.registerCapabilities({
|
|
150
|
+
resources: {},
|
|
151
|
+
});
|
|
152
|
+
this.server.setRequestHandler(types_js_1.ListResourcesRequestSchema, async (request, extra) => {
|
|
153
|
+
const resources = Object.entries(this._registeredResources).map(([uri, resource]) => ({
|
|
154
|
+
uri,
|
|
155
|
+
name: resource.name,
|
|
156
|
+
...resource.metadata,
|
|
157
|
+
}));
|
|
158
|
+
const templateResources = [];
|
|
159
|
+
for (const template of Object.values(this._registeredResourceTemplates)) {
|
|
160
|
+
if (!template.resourceTemplate.listCallback) {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const result = await template.resourceTemplate.listCallback(extra);
|
|
164
|
+
for (const resource of result.resources) {
|
|
165
|
+
templateResources.push({
|
|
166
|
+
...resource,
|
|
167
|
+
...template.metadata,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return { resources: [...resources, ...templateResources] };
|
|
172
|
+
});
|
|
173
|
+
this.server.setRequestHandler(types_js_1.ListResourceTemplatesRequestSchema, async () => {
|
|
174
|
+
const resourceTemplates = Object.entries(this._registeredResourceTemplates).map(([name, template]) => ({
|
|
175
|
+
name,
|
|
176
|
+
uriTemplate: template.resourceTemplate.uriTemplate.toString(),
|
|
177
|
+
...template.metadata,
|
|
178
|
+
}));
|
|
179
|
+
return { resourceTemplates };
|
|
180
|
+
});
|
|
181
|
+
this.server.setRequestHandler(types_js_1.ReadResourceRequestSchema, async (request, extra) => {
|
|
182
|
+
const uri = new URL(request.params.uri);
|
|
183
|
+
// First check for exact resource match
|
|
184
|
+
const resource = this._registeredResources[uri.toString()];
|
|
185
|
+
if (resource) {
|
|
186
|
+
return resource.readCallback(uri, extra);
|
|
187
|
+
}
|
|
188
|
+
// Then check templates
|
|
189
|
+
for (const template of Object.values(this._registeredResourceTemplates)) {
|
|
190
|
+
const variables = template.resourceTemplate.uriTemplate.match(uri.toString());
|
|
191
|
+
if (variables) {
|
|
192
|
+
return template.readCallback(uri, variables, extra);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Resource ${uri} not found`);
|
|
196
|
+
});
|
|
197
|
+
this.setCompletionRequestHandler();
|
|
198
|
+
}
|
|
199
|
+
setPromptRequestHandlers() {
|
|
200
|
+
this.server.assertCanSetRequestHandler(types_js_1.ListPromptsRequestSchema.shape.method.value);
|
|
201
|
+
this.server.assertCanSetRequestHandler(types_js_1.GetPromptRequestSchema.shape.method.value);
|
|
202
|
+
this.server.registerCapabilities({
|
|
203
|
+
prompts: {},
|
|
204
|
+
});
|
|
205
|
+
this.server.setRequestHandler(types_js_1.ListPromptsRequestSchema, () => ({
|
|
206
|
+
prompts: Object.entries(this._registeredPrompts).map(([name, prompt]) => {
|
|
207
|
+
return {
|
|
208
|
+
name,
|
|
209
|
+
description: prompt.description,
|
|
210
|
+
arguments: prompt.argsSchema
|
|
211
|
+
? promptArgumentsFromSchema(prompt.argsSchema)
|
|
212
|
+
: undefined,
|
|
213
|
+
};
|
|
214
|
+
}),
|
|
215
|
+
}));
|
|
216
|
+
this.server.setRequestHandler(types_js_1.GetPromptRequestSchema, async (request, extra) => {
|
|
217
|
+
const prompt = this._registeredPrompts[request.params.name];
|
|
218
|
+
if (!prompt) {
|
|
219
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Prompt ${request.params.name} not found`);
|
|
220
|
+
}
|
|
221
|
+
if (prompt.argsSchema) {
|
|
222
|
+
const parseResult = await prompt.argsSchema.safeParseAsync(request.params.arguments);
|
|
223
|
+
if (!parseResult.success) {
|
|
224
|
+
throw new types_js_1.McpError(types_js_1.ErrorCode.InvalidParams, `Invalid arguments for prompt ${request.params.name}: ${parseResult.error.message}`);
|
|
225
|
+
}
|
|
226
|
+
const args = parseResult.data;
|
|
227
|
+
const cb = prompt.callback;
|
|
228
|
+
return await Promise.resolve(cb(args, extra));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const cb = prompt.callback;
|
|
232
|
+
return await Promise.resolve(cb(extra));
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
this.setCompletionRequestHandler();
|
|
236
|
+
}
|
|
237
|
+
resource(name, uriOrTemplate, ...rest) {
|
|
238
|
+
let metadata;
|
|
239
|
+
if (typeof rest[0] === "object") {
|
|
240
|
+
metadata = rest.shift();
|
|
241
|
+
}
|
|
242
|
+
const readCallback = rest[0];
|
|
243
|
+
if (typeof uriOrTemplate === "string") {
|
|
244
|
+
if (this._registeredResources[uriOrTemplate]) {
|
|
245
|
+
throw new Error(`Resource ${uriOrTemplate} is already registered`);
|
|
246
|
+
}
|
|
247
|
+
this._registeredResources[uriOrTemplate] = {
|
|
248
|
+
name,
|
|
249
|
+
metadata,
|
|
250
|
+
readCallback: readCallback,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
if (this._registeredResourceTemplates[name]) {
|
|
255
|
+
throw new Error(`Resource template ${name} is already registered`);
|
|
256
|
+
}
|
|
257
|
+
this._registeredResourceTemplates[name] = {
|
|
258
|
+
resourceTemplate: uriOrTemplate,
|
|
259
|
+
metadata,
|
|
260
|
+
readCallback: readCallback,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
this.setResourceRequestHandlers();
|
|
264
|
+
}
|
|
265
|
+
tool(name, ...rest) {
|
|
266
|
+
if (this._registeredTools[name]) {
|
|
267
|
+
throw new Error(`Tool ${name} is already registered`);
|
|
268
|
+
}
|
|
269
|
+
let description;
|
|
270
|
+
if (typeof rest[0] === "string") {
|
|
271
|
+
description = rest.shift();
|
|
272
|
+
}
|
|
273
|
+
let paramsSchema;
|
|
274
|
+
if (rest.length > 1) {
|
|
275
|
+
paramsSchema = rest.shift();
|
|
276
|
+
}
|
|
277
|
+
const cb = rest[0];
|
|
278
|
+
this._registeredTools[name] = {
|
|
279
|
+
description,
|
|
280
|
+
inputSchema: paramsSchema === undefined ? undefined : zod_1.z.object(paramsSchema),
|
|
281
|
+
callback: cb,
|
|
282
|
+
};
|
|
283
|
+
this.setToolRequestHandlers();
|
|
284
|
+
}
|
|
285
|
+
prompt(name, ...rest) {
|
|
286
|
+
if (this._registeredPrompts[name]) {
|
|
287
|
+
throw new Error(`Prompt ${name} is already registered`);
|
|
288
|
+
}
|
|
289
|
+
let description;
|
|
290
|
+
if (typeof rest[0] === "string") {
|
|
291
|
+
description = rest.shift();
|
|
292
|
+
}
|
|
293
|
+
let argsSchema;
|
|
294
|
+
if (rest.length > 1) {
|
|
295
|
+
argsSchema = rest.shift();
|
|
296
|
+
}
|
|
297
|
+
const cb = rest[0];
|
|
298
|
+
this._registeredPrompts[name] = {
|
|
299
|
+
description,
|
|
300
|
+
argsSchema: argsSchema === undefined ? undefined : zod_1.z.object(argsSchema),
|
|
301
|
+
callback: cb,
|
|
302
|
+
};
|
|
303
|
+
this.setPromptRequestHandlers();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
exports.McpServer = McpServer;
|
|
307
|
+
/**
|
|
308
|
+
* A resource template combines a URI pattern with optional functionality to enumerate
|
|
309
|
+
* all resources matching that pattern.
|
|
310
|
+
*/
|
|
311
|
+
class ResourceTemplate {
|
|
312
|
+
constructor(uriTemplate, _callbacks) {
|
|
313
|
+
this._callbacks = _callbacks;
|
|
314
|
+
this._uriTemplate =
|
|
315
|
+
typeof uriTemplate === "string"
|
|
316
|
+
? new uriTemplate_js_1.UriTemplate(uriTemplate)
|
|
317
|
+
: uriTemplate;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Gets the URI template pattern.
|
|
321
|
+
*/
|
|
322
|
+
get uriTemplate() {
|
|
323
|
+
return this._uriTemplate;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Gets the list callback, if one was provided.
|
|
327
|
+
*/
|
|
328
|
+
get listCallback() {
|
|
329
|
+
return this._callbacks.list;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Gets the callback for completing a specific URI template variable, if one was provided.
|
|
333
|
+
*/
|
|
334
|
+
completeCallback(variable) {
|
|
335
|
+
var _a;
|
|
336
|
+
return (_a = this._callbacks.complete) === null || _a === void 0 ? void 0 : _a[variable];
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
exports.ResourceTemplate = ResourceTemplate;
|
|
340
|
+
const EMPTY_OBJECT_JSON_SCHEMA = {
|
|
341
|
+
type: "object",
|
|
342
|
+
};
|
|
343
|
+
function promptArgumentsFromSchema(schema) {
|
|
344
|
+
return Object.entries(schema.shape).map(([name, field]) => ({
|
|
345
|
+
name,
|
|
346
|
+
description: field.description,
|
|
347
|
+
required: !field.isOptional(),
|
|
348
|
+
}));
|
|
349
|
+
}
|
|
350
|
+
function createCompletionResult(suggestions) {
|
|
351
|
+
return {
|
|
352
|
+
completion: {
|
|
353
|
+
values: suggestions.slice(0, 100),
|
|
354
|
+
total: suggestions.length,
|
|
355
|
+
hasMore: suggestions.length > 100,
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
const EMPTY_COMPLETION_RESULT = {
|
|
360
|
+
completion: {
|
|
361
|
+
values: [],
|
|
362
|
+
hasMore: false,
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/server/mcp.ts"],"names":[],"mappings":";;;AAAA,yCAAmD;AACnD,2DAAqD;AACrD,6BAUa;AACb,0CA0BqB;AACrB,qDAA+D;AAC/D,6DAAkE;AAIlE;;;;GAIG;AACH,MAAa,SAAS;IAapB,YAAY,UAA0B,EAAE,OAAuB;QAPvD,yBAAoB,GAA0C,EAAE,CAAC;QACjE,iCAA4B,GAEhC,EAAE,CAAC;QACC,qBAAgB,GAAuC,EAAE,CAAC;QAC1D,uBAAkB,GAAyC,EAAE,CAAC;QAGpE,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,SAAoB;QAChC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,iCAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAC1C,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,gCAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CACzC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC/B,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,iCAAsB,EACtB,GAAoB,EAAE,CAAC,CAAC;YACtB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC9C,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAQ,EAAE;gBACrB,OAAO;oBACL,IAAI;oBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC3B,CAAC,CAAE,IAAA,oCAAe,EAAC,IAAI,CAAC,WAAW,CAAyB;wBAC5D,CAAC,CAAC,wBAAwB;iBAC7B,CAAC;YACJ,CAAC,CACF;SACF,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,gCAAqB,EACrB,KAAK,EAAE,OAAO,EAAE,KAAK,EAA2B,EAAE;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,QAAQ,OAAO,CAAC,MAAM,CAAC,IAAI,YAAY,CACxC,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CACvD,OAAO,CAAC,MAAM,CAAC,SAAS,CACzB,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,8BAA8B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CAClF,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;gBAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,QAAqC,CAAC;gBACtD,IAAI,CAAC;oBACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBAChD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;6BAC7D;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,IAAI,CAAC,QAAmC,CAAC;gBACpD,IAAI,CAAC;oBACH,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC1C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;6BAC7D;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,2BAA2B;QACjC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,gCAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CACzC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,gCAAqB,EACrB,KAAK,EAAE,OAAO,EAA2B,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAChC,KAAK,YAAY;oBACf,OAAO,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAElE,KAAK,cAAc;oBACjB,OAAO,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAEpE;oBACE,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,iCAAiC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CACtD,CAAC;YACN,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,OAAwB,EACxB,GAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,UAAU,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,YAAY,CAC9C,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,OAAO,uBAAuB,CAAC;QACjC,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,CAAC,KAAK,YAAY,4BAAW,CAAC,EAAE,CAAC;YACpC,OAAO,uBAAuB,CAAC;QACjC,CAAC;QAED,MAAM,GAAG,GAA8B,KAAK,CAAC,IAAI,CAAC;QAClD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtE,OAAO,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,OAAwB,EACxB,GAAsB;QAEtB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,IAAI,CACpE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,GAAG,CAC7D,CAAC;QAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,wGAAwG;gBACxG,OAAO,uBAAuB,CAAC;YACjC,CAAC;YAED,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,qBAAqB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CACxD,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,CAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAC7B,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,uBAAuB,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnE,OAAO,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAEO,0BAA0B;QAChC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,qCAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAC9C,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,6CAAkC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CACtD,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,oCAAyB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAC7C,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC/B,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,qCAA0B,EAC1B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAC7D,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpB,GAAG;gBACH,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,GAAG,QAAQ,CAAC,QAAQ;aACrB,CAAC,CACH,CAAC;YAEF,MAAM,iBAAiB,GAAe,EAAE,CAAC;YACzC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAClC,IAAI,CAAC,4BAA4B,CAClC,EAAE,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;oBAC5C,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACnE,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;oBACxC,iBAAiB,CAAC,IAAI,CAAC;wBACrB,GAAG,QAAQ;wBACX,GAAG,QAAQ,CAAC,QAAQ;qBACrB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,EAAE,SAAS,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC;QAC7D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,6CAAkC,EAClC,KAAK,IAAI,EAAE;YACT,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CACtC,IAAI,CAAC,4BAA4B,CAClC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3B,IAAI;gBACJ,WAAW,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,QAAQ,EAAE;gBAC7D,GAAG,QAAQ,CAAC,QAAQ;aACrB,CAAC,CAAC,CAAC;YAEJ,OAAO,EAAE,iBAAiB,EAAE,CAAC;QAC/B,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,oCAAyB,EACzB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAExC,uCAAuC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;YAED,uBAAuB;YACvB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAClC,IAAI,CAAC,4BAA4B,CAClC,EAAE,CAAC;gBACF,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAC3D,GAAG,CAAC,QAAQ,EAAE,CACf,CAAC;gBACF,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAED,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,YAAY,GAAG,YAAY,CAC5B,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,mCAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAC5C,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,0BAA0B,CACpC,iCAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAC1C,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;YAC/B,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,mCAAwB,EACxB,GAAsB,EAAE,CAAC,CAAC;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAClD,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAU,EAAE;gBACzB,OAAO;oBACL,IAAI;oBACJ,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,SAAS,EAAE,MAAM,CAAC,UAAU;wBAC1B,CAAC,CAAC,yBAAyB,CAAC,MAAM,CAAC,UAAU,CAAC;wBAC9C,CAAC,CAAC,SAAS;iBACd,CAAC;YACJ,CAAC,CACF;SACF,CAAC,CACH,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAC3B,iCAAsB,EACtB,KAAK,EAAE,OAAO,EAAE,KAAK,EAA4B,EAAE;YACjD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,UAAU,OAAO,CAAC,MAAM,CAAC,IAAI,YAAY,CAC1C,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,cAAc,CACxD,OAAO,CAAC,MAAM,CAAC,SAAS,CACzB,CAAC;gBACF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACzB,MAAM,IAAI,mBAAQ,CAChB,oBAAS,CAAC,aAAa,EACvB,gCAAgC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,CACpF,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;gBAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,QAA8C,CAAC;gBACjE,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,GAAG,MAAM,CAAC,QAAqC,CAAC;gBACxD,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,2BAA2B,EAAE,CAAC;IACrC,CAAC;IAoCD,QAAQ,CACN,IAAY,EACZ,aAAwC,EACxC,GAAG,IAAe;QAElB,IAAI,QAAsC,CAAC;QAC3C,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAsB,CAAC;QAC9C,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAEK,CAAC;QAEjC,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,YAAY,aAAa,wBAAwB,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,GAAG;gBACzC,IAAI;gBACJ,QAAQ;gBACR,YAAY,EAAE,YAAoC;aACnD,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,wBAAwB,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG;gBACxC,gBAAgB,EAAE,aAAa;gBAC/B,QAAQ;gBACR,YAAY,EAAE,YAA4C;aAC3D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACpC,CAAC;IA+BD,IAAI,CAAC,IAAY,EAAE,GAAG,IAAe;QACnC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,wBAAwB,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,WAA+B,CAAC;QACpC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,WAAW,GAAG,IAAI,CAAC,KAAK,EAAY,CAAC;QACvC,CAAC;QAED,IAAI,YAAqC,CAAC;QAC1C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,YAAY,GAAG,IAAI,CAAC,KAAK,EAAiB,CAAC;QAC7C,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAA0C,CAAC;QAC5D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG;YAC5B,WAAW;YACX,WAAW,EACT,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAC,CAAC,MAAM,CAAC,YAAY,CAAC;YACjE,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IA+BD,MAAM,CAAC,IAAY,EAAE,GAAG,IAAe;QACrC,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,wBAAwB,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,WAA+B,CAAC;QACpC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChC,WAAW,GAAG,IAAI,CAAC,KAAK,EAAY,CAAC;QACvC,CAAC;QAED,IAAI,UAA0C,CAAC;QAC/C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,UAAU,GAAG,IAAI,CAAC,KAAK,EAAwB,CAAC;QAClD,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAmD,CAAC;QACrE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG;YAC9B,WAAW;YACX,UAAU,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACvE,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC;CACF;AA7hBD,8BA6hBC;AASD;;;GAGG;AACH,MAAa,gBAAgB;IAG3B,YACE,WAAiC,EACzB,UAYP;QAZO,eAAU,GAAV,UAAU,CAYjB;QAED,IAAI,CAAC,YAAY;YACf,OAAO,WAAW,KAAK,QAAQ;gBAC7B,CAAC,CAAC,IAAI,4BAAW,CAAC,WAAW,CAAC;gBAC9B,CAAC,CAAC,WAAW,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,gBAAgB,CACd,QAAgB;;QAEhB,OAAO,MAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,0CAAG,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF;AA/CD,4CA+CC;AAqBD,MAAM,wBAAwB,GAAG;IAC/B,IAAI,EAAE,QAAiB;CACxB,CAAC;AAgEF,SAAS,yBAAyB,CAChC,MAAqC;IAErC,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CACrC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAkB,EAAE,CAAC,CAAC;QAClC,IAAI;QACJ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE;KAC9B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,WAAqB;IACnD,OAAO;QACL,UAAU,EAAE;YACV,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YACjC,KAAK,EAAE,WAAW,CAAC,MAAM;YACzB,OAAO,EAAE,WAAW,CAAC,MAAM,GAAG,GAAG;SAClC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,uBAAuB,GAAmB;IAC9C,UAAU,EAAE;QACV,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,KAAK;KACf;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../../src/server/sse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAwB,MAAM,aAAa,CAAC;AAMnE;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,SAAS;IAYhD,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,GAAG;IAZb,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,UAAU,CAAS;IAE3B,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;gBAEO,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,cAAc;IAK7B;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B;;;;OAIG;IACG,iBAAiB,CACrB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,UAAU,CAAC,EAAE,OAAO,GACnB,OAAO,CAAC,IAAI,CAAC;IAkChB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAY9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD;;;;OAIG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;CACF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
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
|
+
exports.SSEServerTransport = void 0;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const types_js_1 = require("../types.js");
|
|
9
|
+
const raw_body_1 = __importDefault(require("raw-body"));
|
|
10
|
+
const content_type_1 = __importDefault(require("content-type"));
|
|
11
|
+
const MAXIMUM_MESSAGE_SIZE = "4mb";
|
|
12
|
+
/**
|
|
13
|
+
* Server transport for SSE: this will send messages over an SSE connection and receive messages from HTTP POST requests.
|
|
14
|
+
*
|
|
15
|
+
* This transport is only available in Node.js environments.
|
|
16
|
+
*/
|
|
17
|
+
class SSEServerTransport {
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new SSE server transport, which will direct the client to POST messages to the relative or absolute URL identified by `_endpoint`.
|
|
20
|
+
*/
|
|
21
|
+
constructor(_endpoint, res) {
|
|
22
|
+
this._endpoint = _endpoint;
|
|
23
|
+
this.res = res;
|
|
24
|
+
this._sessionId = (0, node_crypto_1.randomUUID)();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Handles the initial SSE connection request.
|
|
28
|
+
*
|
|
29
|
+
* This should be called when a GET request is made to establish the SSE stream.
|
|
30
|
+
*/
|
|
31
|
+
async start() {
|
|
32
|
+
if (this._sseResponse) {
|
|
33
|
+
throw new Error("SSEServerTransport already started! If using Server class, note that connect() calls start() automatically.");
|
|
34
|
+
}
|
|
35
|
+
this.res.writeHead(200, {
|
|
36
|
+
"Content-Type": "text/event-stream",
|
|
37
|
+
"Cache-Control": "no-cache",
|
|
38
|
+
Connection: "keep-alive",
|
|
39
|
+
});
|
|
40
|
+
// Send the endpoint event
|
|
41
|
+
this.res.write(`event: endpoint\ndata: ${encodeURI(this._endpoint)}?sessionId=${this._sessionId}\n\n`);
|
|
42
|
+
this._sseResponse = this.res;
|
|
43
|
+
this.res.on("close", () => {
|
|
44
|
+
var _a;
|
|
45
|
+
this._sseResponse = undefined;
|
|
46
|
+
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Handles incoming POST messages.
|
|
51
|
+
*
|
|
52
|
+
* This should be called when a POST request is made to send a message to the server.
|
|
53
|
+
*/
|
|
54
|
+
async handlePostMessage(req, res, parsedBody) {
|
|
55
|
+
var _a, _b, _c;
|
|
56
|
+
if (!this._sseResponse) {
|
|
57
|
+
const message = "SSE connection not established";
|
|
58
|
+
res.writeHead(500).end(message);
|
|
59
|
+
throw new Error(message);
|
|
60
|
+
}
|
|
61
|
+
let body;
|
|
62
|
+
try {
|
|
63
|
+
const ct = content_type_1.default.parse((_a = req.headers["content-type"]) !== null && _a !== void 0 ? _a : "");
|
|
64
|
+
if (ct.type !== "application/json") {
|
|
65
|
+
throw new Error(`Unsupported content-type: ${ct}`);
|
|
66
|
+
}
|
|
67
|
+
body = parsedBody !== null && parsedBody !== void 0 ? parsedBody : await (0, raw_body_1.default)(req, {
|
|
68
|
+
limit: MAXIMUM_MESSAGE_SIZE,
|
|
69
|
+
encoding: (_b = ct.parameters.charset) !== null && _b !== void 0 ? _b : "utf-8",
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
res.writeHead(400).end(String(error));
|
|
74
|
+
(_c = this.onerror) === null || _c === void 0 ? void 0 : _c.call(this, error);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
await this.handleMessage(typeof body === 'string' ? JSON.parse(body) : body);
|
|
79
|
+
}
|
|
80
|
+
catch (_d) {
|
|
81
|
+
res.writeHead(400).end(`Invalid message: ${body}`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
res.writeHead(202).end("Accepted");
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Handle a client message, regardless of how it arrived. This can be used to inform the server of messages that arrive via a means different than HTTP POST.
|
|
88
|
+
*/
|
|
89
|
+
async handleMessage(message) {
|
|
90
|
+
var _a, _b;
|
|
91
|
+
let parsedMessage;
|
|
92
|
+
try {
|
|
93
|
+
parsedMessage = types_js_1.JSONRPCMessageSchema.parse(message);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
(_b = this.onmessage) === null || _b === void 0 ? void 0 : _b.call(this, parsedMessage);
|
|
100
|
+
}
|
|
101
|
+
async close() {
|
|
102
|
+
var _a, _b;
|
|
103
|
+
(_a = this._sseResponse) === null || _a === void 0 ? void 0 : _a.end();
|
|
104
|
+
this._sseResponse = undefined;
|
|
105
|
+
(_b = this.onclose) === null || _b === void 0 ? void 0 : _b.call(this);
|
|
106
|
+
}
|
|
107
|
+
async send(message) {
|
|
108
|
+
if (!this._sseResponse) {
|
|
109
|
+
throw new Error("Not connected");
|
|
110
|
+
}
|
|
111
|
+
this._sseResponse.write(`event: message\ndata: ${JSON.stringify(message)}\n\n`);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Returns the session ID for this transport.
|
|
115
|
+
*
|
|
116
|
+
* This can be used to route incoming POST requests.
|
|
117
|
+
*/
|
|
118
|
+
get sessionId() {
|
|
119
|
+
return this._sessionId;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
exports.SSEServerTransport = SSEServerTransport;
|
|
123
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/server/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../src/server/stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IAKlD,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,OAAO;IALjB,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,QAAQ,CAAS;gBAGf,MAAM,GAAE,QAAwB,EAChC,OAAO,GAAE,QAAyB;IAG5C,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;IAG9C,OAAO,UAAW,MAAM,UAGtB;IACF,QAAQ,UAAW,KAAK,UAEtB;IAEF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B,OAAO,CAAC,iBAAiB;IAenB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5B,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAU7C"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
exports.StdioServerTransport = void 0;
|
|
7
|
+
const node_process_1 = __importDefault(require("node:process"));
|
|
8
|
+
const stdio_js_1 = require("../shared/stdio.js");
|
|
9
|
+
/**
|
|
10
|
+
* Server transport for stdio: this communicates with a MCP client by reading from the current process' stdin and writing to stdout.
|
|
11
|
+
*
|
|
12
|
+
* This transport is only available in Node.js environments.
|
|
13
|
+
*/
|
|
14
|
+
class StdioServerTransport {
|
|
15
|
+
constructor(_stdin = node_process_1.default.stdin, _stdout = node_process_1.default.stdout) {
|
|
16
|
+
this._stdin = _stdin;
|
|
17
|
+
this._stdout = _stdout;
|
|
18
|
+
this._readBuffer = new stdio_js_1.ReadBuffer();
|
|
19
|
+
this._started = false;
|
|
20
|
+
// Arrow functions to bind `this` properly, while maintaining function identity.
|
|
21
|
+
this._ondata = (chunk) => {
|
|
22
|
+
this._readBuffer.append(chunk);
|
|
23
|
+
this.processReadBuffer();
|
|
24
|
+
};
|
|
25
|
+
this._onerror = (error) => {
|
|
26
|
+
var _a;
|
|
27
|
+
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Starts listening for messages on stdin.
|
|
32
|
+
*/
|
|
33
|
+
async start() {
|
|
34
|
+
if (this._started) {
|
|
35
|
+
throw new Error("StdioServerTransport already started! If using Server class, note that connect() calls start() automatically.");
|
|
36
|
+
}
|
|
37
|
+
this._started = true;
|
|
38
|
+
this._stdin.on("data", this._ondata);
|
|
39
|
+
this._stdin.on("error", this._onerror);
|
|
40
|
+
}
|
|
41
|
+
processReadBuffer() {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
while (true) {
|
|
44
|
+
try {
|
|
45
|
+
const message = this._readBuffer.readMessage();
|
|
46
|
+
if (message === null) {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
(_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, message);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
(_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async close() {
|
|
57
|
+
var _a;
|
|
58
|
+
// Remove our event listeners first
|
|
59
|
+
this._stdin.off("data", this._ondata);
|
|
60
|
+
this._stdin.off("error", this._onerror);
|
|
61
|
+
// Check if we were the only data listener
|
|
62
|
+
const remainingDataListeners = this._stdin.listenerCount('data');
|
|
63
|
+
if (remainingDataListeners === 0) {
|
|
64
|
+
// Only pause stdin if we were the only listener
|
|
65
|
+
// This prevents interfering with other parts of the application that might be using stdin
|
|
66
|
+
this._stdin.pause();
|
|
67
|
+
}
|
|
68
|
+
// Clear the buffer and notify closure
|
|
69
|
+
this._readBuffer.clear();
|
|
70
|
+
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
71
|
+
}
|
|
72
|
+
send(message) {
|
|
73
|
+
return new Promise((resolve) => {
|
|
74
|
+
const json = (0, stdio_js_1.serializeMessage)(message);
|
|
75
|
+
if (this._stdout.write(json)) {
|
|
76
|
+
resolve();
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
this._stdout.once("drain", resolve);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.StdioServerTransport = StdioServerTransport;
|
|
85
|
+
//# sourceMappingURL=stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../src/server/stdio.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAmC;AAEnC,iDAAkE;AAIlE;;;;GAIG;AACH,MAAa,oBAAoB;IAI/B,YACU,SAAmB,sBAAO,CAAC,KAAK,EAChC,UAAoB,sBAAO,CAAC,MAAM;QADlC,WAAM,GAAN,MAAM,CAA0B;QAChC,YAAO,GAAP,OAAO,CAA2B;QALpC,gBAAW,GAAe,IAAI,qBAAU,EAAE,CAAC;QAC3C,aAAQ,GAAG,KAAK,CAAC;QAWzB,gFAAgF;QAChF,YAAO,GAAG,CAAC,KAAa,EAAE,EAAE;YAC1B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,aAAQ,GAAG,CAAC,KAAY,EAAE,EAAE;;YAC1B,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC;IAbC,CAAC;IAeJ;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,iBAAiB;;QACvB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;gBAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrB,MAAM;gBACR,CAAC;gBAED,MAAA,IAAI,CAAC,SAAS,qDAAG,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAA,IAAI,CAAC,OAAO,qDAAG,KAAc,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;;QACT,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExC,0CAA0C;QAC1C,MAAM,sBAAsB,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,sBAAsB,KAAK,CAAC,EAAE,CAAC;YACjC,gDAAgD;YAChD,0FAA0F;YAC1F,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,MAAA,IAAI,CAAC,OAAO,oDAAI,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAuB;QAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAhFD,oDAgFC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ZodLiteral, ZodObject, ZodType, z } from "zod";
|
|
2
|
-
import { Notification, Progress, Request, Result } from "../types.js";
|
|
2
|
+
import { ClientCapabilities, Notification, Progress, Request, Result, ServerCapabilities } from "../types.js";
|
|
3
3
|
import { Transport } from "./transport.js";
|
|
4
4
|
/**
|
|
5
5
|
* Callback for progress notifications.
|
|
@@ -141,6 +141,10 @@ export declare abstract class Protocol<SendRequestT extends Request, SendNotific
|
|
|
141
141
|
* Removes the request handler for the given method.
|
|
142
142
|
*/
|
|
143
143
|
removeRequestHandler(method: string): void;
|
|
144
|
+
/**
|
|
145
|
+
* Asserts that a request handler has not already been set for the given method, in preparation for a new one being automatically installed.
|
|
146
|
+
*/
|
|
147
|
+
assertCanSetRequestHandler(method: string): void;
|
|
144
148
|
/**
|
|
145
149
|
* Registers a handler to invoke when this protocol object receives a notification with the given method.
|
|
146
150
|
*
|
|
@@ -154,4 +158,5 @@ export declare abstract class Protocol<SendRequestT extends Request, SendNotific
|
|
|
154
158
|
*/
|
|
155
159
|
removeNotificationHandler(method: string): void;
|
|
156
160
|
}
|
|
161
|
+
export declare function mergeCapabilities<T extends ServerCapabilities | ClientCapabilities>(base: T, additional: T): T;
|
|
157
162
|
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/shared/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,EAEL,kBAAkB,EAOlB,YAAY,EAEZ,QAAQ,EAGR,OAAO,EAEP,MAAM,EACN,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;OAMG;IACH,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,8BAAsB,QAAQ,CAC5B,YAAY,SAAS,OAAO,EAC5B,iBAAiB,SAAS,YAAY,EACtC,WAAW,SAAS,MAAM;IA+Cd,OAAO,CAAC,QAAQ,CAAC;IA7C7B,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAMV;IACd,OAAO,CAAC,+BAA+B,CAC3B;IACZ,OAAO,CAAC,qBAAqB,CAGf;IACd,OAAO,CAAC,iBAAiB,CAGX;IACd,OAAO,CAAC,iBAAiB,CAA4C;IAErE;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;OAEG;IACH,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAEpE;;OAEG;IACH,2BAA2B,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;gBAExD,QAAQ,CAAC,EAAE,eAAe,YAAA;IAmB9C;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBlD,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,UAAU;IAiElB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,WAAW;IA0BnB,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAErC;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,yBAAyB,CAC1C,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAC7B,IAAI;IAEP;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,4BAA4B,CAC7C,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAClC,IAAI;IAEP;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,8BAA8B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAEvE;;;;OAIG;IACH,OAAO,CAAC,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,EAC/B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,CAAC,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAoGtB;;OAEG;IACG,YAAY,CAAC,YAAY,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAelE;;;;OAIG;IACH,iBAAiB,CACf,CAAC,SAAS,SAAS,CAAC;QAClB,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;KAC5B,CAAC,EAEF,aAAa,EAAE,CAAC,EAChB,OAAO,EAAE,CACP,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,KAAK,EAAE,mBAAmB,KACvB,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,GACtC,IAAI;IAQP;;OAEG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C;;OAEG;IACH,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQhD;;;;OAIG;IACH,sBAAsB,CACpB,CAAC,SAAS,SAAS,CAAC;QAClB,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;KAC5B,CAAC,EAEF,kBAAkB,EAAE,CAAC,EACrB,OAAO,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC1D,IAAI;IAQP;;OAEG;IACH,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGhD;AAED,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,EACjD,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,CAY3B"}
|