Address PR #1220 code review feedback

- Remove unused clientExperimental prop from ExperimentalFeaturesPanel
- Restore readable display of server capabilities by extracting
  description and methods fields when present instead of raw JSON
- Extract RootDraft type alias to avoid repeated inline type

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
cliffhall 2026-04-21 12:58:24 -04:00
commit 31b8db98ab
3 changed files with 46 additions and 18 deletions

View file

@ -23,7 +23,6 @@ const meta: Meta<typeof ExperimentalFeaturesPanel> = {
onHeaderChange: fn(), onHeaderChange: fn(),
onCopyResponse: fn(), onCopyResponse: fn(),
onTestCapability: fn(), onTestCapability: fn(),
clientExperimental: {},
clientToggles: defaultClientToggles, clientToggles: defaultClientToggles,
customHeaders: [], customHeaders: [],
requestHistory: [], requestHistory: [],

View file

@ -15,7 +15,6 @@ import {
Title, Title,
} from "@mantine/core"; } from "@mantine/core";
import type { import type {
ClientCapabilities,
JSONRPCErrorResponse, JSONRPCErrorResponse,
JSONRPCResponse, JSONRPCResponse,
ServerCapabilities, ServerCapabilities,
@ -40,7 +39,6 @@ export interface RequestHistoryItem {
export interface ExperimentalFeaturesPanelProps { export interface ExperimentalFeaturesPanelProps {
serverExperimental: ServerCapabilities["experimental"]; serverExperimental: ServerCapabilities["experimental"];
clientExperimental: ClientCapabilities["experimental"];
clientToggles: ClientExperimentalToggle[]; clientToggles: ClientExperimentalToggle[];
requestDraft: string; requestDraft: string;
response?: JSONRPCResponse | JSONRPCErrorResponse; response?: JSONRPCResponse | JSONRPCErrorResponse;
@ -108,6 +106,28 @@ function getCapabilityEntries(
return Object.entries(experimental); return Object.entries(experimental);
} }
function getCapabilityDescription(value: object): string | undefined {
if ("description" in value && typeof value.description === "string") {
return value.description;
}
return undefined;
}
function getCapabilityMethods(value: object): string[] | undefined {
if (
"methods" in value &&
Array.isArray(value.methods) &&
value.methods.every((m: unknown) => typeof m === "string")
) {
return value.methods as string[];
}
return undefined;
}
function formatMethods(methods: string[]): string {
return `Methods: ${methods.join(", ")}`;
}
export function ExperimentalFeaturesPanel({ export function ExperimentalFeaturesPanel({
serverExperimental, serverExperimental,
clientToggles, clientToggles,
@ -137,11 +157,17 @@ export function ExperimentalFeaturesPanel({
{serverEntries.length === 0 ? ( {serverEntries.length === 0 ? (
<Text c="dimmed">No experimental capabilities</Text> <Text c="dimmed">No experimental capabilities</Text>
) : ( ) : (
serverEntries.map(([name, value]) => ( serverEntries.map(([name, value]) => {
const description = getCapabilityDescription(value);
const methods = getCapabilityMethods(value);
return (
<CapCard key={name}> <CapCard key={name}>
<Stack gap="xs"> <Stack gap="xs">
<Text fw={600}>{name}</Text> <Text fw={600}>{name}</Text>
<MetaText>{JSON.stringify(value)}</MetaText> {description && <HintText>{description}</HintText>}
{methods && methods.length > 0 && (
<MetaText>{formatMethods(methods)}</MetaText>
)}
<Group> <Group>
<CompactButton onClick={() => onTestCapability(name)}> <CompactButton onClick={() => onTestCapability(name)}>
Test → Test →
@ -149,7 +175,8 @@ export function ExperimentalFeaturesPanel({
</Group> </Group>
</Stack> </Stack>
</CapCard> </CapCard>
)) );
})
)} )}
<Divider /> <Divider />

View file

@ -12,11 +12,13 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import type { Root } from "@modelcontextprotocol/sdk/types.js"; import type { Root } from "@modelcontextprotocol/sdk/types.js";
export type RootDraft = { name: string; uri: string };
export interface RootsTableProps { export interface RootsTableProps {
roots: Root[]; roots: Root[];
newRootDraft: { name: string; uri: string }; newRootDraft: RootDraft;
onRemoveRoot: (uri: string) => void; onRemoveRoot: (uri: string) => void;
onNewRootDraftChange: (draft: { name: string; uri: string }) => void; onNewRootDraftChange: (draft: RootDraft) => void;
onAddRoot: () => void; onAddRoot: () => void;
onBrowse: () => void; onBrowse: () => void;
} }