Skip to content

Commit 8215651

Browse files
Add helper functions to distinguish between jsonRPC message types
1 parent df87019 commit 8215651

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

src/shared/protocol.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import {
33
CancelledNotificationSchema,
44
ClientCapabilities,
55
ErrorCode,
6+
isJSONRPCRequest,
7+
isJSONRPCResponse,
8+
isJSONRPCNotification,
69
JSONRPCError,
710
JSONRPCNotification,
811
JSONRPCRequest,
@@ -271,12 +274,14 @@ export abstract class Protocol<
271274
};
272275

273276
this._transport.onmessage = (message) => {
274-
if (!("method" in message)) {
277+
if (isJSONRPCResponse(message)) {
275278
this._onresponse(message);
276-
} else if ("id" in message) {
279+
} else if (isJSONRPCRequest(message)) {
277280
this._onrequest(message);
278-
} else {
281+
} else if (isJSONRPCNotification(message)) {
279282
this._onnotification(message);
283+
} else {
284+
this._onerror(new Error(`Unknown message type: ${JSON.stringify(message)}`));
280285
}
281286
};
282287

@@ -437,7 +442,7 @@ export abstract class Protocol<
437442
this._progressHandlers.delete(messageId);
438443
this._cleanupTimeout(messageId);
439444

440-
if ("result" in response) {
445+
if (isJSONRPCResponse(response)) {
441446
handler(response);
442447
} else {
443448
const error = new McpError(

src/types.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ export const JSONRPCRequestSchema = z
7878
.merge(RequestSchema)
7979
.strict();
8080

81+
export const isJSONRPCRequest = (value: unknown): value is JSONRPCRequest =>
82+
JSONRPCRequestSchema.safeParse(value).success;
83+
8184
/**
8285
* A notification which does not expect a response.
8386
*/
@@ -88,6 +91,11 @@ export const JSONRPCNotificationSchema = z
8891
.merge(NotificationSchema)
8992
.strict();
9093

94+
export const isJSONRPCNotification = (
95+
value: unknown
96+
): value is JSONRPCNotification =>
97+
JSONRPCNotificationSchema.safeParse(value).success;
98+
9199
/**
92100
* A successful (non-error) response to a request.
93101
*/
@@ -99,6 +107,9 @@ export const JSONRPCResponseSchema = z
99107
})
100108
.strict();
101109

110+
export const isJSONRPCResponse = (value: unknown): value is JSONRPCResponse =>
111+
JSONRPCResponseSchema.safeParse(value).success;
112+
102113
/**
103114
* Error codes defined by the JSON-RPC specification.
104115
*/

0 commit comments

Comments
 (0)