Skip to content

Commit 8ad6253

Browse files
committed
fix: Extract function to utils
1 parent b000fc2 commit 8ad6253

File tree

2 files changed

+42
-27
lines changed

2 files changed

+42
-27
lines changed

client/src/lib/hooks/useConnection.ts

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ import {
3030
Progress,
3131
LoggingLevel,
3232
ElicitRequestSchema,
33-
isJSONRPCRequest,
3433
} from "@modelcontextprotocol/sdk/types.js";
3534
import { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js";
3635
import { useEffect, useState } from "react";
@@ -58,8 +57,7 @@ import { getMCPServerRequestTimeout } from "@/utils/configUtils";
5857
import { InspectorConfig } from "../configurationTypes";
5958
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
6059
import { CustomHeaders } from "../types/customHeaders";
61-
import { JsonSchemaType } from "@/utils/jsonUtils";
62-
import { resolveRef } from "@/utils/schemaUtils";
60+
import { resolveRefsInMessage } from "@/utils/schemaUtils";
6361

6462
interface UseConnectionOptions {
6563
transportType: "stdio" | "sse" | "streamable-http";
@@ -687,29 +685,8 @@ export function useConnection({
687685
const protocolOnMessage = transport.onmessage;
688686
if (protocolOnMessage) {
689687
transport.onmessage = (message) => {
690-
// Resolve $ref references in requests before validation
691-
if (isJSONRPCRequest(message) && message.params?.requestedSchema) {
692-
const requestedSchema = message.params
693-
.requestedSchema as JsonSchemaType;
694-
if (requestedSchema?.properties) {
695-
const resolvedProperties = Object.fromEntries(
696-
Object.entries(requestedSchema.properties).map(
697-
([key, propSchema]) => [
698-
key,
699-
resolveRef(propSchema, requestedSchema),
700-
],
701-
),
702-
);
703-
message.params = {
704-
...message.params,
705-
requestedSchema: {
706-
...requestedSchema,
707-
properties: resolvedProperties,
708-
},
709-
};
710-
}
711-
}
712-
protocolOnMessage(message);
688+
const resolvedMessage = resolveRefsInMessage(message);
689+
protocolOnMessage(resolvedMessage);
713690
};
714691
}
715692

client/src/utils/schemaUtils.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import type { JsonValue, JsonSchemaType, JsonObject } from "./jsonUtils";
22
import Ajv from "ajv";
33
import type { ValidateFunction } from "ajv";
4-
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
4+
import type { Tool, JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
5+
import { isJSONRPCRequest } from "@modelcontextprotocol/sdk/types.js";
56

67
const ajv = new Ajv();
78

@@ -299,3 +300,40 @@ export function formatFieldLabel(key: string): string {
299300
.replace(/_/g, " ") // Replace underscores with spaces
300301
.replace(/^\w/, (c) => c.toUpperCase()); // Capitalize first letter
301302
}
303+
304+
/**
305+
* Resolves $ref references in a JSON-RPC message's requestedSchema
306+
* @param message The JSON-RPC message that may contain $ref references
307+
* @returns A new message with resolved $ref references, or the original message if no resolution is needed
308+
*/
309+
export function resolveRefsInMessage(message: JSONRPCMessage): JSONRPCMessage {
310+
if (!isJSONRPCRequest(message) || !message.params?.requestedSchema) {
311+
return message;
312+
}
313+
314+
const requestedSchema = message.params.requestedSchema as JsonSchemaType;
315+
316+
if (!requestedSchema?.properties) {
317+
return message;
318+
}
319+
320+
const resolvedMessage = {
321+
...message,
322+
params: {
323+
...message.params,
324+
requestedSchema: {
325+
...requestedSchema,
326+
properties: Object.fromEntries(
327+
Object.entries(requestedSchema.properties).map(
328+
([key, propSchema]) => [
329+
key,
330+
resolveRef(propSchema, requestedSchema),
331+
],
332+
),
333+
),
334+
},
335+
},
336+
};
337+
338+
return resolvedMessage;
339+
}

0 commit comments

Comments
 (0)