Skip to content

Commit 7372b8a

Browse files
Merge pull request #38 from modelcontextprotocol/justin/support-older-protocol-version
Add backwards compatibility with 2024-10-07
2 parents f336662 + 1f3dbef commit 7372b8a

File tree

4 files changed

+56
-46
lines changed

4 files changed

+56
-46
lines changed

Diff for: src/client/index.ts

+26-23
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
11
import { ProgressCallback, Protocol } from "../shared/protocol.js";
22
import { Transport } from "../shared/transport.js";
33
import {
4+
CallToolRequest,
5+
CallToolResultSchema,
46
ClientNotification,
57
ClientRequest,
68
ClientResult,
7-
Implementation,
8-
InitializeResultSchema,
9-
Notification,
10-
PROTOCOL_VERSION,
11-
Request,
12-
Result,
13-
ServerCapabilities,
9+
CompatibilityCallToolResultSchema,
1410
CompleteRequest,
15-
GetPromptRequest,
16-
ListPromptsRequest,
17-
ListResourcesRequest,
18-
ReadResourceRequest,
19-
SubscribeRequest,
20-
UnsubscribeRequest,
21-
CallToolRequest,
22-
ListToolsRequest,
2311
CompleteResultSchema,
12+
EmptyResultSchema,
13+
GetPromptRequest,
2414
GetPromptResultSchema,
15+
Implementation,
16+
InitializeResultSchema,
17+
LATEST_PROTOCOL_VERSION,
18+
ListPromptsRequest,
2519
ListPromptsResultSchema,
20+
ListResourcesRequest,
2621
ListResourcesResultSchema,
27-
ReadResourceResultSchema,
28-
CallToolResultSchema,
29-
ListToolsResultSchema,
30-
EmptyResultSchema,
31-
LoggingLevel,
3222
ListResourceTemplatesRequest,
3323
ListResourceTemplatesResultSchema,
24+
ListToolsRequest,
25+
ListToolsResultSchema,
26+
LoggingLevel,
27+
Notification,
28+
ReadResourceRequest,
29+
ReadResourceResultSchema,
30+
Request,
31+
Result,
32+
ServerCapabilities,
33+
SubscribeRequest,
34+
SUPPORTED_PROTOCOL_VERSIONS,
35+
UnsubscribeRequest
3436
} from "../types.js";
3537

