diff --git a/client/src/App.tsx b/client/src/App.tsx index 01d5552..ad54ac0 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -19,6 +19,7 @@ import ResourcesTab, { Resource } from "./components/ResourcesTab"; import NotificationsTab from "./components/NotificationsTab"; import PromptsTab, { Prompt } from "./components/PromptsTab"; import ToolsTab, { Tool as ToolType } from "./components/ToolsTab"; +import History from "./components/CommandHistory"; const App = () => { const [socket, setSocket] = useState(null); @@ -39,6 +40,9 @@ const App = () => { "/Users/ashwin/code/example-servers/build/everything/index.js", ); const [mcpConnected, setMcpConnected] = useState(false); + const [requestHistory, setRequestHistory] = useState< + Array<{ request: string; response: string | null }> + >([]); useEffect(() => { const ws = new WebSocket("ws://localhost:3000"); @@ -75,6 +79,8 @@ const App = () => { } else if (message.type === "connected") { setMcpConnected(true); } + + updateRequestHistory(message); }; ws.onerror = () => { @@ -89,10 +95,29 @@ const App = () => { return () => ws.close(); }, []); + const updateRequestHistory = (response: unknown) => { + setRequestHistory((prev) => { + const lastRequest = prev[prev.length - 1]; + if (lastRequest && lastRequest.response === null) { + const updatedHistory = [...prev]; + updatedHistory[updatedHistory.length - 1] = { + ...lastRequest, + response: JSON.stringify(response), + }; + return updatedHistory; + } + return prev; + }); + }; + const sendWebSocketMessage = (message: object) => { if (socket) { console.log("Sending WebSocket message:", message); socket.send(JSON.stringify(message)); + setRequestHistory((prev) => [ + ...prev, + { request: JSON.stringify(message), response: null }, + ]); } }; @@ -136,97 +161,100 @@ const App = () => {

MCP Inspector

-
-
-

Connect MCP Server

-
- setCommand(e.target.value)} - /> - setArgs(e.target.value)} - /> - -
-
- {mcpConnected ? ( - - - - - Resources - - - - Prompts - - - - Requests - - - - Notifications - - - - Tools - - - - Console - - - -
- +
+
+

Connect MCP Server

+
+ setCommand(e.target.value)} /> - - setArgs(e.target.value)} /> - - - +
- - ) : ( -
-

- Connect to an MCP server to start inspecting -

- )} + {mcpConnected ? ( + + + + + Resources + + + + Prompts + + + + Requests + + + + Notifications + + + + Tools + + + + Console + + + +
+ + + + + + +
+
+ ) : ( +
+

+ Connect to an MCP server to start inspecting +

+
+ )} +
+
); }; diff --git a/client/src/components/History.tsx b/client/src/components/History.tsx new file mode 100644 index 0000000..8ccf3ab --- /dev/null +++ b/client/src/components/History.tsx @@ -0,0 +1,94 @@ +import { useState } from "react"; +import { Copy } from "lucide-react"; + +const History = ({ + requestHistory, +}: { + requestHistory: Array<{ request: string; response: string | null }>; +}) => { + const [expandedRequests, setExpandedRequests] = useState<{ + [key: number]: boolean; + }>({}); + + const toggleRequestExpansion = (index: number) => { + setExpandedRequests((prev) => ({ ...prev, [index]: !prev[index] })); + }; + + const copyToClipboard = (text: string) => { + navigator.clipboard.writeText(text); + }; + + return ( +
+

History

+
    + {requestHistory + .slice() + .reverse() + .map((request, index) => ( +
  • +
    + toggleRequestExpansion(requestHistory.length - 1 - index) + } + > + + {requestHistory.length - index}.{" "} + {JSON.parse(request.request).type} + + + {expandedRequests[requestHistory.length - 1 - index] + ? "▼" + : "▶"} + +
    + {expandedRequests[requestHistory.length - 1 - index] && ( + <> +
    +
    + + Request: + + +
    +
    +                      {JSON.stringify(JSON.parse(request.request), null, 2)}
    +                    
    +
    + {request.response && ( +
    +
    + + Response: + + +
    +
    +                        {JSON.stringify(JSON.parse(request.response), null, 2)}
    +                      
    +
    + )} + + )} +
  • + ))} +
+
+ ); +}; + +export default History;