package server
import (
"context"
"fmt"
"github.com/modelcontextprotocol/go-sdk/mcp"
"github.com/sirupsen/logrus"
k8scontext "mcp-k8swizard/internal/context"
"mcp-k8swizard/internal/tools"
)
// Server manages the MCP server and tool registration
type Server struct {
mcpServer *mcp.Server
contextManager *k8scontext.Manager
k8sTools *tools.K8sTools
kubectlTools *tools.KubectlTools
promptTools *tools.PromptTools
}
// NewServer creates a new server instance
func NewServer(version string) *Server {
// Create MCP server
mcpServer := mcp.NewServer(&mcp.Implementation{
Name: "mcp-k8swizard",
Version: version,
}, nil)
// Initialize context manager
contextManager := k8scontext.NewManager()
// Initialize tool handlers
k8sTools := tools.NewK8sTools(contextManager)
kubectlTools := tools.NewKubectlToolsWithContext(contextManager)
promptTools := tools.NewPromptTools(contextManager)
return &Server{
mcpServer: mcpServer,
contextManager: contextManager,
k8sTools: k8sTools,
kubectlTools: kubectlTools,
promptTools: promptTools,
}
}
// InitializeContexts initializes available contexts
func (s *Server) InitializeContexts() error {
contextTools := tools.NewContextTools(s.contextManager)
contexts, err := contextTools.GetAvailableContexts()
if err != nil {
logrus.Warnf("Failed to get available contexts at startup: %v", err)
return err
}
s.contextManager.SetAvailableContexts(contexts)
logrus.Infof("Initialized with %d available contexts", len(contexts))
return nil
}
// RegisterTools registers all available tools with the MCP server
func (s *Server) RegisterTools() {
// Kubernetes tools
s.registerK8sTools()
// Kubectl tools
s.registerKubectlTools()
// Context management tools
s.registerContextTools()
// Prompt tools
s.registerPromptTools()
logrus.Info("All tools registered successfully")
}
// registerK8sTools registers Kubernetes-specific tools
func (s *Server) registerK8sTools() {
// Kubernetes tools
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_cluster_info",
Description: "Get comprehensive information about Kubernetes clusters including nodes, namespaces, and cluster type detection (EKS, AKS, GKE, RKE2, K3s)",
}, s.k8sTools.HandleClusterInfo)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_list_resources",
Description: "List Kubernetes resources (pods, services, deployments, etc.) with filtering options",
}, s.k8sTools.HandleListResources)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_get_resource",
Description: "Get detailed information about a specific Kubernetes resource",
}, s.k8sTools.HandleGetResource)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_get_logs",
Description: "Get logs from Kubernetes pods with filtering and streaming options",
}, s.k8sTools.HandleGetLogs)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_natural_language_query",
Description: "Process natural language queries about Kubernetes resources and get intelligent responses",
}, s.k8sTools.HandleNaturalLanguage)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "ping",
Description: "Verify connection to the Kubernetes cluster",
}, s.k8sTools.HandlePing)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_get_events",
Description: "Get Kubernetes events with filtering options",
}, s.k8sTools.HandleGetEvents)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_exec_in_pod",
Description: "Execute commands in Kubernetes pods",
}, s.k8sTools.HandleExecInPod)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_check_all_clusters",
Description: "Check status of all available clusters in parallel for faster results",
}, s.k8sTools.HandleCheckAllClusters)
}
// registerKubectlTools registers kubectl-specific tools
func (s *Server) registerKubectlTools() {
// Kubectl tools
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_get",
Description: "Get or list Kubernetes resources (pods, services, deployments, etc.) with filtering options",
}, s.kubectlTools.HandleKubectlGet)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_describe",
Description: "Describe detailed information about a specific Kubernetes resource",
}, s.kubectlTools.HandleKubectlDescribe)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_create",
Description: "Create Kubernetes resources from command line arguments",
}, s.kubectlTools.HandleKubectlCreate)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_apply",
Description: "Apply Kubernetes resources from YAML or JSON manifests",
}, s.kubectlTools.HandleKubectlApply)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_delete",
Description: "Delete Kubernetes resources",
}, s.kubectlTools.HandleKubectlDelete)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_context",
Description: "Manage kubectl contexts - list, switch, or get current context",
}, s.kubectlTools.HandleKubectlContext)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_scale",
Description: "Scale Kubernetes resources (deployments, replicasets, etc.)",
}, s.kubectlTools.HandleKubectlScale)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_patch",
Description: "Update field(s) of a Kubernetes resource using strategic merge patch",
}, s.kubectlTools.HandleKubectlPatch)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_rollout",
Description: "Manage deployment rollouts - status, history, pause, resume, undo",
}, s.kubectlTools.HandleKubectlRollout)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "kubectl_generic",
Description: "Execute any kubectl command with custom arguments",
}, s.kubectlTools.HandleKubectlGeneric)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "explain_resource",
Description: "Explain Kubernetes resources and their fields",
}, s.kubectlTools.HandleExplainResource)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "list_api_resources",
Description: "List all API resources available in the cluster",
}, s.kubectlTools.HandleListApiResources)
}
// registerContextTools registers context management tools
func (s *Server) registerContextTools() {
contextTools := tools.NewContextTools(s.contextManager)
// Context management tools
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_set_context",
Description: "Set the current Kubernetes context for all subsequent operations",
}, contextTools.HandleSetContext)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_get_current_context",
Description: "Get the current Kubernetes context",
}, contextTools.HandleGetCurrentContext)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_list_contexts",
Description: "List all available Kubernetes contexts",
}, contextTools.HandleListContexts)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_clear_context",
Description: "Clear the current context (will use default context)",
}, contextTools.HandleClearContext)
}
// registerPromptTools registers prompt-based tools
func (s *Server) registerPromptTools() {
// Prompt tools
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_diagnose",
Description: "Generate systematic troubleshooting prompts for Kubernetes pods with step-by-step diagnostic guidance",
}, s.promptTools.HandleK8sDiagnose)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_troubleshoot",
Description: "Generate advanced troubleshooting prompts for comprehensive Kubernetes debugging",
}, s.promptTools.HandleK8sTroubleshoot)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_optimize",
Description: "Generate performance optimization prompts for Kubernetes resources",
}, s.promptTools.HandleK8sOptimize)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_security",
Description: "Generate security analysis prompts for Kubernetes resources and configurations",
}, s.promptTools.HandleK8sSecurity)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_performance",
Description: "Generate performance monitoring prompts for Kubernetes resources",
}, s.promptTools.HandleK8sPerformance)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "k8s_deployment",
Description: "Generate deployment analysis prompts for Kubernetes deployments and rollouts",
}, s.promptTools.HandleK8sDeployment)
mcp.AddTool(s.mcpServer, &mcp.Tool{
Name: "prompt_suggestions",
Description: "Get contextual prompt suggestions based on your current situation or keywords",
}, s.promptTools.HandlePromptSuggestions)
}
// Run starts the MCP server
func (s *Server) Run(ctx context.Context) error {
logrus.Info("Starting MCP server on stdio transport...")
return s.mcpServer.Run(ctx, &mcp.StdioTransport{})
}
// PrintHelp prints the help information
func PrintHelp() {
fmt.Println("MCP-K8sWizard - The Kubernetes Wizard for Modern DevOps")
fmt.Println("Usage: mcp-k8swizard [options]")
fmt.Println("")
fmt.Println("Options:")
fmt.Println(" -log-level string")
fmt.Println(" Set log level (DEBUG, INFO, WARN, ERROR)")
fmt.Println(" -verbose")
fmt.Println(" Enable verbose logging (equivalent to DEBUG level)")
fmt.Println(" -version")
fmt.Println(" Show version information")
fmt.Println(" -help")
fmt.Println(" Show this help message")
fmt.Println("")
fmt.Println("Environment Variables:")
fmt.Println(" LOG_LEVEL Set log level (overrides -log-level flag)")
fmt.Println(" KUBECONFIG Path to kubeconfig file")
fmt.Println(" K8S_CONTEXT Kubernetes context to use")
fmt.Println("")
fmt.Println("This tool works with Cursor AI via MCP protocol")
}