3638
/**
@@ -84,7 +86,7 @@ export class Client<
8486
{
8587
method: "initialize",
8688
params: {
87-
protocolVersion: PROTOCOL_VERSION,
89+
protocolVersion: LATEST_PROTOCOL_VERSION,
8890
capabilities: {},
8991
clientInfo: this._clientInfo,
9092
},
@@ -96,7 +98,7 @@ export class Client<
9698
throw new Error(`Server sent invalid initialize result: ${result}`);
9799
}
98100

99-
if (result.protocolVersion !== PROTOCOL_VERSION) {
101+
if (!SUPPORTED_PROTOCOL_VERSIONS.includes(result.protocolVersion)) {
100102
throw new Error(
101103
`Server's protocol version is not supported: ${result.protocolVersion}`,
102104
);
@@ -217,11 +219,12 @@ export class Client<
217219

218220
async callTool(
219221
params: CallToolRequest["params"],
222+
resultSchema: typeof CallToolResultSchema | typeof CompatibilityCallToolResultSchema = CallToolResultSchema,
220223
onprogress?: ProgressCallback,
221224
) {
222225
return this.request(
223226
{ method: "tools/call", params },
224-
CallToolResultSchema,
227+
resultSchema,
225228
onprogress,
226229
);
227230
}

Diff for: src/server/index.ts

+15-18
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
import { ProgressCallback, Protocol } from "../shared/protocol.js";
22
import {
33
ClientCapabilities,
4+
CreateMessageRequest,
5+
CreateMessageResultSchema,
6+
EmptyResultSchema,
47
Implementation,
58
InitializedNotificationSchema,
69
InitializeRequest,
710
InitializeRequestSchema,
811
InitializeResult,
12+
LATEST_PROTOCOL_VERSION,
13+
ListPromptsRequestSchema,
14+
ListResourcesRequestSchema,
15+
ListRootsRequest,
16+
ListRootsResultSchema,
17+
ListToolsRequestSchema,
18+
LoggingMessageNotification,
919
Notification,
10-
PROTOCOL_VERSION,
1120
Request,
21+
ResourceUpdatedNotification,
1222
Result,
23+
ServerCapabilities,
1324
ServerNotification,
1425
ServerRequest,
1526
ServerResult,
16-
ServerCapabilities,
17-
ListResourcesRequestSchema,
18-
ListToolsRequestSchema,
19-
ListPromptsRequestSchema,
2027
SetLevelRequestSchema,
21-
CreateMessageRequest,
22-
CreateMessageResultSchema,
23-
EmptyResultSchema,
24-
LoggingMessageNotification,
25-
ResourceUpdatedNotification,
26-
ListRootsRequest,
27-
ListRootsResultSchema,
28+
SUPPORTED_PROTOCOL_VERSIONS
2829
} from "../types.js";
2930

3031
/**
@@ -86,17 +87,13 @@ export class Server<
8687
private async _oninitialize(
8788
request: InitializeRequest,
8889
): Promise<InitializeResult> {
89-
if (request.params.protocolVersion !== PROTOCOL_VERSION) {
90-
throw new Error(
91-
`Client's protocol version is not supported: ${request.params.protocolVersion}`,
92-
);
93-
}
90+
const requestedVersion = request.params.protocolVersion;
9491

9592
this._clientCapabilities = request.params.capabilities;
9693
this._clientVersion = request.params.clientInfo;
9794

9895
return {
99-
protocolVersion: PROTOCOL_VERSION,
96+
protocolVersion: SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion) ? requestedVersion : LATEST_PROTOCOL_VERSION,
10097
capabilities: this.getCapabilities(),
10198
serverInfo: this._serverInfo,
10299
};

Diff for: src/shared/protocol.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AnyZodObject, ZodLiteral, ZodObject, z } from "zod";
1+
import { ZodLiteral, ZodObject, ZodType, z } from "zod";
22
import {
33
ErrorCode,
44
JSONRPCError,
@@ -250,7 +250,7 @@ export class Protocol<
250250
*
251251
* Do not use this method to emit notifications! Use notification() instead.
252252
*/
253-
request<T extends AnyZodObject>(
253+
request<T extends ZodType<object>>(
254254
request: SendRequestT,
255255
resultSchema: T,
256256
onprogress?: ProgressCallback,

Diff for: src/types.ts

+13-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { z } from "zod";
22

3-
export const PROTOCOL_VERSION = "2024-11-05";
3+
export const LATEST_PROTOCOL_VERSION = "2024-11-05";
4+
export const SUPPORTED_PROTOCOL_VERSIONS = [LATEST_PROTOCOL_VERSION, "2024-10-07"];
45

56
/* JSON-RPC types */
67
export const JSONRPC_VERSION = "2.0";
@@ -196,7 +197,7 @@ export const InitializeRequestSchema = RequestSchema.extend({
196197
/**
197198
* The latest version of the Model Context Protocol that the client supports. The client MAY decide to support older versions as well.
198199
*/
199-
protocolVersion: z.string().or(z.number().int()),
200+
protocolVersion: z.string(),
200201
capabilities: ClientCapabilitiesSchema,
201202
clientInfo: ImplementationSchema,
202203
}),
@@ -268,7 +269,7 @@ export const InitializeResultSchema = ResultSchema.extend({
268269
/**
269270
* The version of the Model Context Protocol that the server wants to use. This may not match the version that the client requested. If the client cannot support this version, it MUST disconnect.
270271
*/
271-
protocolVersion: z.string().or(z.number().int()),
272+
protocolVersion: z.string(),
272273
capabilities: ServerCapabilitiesSchema,
273274
serverInfo: ImplementationSchema,
274275
});
@@ -721,6 +722,13 @@ export const CallToolResultSchema = ResultSchema.extend({
721722
isError: z.boolean(),
722723
});
723724

725+
/**
726+
* CallToolResultSchema extended with backwards compatibility to protocol version 2024-10-07.
727+
*/
728+
export const CompatibilityCallToolResultSchema = CallToolResultSchema.or(ResultSchema.extend({
729+
toolResult: z.unknown(),
730+
}));
731+
724732
/**
725733
* Used by the client to invoke a tool provided by the server.
726734
*/
@@ -1053,6 +1061,7 @@ export const ServerResultSchema = z.union([
10531061
ListResourceTemplatesResultSchema,
10541062
ReadResourceResultSchema,
10551063
CallToolResultSchema,
1064+
CompatibilityCallToolResultSchema,
10561065
ListToolsResultSchema,
10571066
]);
10581067

@@ -1147,6 +1156,7 @@ export type Tool = z.infer<typeof ToolSchema>;
11471156
export type ListToolsRequest = z.infer<typeof ListToolsRequestSchema>;
11481157
export type ListToolsResult = z.infer<typeof ListToolsResultSchema>;
11491158
export type CallToolResult = z.infer<typeof CallToolResultSchema>;
1159+
export type CompatibilityCallToolResult = z.infer<typeof CompatibilityCallToolResultSchema>;
11501160
export type CallToolRequest = z.infer<typeof CallToolRequestSchema>;
11511161
export type ToolListChangedNotification = z.infer<
11521162
typeof ToolListChangedNotificationSchema

0 commit comments

Comments
 (0)