1
1
import { useState , useEffect } from "react" ;
2
- import { Send , Bell , Terminal , Files } from "lucide-react" ;
2
+ import { Send , Bell , Terminal , Files , MessageSquare } from "lucide-react" ;
3
3
import { Tabs , TabsList , TabsTrigger } from "@/components/ui/tabs" ;
4
4
5
5
import ConsoleTab from "./components/ConsoleTab" ;
6
6
import Sidebar from "./components/Sidebar" ;
7
7
import RequestsTab from "./components/RequestsTabs" ;
8
8
import ResourcesTab , { Resource } from "./components/ResourcesTab" ;
9
9
import NotificationsTab from "./components/NotificationsTab" ;
10
+ import PromptsTab , { Prompt } from "./components/PromptsTab" ;
10
11
11
12
const App = ( ) => {
12
13
const [ socket , setSocket ] = useState < WebSocket | null > ( null ) ;
13
- const [ resources , setResources ] = useState < Resource [ ] > ( [ ] ) ;
14
- const [ selectedResource , setSelectedResource ] = useState < Resource | null > (
15
- null ,
16
- ) ;
17
- const [ resourceContent , setResourceContent ] = useState < string > ( "" ) ;
18
14
const [ connectionStatus , setConnectionStatus ] = useState <
19
15
"disconnected" | "connected" | "error"
20
16
> ( "disconnected" ) ;
17
+ const [ resources , setResources ] = useState < Resource [ ] > ( [ ] ) ;
18
+ const [ resourceContent , setResourceContent ] = useState < string > ( "" ) ;
19
+ const [ prompts , setPrompts ] = useState < Prompt [ ] > ( [ ] ) ;
20
+ const [ promptContent , setPromptContent ] = useState < string > ( "" ) ;
21
21
const [ error , setError ] = useState < string | null > ( null ) ;
22
22
23
23
useEffect ( ( ) => {
@@ -38,6 +38,12 @@ const App = () => {
38
38
} else if ( message . type === "resource" ) {
39
39
setResourceContent ( JSON . stringify ( message . data , null , 2 ) ) ;
40
40
setError ( null ) ;
41
+ } else if ( message . type === "prompts" ) {
42
+ setPrompts ( message . data . prompts ) ;
43
+ setError ( null ) ;
44
+ } else if ( message . type === "prompt" ) {
45
+ setPromptContent ( JSON . stringify ( message . data , null , 2 ) ) ;
46
+ setError ( null ) ;
41
47
} else if ( message . type === "error" ) {
42
48
setError ( message . message ) ;
43
49
}
@@ -54,24 +60,41 @@ const App = () => {
54
60
return ( ) => ws . close ( ) ;
55
61
} , [ ] ) ;
56
62
57
- const listResources = ( ) => {
63
+ const sendWebSocketMessage = ( message : object ) => {
58
64
if ( socket ) {
59
- socket . send ( JSON . stringify ( { type : "listResources" } ) ) ;
65
+ console . log ( "Sending WebSocket message:" , message ) ;
66
+ socket . send ( JSON . stringify ( message ) ) ;
60
67
}
61
68
} ;
62
69
70
+ const [ selectedResource , setSelectedResource ] = useState < Resource | null > (
71
+ null ,
72
+ ) ;
73
+ const [ selectedPrompt , setSelectedPrompt ] = useState < Prompt | null > ( null ) ;
74
+
75
+ const listResources = ( ) => {
76
+ sendWebSocketMessage ( { type : "listResources" } ) ;
77
+ } ;
78
+
63
79
const readResource = ( uri : string ) => {
64
- if ( socket ) {
65
- socket . send ( JSON . stringify ( { type : "readResource" , uri } ) ) ;
66
- }
80
+ sendWebSocketMessage ( { type : "readResource" , uri } ) ;
81
+ } ;
82
+
83
+ const listPrompts = ( ) => {
84
+ sendWebSocketMessage ( { type : "listPrompts" } ) ;
85
+ } ;
86
+
87
+ const getPrompt = ( name : string ) => {
88
+ sendWebSocketMessage ( { type : "getPrompt" , name } ) ;
67
89
} ;
68
90
69
91
return (
70
92
< div className = "flex h-screen bg-gray-100" >
71
93
< Sidebar connectionStatus = { connectionStatus } />
72
- < div className = "flex-1 flex flex-col" >
73
- < div className = "flex-1 p-6" >
74
- < Tabs defaultValue = "requests" >
94
+ < div className = "flex-1 flex flex-col overflow-hidden" >
95
+ < h1 className = "text-2xl font-bold p-4" > MCP Inspector</ h1 >
96
+ < div className = "flex-1 overflow-auto" >
97
+ < Tabs defaultValue = "requests" className = "w-full" >
75
98
< TabsList className = "mb-4" >
76
99
< TabsTrigger value = "requests" >
77
100
< Send className = "w-4 h-4 mr-2" />
@@ -85,24 +108,39 @@ const App = () => {
85
108
< Files className = "w-4 h-4 mr-2" />
86
109
Resources
87
110
</ TabsTrigger >
111
+ < TabsTrigger value = "prompts" >
112
+ < MessageSquare className = "w-4 h-4 mr-2" />
113
+ Prompts
114
+ </ TabsTrigger >
88
115
< TabsTrigger value = "console" >
89
116
< Terminal className = "w-4 h-4 mr-2" />
90
117
Console
91
118
</ TabsTrigger >
92
119
</ TabsList >
93
120
94
- < RequestsTab />
95
- < ResourcesTab
96
- resources = { resources }
97
- listResources = { listResources }
98
- readResource = { readResource }
99
- selectedResource = { selectedResource }
100
- setSelectedResource = { setSelectedResource }
101
- resourceContent = { resourceContent }
102
- error = { error }
103
- />
104
- < NotificationsTab />
105
- < ConsoleTab />
121
+ < div className = "w-full" >
122
+ < RequestsTab />
123
+ < ResourcesTab
124
+ resources = { resources }
125
+ listResources = { listResources }
126
+ readResource = { readResource }
127
+ selectedResource = { selectedResource }
128
+ setSelectedResource = { setSelectedResource }
129
+ resourceContent = { resourceContent }
130
+ error = { error }
131
+ />
132
+ < NotificationsTab />
133
+ < PromptsTab
134
+ prompts = { prompts }
135
+ listPrompts = { listPrompts }
136
+ getPrompt = { getPrompt }
137
+ selectedPrompt = { selectedPrompt }
138
+ setSelectedPrompt = { setSelectedPrompt }
139
+ promptContent = { promptContent }
140
+ error = { error }
141
+ />
142
+ < ConsoleTab />
143
+ </ div >
106
144
</ Tabs >
107
145
</ div >
108
146
</ div >
0 commit comments