fix: Extract function to utils

This commit is contained in:
Vincent 2025-11-04 09:31:31 -08:00
commit 8ad6253cd9
2 changed files with 42 additions and 27 deletions

View file

@ -30,7 +30,6 @@ import {
Progress,
LoggingLevel,
ElicitRequestSchema,
isJSONRPCRequest,
} from "@modelcontextprotocol/sdk/types.js";
import { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js";
import { useEffect, useState } from "react";
@ -58,8 +57,7 @@ import { getMCPServerRequestTimeout } from "@/utils/configUtils";
import { InspectorConfig } from "../configurationTypes";
import { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
import { CustomHeaders } from "../types/customHeaders";
import { JsonSchemaType } from "@/utils/jsonUtils";
import { resolveRef } from "@/utils/schemaUtils";
import { resolveRefsInMessage } from "@/utils/schemaUtils";
interface UseConnectionOptions {
transportType: "stdio" | "sse" | "streamable-http";
@ -687,29 +685,8 @@ export function useConnection({
const protocolOnMessage = transport.onmessage;
if (protocolOnMessage) {
transport.onmessage = (message) => {
// Resolve $ref references in requests before validation
if (isJSONRPCRequest(message) && message.params?.requestedSchema) {
const requestedSchema = message.params
.requestedSchema as JsonSchemaType;
if (requestedSchema?.properties) {
const resolvedProperties = Object.fromEntries(
Object.entries(requestedSchema.properties).map(
([key, propSchema]) => [
key,
resolveRef(propSchema, requestedSchema),
],
),
);
message.params = {
...message.params,
requestedSchema: {
...requestedSchema,
properties: resolvedProperties,
},
};
}
}
protocolOnMessage(message);
const resolvedMessage = resolveRefsInMessage(message);
protocolOnMessage(resolvedMessage);
};
}

View file

@ -1,7 +1,8 @@
import type { JsonValue, JsonSchemaType, JsonObject } from "./jsonUtils";
import Ajv from "ajv";
import type { ValidateFunction } from "ajv";
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
import type { Tool, JSONRPCMessage } from "@modelcontextprotocol/sdk/types.js";
import { isJSONRPCRequest } from "@modelcontextprotocol/sdk/types.js";
const ajv = new Ajv();
@ -299,3 +300,40 @@ export function formatFieldLabel(key: string): string {
.replace(/_/g, " ") // Replace underscores with spaces
.replace(/^\w/, (c) => c.toUpperCase()); // Capitalize first letter
}
/**
* Resolves $ref references in a JSON-RPC message's requestedSchema
* @param message The JSON-RPC message that may contain $ref references
* @returns A new message with resolved $ref references, or the original message if no resolution is needed
*/
export function resolveRefsInMessage(message: JSONRPCMessage): JSONRPCMessage {
if (!isJSONRPCRequest(message) || !message.params?.requestedSchema) {
return message;
}
const requestedSchema = message.params.requestedSchema as JsonSchemaType;
if (!requestedSchema?.properties) {
return message;
}
const resolvedMessage = {
...message,
params: {
...message.params,
requestedSchema: {
...requestedSchema,
properties: Object.fromEntries(
Object.entries(requestedSchema.properties).map(
([key, propSchema]) => [
key,
resolveRef(propSchema, requestedSchema),
],
),
),
},
},
};
return resolvedMessage;
}