import { Client } from "mcp-typescript/client/index.js"; import { SSEClientTransport } from "mcp-typescript/client/sse.js"; import { ListResourcesResultSchema, GetPromptResultSchema, ListToolsResultSchema, ReadResourceResultSchema, CallToolResultSchema, ListPromptsResultSchema, Tool, ClientRequest, } from "mcp-typescript/types.js"; import { useState } from "react"; import { Send, Bell, Terminal, Files, MessageSquare, Hammer, Play, } from "lucide-react"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import ConsoleTab from "./components/ConsoleTab"; import Sidebar from "./components/Sidebar"; import RequestsTab from "./components/RequestsTabs"; import ResourcesTab, { Resource } from "./components/ResourcesTab"; import NotificationsTab from "./components/NotificationsTab"; import PromptsTab, { Prompt } from "./components/PromptsTab"; import ToolsTab from "./components/ToolsTab"; import History from "./components/History"; import { AnyZodObject } from "node_modules/zod/lib"; const App = () => { const [connectionStatus, setConnectionStatus] = useState< "disconnected" | "connected" | "error" >("disconnected"); const [resources, setResources] = useState([]); const [resourceContent, setResourceContent] = useState(""); const [prompts, setPrompts] = useState([]); const [promptContent, setPromptContent] = useState(""); const [tools, setTools] = useState([]); const [toolResult, setToolResult] = useState(""); const [error, setError] = useState(null); const [command, setCommand] = useState( "/Users/ashwin/.nvm/versions/node/v18.20.4/bin/node", ); const [args, setArgs] = useState( "/Users/ashwin/code/example-servers/build/everything/stdio.js", ); const [url, setUrl] = useState("http://localhost:3001/sse"); const [transportType, setTransportType] = useState<"stdio" | "sse">("stdio"); const [requestHistory, setRequestHistory] = useState< { request: string; response: string }[] >([]); const [mcpClient, setMcpClient] = useState(null); const [selectedResource, setSelectedResource] = useState( null, ); const [selectedPrompt, setSelectedPrompt] = useState(null); const [selectedTool, setSelectedTool] = useState(null); const pushHistory = (request: object, response: object) => { setRequestHistory((prev) => [ ...prev, { request: JSON.stringify(request), response: JSON.stringify(response) }, ]); }; const makeRequest = async ( request: ClientRequest, schema: T, ) => { if (!mcpClient) { throw new Error("MCP client not connected"); } try { const response = await mcpClient.request(request, schema); pushHistory(request, response); return response; } catch (e: unknown) { setError((e as Error).message); throw e; } }; const listResources = async () => { const response = await makeRequest( { method: "resources/list" as const, }, ListResourcesResultSchema, ); if (response.resources) { setResources(response.resources); } }; const readResource = async (uri: string) => { const response = await makeRequest( { method: "resources/read" as const, params: { uri }, }, ReadResourceResultSchema, ); setResourceContent(JSON.stringify(response, null, 2)); }; const listPrompts = async () => { const response = await makeRequest( { method: "prompts/list" as const, }, ListPromptsResultSchema, ); setPrompts(response.prompts); }; const getPrompt = async (name: string, args: Record = {}) => { const response = await makeRequest( { method: "prompts/get" as const, params: { name, arguments: args }, }, GetPromptResultSchema, ); setPromptContent(JSON.stringify(response, null, 2)); }; const listTools = async () => { const response = await makeRequest( { method: "tools/list" as const, }, ListToolsResultSchema, ); setTools(response.tools); }; const callTool = async (name: string, params: Record) => { const response = await makeRequest( { method: "tools/call" as const, params: { name, arguments: params }, }, CallToolResultSchema, ); setToolResult(JSON.stringify(response.toolResult, null, 2)); }; const connectMcpServer = async () => { try { const client = new Client({ name: "mcp-inspector", version: "0.0.1", }); const clientTransport = new SSEClientTransport(); const backendUrl = new URL("http://localhost:3000/sse"); backendUrl.searchParams.append("transportType", transportType); if (transportType === "stdio") { backendUrl.searchParams.append("command", encodeURIComponent(command)); backendUrl.searchParams.append("args", encodeURIComponent(args)); } else { backendUrl.searchParams.append("url", encodeURIComponent(url)); } await clientTransport.connect(backendUrl); await client.connect(clientTransport); setMcpClient(client); setConnectionStatus("connected"); } catch (e) { console.error(e); setConnectionStatus("error"); } }; return (

MCP Inspector

Connect MCP Server

{transportType === "stdio" ? ( <> setCommand(e.target.value)} /> setArgs(e.target.value)} /> ) : ( setUrl(e.target.value)} /> )}
{mcpClient ? ( Resources Prompts Requests Notifications Tools Console
{ setSelectedTool(tool); setToolResult(""); }} toolResult={toolResult} error={error} />
) : (

Connect to an MCP server to start inspecting

)}
); }; export default App;