add validations against spec, add reserved metadata key validations

This commit is contained in:
Konstantin Konstantinov 2025-11-15 01:26:13 +02:00
commit a45247a4f2
No known key found for this signature in database

View file

@ -19,6 +19,11 @@ import {
} from "@modelcontextprotocol/sdk/types.js";
import { OAuthTokensSchema } from "@modelcontextprotocol/sdk/shared/auth.js";
import { SESSION_KEYS, getServerSpecificKey } from "./lib/constants";
import {
hasValidMetaName,
hasValidMetaPrefix,
isReservedMetaKey,
} from "@/utils/metaUtils";
import { AuthDebuggerState, EMPTY_DEBUGGER_STATE } from "./lib/auth-types";
import { OAuthStateMachine } from "./lib/oauth-state-machine";
import { cacheToolOutputSchemas } from "./utils/schemaUtils";
@ -85,6 +90,24 @@ import MetadataTab from "./components/MetadataTab";
const CONFIG_LOCAL_STORAGE_KEY = "inspectorConfig_v1";
const filterReservedMetadata = (
metadata: Record<string, string>,
): Record<string, string> => {
return Object.entries(metadata).reduce<Record<string, string>>(
(acc, [key, value]) => {
if (
!isReservedMetaKey(key) &&
hasValidMetaPrefix(key) &&
hasValidMetaName(key)
) {
acc[key] = value;
}
return acc;
},
{},
);
};
const App = () => {
const [resources, setResources] = useState<Resource[]>([]);
const [resourceTemplates, setResourceTemplates] = useState<
@ -206,7 +229,10 @@ const App = () => {
const savedMetadata = localStorage.getItem("lastMetadata");
if (savedMetadata) {
try {
return JSON.parse(savedMetadata);
const parsed = JSON.parse(savedMetadata);
if (parsed && typeof parsed === "object") {
return filterReservedMetadata(parsed);
}
} catch (error) {
console.warn("Failed to parse saved metadata:", error);
}
@ -219,8 +245,9 @@ const App = () => {
};
const handleMetadataChange = (newMetadata: Record<string, string>) => {
setMetadata(newMetadata);
localStorage.setItem("lastMetadata", JSON.stringify(newMetadata));
const sanitizedMetadata = filterReservedMetadata(newMetadata);
setMetadata(sanitizedMetadata);
localStorage.setItem("lastMetadata", JSON.stringify(sanitizedMetadata));
};
const nextRequestId = useRef(0);
const rootsRef = useRef<Root[]>([]);
@ -824,7 +851,7 @@ const App = () => {
const mergedMetadata = {
...metadata, // General metadata
progressToken: progressTokenRef.current++,
...(toolMetadata ?? {}), // Tool-specific metadata
...toolMetadata, // Tool-specific metadata
};
const response = await sendMCPRequest(