From c5d02456e03eef7380db146eb895de7290b48fcf Mon Sep 17 00:00:00 2001 From: cliffhall Date: Sun, 26 Apr 2026 19:17:57 -0400 Subject: [PATCH] Phase 5: Lift ServerEntry into core/mcp/types.ts ServerEntry was previously defined as `Pick` in ServerListScreen, inverting the natural dependency direction (data shape derived from a UI prop type). Phase 5's cleanup pass calls this out specifically. Move the canonical ServerEntry into core/mcp/types.ts and have ServerCardProps extend it. ServerListScreen, InspectorView, and their stories now import ServerEntry from core directly. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../components/groups/ServerCard/ServerCard.tsx | 12 ++---------- .../ServerListScreen/ServerListScreen.stories.tsx | 3 ++- .../screens/ServerListScreen/ServerListScreen.tsx | 7 +------ .../views/InspectorView/InspectorView.stories.tsx | 2 +- .../views/InspectorView/InspectorView.tsx | 6 ++---- core/mcp/types.ts | 15 +++++++++++++++ 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/clients/web/src/components/groups/ServerCard/ServerCard.tsx b/clients/web/src/components/groups/ServerCard/ServerCard.tsx index 14804548..a4e42ef0 100644 --- a/clients/web/src/components/groups/ServerCard/ServerCard.tsx +++ b/clients/web/src/components/groups/ServerCard/ServerCard.tsx @@ -1,8 +1,7 @@ import { Badge, Button, Card, Group, Stack, Text } from "@mantine/core"; -import type { Implementation } from "@modelcontextprotocol/sdk/types.js"; import type { - ConnectionState, MCPServerConfig, + ServerEntry, ServerType, } from "@inspector/core/mcp/types.js"; import { ServerStatusIndicator } from "../../elements/ServerStatusIndicator/ServerStatusIndicator"; @@ -11,14 +10,7 @@ import { ConnectionToggle } from "../../elements/ConnectionToggle/ConnectionTogg import { ContentViewer } from "../../elements/ContentViewer/ContentViewer"; import { InlineError } from "../../elements/InlineError/InlineError"; -export interface ServerCardProps { - /** Stable unique identifier — the MCPConfig.mcpServers map key. */ - id: string; - /** Display label shown in the card header. May or may not equal id. */ - name: string; - config: MCPServerConfig; - info?: Implementation; - connection: ConnectionState; +export interface ServerCardProps extends ServerEntry { activeServer?: string; onToggleConnection: (id: string) => void; onServerInfo: (id: string) => void; diff --git a/clients/web/src/components/screens/ServerListScreen/ServerListScreen.stories.tsx b/clients/web/src/components/screens/ServerListScreen/ServerListScreen.stories.tsx index a5177a14..4040dffb 100644 --- a/clients/web/src/components/screens/ServerListScreen/ServerListScreen.stories.tsx +++ b/clients/web/src/components/screens/ServerListScreen/ServerListScreen.stories.tsx @@ -1,6 +1,7 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { fn } from "storybook/test"; -import { ServerListScreen, type ServerEntry } from "./ServerListScreen"; +import type { ServerEntry } from "@inspector/core/mcp/types.js"; +import { ServerListScreen } from "./ServerListScreen"; const meta: Meta = { title: "Screens/ServerListScreen", diff --git a/clients/web/src/components/screens/ServerListScreen/ServerListScreen.tsx b/clients/web/src/components/screens/ServerListScreen/ServerListScreen.tsx index c2466790..10fda85b 100644 --- a/clients/web/src/components/screens/ServerListScreen/ServerListScreen.tsx +++ b/clients/web/src/components/screens/ServerListScreen/ServerListScreen.tsx @@ -1,13 +1,8 @@ import { useState } from "react"; import { ScrollArea, SimpleGrid, Stack, Text } from "@mantine/core"; +import type { ServerEntry } from "@inspector/core/mcp/types.js"; import { ServerCard } from "../../groups/ServerCard/ServerCard"; import { ServerListControls } from "../../groups/ServerListControls/ServerListControls"; -import type { ServerCardProps } from "../../groups/ServerCard/ServerCard"; - -export type ServerEntry = Pick< - ServerCardProps, - "id" | "name" | "config" | "info" | "connection" ->; export interface ServerListScreenProps { servers: ServerEntry[]; diff --git a/clients/web/src/components/views/InspectorView/InspectorView.stories.tsx b/clients/web/src/components/views/InspectorView/InspectorView.stories.tsx index eb38596b..4a26488a 100644 --- a/clients/web/src/components/views/InspectorView/InspectorView.stories.tsx +++ b/clients/web/src/components/views/InspectorView/InspectorView.stories.tsx @@ -7,11 +7,11 @@ import type { import type { InspectorResourceSubscription, MessageEntry, + ServerEntry, } from "@inspector/core/mcp/types.js"; import type { Meta, StoryObj } from "@storybook/react-vite"; import { fn } from "storybook/test"; import { InspectorView } from "./InspectorView"; -import type { ServerEntry } from "../../screens/ServerListScreen/ServerListScreen"; import { mixedEntries as demoLogs } from "../../screens/LoggingScreen/LoggingScreen.fixtures"; import { longToolList as demoTools } from "../../screens/ToolsScreen/ToolsScreen.fixtures"; import type { TaskProgress } from "../../groups/TaskCard/TaskCard"; diff --git a/clients/web/src/components/views/InspectorView/InspectorView.tsx b/clients/web/src/components/views/InspectorView/InspectorView.tsx index 77815688..1ccdd5f2 100644 --- a/clients/web/src/components/views/InspectorView/InspectorView.tsx +++ b/clients/web/src/components/views/InspectorView/InspectorView.tsx @@ -13,12 +13,10 @@ import type { ConnectionStatus, InspectorResourceSubscription, MessageEntry, + ServerEntry, } from "@inspector/core/mcp/types.js"; import { ViewHeader } from "../../groups/ViewHeader/ViewHeader"; -import { - ServerListScreen, - type ServerEntry, -} from "../../screens/ServerListScreen/ServerListScreen"; +import { ServerListScreen } from "../../screens/ServerListScreen/ServerListScreen"; import { ToolsScreen } from "../../screens/ToolsScreen/ToolsScreen"; import { PromptsScreen } from "../../screens/PromptsScreen/PromptsScreen"; import { ResourcesScreen } from "../../screens/ResourcesScreen/ResourcesScreen"; diff --git a/core/mcp/types.ts b/core/mcp/types.ts index 6709046b..96e08546 100644 --- a/core/mcp/types.ts +++ b/core/mcp/types.ts @@ -70,6 +70,21 @@ export interface ConnectionState { error?: { message: string; details?: string }; } +/** + * One server entry as seen by the UI: identity, transport config, optional + * `Implementation` info reported during `initialize`, and the current + * connection snapshot. Cards/screens spread this onto presentational props. + */ +export interface ServerEntry { + /** Stable unique identifier — the MCPConfig.mcpServers map key. */ + id: string; + /** Display label shown in the card header. May or may not equal id. */ + name: string; + config: MCPServerConfig; + info?: Implementation; + connection: ConnectionState; +} + export interface StderrLogEntry { timestamp: Date; message: string;