@@ -6,8 +6,11 @@ import {
6
6
Files ,
7
7
MessageSquare ,
8
8
Hammer ,
9
+ Play ,
9
10
} from "lucide-react" ;
10
11
import { Tabs , TabsList , TabsTrigger } from "@/components/ui/tabs" ;
12
+ import { Input } from "@/components/ui/input" ;
13
+ import { Button } from "@/components/ui/button" ;
11
14
12
15
import ConsoleTab from "./components/ConsoleTab" ;
13
16
import Sidebar from "./components/Sidebar" ;
@@ -29,6 +32,13 @@ const App = () => {
29
32
const [ tools , setTools ] = useState < ToolType [ ] > ( [ ] ) ;
30
33
const [ toolResult , setToolResult ] = useState < string > ( "" ) ;
31
34
const [ error , setError ] = useState < string | null > ( null ) ;
35
+ const [ command , setCommand ] = useState < string > (
36
+ "/Users/ashwin/.nvm/versions/node/v18.20.4/bin/node" ,
37
+ ) ;
38
+ const [ args , setArgs ] = useState < string > (
39
+ "/Users/ashwin/code/example-servers/build/everything/index.js" ,
40
+ ) ;
41
+ const [ mcpConnected , setMcpConnected ] = useState < boolean > ( false ) ;
32
42
33
43
useEffect ( ( ) => {
34
44
const ws = new WebSocket ( "ws://localhost:3000" ) ;
@@ -62,6 +72,8 @@ const App = () => {
62
72
setError ( null ) ;
63
73
} else if ( message . type === "error" ) {
64
74
setError ( message . message ) ;
75
+ } else if ( message . type === "connected" ) {
76
+ setMcpConnected ( true ) ;
65
77
}
66
78
} ;
67
79
@@ -71,6 +83,7 @@ const App = () => {
71
83
72
84
ws . onclose = ( ) => {
73
85
setConnectionStatus ( "disconnected" ) ;
86
+ setMcpConnected ( false ) ;
74
87
} ;
75
88
76
89
return ( ) => ws . close ( ) ;
@@ -113,73 +126,105 @@ const App = () => {
113
126
sendWebSocketMessage ( { type : "callTool" , name, params } ) ;
114
127
} ;
115
128
129
+ const connectMcpServer = ( ) => {
130
+ const argsArray = args . split ( " " ) . filter ( ( arg ) => arg . trim ( ) !== "" ) ;
131
+ sendWebSocketMessage ( { type : "connect" , command, args : argsArray } ) ;
132
+ } ;
133
+
116
134
return (
117
135
< div className = "flex h-screen bg-gray-100" >
118
136
< Sidebar connectionStatus = { connectionStatus } />
119
137
< div className = "flex-1 flex flex-col overflow-hidden" >
120
138
< h1 className = "text-2xl font-bold p-4" > MCP Inspector</ h1 >
121
139
< div className = "flex-1 overflow-auto" >
122
- < Tabs defaultValue = "requests" className = "w-full p-4" >
123
- < TabsList className = "mb-4" >
124
- < TabsTrigger value = "resources" >
125
- < Files className = "w-4 h-4 mr-2" />
126
- Resources
127
- </ TabsTrigger >
128
- < TabsTrigger value = "prompts" >
129
- < MessageSquare className = "w-4 h-4 mr-2" />
130
- Prompts
131
- </ TabsTrigger >
132
- < TabsTrigger value = "requests" disabled >
133
- < Send className = "w-4 h-4 mr-2" />
134
- Requests
135
- </ TabsTrigger >
136
- < TabsTrigger value = "notifications" disabled >
137
- < Bell className = "w-4 h-4 mr-2" />
138
- Notifications
139
- </ TabsTrigger >
140
- < TabsTrigger value = "tools" disabled >
141
- < Hammer className = "w-4 h-4 mr-2" />
142
- Tools
143
- </ TabsTrigger >
144
- < TabsTrigger value = "console" disabled >
145
- < Terminal className = "w-4 h-4 mr-2" />
146
- Console
147
- </ TabsTrigger >
148
- </ TabsList >
149
-
150
- < div className = "w-full" >
151
- < RequestsTab />
152
- < ResourcesTab
153
- resources = { resources }
154
- listResources = { listResources }
155
- readResource = { readResource }
156
- selectedResource = { selectedResource }
157
- setSelectedResource = { setSelectedResource }
158
- resourceContent = { resourceContent }
159
- error = { error }
160
- />
161
- < NotificationsTab />
162
- < PromptsTab
163
- prompts = { prompts }
164
- listPrompts = { listPrompts }
165
- getPrompt = { getPrompt }
166
- selectedPrompt = { selectedPrompt }
167
- setSelectedPrompt = { setSelectedPrompt }
168
- promptContent = { promptContent }
169
- error = { error }
140
+ < div className = "p-4 bg-white shadow-md m-4 rounded-md" >
141
+ < h2 className = "text-lg font-semibold mb-2" > Connect MCP Server</ h2 >
142
+ < div className = "flex space-x-2 mb-2" >
143
+ < Input
144
+ placeholder = "Command"
145
+ value = { command }
146
+ onChange = { ( e ) => setCommand ( e . target . value ) }
170
147
/>
171
- < ToolsTab
172
- tools = { tools }
173
- listTools = { listTools }
174
- callTool = { callTool }
175
- selectedTool = { selectedTool }
176
- setSelectedTool = { setSelectedTool }
177
- toolResult = { toolResult }
178
- error = { error }
148
+ < Input
149
+ placeholder = "Arguments (space-separated)"
150
+ value = { args }
151
+ onChange = { ( e ) => setArgs ( e . target . value ) }
179
152
/>
180
- < ConsoleTab />
153
+ < Button onClick = { connectMcpServer } >
154
+ < Play className = "w-4 h-4 mr-2" />
155
+ Connect
156
+ </ Button >
157
+ </ div >
158
+ </ div >
159
+ { mcpConnected ? (
160
+ < Tabs defaultValue = "resources" className = "w-full p-4" >
161
+ < TabsList className = "mb-4 p-0" >
162
+ < TabsTrigger value = "resources" >
163
+ < Files className = "w-4 h-4 mr-2" />
164
+ Resources
165
+ </ TabsTrigger >
166
+ < TabsTrigger value = "prompts" >
167
+ < MessageSquare className = "w-4 h-4 mr-2" />
168
+ Prompts
169
+ </ TabsTrigger >
170
+ < TabsTrigger value = "requests" disabled >
171
+ < Send className = "w-4 h-4 mr-2" />
172
+ Requests
173
+ </ TabsTrigger >
174
+ < TabsTrigger value = "notifications" disabled >
175
+ < Bell className = "w-4 h-4 mr-2" />
176
+ Notifications
177
+ </ TabsTrigger >
178
+ < TabsTrigger value = "tools" disabled >
179
+ < Hammer className = "w-4 h-4 mr-2" />
180
+ Tools
181
+ </ TabsTrigger >
182
+ < TabsTrigger value = "console" disabled >
183
+ < Terminal className = "w-4 h-4 mr-2" />
184
+ Console
185
+ </ TabsTrigger >
186
+ </ TabsList >
187
+
188
+ < div className = "w-full" >
189
+ < ResourcesTab
190
+ resources = { resources }
191
+ listResources = { listResources }
192
+ readResource = { readResource }
193
+ selectedResource = { selectedResource }
194
+ setSelectedResource = { setSelectedResource }
195
+ resourceContent = { resourceContent }
196
+ error = { error }
197
+ />
198
+ < NotificationsTab />
199
+ < PromptsTab
200
+ prompts = { prompts }
201
+ listPrompts = { listPrompts }
202
+ getPrompt = { getPrompt }
203
+ selectedPrompt = { selectedPrompt }
204
+ setSelectedPrompt = { setSelectedPrompt }
205
+ promptContent = { promptContent }
206
+ error = { error }
207
+ />
208
+ < RequestsTab />
209
+ < ToolsTab
210
+ tools = { tools }
211
+ listTools = { listTools }
212
+ callTool = { callTool }
213
+ selectedTool = { selectedTool }
214
+ setSelectedTool = { setSelectedTool }
215
+ toolResult = { toolResult }
216
+ error = { error }
217
+ />
218
+ < ConsoleTab />
219
+ </ div >
220
+ </ Tabs >
221
+ ) : (
222
+ < div className = "flex items-center justify-center h-full" >
223
+ < p className = "text-lg text-gray-500" >
224
+ Connect to an MCP server to start inspecting
225
+ </ p >
181
226
</ div >
182
- </ Tabs >
227
+ ) }
183
228
</ div >
184
229
</ div >
185
230
</ div >
0 commit comments