@@ -45,23 +45,16 @@ import RootsTab from "./components/RootsTab";
4545import SamplingTab , { PendingRequest } from "./components/SamplingTab" ;
4646import Sidebar from "./components/Sidebar" ;
4747import ToolsTab from "./components/ToolsTab" ;
48+ import { DEFAULT_INSPECTOR_CONFIG } from "./lib/constants" ;
49+ import { InspectorConfig } from "./lib/configurationTypes" ;
4850
4951const params = new URLSearchParams ( window . location . search ) ;
5052const PROXY_PORT = params . get ( "proxyPort" ) ?? "3000" ;
5153const PROXY_SERVER_URL = `http://${ window . location . hostname } :${ PROXY_PORT } ` ;
54+ const CONFIG_LOCAL_STORAGE_KEY = "inspectorConfig_v1" ;
5255
5356const App = ( ) => {
5457 // Handle OAuth callback route
55- if ( window . location . pathname === "/oauth/callback" ) {
56- const OAuthCallback = React . lazy (
57- ( ) => import ( "./components/OAuthCallback" ) ,
58- ) ;
59- return (
60- < Suspense fallback = { < div > Loading...</ div > } >
61- < OAuthCallback />
62- </ Suspense >
63- ) ;
64- }
6558 const [ resources , setResources ] = useState < Resource [ ] > ( [ ] ) ;
6659 const [ resourceTemplates , setResourceTemplates ] = useState <
6760 ResourceTemplate [ ]
@@ -99,6 +92,11 @@ const App = () => {
9992 > ( [ ] ) ;
10093 const [ roots , setRoots ] = useState < Root [ ] > ( [ ] ) ;
10194 const [ env , setEnv ] = useState < Record < string , string > > ( { } ) ;
95+
96+ const [ config , setConfig ] = useState < InspectorConfig > ( ( ) => {
97+ const savedConfig = localStorage . getItem ( CONFIG_LOCAL_STORAGE_KEY ) ;
98+ return savedConfig ? JSON . parse ( savedConfig ) : DEFAULT_INSPECTOR_CONFIG ;
99+ } ) ;
102100 const [ bearerToken , setBearerToken ] = useState < string > ( ( ) => {
103101 return localStorage . getItem ( "lastBearerToken" ) || "" ;
104102 } ) ;
@@ -114,22 +112,6 @@ const App = () => {
114112 const nextRequestId = useRef ( 0 ) ;
115113 const rootsRef = useRef < Root [ ] > ( [ ] ) ;
116114
117- const handleApproveSampling = ( id : number , result : CreateMessageResult ) => {
118- setPendingSampleRequests ( ( prev ) => {
119- const request = prev . find ( ( r ) => r . id === id ) ;
120- request ?. resolve ( result ) ;
121- return prev . filter ( ( r ) => r . id !== id ) ;
122- } ) ;
123- } ;
124-
125- const handleRejectSampling = ( id : number ) => {
126- setPendingSampleRequests ( ( prev ) => {
127- const request = prev . find ( ( r ) => r . id === id ) ;
128- request ?. reject ( new Error ( "Sampling request rejected" ) ) ;
129- return prev . filter ( ( r ) => r . id !== id ) ;
130- } ) ;
131- } ;
132-
133115 const [ selectedResource , setSelectedResource ] = useState < Resource | null > (
134116 null ,
135117 ) ;
@@ -171,6 +153,7 @@ const App = () => {
171153 env,
172154 bearerToken,
173155 proxyServerUrl : PROXY_SERVER_URL ,
156+ requestTimeout : config . MCP_SERVER_REQUEST_TIMEOUT . value as number ,
174157 onNotification : ( notification ) => {
175158 setNotifications ( ( prev ) => [ ...prev , notification as ServerNotification ] ) ;
176159 } ,
@@ -209,6 +192,10 @@ const App = () => {
209192 localStorage . setItem ( "lastBearerToken" , bearerToken ) ;
210193 } , [ bearerToken ] ) ;
211194
195+ useEffect ( ( ) => {
196+ localStorage . setItem ( CONFIG_LOCAL_STORAGE_KEY , JSON . stringify ( config ) ) ;
197+ } , [ config ] ) ;
198+
212199 // Auto-connect if serverUrl is provided in URL params (e.g. after OAuth callback)
213200 useEffect ( ( ) => {
214201 const serverUrl = params . get ( "serverUrl" ) ;
@@ -224,7 +211,7 @@ const App = () => {
224211 // Connect to the server
225212 connectMcpServer ( ) ;
226213 }
227- } , [ ] ) ;
214+ } , [ connectMcpServer ] ) ;
228215
229216 useEffect ( ( ) => {
230217 fetch ( `${ PROXY_SERVER_URL } /config` )
@@ -253,6 +240,22 @@ const App = () => {
253240 }
254241 } , [ ] ) ;
255242
243+ const handleApproveSampling = ( id : number , result : CreateMessageResult ) => {
244+ setPendingSampleRequests ( ( prev ) => {
245+ const request = prev . find ( ( r ) => r . id === id ) ;
246+ request ?. resolve ( result ) ;
247+ return prev . filter ( ( r ) => r . id !== id ) ;
248+ } ) ;
249+ } ;
250+
251+ const handleRejectSampling = ( id : number ) => {
252+ setPendingSampleRequests ( ( prev ) => {
253+ const request = prev . find ( ( r ) => r . id === id ) ;
254+ request ?. reject ( new Error ( "Sampling request rejected" ) ) ;
255+ return prev . filter ( ( r ) => r . id !== id ) ;
256+ } ) ;
257+ } ;
258+
256259 const clearError = ( tabKey : keyof typeof errors ) => {
257260 setErrors ( ( prev ) => ( { ...prev , [ tabKey ] : null } ) ) ;
258261 } ;
@@ -425,6 +428,17 @@ const App = () => {
425428 setLogLevel ( level ) ;
426429 } ;
427430
431+ if ( window . location . pathname === "/oauth/callback" ) {
432+ const OAuthCallback = React . lazy (
433+ ( ) => import ( "./components/OAuthCallback" ) ,
434+ ) ;
435+ return (
436+ < Suspense fallback = { < div > Loading...</ div > } >
437+ < OAuthCallback />
438+ </ Suspense >
439+ ) ;
440+ }
441+
428442 return (
429443 < div className = "flex h-screen bg-background" >
430444 < Sidebar
@@ -439,6 +453,8 @@ const App = () => {
439453 setSseUrl = { setSseUrl }
440454 env = { env }
441455 setEnv = { setEnv }
456+ config = { config }
457+ setConfig = { setConfig }
442458 bearerToken = { bearerToken }
443459 setBearerToken = { setBearerToken }
444460 onConnect = { connectMcpServer }
0 commit comments