@@ -3,7 +3,7 @@ package http
33import (
44 "context"
55 "errors"
6- "fmt "
6+ "strings "
77 "log/slog"
88 "net/http"
99
@@ -416,6 +416,22 @@ func PATScopeFilter(b *inventory.Builder, r *http.Request, fetcher scopes.Fetche
416416 return b
417417}
418418
419+ // corsAllowHeaders is the precomputed Access-Control-Allow-Headers value.
420+ var corsAllowHeaders = strings .Join ([]string {
421+ "Content-Type" ,
422+ "Mcp-Session-Id" ,
423+ "Mcp-Protocol-Version" ,
424+ "Last-Event-ID" ,
425+ headers .AuthorizationHeader ,
426+ headers .MCPReadOnlyHeader ,
427+ headers .MCPToolsetsHeader ,
428+ headers .MCPToolsHeader ,
429+ headers .MCPExcludeToolsHeader ,
430+ headers .MCPFeaturesHeader ,
431+ headers .MCPLockdownHeader ,
432+ headers .MCPInsidersHeader ,
433+ }, ", " )
434+
419435// SetCorsHeaders is middleware that sets CORS headers to allow browser-based
420436// MCP clients to connect from any origin. This is safe because the server
421437// authenticates via bearer tokens (not cookies), so cross-origin requests
@@ -426,17 +442,7 @@ func SetCorsHeaders(h http.Handler) http.Handler {
426442 w .Header ().Set ("Access-Control-Allow-Methods" , "GET, POST, DELETE, OPTIONS" )
427443 w .Header ().Set ("Access-Control-Max-Age" , "86400" )
428444 w .Header ().Set ("Access-Control-Expose-Headers" , "Mcp-Session-Id, WWW-Authenticate" )
429- w .Header ().Set ("Access-Control-Allow-Headers" , fmt .Sprintf (
430- "Content-Type, Mcp-Session-Id, Mcp-Protocol-Version, Last-Event-ID, %s, %s, %s, %s, %s, %s, %s, %s" ,
431- headers .AuthorizationHeader ,
432- headers .MCPReadOnlyHeader ,
433- headers .MCPToolsetsHeader ,
434- headers .MCPToolsHeader ,
435- headers .MCPExcludeToolsHeader ,
436- headers .MCPFeaturesHeader ,
437- headers .MCPLockdownHeader ,
438- headers .MCPInsidersHeader ,
439- ))
445+ w .Header ().Set ("Access-Control-Allow-Headers" , corsAllowHeaders )
440446
441447 if r .Method == http .MethodOptions {
442448 w .WriteHeader (http .StatusOK )
0 commit comments