Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,7 @@ python/build/
python/dist/
python/kubernetes_mcp_server.egg-info/
!python/kubernetes-mcp-server

.gevals-step*
gevals-kubevirt-vm-operations-out.json
.gemini
1 change: 1 addition & 0 deletions internal/tools/update-readme/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/config"
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/core"
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/helm"
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/kubevirt"
)

type OpenShift struct{}
Expand Down
53 changes: 53 additions & 0 deletions pkg/api/toolsets.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package api
import (
"context"
"encoding/json"
"fmt"

internalk8s "github.com/containers/kubernetes-mcp-server/pkg/kubernetes"
"github.com/containers/kubernetes-mcp-server/pkg/output"
Expand Down Expand Up @@ -69,6 +70,58 @@ type ToolHandlerParams struct {
ListOutput output.Output
}

// GetRequiredString extracts a required string parameter from the tool call arguments.
// Returns an error if the parameter is missing or not a string.
func (p ToolHandlerParams) GetRequiredString(key string) (string, error) {
args := p.GetArguments()
val, ok := args[key]
if !ok {
return "", fmt.Errorf("%s parameter required", key)
}
str, ok := val.(string)
if !ok {
return "", fmt.Errorf("%s parameter must be a string", key)
}
return str, nil
}

// GetOptionalString extracts an optional string parameter from the tool call arguments.
// Returns the provided default value if the parameter is missing or not a string.
// If no default value is provided, returns an empty string.
func (p ToolHandlerParams) GetOptionalString(key string, defaultValue ...string) string {
args := p.GetArguments()
val, ok := args[key]
if !ok {
if len(defaultValue) > 0 {
return defaultValue[0]
}
return ""
}
str, ok := val.(string)
if !ok {
if len(defaultValue) > 0 {
return defaultValue[0]
}
return ""
}
return str
}

// GetOptionalBool extracts an optional boolean parameter from the tool call arguments.
// Returns false if the parameter is missing or not a boolean.
func (p ToolHandlerParams) GetOptionalBool(key string) bool {
args := p.GetArguments()
val, ok := args[key]
if !ok {
return false
}
b, ok := val.(bool)
if !ok {
return false
}
return b
}

type ToolHandlerFunc func(params ToolHandlerParams) (*ToolCallResult, error)

type Tool struct {
Expand Down
2 changes: 1 addition & 1 deletion pkg/kubernetes-mcp-server/cmd/root_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ func TestToolsets(t *testing.T) {
rootCmd := NewMCPServer(ioStreams)
rootCmd.SetArgs([]string{"--help"})
o, err := captureOutput(rootCmd.Execute) // --help doesn't use logger/klog, cobra prints directly to stdout
if !strings.Contains(o, "Comma-separated list of MCP toolsets to use (available toolsets: config, core, helm).") {
if !strings.Contains(o, "Comma-separated list of MCP toolsets to use (available toolsets: config, core, helm, kubevirt).") {
t.Fatalf("Expected all available toolsets, got %s %v", o, err)
}
})
Expand Down
9 changes: 9 additions & 0 deletions pkg/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package kubernetes

import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/rest"

"github.com/containers/kubernetes-mcp-server/pkg/helm"
"k8s.io/client-go/kubernetes/scheme"
Expand Down Expand Up @@ -30,6 +31,14 @@ func (k *Kubernetes) AccessControlClientset() *AccessControlClientset {
return k.manager.accessControlClientSet
}

// RESTConfig returns the Kubernetes REST configuration
func (k *Kubernetes) RESTConfig() *rest.Config {
if k.manager == nil {
return nil
}
return k.manager.cfg
}

var Scheme = scheme.Scheme
var ParameterCodec = runtime.NewParameterCodec(Scheme)

Expand Down
1 change: 1 addition & 0 deletions pkg/mcp/modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ package mcp
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/config"
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/core"
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/helm"
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/kubevirt"
Loading