From 0a7f5f9f2280754434ad7588528ba8a9a0cebf7d Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Mon, 7 Oct 2024 17:09:13 -0700 Subject: [PATCH] add prompts tab --- client/src/App.tsx | 90 ++++++++++++++++------- client/src/components/PromptsTab.tsx | 103 +++++++++++++++++++++++++++ client/src/components/Sidebar.tsx | 2 +- server/src/client.ts | 24 +++++++ server/src/index.ts | 7 +- 5 files changed, 198 insertions(+), 28 deletions(-) create mode 100644 client/src/components/PromptsTab.tsx diff --git a/client/src/App.tsx b/client/src/App.tsx index 693f015..7a506b9 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from "react"; -import { Send, Bell, Terminal, Files } from "lucide-react"; +import { Send, Bell, Terminal, Files, MessageSquare } from "lucide-react"; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import ConsoleTab from "./components/ConsoleTab"; @@ -7,17 +7,17 @@ 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"; const App = () => { const [socket, setSocket] = useState(null); - const [resources, setResources] = useState([]); - const [selectedResource, setSelectedResource] = useState( - null, - ); - const [resourceContent, setResourceContent] = useState(""); 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 [error, setError] = useState(null); useEffect(() => { @@ -38,6 +38,12 @@ const App = () => { } else if (message.type === "resource") { setResourceContent(JSON.stringify(message.data, null, 2)); setError(null); + } else if (message.type === "prompts") { + setPrompts(message.data.prompts); + setError(null); + } else if (message.type === "prompt") { + setPromptContent(JSON.stringify(message.data, null, 2)); + setError(null); } else if (message.type === "error") { setError(message.message); } @@ -54,24 +60,41 @@ const App = () => { return () => ws.close(); }, []); - const listResources = () => { + const sendWebSocketMessage = (message: object) => { if (socket) { - socket.send(JSON.stringify({ type: "listResources" })); + console.log("Sending WebSocket message:", message); + socket.send(JSON.stringify(message)); } }; + const [selectedResource, setSelectedResource] = useState( + null, + ); + const [selectedPrompt, setSelectedPrompt] = useState(null); + + const listResources = () => { + sendWebSocketMessage({ type: "listResources" }); + }; + const readResource = (uri: string) => { - if (socket) { - socket.send(JSON.stringify({ type: "readResource", uri })); - } + sendWebSocketMessage({ type: "readResource", uri }); + }; + + const listPrompts = () => { + sendWebSocketMessage({ type: "listPrompts" }); + }; + + const getPrompt = (name: string) => { + sendWebSocketMessage({ type: "getPrompt", name }); }; return (
-
-
- +
+

MCP Inspector

+
+ @@ -85,24 +108,39 @@ const App = () => { Resources + + + Prompts + Console - - - - +
+ + + + + +
diff --git a/client/src/components/PromptsTab.tsx b/client/src/components/PromptsTab.tsx new file mode 100644 index 0000000..fd25634 --- /dev/null +++ b/client/src/components/PromptsTab.tsx @@ -0,0 +1,103 @@ +import { Send, AlertCircle } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { TabsContent } from "@/components/ui/tabs"; +import { Input } from "@/components/ui/input"; +import { Textarea } from "@/components/ui/textarea"; + +export type Prompt = { + id: string; + name: string; +}; + +const PromptsTab = ({ + prompts, + listPrompts, + getPrompt, + selectedPrompt, + setSelectedPrompt, + promptContent, + error, +}: { + prompts: Prompt[]; + listPrompts: () => void; + getPrompt: (name: string) => void; + selectedPrompt: Prompt | null; + setSelectedPrompt: (prompt: Prompt) => void; + promptContent: string; + error: string | null; +}) => { + console.log("prompts", prompts); + return ( + +
+
+

Prompts

+
+
+ +
+ {prompts.map((prompt) => ( +
{ + setSelectedPrompt(prompt); + getPrompt(prompt.name); + }} + > + {prompt.name} +
+ ))} +
+
+
+ +
+
+

+ {selectedPrompt ? selectedPrompt.name : "Select a prompt"} +

+
+
+ {error ? ( + + + Error + {error} + + ) : selectedPrompt ? ( +
+