Skip to content

Commit 13d3159

Browse files
committed
Merge branch 'main' into resizable-left-sidebar
2 parents 93553d5 + 7df0ac4 commit 13d3159

File tree

18 files changed

+1066
-168
lines changed

18 files changed

+1066
-168
lines changed

README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,31 @@ The MCP inspector is a developer tool for testing and debugging MCP servers.
44

55
![MCP Inspector Screenshot](https://raw.githubusercontent.com/modelcontextprotocol/inspector/main/mcp-inspector.png)
66

7+
## Architecture Overview
8+
9+
The MCP Inspector consists of two main components that work together:
10+
11+
- **MCP Inspector Client (MCPI)**: A React-based web UI that provides an interactive interface for testing and debugging MCP servers
12+
- **MCP Proxy (MCPP)**: A Node.js server that acts as a protocol bridge, connecting the web UI to MCP servers via various transport methods (stdio, SSE, streamable-http)
13+
14+
Note that the proxy is not a network proxy for intercepting traffic. Instead, it functions as both an MCP client (connecting to your MCP server) and an HTTP server (serving the web UI), enabling browser-based interaction with MCP servers that use different transport protocols.
15+
716
## Running the Inspector
817

918
### Requirements
1019

1120
- Node.js: ^22.7.5
1221

22+
### Quick Start (UI mode)
23+
24+
To get up and running right away with the UI, just execute the following:
25+
26+
```bash
27+
npx @modelcontextprotocol/inspector
28+
```
29+
30+
The server will start up and the UI will be accessible at `http://localhost:6274`.
31+
1332
### From an MCP server repository
1433

1534
To inspect an MCP server implementation, there's no need to clone this repo. Instead, use `npx`. For example, if your server is built at `build/index.js`:

client/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"dependencies": {
2626
"@modelcontextprotocol/sdk": "^1.11.5",
2727
"@radix-ui/react-checkbox": "^1.1.4",
28+
"ajv": "^6.12.6",
2829
"@radix-ui/react-dialog": "^1.1.3",
2930
"@radix-ui/react-icons": "^1.3.0",
3031
"@radix-ui/react-label": "^2.1.0",

client/src/App.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
import { OAuthTokensSchema } from "@modelcontextprotocol/sdk/shared/auth.js";
2121
import { SESSION_KEYS, getServerSpecificKey } from "./lib/constants";
2222
import { AuthDebuggerState } from "./lib/auth-types";
23+
import { cacheToolOutputSchemas } from "./utils/schemaUtils";
2324
import React, {
2425
Suspense,
2526
useCallback,
@@ -481,6 +482,8 @@ const App = () => {
481482
);
482483
setTools(response.tools);
483484
setNextToolCursor(response.nextCursor);
485+
// Cache output schemas for validation
486+
cacheToolOutputSchemas(response.tools);
484487
};
485488

486489
const callTool = async (name: string, params: Record<string, unknown>) => {
@@ -642,7 +645,7 @@ const App = () => {
642645
className="w-full p-4"
643646
onValueChange={(value) => (window.location.hash = value)}
644647
>
645-
<TabsList className="mb-4 p-0">
648+
<TabsList className="mb-4 py-0">
646649
<TabsTrigger
647650
value="resources"
648651
disabled={!serverCapabilities?.resources}
@@ -693,7 +696,7 @@ const App = () => {
693696
!serverCapabilities?.tools ? (
694697
<>
695698
<div className="flex items-center justify-center p-4">
696-
<p className="text-lg text-gray-500">
699+
<p className="text-lg text-gray-500 dark:text-gray-400">
697700
The connected server does not support any MCP
698701
capabilities
699702
</p>
@@ -793,6 +796,8 @@ const App = () => {
793796
clearTools={() => {
794797
setTools([]);
795798
setNextToolCursor(undefined);
799+
// Clear cached output schemas
800+
cacheToolOutputSchemas([]);
796801
}}
797802
callTool={async (name, params) => {
798803
clearError("tools");
@@ -845,7 +850,7 @@ const App = () => {
845850
</Tabs>
846851
) : (
847852
<div className="flex flex-col items-center justify-center h-full gap-4">
848-
<p className="text-lg text-gray-500">
853+
<p className="text-lg text-gray-500 dark:text-gray-400">
849854
Connect to an MCP server to start inspecting
850855
</p>
851856
<div className="flex items-center gap-2">
@@ -870,7 +875,7 @@ const App = () => {
870875
}}
871876
>
872877
<div
873-
className="absolute w-full h-4 -top-2 cursor-row-resize flex items-center justify-center hover:bg-accent/50"
878+
className="absolute w-full h-4 -top-2 cursor-row-resize flex items-center justify-center hover:bg-accent/50 dark:hover:bg-input/40"
874879
onMouseDown={handleDragStart}
875880
>
876881
<div className="w-8 h-1 rounded-full bg-border" />

client/src/components/History.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ const HistoryAndNotifications = ({
2929
<div className="flex-1 overflow-y-auto p-4 border-r">
3030
<h2 className="text-lg font-semibold mb-4">History</h2>
3131
{requestHistory.length === 0 ? (
32-
<p className="text-sm text-gray-500 italic">No history yet</p>
32+
<p className="text-sm text-gray-500 dark:text-gray-400 italic">
33+
No history yet
34+
</p>
3335
) : (
3436
<ul className="space-y-3">
3537
{requestHistory
@@ -38,7 +40,7 @@ const HistoryAndNotifications = ({
3840
.map((request, index) => (
3941
<li
4042
key={index}
41-
className="text-sm text-foreground bg-secondary p-2 rounded"
43+
className="text-sm text-foreground bg-secondary py-2 px-3 rounded"
4244
>
4345
<div
4446
className="flex justify-between items-center cursor-pointer"
@@ -93,7 +95,9 @@ const HistoryAndNotifications = ({
9395
<div className="flex-1 overflow-y-auto p-4">
9496
<h2 className="text-lg font-semibold mb-4">Server Notifications</h2>
9597
{serverNotifications.length === 0 ? (
96-
<p className="text-sm text-gray-500 italic">No notifications yet</p>
98+
<p className="text-sm text-gray-500 dark:text-gray-400 italic">
99+
No notifications yet
100+
</p>
97101
) : (
98102
<ul className="space-y-3">
99103
{serverNotifications
@@ -102,7 +106,7 @@ const HistoryAndNotifications = ({
102106
.map((notification, index) => (
103107
<li
104108
key={index}
105-
className="text-sm text-foreground bg-secondary p-2 rounded"
109+
className="text-sm text-foreground bg-secondary py-2 px-3 rounded"
106110
>
107111
<div
108112
className="flex justify-between items-center cursor-pointer"

client/src/components/ListPane.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ const ListPane = <T extends object>({
2121
buttonText,
2222
isButtonDisabled,
2323
}: ListPaneProps<T>) => (
24-
<div className="bg-card rounded-lg shadow">
25-
<div className="p-4 border-b border-gray-200 dark:border-gray-800">
24+
<div className="bg-card border border-border rounded-lg shadow">
25+
<div className="p-4 border-b border-gray-200 dark:border-border">
2626
<h3 className="font-semibold dark:text-white">{title}</h3>
2727
</div>
2828
<div className="p-4">
@@ -46,7 +46,7 @@ const ListPane = <T extends object>({
4646
{items.map((item, index) => (
4747
<div
4848
key={index}
49-
className="flex items-center p-2 rounded hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer"
49+
className="flex items-center py-2 px-4 rounded hover:bg-gray-50 dark:hover:bg-secondary cursor-pointer"
5050
onClick={() => setSelectedItem(item)}
5151
>
5252
{renderItem(item)}

client/src/components/PromptsTab.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ const PromptsTab = ({
110110
isButtonDisabled={!nextCursor && prompts.length > 0}
111111
/>
112112

113-
<div className="bg-card rounded-lg shadow">
114-
<div className="p-4 border-b border-gray-200 dark:border-gray-800">
113+
<div className="bg-card border border-border rounded-lg shadow">
114+
<div className="p-4 border-b border-gray-200 dark:border-border">
115115
<h3 className="font-semibold">
116116
{selectedPrompt ? selectedPrompt.name : "Select a prompt"}
117117
</h3>
@@ -126,7 +126,7 @@ const PromptsTab = ({
126126
) : selectedPrompt ? (
127127
<div className="space-y-4">
128128
{selectedPrompt.description && (
129-
<p className="text-sm text-gray-600">
129+
<p className="text-sm text-gray-600 dark:text-gray-400">
130130
{selectedPrompt.description}
131131
</p>
132132
)}

client/src/components/ResourcesTab.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,8 @@ const ResourcesTab = ({
173173
isButtonDisabled={!nextTemplateCursor && resourceTemplates.length > 0}
174174
/>
175175

176-
<div className="bg-card rounded-lg shadow">
177-
<div className="p-4 border-b border-gray-200 dark:border-gray-800 flex justify-between items-center">
176+
<div className="bg-card border border-border rounded-lg shadow">
177+
<div className="p-4 border-b border-gray-200 dark:border-border flex justify-between items-center">
178178
<h3
179179
className="font-semibold truncate"
180180
title={selectedResource?.name || selectedTemplate?.name}
@@ -234,7 +234,7 @@ const ResourcesTab = ({
234234
/>
235235
) : selectedTemplate ? (
236236
<div className="space-y-4">
237-
<p className="text-sm text-gray-600">
237+
<p className="text-sm text-gray-600 dark:text-gray-400">
238238
{selectedTemplate.description}
239239
</p>
240240
{selectedTemplate.uriTemplate

client/src/components/Sidebar.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ const Sidebar = ({
215215

216216
return (
217217
<div className="bg-card border-r border-border flex flex-col h-full">
218-
<div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-800">
218+
<div className="flex items-center justify-between p-4 border-b border-gray-200 dark:border-border">
219219
<div className="flex items-center">
220220
<h1 className="ml-2 text-lg font-semibold">
221221
MCP Inspector v{version}
@@ -646,7 +646,7 @@ const Sidebar = ({
646646
}
647647
})()}`}
648648
/>
649-
<span className="text-sm text-gray-600">
649+
<span className="text-sm text-gray-600 dark:text-gray-400">
650650
{(() => {
651651
switch (connectionStatus) {
652652
case "connected":

0 commit comments

Comments
 (0)