From d32e7b67257a38c60611d8963370f8e1974ddad2 Mon Sep 17 00:00:00 2001 From: Ashwin Bhat Date: Thu, 10 Oct 2024 09:06:12 -0700 Subject: [PATCH] add SSE connection ability --- client/package.json | 1 + client/src/App.tsx | 69 +++++++-- client/src/components/ui/select.tsx | 162 ++++++++++++++++++++ client/yarn.lock | 227 +++++++++++++++++++++++++++- server/package.json | 2 +- server/src/index.ts | 27 +++- server/src/mcpProxy.ts | 13 ++ 7 files changed, 480 insertions(+), 21 deletions(-) create mode 100644 client/src/components/ui/select.tsx diff --git a/client/package.json b/client/package.json index d54fd1a..cf896a8 100644 --- a/client/package.json +++ b/client/package.json @@ -12,6 +12,7 @@ "dependencies": { "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-tabs": "^1.1.1", "class-variance-authority": "^0.7.0", diff --git a/client/src/App.tsx b/client/src/App.tsx index 0193872..aeb3ff0 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -23,6 +23,13 @@ import { 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"; @@ -49,8 +56,10 @@ const App = () => { "/Users/ashwin/.nvm/versions/node/v18.20.4/bin/node", ); const [args, setArgs] = useState( - "/Users/ashwin/code/example-servers/build/everything/index.js", + "/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 }[] >([]); @@ -160,11 +169,17 @@ const App = () => { }); const clientTransport = new SSEClientTransport(); - const url = new URL("http://localhost:3000/sse"); - url.searchParams.append("command", encodeURIComponent(command)); - url.searchParams.append("args", encodeURIComponent(args)); - await clientTransport.connect(url); + 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); @@ -185,16 +200,40 @@ const App = () => {

Connect MCP Server

- setCommand(e.target.value)} - /> - setArgs(e.target.value)} - /> + + {transportType === "stdio" ? ( + <> + setCommand(e.target.value)} + /> + setArgs(e.target.value)} + /> + + ) : ( + setUrl(e.target.value)} + /> + )}