mirror of
https://github.com/containers/kubernetes-mcp-server.git
synced 2025-10-23 01:22:57 +03:00
fix(npm): child process exits gracefully on SIGxxx (#243)
Signed-off-by: Marc Nuri <marc@marcnuri.com>
This commit is contained in:
@@ -2,7 +2,6 @@ package http
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -19,11 +18,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
oauthProtectedResourceEndpoint = "/.well-known/oauth-protected-resource"
|
healthEndpoint = "/healthz"
|
||||||
healthEndpoint = "/healthz"
|
mcpEndpoint = "/mcp"
|
||||||
mcpEndpoint = "/mcp"
|
sseEndpoint = "/sse"
|
||||||
sseEndpoint = "/sse"
|
sseMessageEndpoint = "/message"
|
||||||
sseMessageEndpoint = "/message"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func Serve(ctx context.Context, mcpServer *mcp.Server, staticConfig *config.StaticConfig, oidcProvider *oidc.Provider) error {
|
func Serve(ctx context.Context, mcpServer *mcp.Server, staticConfig *config.StaticConfig, oidcProvider *oidc.Provider) error {
|
||||||
@@ -46,39 +44,7 @@ func Serve(ctx context.Context, mcpServer *mcp.Server, staticConfig *config.Stat
|
|||||||
mux.HandleFunc(healthEndpoint, func(w http.ResponseWriter, r *http.Request) {
|
mux.HandleFunc(healthEndpoint, func(w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
})
|
})
|
||||||
mux.HandleFunc(oauthProtectedResourceEndpoint, func(w http.ResponseWriter, r *http.Request) {
|
mux.HandleFunc(oauthProtectedResourceEndpoint, OAuthProtectedResourceHandler(mcpServer, staticConfig))
|
||||||
w.Header().Set("Content-Type", "application/json")
|
|
||||||
|
|
||||||
var authServers []string
|
|
||||||
if staticConfig.AuthorizationURL != "" {
|
|
||||||
authServers = []string{staticConfig.AuthorizationURL}
|
|
||||||
} else {
|
|
||||||
// Fallback to Kubernetes API server host if authorization_server is not configured
|
|
||||||
if apiServerHost := mcpServer.GetKubernetesAPIServerHost(); apiServerHost != "" {
|
|
||||||
authServers = []string{apiServerHost}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
response := map[string]interface{}{
|
|
||||||
"authorization_servers": authServers,
|
|
||||||
"authorization_server": authServers[0],
|
|
||||||
"scopes_supported": mcpServer.GetEnabledTools(),
|
|
||||||
"bearer_methods_supported": []string{"header"},
|
|
||||||
}
|
|
||||||
|
|
||||||
if staticConfig.ServerURL != "" {
|
|
||||||
response["resource"] = staticConfig.ServerURL
|
|
||||||
}
|
|
||||||
|
|
||||||
if staticConfig.JwksURL != "" {
|
|
||||||
response["jwks_uri"] = staticConfig.JwksURL
|
|
||||||
}
|
|
||||||
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
if err := json.NewEncoder(w).Encode(response); err != nil {
|
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(ctx)
|
ctx, cancel := context.WithCancel(ctx)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|||||||
49
pkg/http/wellknown.go
Normal file
49
pkg/http/wellknown.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package http
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/containers/kubernetes-mcp-server/pkg/config"
|
||||||
|
"github.com/containers/kubernetes-mcp-server/pkg/mcp"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
oauthProtectedResourceEndpoint = "/.well-known/oauth-protected-resource"
|
||||||
|
)
|
||||||
|
|
||||||
|
func OAuthProtectedResourceHandler(mcpServer *mcp.Server, staticConfig *config.StaticConfig) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
|
||||||
|
var authServers []string
|
||||||
|
if staticConfig.AuthorizationURL != "" {
|
||||||
|
authServers = []string{staticConfig.AuthorizationURL}
|
||||||
|
} else {
|
||||||
|
// Fallback to Kubernetes API server host if authorization_server is not configured
|
||||||
|
if apiServerHost := mcpServer.GetKubernetesAPIServerHost(); apiServerHost != "" {
|
||||||
|
authServers = []string{apiServerHost}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
response := map[string]interface{}{
|
||||||
|
"authorization_servers": authServers,
|
||||||
|
"authorization_server": authServers[0],
|
||||||
|
"scopes_supported": mcpServer.GetEnabledTools(),
|
||||||
|
"bearer_methods_supported": []string{"header"},
|
||||||
|
}
|
||||||
|
|
||||||
|
if staticConfig.ServerURL != "" {
|
||||||
|
response["resource"] = staticConfig.ServerURL
|
||||||
|
}
|
||||||
|
|
||||||
|
if staticConfig.JwksURL != "" {
|
||||||
|
response["jwks_uri"] = staticConfig.JwksURL
|
||||||
|
}
|
||||||
|
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
if err := json.NewEncoder(w).Encode(response); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user