@@ -294,9 +294,17 @@ func buildHTTPHandler(
294294userTokenService * server.UserTokenService ,
295295baseURL string ,
296296info mcp.Implementation ,
297- ) (* http.ServeMux , error ) {
297+ ) (http.Handler , error ) {
298298// Create mux and register all routes with dependency injection
299299mux := http .NewServeMux ()
300+ basePath := cfg .Proxy .BasePath
301+
302+ route := func (path string ) string {
303+ if basePath == "/" {
304+ return path
305+ }
306+ return basePath + path
307+ }
300308
301309// Build common middleware
302310corsMiddleware := server .NewCORSMiddleware (authConfig .AllowedOrigins )
@@ -307,7 +315,6 @@ func buildHTTPHandler(
307315mcpRecover := server .NewRecoverMiddleware ("mcp" )
308316oauthRecover := server .NewRecoverMiddleware ("oauth" )
309317
310- // Register health endpoint
311318mux .Handle ("/health" , server .NewHealthHandler ())
312319
313320// Create browser state token for SSO middleware (used by both OAuth and admin routes)
@@ -337,13 +344,13 @@ func buildHTTPHandler(
337344)
338345
339346// Register OAuth endpoints
340- mux .Handle ("/.well-known/oauth-authorization-server" , server .ChainMiddleware (http .HandlerFunc (authHandlers .WellKnownHandler ), oauthMiddleware ... ))
341- mux .Handle ("/.well-known/oauth-protected-resource" , server .ChainMiddleware (http .HandlerFunc (authHandlers .ProtectedResourceMetadataHandler ), oauthMiddleware ... ))
342- mux .Handle ("/authorize" , server .ChainMiddleware (http .HandlerFunc (authHandlers .AuthorizeHandler ), oauthMiddleware ... ))
343- mux .Handle ("/oauth/callback" , server .ChainMiddleware (http .HandlerFunc (authHandlers .GoogleCallbackHandler ), oauthMiddleware ... ))
344- mux .Handle ("/token" , server .ChainMiddleware (http .HandlerFunc (authHandlers .TokenHandler ), oauthMiddleware ... ))
345- mux .Handle ("/register" , server .ChainMiddleware (http .HandlerFunc (authHandlers .RegisterHandler ), oauthMiddleware ... ))
346- mux .Handle ("/clients/{client_id}" , server .ChainMiddleware (http .HandlerFunc (authHandlers .ClientMetadataHandler ), oauthMiddleware ... ))
347+ mux .Handle (route ( "/.well-known/oauth-authorization-server" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .WellKnownHandler ), oauthMiddleware ... ))
348+ mux .Handle (route ( "/.well-known/oauth-protected-resource" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .ProtectedResourceMetadataHandler ), oauthMiddleware ... ))
349+ mux .Handle (route ( "/authorize" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .AuthorizeHandler ), oauthMiddleware ... ))
350+ mux .Handle (route ( "/oauth/callback" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .GoogleCallbackHandler ), oauthMiddleware ... ))
351+ mux .Handle (route ( "/token" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .TokenHandler ), oauthMiddleware ... ))
352+ mux .Handle (route ( "/register" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .RegisterHandler ), oauthMiddleware ... ))
353+ mux .Handle (route ( "/clients/{client_id}" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .ClientMetadataHandler ), oauthMiddleware ... ))
347354
348355// Register protected token endpoints
349356tokenMiddleware := []server.MiddlewareFunc {
@@ -357,19 +364,19 @@ func buildHTTPHandler(
357364tokenHandlers := server .NewTokenHandlers (storage , cfg .MCPServers , true , serviceOAuthClient )
358365
359366// Token management UI endpoints
360- mux .Handle ("/my/tokens" , server .ChainMiddleware (http .HandlerFunc (tokenHandlers .ListTokensHandler ), tokenMiddleware ... ))
361- mux .Handle ("/my/tokens/set" , server .ChainMiddleware (http .HandlerFunc (tokenHandlers .SetTokenHandler ), tokenMiddleware ... ))
362- mux .Handle ("/my/tokens/delete" , server .ChainMiddleware (http .HandlerFunc (tokenHandlers .DeleteTokenHandler ), tokenMiddleware ... ))
367+ mux .Handle (route ( "/my/tokens" ) , server .ChainMiddleware (http .HandlerFunc (tokenHandlers .ListTokensHandler ), tokenMiddleware ... ))
368+ mux .Handle (route ( "/my/tokens/set" ) , server .ChainMiddleware (http .HandlerFunc (tokenHandlers .SetTokenHandler ), tokenMiddleware ... ))
369+ mux .Handle (route ( "/my/tokens/delete" ) , server .ChainMiddleware (http .HandlerFunc (tokenHandlers .DeleteTokenHandler ), tokenMiddleware ... ))
363370
364371// OAuth interstitial page and completion endpoint
365- mux .Handle ("/oauth/services" , server .ChainMiddleware (http .HandlerFunc (authHandlers .ServiceSelectionHandler ), tokenMiddleware ... ))
366- mux .Handle ("/oauth/complete" , server .ChainMiddleware (http .HandlerFunc (authHandlers .CompleteOAuthHandler ), tokenMiddleware ... ))
372+ mux .Handle (route ( "/oauth/services" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .ServiceSelectionHandler ), tokenMiddleware ... ))
373+ mux .Handle (route ( "/oauth/complete" ) , server .ChainMiddleware (http .HandlerFunc (authHandlers .CompleteOAuthHandler ), tokenMiddleware ... ))
367374
368375// Register service OAuth endpoints
369376serviceAuthHandlers := server .NewServiceAuthHandlers (serviceOAuthClient , cfg .MCPServers , storage )
370- mux .HandleFunc ("/oauth/callback/" , serviceAuthHandlers .CallbackHandler )
371- mux .Handle ("/oauth/connect" , server .ChainMiddleware (http .HandlerFunc (serviceAuthHandlers .ConnectHandler ), tokenMiddleware ... ))
372- mux .Handle ("/oauth/disconnect" , server .ChainMiddleware (http .HandlerFunc (serviceAuthHandlers .DisconnectHandler ), tokenMiddleware ... ))
377+ mux .HandleFunc (route ( "/oauth/callback/{service}" ) , serviceAuthHandlers .CallbackHandler )
378+ mux .Handle (route ( "/oauth/connect" ) , server .ChainMiddleware (http .HandlerFunc (serviceAuthHandlers .ConnectHandler ), tokenMiddleware ... ))
379+ mux .Handle (route ( "/oauth/disconnect" ) , server .ChainMiddleware (http .HandlerFunc (serviceAuthHandlers .DisconnectHandler ), tokenMiddleware ... ))
373380}
374381
375382// Setup MCP server endpoints
@@ -411,8 +418,8 @@ func buildHTTPHandler(
411418baseURL ,
412419info ,
413420sessionManager ,
414- sseServers [serverName ], // Pass the shared SSE server (nil for non-stdio)
415- mcpServer , // Pass the shared MCP server (nil for non-stdio)
421+ sseServers [serverName ],
422+ mcpServer ,
416423userTokenService .GetUserToken ,
417424)
418425}
@@ -436,8 +443,7 @@ func buildHTTPHandler(
436443// Recovery middleware should be last (outermost)
437444mcpMiddlewares = append (mcpMiddlewares , mcpRecover )
438445
439- // Register handler - SSE server needs to handle all paths under the server name
440- mux .Handle ("/" + serverName + "/" , server .ChainMiddleware (handler , mcpMiddlewares ... ))
446+ mux .Handle (route ("/" + serverName + "/" ), server .ChainMiddleware (handler , mcpMiddlewares ... ))
441447}
442448
443449// Setup admin routes if admin is enabled
@@ -474,10 +480,10 @@ func buildHTTPHandler(
474480adminMiddleware = append (adminMiddleware , mcpRecover )
475481
476482// Register admin routes
477- mux .Handle ("/admin" , server .ChainMiddleware (http .HandlerFunc (adminHandlers .DashboardHandler ), adminMiddleware ... ))
478- mux .Handle ("/admin/users" , server .ChainMiddleware (http .HandlerFunc (adminHandlers .UserActionHandler ), adminMiddleware ... ))
479- mux .Handle ("/admin/sessions" , server .ChainMiddleware (http .HandlerFunc (adminHandlers .SessionActionHandler ), adminMiddleware ... ))
480- mux .Handle ("/admin/logging" , server .ChainMiddleware (http .HandlerFunc (adminHandlers .LoggingActionHandler ), adminMiddleware ... ))
483+ mux .Handle (route ( "/admin" ) , server .ChainMiddleware (http .HandlerFunc (adminHandlers .DashboardHandler ), adminMiddleware ... ))
484+ mux .Handle (route ( "/admin/users" ) , server .ChainMiddleware (http .HandlerFunc (adminHandlers .UserActionHandler ), adminMiddleware ... ))
485+ mux .Handle (route ( "/admin/sessions" ) , server .ChainMiddleware (http .HandlerFunc (adminHandlers .SessionActionHandler ), adminMiddleware ... ))
486+ mux .Handle (route ( "/admin/logging" ) , server .ChainMiddleware (http .HandlerFunc (adminHandlers .LoggingActionHandler ), adminMiddleware ... ))
481487}
482488
483489log .LogInfoWithFields ("server" , "MCP proxy server initialized" , nil )
0 commit comments