diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4cd54fa..25f5523 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -24,7 +24,7 @@ jobs: go mod verify go mod download - LINT_VERSION=2.1.6 + LINT_VERSION=2.12.2 curl -fsSL https://github.com/golangci/golangci-lint/releases/download/v${LINT_VERSION}/golangci-lint-${LINT_VERSION}-linux-amd64.tar.gz | \ tar xz --strip-components 1 --wildcards \*/golangci-lint mkdir -p bin && mv golangci-lint bin/ diff --git a/go.mod b/go.mod index eee9443..825bfc3 100644 --- a/go.mod +++ b/go.mod @@ -1,29 +1,29 @@ module github.com/basebandit/kai -go 1.24.1 +go 1.25.5 require ( - github.com/mark3labs/mcp-go v0.28.0 + github.com/mark3labs/mcp-go v0.52.0 github.com/prometheus/client_golang v1.23.2 github.com/stretchr/testify v1.11.1 - k8s.io/api v0.33.1 - k8s.io/apimachinery v0.33.1 - k8s.io/client-go v0.33.1 + k8s.io/api v0.34.1 + k8s.io/apimachinery v0.34.1 + k8s.io/client-go v0.34.1 ) require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.20.2 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/google/gnostic-models v0.6.9 // indirect - github.com/google/go-cmp v0.7.0 // indirect + github.com/google/gnostic-models v0.7.0 // indirect + github.com/google/jsonschema-go v0.4.2 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -31,7 +31,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/moby/spdystream v0.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/pkg/errors v0.9.1 // indirect @@ -39,12 +39,14 @@ require ( github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.66.1 // indirect github.com/prometheus/procfs v0.16.1 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/net v0.43.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sys v0.35.0 // indirect @@ -56,10 +58,10 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect - k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect - sigs.k8s.io/yaml v1.4.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) diff --git a/go.sum b/go.sum index fec06d7..d4074f9 100644 --- a/go.sum +++ b/go.sum @@ -9,12 +9,14 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= -github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= @@ -29,12 +31,13 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= -github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= +github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/jsonschema-go v0.4.2 h1:tmrUohrwoLZZS/P3x7ex0WAVknEkBZM46iALbcqoRA8= +github.com/google/jsonschema-go v0.4.2/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE= github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -60,15 +63,16 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mark3labs/mcp-go v0.28.0 h1:7yl4y5D1KYU2f/9Uxp7xfLIggfunHoESCRbrjcytcLM= -github.com/mark3labs/mcp-go v0.28.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= +github.com/mark3labs/mcp-go v0.52.0 h1:uRSzupNSUyPGDpF4owY5X4zEpACPwBnlM3FAFuXN6gQ= +github.com/mark3labs/mcp-go v0.52.0/go.mod h1:Zg9cB2HdwdMMVgY0xtTzq3KvYIOJQDsaut+jWjwDaQY= github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= @@ -92,10 +96,12 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -117,6 +123,8 @@ go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -168,24 +176,23 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= -k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= -k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= -k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= -k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= -k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= +k8s.io/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= +k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= +k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= +k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= +k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= +k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= -k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= -k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= -sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= -sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc= -sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= -sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= -sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= +sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/tools/configmap.go b/tools/configmap.go index 95bdc0f..c325301 100644 --- a/tools/configmap.go +++ b/tools/configmap.go @@ -134,7 +134,7 @@ func createConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "create_configmap")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -145,7 +145,7 @@ func createConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -154,19 +154,19 @@ func createConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun Namespace: namespace, } - if dataArg, ok := request.Params.Arguments["data"].(map[string]interface{}); ok { + if dataArg, ok := request.GetArguments()["data"].(map[string]interface{}); ok { params.Data = dataArg } - if binaryDataArg, ok := request.Params.Arguments["binary_data"].(map[string]interface{}); ok { + if binaryDataArg, ok := request.GetArguments()["binary_data"].(map[string]interface{}); ok { params.BinaryData = binaryDataArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } @@ -189,7 +189,7 @@ func getConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) func(c return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_configmap")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -200,7 +200,7 @@ func getConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) func(c } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -229,13 +229,13 @@ func listConfigMapsHandler(cm kai.ClusterManager, factory ConfigMapFactory) func slog.Debug("tool invoked", slog.String("tool", "list_configmaps")) var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -243,7 +243,7 @@ func listConfigMapsHandler(cm kai.ClusterManager, factory ConfigMapFactory) func } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -271,7 +271,7 @@ func deleteConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_configmap")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -282,7 +282,7 @@ func deleteConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -310,7 +310,7 @@ func updateConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "update_configmap")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -321,7 +321,7 @@ func updateConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -330,19 +330,19 @@ func updateConfigMapHandler(cm kai.ClusterManager, factory ConfigMapFactory) fun Namespace: namespace, } - if dataArg, ok := request.Params.Arguments["data"].(map[string]interface{}); ok { + if dataArg, ok := request.GetArguments()["data"].(map[string]interface{}); ok { params.Data = dataArg } - if binaryDataArg, ok := request.Params.Arguments["binary_data"].(map[string]interface{}); ok { + if binaryDataArg, ok := request.GetArguments()["binary_data"].(map[string]interface{}); ok { params.BinaryData = binaryDataArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } diff --git a/tools/configmap_test.go b/tools/configmap_test.go index 7ee7516..ad51b51 100644 --- a/tools/configmap_test.go +++ b/tools/configmap_test.go @@ -159,11 +159,7 @@ func TestListConfigMapsHandler(t *testing.T) { handler := listConfigMapsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -256,11 +252,7 @@ func TestGetConfigMapHandler(t *testing.T) { handler := getConfigMapHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -386,11 +378,7 @@ func TestCreateConfigMapHandler(t *testing.T) { handler := createConfigMapHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -474,11 +462,7 @@ func TestDeleteConfigMapHandler(t *testing.T) { handler := deleteConfigMapHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -574,11 +558,7 @@ func TestUpdateConfigMapHandler(t *testing.T) { handler := updateConfigMapHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } diff --git a/tools/context.go b/tools/context.go index 72a69fa..bf45612 100644 --- a/tools/context.go +++ b/tools/context.go @@ -133,7 +133,7 @@ func getCurrentContextHandler(cm kai.ClusterManager) func(ctx context.Context, r func switchContextHandler(cm kai.ClusterManager) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "switch_context")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText("Required parameter 'name' is missing"), nil } @@ -155,7 +155,7 @@ func switchContextHandler(cm kai.ClusterManager) func(ctx context.Context, reque func loadKubeconfigHandler(cm kai.ClusterManager) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "load_kubeconfig")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText("Required parameter 'name' is missing"), nil } @@ -166,7 +166,7 @@ func loadKubeconfigHandler(cm kai.ClusterManager) func(ctx context.Context, requ } path := "" - if pathArg, ok := request.Params.Arguments["path"].(string); ok { + if pathArg, ok := request.GetArguments()["path"].(string); ok { path = pathArg } @@ -187,7 +187,7 @@ func loadKubeconfigHandler(cm kai.ClusterManager) func(ctx context.Context, requ func deleteContextHandler(cm kai.ClusterManager) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_context")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText("Required parameter 'name' is missing"), nil } @@ -209,7 +209,7 @@ func deleteContextHandler(cm kai.ClusterManager) func(ctx context.Context, reque func renameContextHandler(cm kai.ClusterManager) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "rename_context")) - oldNameArg, ok := request.Params.Arguments["old_name"] + oldNameArg, ok := request.GetArguments()["old_name"] if !ok || oldNameArg == nil { return mcp.NewToolResultText("Required parameter 'old_name' is missing"), nil } @@ -219,7 +219,7 @@ func renameContextHandler(cm kai.ClusterManager) func(ctx context.Context, reque return mcp.NewToolResultText("Parameter 'old_name' must be a non-empty string"), nil } - newNameArg, ok := request.Params.Arguments["new_name"] + newNameArg, ok := request.GetArguments()["new_name"] if !ok || newNameArg == nil { return mcp.NewToolResultText("Required parameter 'new_name' is missing"), nil } @@ -241,7 +241,7 @@ func renameContextHandler(cm kai.ClusterManager) func(ctx context.Context, reque func describeContextHandler(cm kai.ClusterManager) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "describe_context")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText("Required parameter 'name' is missing"), nil } diff --git a/tools/context_test.go b/tools/context_test.go index 8afcfa5..ed70067 100644 --- a/tools/context_test.go +++ b/tools/context_test.go @@ -192,11 +192,7 @@ func testSwitchContextHandler(t *testing.T) { handler := switchContextHandler(mockCM) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -262,11 +258,7 @@ func testLoadKubeconfigHandler(t *testing.T) { handler := loadKubeconfigHandler(mockCM) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -324,11 +316,7 @@ func testDeleteContextHandler(t *testing.T) { handler := deleteContextHandler(mockCM) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -398,11 +386,7 @@ func testRenameContextHandler(t *testing.T) { handler := renameContextHandler(mockCM) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -486,11 +470,7 @@ func testDescribeContextHandler(t *testing.T) { handler := describeContextHandler(mockCM) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } diff --git a/tools/cronjob.go b/tools/cronjob.go index 6ba5f63..5049eb2 100644 --- a/tools/cronjob.go +++ b/tools/cronjob.go @@ -207,7 +207,7 @@ func createCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "create_cronjob")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -217,7 +217,7 @@ func createCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct return mcp.NewToolResultText(errEmptyName), nil } - scheduleArg, ok := request.Params.Arguments["schedule"] + scheduleArg, ok := request.GetArguments()["schedule"] if !ok || scheduleArg == nil { return mcp.NewToolResultText("schedule is required"), nil } @@ -227,7 +227,7 @@ func createCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct return mcp.NewToolResultText("schedule cannot be empty"), nil } - imageArg, ok := request.Params.Arguments["image"] + imageArg, ok := request.GetArguments()["image"] if !ok || imageArg == nil { return mcp.NewToolResultText(errMissingImage), nil } @@ -238,7 +238,7 @@ func createCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -249,59 +249,59 @@ func createCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct Image: image, } - if commandArg, ok := request.Params.Arguments["command"].([]interface{}); ok { + if commandArg, ok := request.GetArguments()["command"].([]interface{}); ok { params.Command = commandArg } - if argsArg, ok := request.Params.Arguments["args"].([]interface{}); ok { + if argsArg, ok := request.GetArguments()["args"].([]interface{}); ok { params.Args = argsArg } - if restartPolicyArg, ok := request.Params.Arguments["restart_policy"].(string); ok && restartPolicyArg != "" { + if restartPolicyArg, ok := request.GetArguments()["restart_policy"].(string); ok && restartPolicyArg != "" { params.RestartPolicy = restartPolicyArg } - if concurrencyPolicyArg, ok := request.Params.Arguments["concurrency_policy"].(string); ok && concurrencyPolicyArg != "" { + if concurrencyPolicyArg, ok := request.GetArguments()["concurrency_policy"].(string); ok && concurrencyPolicyArg != "" { params.ConcurrencyPolicy = concurrencyPolicyArg } - if suspendArg, ok := request.Params.Arguments["suspend"].(bool); ok { + if suspendArg, ok := request.GetArguments()["suspend"].(bool); ok { params.Suspend = &suspendArg } - if successfulJobsHistoryLimitArg, ok := request.Params.Arguments["successful_jobs_history_limit"].(float64); ok { + if successfulJobsHistoryLimitArg, ok := request.GetArguments()["successful_jobs_history_limit"].(float64); ok { limit := int32(successfulJobsHistoryLimitArg) params.SuccessfulJobsHistoryLimit = &limit } - if failedJobsHistoryLimitArg, ok := request.Params.Arguments["failed_jobs_history_limit"].(float64); ok { + if failedJobsHistoryLimitArg, ok := request.GetArguments()["failed_jobs_history_limit"].(float64); ok { limit := int32(failedJobsHistoryLimitArg) params.FailedJobsHistoryLimit = &limit } - if startingDeadlineSecondsArg, ok := request.Params.Arguments["starting_deadline_seconds"].(float64); ok { + if startingDeadlineSecondsArg, ok := request.GetArguments()["starting_deadline_seconds"].(float64); ok { deadline := int64(startingDeadlineSecondsArg) params.StartingDeadlineSeconds = &deadline } - if backoffLimitArg, ok := request.Params.Arguments["backoff_limit"].(float64); ok { + if backoffLimitArg, ok := request.GetArguments()["backoff_limit"].(float64); ok { backoffLimit := int32(backoffLimitArg) params.BackoffLimit = &backoffLimit } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if envArg, ok := request.Params.Arguments["env"].(map[string]interface{}); ok { + if envArg, ok := request.GetArguments()["env"].(map[string]interface{}); ok { params.Env = envArg } - if imagePullPolicyArg, ok := request.Params.Arguments["image_pull_policy"].(string); ok && imagePullPolicyArg != "" { + if imagePullPolicyArg, ok := request.GetArguments()["image_pull_policy"].(string); ok && imagePullPolicyArg != "" { params.ImagePullPolicy = imagePullPolicyArg } - if imagePullSecretsArg, ok := request.Params.Arguments["image_pull_secrets"].([]interface{}); ok { + if imagePullSecretsArg, ok := request.GetArguments()["image_pull_secrets"].([]interface{}); ok { params.ImagePullSecrets = imagePullSecretsArg } @@ -324,7 +324,7 @@ func getCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx c return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_cronjob")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -335,7 +335,7 @@ func getCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx c } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -364,13 +364,13 @@ func listCronJobsHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx slog.Debug("tool invoked", slog.String("tool", "list_cronjobs")) var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -378,7 +378,7 @@ func listCronJobsHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -406,7 +406,7 @@ func deleteCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_cronjob")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -417,7 +417,7 @@ func deleteCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -443,7 +443,7 @@ func deleteCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct func updateCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -454,7 +454,7 @@ func updateCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -463,24 +463,24 @@ func updateCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct Namespace: namespace, } - if scheduleArg, ok := request.Params.Arguments["schedule"].(string); ok && scheduleArg != "" { + if scheduleArg, ok := request.GetArguments()["schedule"].(string); ok && scheduleArg != "" { params.Schedule = scheduleArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if concurrencyPolicyArg, ok := request.Params.Arguments["concurrency_policy"].(string); ok && concurrencyPolicyArg != "" { + if concurrencyPolicyArg, ok := request.GetArguments()["concurrency_policy"].(string); ok && concurrencyPolicyArg != "" { params.ConcurrencyPolicy = concurrencyPolicyArg } - if successfulJobsHistoryLimitArg, ok := request.Params.Arguments["successful_jobs_history_limit"].(float64); ok { + if successfulJobsHistoryLimitArg, ok := request.GetArguments()["successful_jobs_history_limit"].(float64); ok { limit := int32(successfulJobsHistoryLimitArg) params.SuccessfulJobsHistoryLimit = &limit } - if failedJobsHistoryLimitArg, ok := request.Params.Arguments["failed_jobs_history_limit"].(float64); ok { + if failedJobsHistoryLimitArg, ok := request.GetArguments()["failed_jobs_history_limit"].(float64); ok { limit := int32(failedJobsHistoryLimitArg) params.FailedJobsHistoryLimit = &limit } @@ -497,7 +497,7 @@ func updateCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct func suspendCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -508,7 +508,7 @@ func suspendCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(c } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -529,7 +529,7 @@ func suspendCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(c func resumeCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -540,7 +540,7 @@ func resumeCronJobHandler(cm kai.ClusterManager, factory CronJobFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } diff --git a/tools/cronjob_test.go b/tools/cronjob_test.go index 471e1a6..95c486e 100644 --- a/tools/cronjob_test.go +++ b/tools/cronjob_test.go @@ -165,11 +165,7 @@ func TestCreateCronJobHandler(t *testing.T) { handler := createCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -240,11 +236,7 @@ func TestGetCronJobHandler(t *testing.T) { handler := getCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -337,11 +329,7 @@ func TestListCronJobsHandler(t *testing.T) { handler := listCronJobsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -412,11 +400,7 @@ func TestDeleteCronJobHandler(t *testing.T) { handler := deleteCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -504,11 +488,7 @@ func TestCreateCronJobHandlerError(t *testing.T) { handler := createCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{ "name": "test-cronjob", "schedule": "*/5 * * * *", @@ -537,11 +517,7 @@ func TestGetCronJobHandlerError(t *testing.T) { handler := getCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{ "name": "test-cronjob", }, @@ -568,11 +544,7 @@ func TestListCronJobsHandlerError(t *testing.T) { handler := listCronJobsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{}, }, } @@ -597,11 +569,7 @@ func TestDeleteCronJobHandlerError(t *testing.T) { handler := deleteCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{ "name": "test-cronjob", }, @@ -633,11 +601,7 @@ func TestCreateCronJobHandlerDefaultNamespace(t *testing.T) { handler := createCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{ "name": "test-cronjob", "schedule": "*/5 * * * *", @@ -669,11 +633,7 @@ func TestGetCronJobHandlerDefaultNamespace(t *testing.T) { handler := getCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{ "name": "test-cronjob", // No namespace provided - should use default @@ -703,11 +663,7 @@ func TestDeleteCronJobHandlerDefaultNamespace(t *testing.T) { handler := deleteCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: map[string]any{ "name": "test-cronjob", // No namespace provided - should use default @@ -814,11 +770,7 @@ func TestUpdateCronJobHandler(t *testing.T) { handler := updateCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -909,11 +861,7 @@ func TestSuspendCronJobHandler(t *testing.T) { handler := suspendCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -1004,11 +952,7 @@ func TestResumeCronJobHandler(t *testing.T) { handler := resumeCronJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } diff --git a/tools/deployment.go b/tools/deployment.go index dfe4afc..d823fc3 100644 --- a/tools/deployment.go +++ b/tools/deployment.go @@ -272,7 +272,7 @@ func getDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) func return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_deployment")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -283,7 +283,7 @@ func getDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) func } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -315,13 +315,13 @@ func listDeploymentsHandler(cm kai.ClusterManager, factory DeploymentFactory) fu var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -329,7 +329,7 @@ func listDeploymentsHandler(cm kai.ClusterManager, factory DeploymentFactory) fu } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -358,7 +358,7 @@ func describeDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "describe_deployment")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -369,7 +369,7 @@ func describeDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -404,7 +404,7 @@ func createDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f Replicas: 1, // Set default replica count to 1 } - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -414,7 +414,7 @@ func createDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f return mcp.NewToolResultText(errEmptyName), nil } - imageArg, ok := request.Params.Arguments["image"] + imageArg, ok := request.GetArguments()["image"] if !ok || imageArg == nil { return mcp.NewToolResultText(errMissingImage), nil } @@ -424,15 +424,15 @@ func createDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f return mcp.NewToolResultText(errEmptyImage), nil } - if replicasArg, ok := request.Params.Arguments["replicas"].(float64); ok { + if replicasArg, ok := request.GetArguments()["replicas"].(float64); ok { params.Replicas = replicasArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if containerPortArg, ok := request.Params.Arguments["container_port"].(string); ok && containerPortArg != "" { + if containerPortArg, ok := request.GetArguments()["container_port"].(string); ok && containerPortArg != "" { errMsg := validateContainerPort(containerPortArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -440,15 +440,15 @@ func createDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f params.ContainerPort = containerPortArg } - if envArg, ok := request.Params.Arguments["env"].(map[string]interface{}); ok { + if envArg, ok := request.GetArguments()["env"].(map[string]interface{}); ok { params.Env = envArg } - if imagePullSecretsArg, ok := request.Params.Arguments["image_pull_secrets"].([]interface{}); ok { + if imagePullSecretsArg, ok := request.GetArguments()["image_pull_secrets"].([]interface{}); ok { params.ImagePullSecrets = imagePullSecretsArg } - if imagePullPolicyArg, ok := request.Params.Arguments["image_pull_policy"].(string); ok { + if imagePullPolicyArg, ok := request.GetArguments()["image_pull_policy"].(string); ok { errMsg := validateImagePullPolicy(imagePullPolicyArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -457,7 +457,7 @@ func createDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -488,7 +488,7 @@ func updateDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f params := kai.DeploymentParams{} - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -501,29 +501,29 @@ func updateDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f params.Name = name namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } params.Namespace = namespace var hasUpdateParams bool - if imageArg, ok := request.Params.Arguments["image"].(string); ok && imageArg != "" { + if imageArg, ok := request.GetArguments()["image"].(string); ok && imageArg != "" { params.Image = imageArg hasUpdateParams = true } - if replicasArg, ok := request.Params.Arguments["replicas"].(float64); ok { + if replicasArg, ok := request.GetArguments()["replicas"].(float64); ok { params.Replicas = replicasArg hasUpdateParams = true } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg hasUpdateParams = true } - if containerPortArg, ok := request.Params.Arguments["container_port"].(string); ok && containerPortArg != "" { + if containerPortArg, ok := request.GetArguments()["container_port"].(string); ok && containerPortArg != "" { errMsg := validateContainerPort(containerPortArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -532,17 +532,17 @@ func updateDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f hasUpdateParams = true } - if envArg, ok := request.Params.Arguments["env"].(map[string]interface{}); ok { + if envArg, ok := request.GetArguments()["env"].(map[string]interface{}); ok { params.Env = envArg hasUpdateParams = true } - if imagePullSecretsArg, ok := request.Params.Arguments["image_pull_secrets"].([]interface{}); ok { + if imagePullSecretsArg, ok := request.GetArguments()["image_pull_secrets"].([]interface{}); ok { params.ImagePullSecrets = imagePullSecretsArg hasUpdateParams = true } - if imagePullPolicyArg, ok := request.Params.Arguments["image_pull_policy"].(string); ok { + if imagePullPolicyArg, ok := request.GetArguments()["image_pull_policy"].(string); ok { errMsg := validateImagePullPolicy(imagePullPolicyArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -572,7 +572,7 @@ func updateDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f func deleteDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -583,7 +583,7 @@ func deleteDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -604,7 +604,7 @@ func deleteDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) f func scaleDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -614,7 +614,7 @@ func scaleDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) fu return mcp.NewToolResultText(errEmptyName), nil } - replicasArg, ok := request.Params.Arguments["replicas"] + replicasArg, ok := request.GetArguments()["replicas"] if !ok || replicasArg == nil { return mcp.NewToolResultText("missing required parameter: replicas"), nil } @@ -625,7 +625,7 @@ func scaleDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) fu } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -647,7 +647,7 @@ func scaleDeploymentHandler(cm kai.ClusterManager, factory DeploymentFactory) fu func rolloutStatusHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -658,7 +658,7 @@ func rolloutStatusHandler(cm kai.ClusterManager, factory DeploymentFactory) func } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -679,7 +679,7 @@ func rolloutStatusHandler(cm kai.ClusterManager, factory DeploymentFactory) func func rolloutHistoryHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -690,7 +690,7 @@ func rolloutHistoryHandler(cm kai.ClusterManager, factory DeploymentFactory) fun } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -711,7 +711,7 @@ func rolloutHistoryHandler(cm kai.ClusterManager, factory DeploymentFactory) fun func rolloutUndoHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -722,12 +722,12 @@ func rolloutUndoHandler(cm kai.ClusterManager, factory DeploymentFactory) func(c } var revision int64 - if revisionArg, ok := request.Params.Arguments["revision"].(float64); ok { + if revisionArg, ok := request.GetArguments()["revision"].(float64); ok { revision = int64(revisionArg) } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -748,7 +748,7 @@ func rolloutUndoHandler(cm kai.ClusterManager, factory DeploymentFactory) func(c func rolloutRestartHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -759,7 +759,7 @@ func rolloutRestartHandler(cm kai.ClusterManager, factory DeploymentFactory) fun } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -780,7 +780,7 @@ func rolloutRestartHandler(cm kai.ClusterManager, factory DeploymentFactory) fun func rolloutPauseHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -791,7 +791,7 @@ func rolloutPauseHandler(cm kai.ClusterManager, factory DeploymentFactory) func( } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -812,7 +812,7 @@ func rolloutPauseHandler(cm kai.ClusterManager, factory DeploymentFactory) func( func rolloutResumeHandler(cm kai.ClusterManager, factory DeploymentFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -823,7 +823,7 @@ func rolloutResumeHandler(cm kai.ClusterManager, factory DeploymentFactory) func } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } diff --git a/tools/deployment_test.go b/tools/deployment_test.go index b2eea2d..de930b2 100644 --- a/tools/deployment_test.go +++ b/tools/deployment_test.go @@ -216,11 +216,7 @@ func TestCreateDeploymentHandler(t *testing.T) { handler := createDeploymentHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -336,11 +332,7 @@ func TestDescribeDeploymentHandler(t *testing.T) { handler := describeDeploymentHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -519,11 +511,7 @@ func TestUpdateDeploymentHandler(t *testing.T) { handler := updateDeploymentHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -659,11 +647,7 @@ func TestListDeploymentsHandler(t *testing.T) { handler := listDeploymentsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -780,11 +764,7 @@ func TestGetDeploymentHandler(t *testing.T) { handler := getDeploymentHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -1394,11 +1374,7 @@ func runDeploymentTests(t *testing.T, testCases []deploymentTestCase, handlerFn handler := handlerFn(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } diff --git a/tools/ingress.go b/tools/ingress.go index 751320a..75ca001 100644 --- a/tools/ingress.go +++ b/tools/ingress.go @@ -148,7 +148,7 @@ func createIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "create_ingress")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -158,8 +158,8 @@ func createIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct return mcp.NewToolResultText(errEmptyName), nil } - rulesArg, hasRules := request.Params.Arguments["rules"] - defaultBackendArg, hasDefaultBackend := request.Params.Arguments["default_backend"] + rulesArg, hasRules := request.GetArguments()["rules"] + defaultBackendArg, hasDefaultBackend := request.GetArguments()["default_backend"] if !hasRules && !hasDefaultBackend { return mcp.NewToolResultText("Required parameter 'rules' or 'default_backend' is missing"), nil } @@ -177,7 +177,7 @@ func createIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -186,15 +186,15 @@ func createIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct Namespace: namespace, } - if ingressClassArg, ok := request.Params.Arguments["ingress_class"].(string); ok && ingressClassArg != "" { + if ingressClassArg, ok := request.GetArguments()["ingress_class"].(string); ok && ingressClassArg != "" { params.IngressClassName = ingressClassArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } @@ -217,7 +217,7 @@ func createIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } // Parse TLS - if tlsArg, ok := request.Params.Arguments["tls"].([]interface{}); ok { + if tlsArg, ok := request.GetArguments()["tls"].([]interface{}); ok { tls, err := parseIngressTLS(tlsArg) if err != nil { return mcp.NewToolResultText(fmt.Sprintf("Invalid TLS configuration: %s", err.Error())), nil @@ -244,7 +244,7 @@ func getIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ctx c return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_ingress")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -255,7 +255,7 @@ func getIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ctx c } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -284,13 +284,13 @@ func listIngressesHandler(cm kai.ClusterManager, factory IngressFactory) func(ct slog.Debug("tool invoked", slog.String("tool", "list_ingresses")) var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -298,7 +298,7 @@ func listIngressesHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -326,7 +326,7 @@ func updateIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "update_ingress")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -337,7 +337,7 @@ func updateIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -346,20 +346,20 @@ func updateIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct Namespace: namespace, } - if ingressClassArg, ok := request.Params.Arguments["ingress_class"].(string); ok && ingressClassArg != "" { + if ingressClassArg, ok := request.GetArguments()["ingress_class"].(string); ok && ingressClassArg != "" { params.IngressClassName = ingressClassArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } // Parse rules if provided - if rulesArg, ok := request.Params.Arguments["rules"].([]interface{}); ok && len(rulesArg) > 0 { + if rulesArg, ok := request.GetArguments()["rules"].([]interface{}); ok && len(rulesArg) > 0 { rules, err := parseIngressRules(rulesArg) if err != nil { return mcp.NewToolResultText(fmt.Sprintf("Invalid rules: %s", err.Error())), nil @@ -368,7 +368,7 @@ func updateIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } // Parse default backend if provided - if defaultBackendArg, ok := request.Params.Arguments["default_backend"]; ok { + if defaultBackendArg, ok := request.GetArguments()["default_backend"]; ok { backend, err := parseIngressBackend(defaultBackendArg) if err != nil { return mcp.NewToolResultText(fmt.Sprintf("Invalid default backend: %s", err.Error())), nil @@ -377,7 +377,7 @@ func updateIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } // Parse TLS if provided - if tlsArg, ok := request.Params.Arguments["tls"].([]interface{}); ok { + if tlsArg, ok := request.GetArguments()["tls"].([]interface{}); ok { tls, err := parseIngressTLS(tlsArg) if err != nil { return mcp.NewToolResultText(fmt.Sprintf("Invalid TLS configuration: %s", err.Error())), nil @@ -404,7 +404,7 @@ func deleteIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_ingress")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -415,7 +415,7 @@ func deleteIngressHandler(cm kai.ClusterManager, factory IngressFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } diff --git a/tools/ingress_test.go b/tools/ingress_test.go index a9ff612..6fcc211 100644 --- a/tools/ingress_test.go +++ b/tools/ingress_test.go @@ -250,11 +250,7 @@ func TestCreateIngressHandler(t *testing.T) { handler := createIngressHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -341,11 +337,7 @@ func TestGetIngressHandler(t *testing.T) { handler := getIngressHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -433,11 +425,7 @@ func TestListIngressesHandler(t *testing.T) { handler := listIngressesHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -581,11 +569,7 @@ func TestUpdateIngressHandler(t *testing.T) { handler := updateIngressHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -672,11 +656,7 @@ func TestDeleteIngressHandler(t *testing.T) { handler := deleteIngressHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } diff --git a/tools/job.go b/tools/job.go index f7687e3..8b2f7c8 100644 --- a/tools/job.go +++ b/tools/job.go @@ -157,7 +157,7 @@ func createJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "create_job")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -167,7 +167,7 @@ func createJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex return mcp.NewToolResultText(errEmptyName), nil } - imageArg, ok := request.Params.Arguments["image"] + imageArg, ok := request.GetArguments()["image"] if !ok || imageArg == nil { return mcp.NewToolResultText(errMissingImage), nil } @@ -178,7 +178,7 @@ func createJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -188,46 +188,46 @@ func createJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex Image: image, } - if commandArg, ok := request.Params.Arguments["command"].([]interface{}); ok { + if commandArg, ok := request.GetArguments()["command"].([]interface{}); ok { params.Command = commandArg } - if argsArg, ok := request.Params.Arguments["args"].([]interface{}); ok { + if argsArg, ok := request.GetArguments()["args"].([]interface{}); ok { params.Args = argsArg } - if restartPolicyArg, ok := request.Params.Arguments["restart_policy"].(string); ok && restartPolicyArg != "" { + if restartPolicyArg, ok := request.GetArguments()["restart_policy"].(string); ok && restartPolicyArg != "" { params.RestartPolicy = restartPolicyArg } - if backoffLimitArg, ok := request.Params.Arguments["backoff_limit"].(float64); ok { + if backoffLimitArg, ok := request.GetArguments()["backoff_limit"].(float64); ok { backoffLimit := int32(backoffLimitArg) params.BackoffLimit = &backoffLimit } - if completionsArg, ok := request.Params.Arguments["completions"].(float64); ok { + if completionsArg, ok := request.GetArguments()["completions"].(float64); ok { completions := int32(completionsArg) params.Completions = &completions } - if parallelismArg, ok := request.Params.Arguments["parallelism"].(float64); ok { + if parallelismArg, ok := request.GetArguments()["parallelism"].(float64); ok { parallelism := int32(parallelismArg) params.Parallelism = ¶llelism } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if envArg, ok := request.Params.Arguments["env"].(map[string]interface{}); ok { + if envArg, ok := request.GetArguments()["env"].(map[string]interface{}); ok { params.Env = envArg } - if imagePullPolicyArg, ok := request.Params.Arguments["image_pull_policy"].(string); ok && imagePullPolicyArg != "" { + if imagePullPolicyArg, ok := request.GetArguments()["image_pull_policy"].(string); ok && imagePullPolicyArg != "" { params.ImagePullPolicy = imagePullPolicyArg } - if imagePullSecretsArg, ok := request.Params.Arguments["image_pull_secrets"].([]interface{}); ok { + if imagePullSecretsArg, ok := request.GetArguments()["image_pull_secrets"].([]interface{}); ok { params.ImagePullSecrets = imagePullSecretsArg } @@ -250,7 +250,7 @@ func getJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx context.C return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_job")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -261,7 +261,7 @@ func getJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx context.C } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -290,13 +290,13 @@ func listJobsHandler(cm kai.ClusterManager, factory JobFactory) func(ctx context slog.Debug("tool invoked", slog.String("tool", "list_jobs")) var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -304,7 +304,7 @@ func listJobsHandler(cm kai.ClusterManager, factory JobFactory) func(ctx context } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -332,7 +332,7 @@ func deleteJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_job")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -343,7 +343,7 @@ func deleteJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -369,7 +369,7 @@ func deleteJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex func updateJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -380,7 +380,7 @@ func updateJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -389,11 +389,11 @@ func updateJobHandler(cm kai.ClusterManager, factory JobFactory) func(ctx contex Namespace: namespace, } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if parallelismArg, ok := request.Params.Arguments["parallelism"].(float64); ok { + if parallelismArg, ok := request.GetArguments()["parallelism"].(float64); ok { parallelism := int32(parallelismArg) params.Parallelism = ¶llelism } diff --git a/tools/job_test.go b/tools/job_test.go index 7934f64..f13044f 100644 --- a/tools/job_test.go +++ b/tools/job_test.go @@ -125,11 +125,7 @@ func TestCreateJobHandler(t *testing.T) { handler := createJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -200,11 +196,7 @@ func TestGetJobHandler(t *testing.T) { handler := getJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -297,11 +289,7 @@ func TestListJobsHandler(t *testing.T) { handler := listJobsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -372,11 +360,7 @@ func TestDeleteJobHandler(t *testing.T) { handler := deleteJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -506,11 +490,7 @@ func TestUpdateJobHandler(t *testing.T) { handler := updateJobHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } diff --git a/tools/namespace.go b/tools/namespace.go index 9bd4951..b0ea604 100644 --- a/tools/namespace.go +++ b/tools/namespace.go @@ -74,7 +74,7 @@ func createNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, req return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "create_namespace")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -88,11 +88,11 @@ func createNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, req Name: name, } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { namespace.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { namespace.Annotations = annotationsArg } @@ -113,7 +113,7 @@ func getNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, reques return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_namespace")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -145,7 +145,7 @@ func listNamespacesHandler(cm kai.ClusterManager) func(ctx context.Context, requ slog.Debug("tool invoked", slog.String("tool", "list_namespaces")) labelSelector := "" - if selectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if selectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = selectorArg } @@ -170,11 +170,11 @@ func deleteNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, req namespace := cluster.Namespace{} - if nameArg, ok := request.Params.Arguments["name"].(string); ok && nameArg != "" { + if nameArg, ok := request.GetArguments()["name"].(string); ok && nameArg != "" { namespace.Name = nameArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { namespace.Labels = labelsArg } @@ -197,7 +197,7 @@ func deleteNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, req func updateNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -211,11 +211,11 @@ func updateNamespaceHandler(cm kai.ClusterManager) func(ctx context.Context, req Name: name, } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { namespace.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { namespace.Annotations = annotationsArg } diff --git a/tools/namespace_test.go b/tools/namespace_test.go index dd27b19..c80350a 100644 --- a/tools/namespace_test.go +++ b/tools/namespace_test.go @@ -85,11 +85,7 @@ func testCreateNamespaceHandler(t *testing.T) { handler := createNamespaceHandlerWithFactory(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -154,11 +150,7 @@ func testGetNamespaceHandler(t *testing.T) { handler := getNamespaceHandlerWithFactory(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -216,11 +208,7 @@ func testListNamespacesHandler(t *testing.T) { handler := listNamespacesHandlerWithFactory(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -291,11 +279,7 @@ func testDeleteNamespaceHandler(t *testing.T) { handler := deleteNamespaceHandlerWithFactory(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } @@ -323,7 +307,7 @@ func TestRegisterNamespaceTools(t *testing.T) { // Helper functions for testing with factory pattern func createNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks.NamespaceFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -337,11 +321,11 @@ func createNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks. Name: name, } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } @@ -358,7 +342,7 @@ func createNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks. func getNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks.NamespaceFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -386,7 +370,7 @@ func getNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks.Nam func listNamespacesHandlerWithFactory(cm kai.ClusterManager, factory testmocks.NamespaceFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { labelSelector := "" - if selectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if selectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = selectorArg } @@ -406,11 +390,11 @@ func deleteNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks. return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { params := kai.NamespaceParams{} - if nameArg, ok := request.Params.Arguments["name"].(string); ok && nameArg != "" { + if nameArg, ok := request.GetArguments()["name"].(string); ok && nameArg != "" { params.Name = nameArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } @@ -431,7 +415,7 @@ func deleteNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks. func updateNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks.NamespaceFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -445,11 +429,11 @@ func updateNamespaceHandlerWithFactory(cm kai.ClusterManager, factory testmocks. Name: name, } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } @@ -549,11 +533,7 @@ func testUpdateNamespaceHandler(t *testing.T) { handler := updateNamespaceHandlerWithFactory(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tt.args, }, } diff --git a/tools/operations.go b/tools/operations.go index 250c699..9712ffc 100644 --- a/tools/operations.go +++ b/tools/operations.go @@ -63,18 +63,18 @@ func startPortForwardHandler(manager *cluster.Manager) func(ctx context.Context, return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "start_port_forward")) - target, ok := request.Params.Arguments["target"].(string) + target, ok := request.GetArguments()["target"].(string) if !ok || target == "" { return mcp.NewToolResultError("target is required"), nil } - portsStr, ok := request.Params.Arguments["ports"].(string) + portsStr, ok := request.GetArguments()["ports"].(string) if !ok || portsStr == "" { return mcp.NewToolResultError("ports is required"), nil } namespace := "" - if ns, ok := request.Params.Arguments["namespace"].(string); ok { + if ns, ok := request.GetArguments()["namespace"].(string); ok { namespace = ns } @@ -109,7 +109,7 @@ func stopPortForwardHandler(manager *cluster.Manager) func(ctx context.Context, return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "stop_port_forward")) - sessionID, ok := request.Params.Arguments["session_id"].(string) + sessionID, ok := request.GetArguments()["session_id"].(string) if !ok || sessionID == "" { return mcp.NewToolResultError("session_id is required"), nil } diff --git a/tools/pod.go b/tools/pod.go index eac7935..8075f23 100644 --- a/tools/pod.go +++ b/tools/pod.go @@ -175,7 +175,7 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex RestartPolicy: "Always", // Default restart policy } - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -185,7 +185,7 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex return mcp.NewToolResultText(errEmptyName), nil } - imageArg, ok := request.Params.Arguments["image"] + imageArg, ok := request.GetArguments()["image"] if !ok || imageArg == nil { return mcp.NewToolResultText("Required parameter 'image' is missing"), nil } @@ -196,7 +196,7 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -204,7 +204,7 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex params.Image = image params.Namespace = namespace - if commandArg, ok := request.Params.Arguments["command"].([]interface{}); ok && len(commandArg) > 0 { + if commandArg, ok := request.GetArguments()["command"].([]interface{}); ok && len(commandArg) > 0 { params.Command = make([]interface{}, len(commandArg)) for i, cmd := range commandArg { if cmdStr, ok := cmd.(string); ok { @@ -213,7 +213,7 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex } } - if argsArg, ok := request.Params.Arguments["args"].([]interface{}); ok && len(argsArg) > 0 { + if argsArg, ok := request.GetArguments()["args"].([]interface{}); ok && len(argsArg) > 0 { params.Args = make([]interface{}, len(argsArg)) for i, arg := range argsArg { if argStr, ok := arg.(string); ok { @@ -222,17 +222,17 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex } } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if containerNameArg, ok := request.Params.Arguments["container_name"].(string); ok && containerNameArg != "" { + if containerNameArg, ok := request.GetArguments()["container_name"].(string); ok && containerNameArg != "" { params.ContainerName = containerNameArg } else { params.ContainerName = name } - if containerPortArg, ok := request.Params.Arguments["container_port"].(string); ok && containerPortArg != "" { + if containerPortArg, ok := request.GetArguments()["container_port"].(string); ok && containerPortArg != "" { errMsg := validateContainerPort(containerPortArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -240,11 +240,11 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex params.ContainerPort = containerPortArg } - if envArg, ok := request.Params.Arguments["env"].(map[string]interface{}); ok { + if envArg, ok := request.GetArguments()["env"].(map[string]interface{}); ok { params.Env = envArg } - if imagePullPolicyArg, ok := request.Params.Arguments["image_pull_policy"].(string); ok { + if imagePullPolicyArg, ok := request.GetArguments()["image_pull_policy"].(string); ok { errMsg := validateImagePullPolicy(imagePullPolicyArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -252,11 +252,11 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex params.ImagePullPolicy = imagePullPolicyArg } - if imagePullSecretsArg, ok := request.Params.Arguments["image_pull_secrets"].([]interface{}); ok { + if imagePullSecretsArg, ok := request.GetArguments()["image_pull_secrets"].([]interface{}); ok { params.ImagePullSecrets = imagePullSecretsArg } - if restartPolicyArg, ok := request.Params.Arguments["restart_policy"].(string); ok { + if restartPolicyArg, ok := request.GetArguments()["restart_policy"].(string); ok { errMsg := validateRestartPolicy(restartPolicyArg) if errMsg != nil { return mcp.NewToolResultText(errMsg.Error()), nil @@ -264,11 +264,11 @@ func createPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex params.RestartPolicy = restartPolicyArg } - if nodeSelectorArg, ok := request.Params.Arguments["node_selector"].(map[string]interface{}); ok { + if nodeSelectorArg, ok := request.GetArguments()["node_selector"].(map[string]interface{}); ok { params.NodeSelector = nodeSelectorArg } - if serviceAccountArg, ok := request.Params.Arguments["service_account"].(string); ok && serviceAccountArg != "" { + if serviceAccountArg, ok := request.GetArguments()["service_account"].(string); ok && serviceAccountArg != "" { params.ServiceAccountName = serviceAccountArg } @@ -294,13 +294,13 @@ func listPodsHandler(cm kai.ClusterManager, factory PodFactory) func(ctx context var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -308,17 +308,17 @@ func listPodsHandler(cm kai.ClusterManager, factory PodFactory) func(ctx context } var labelSelector string - if LabelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if LabelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = LabelSelectorArg } var fieldSelector string - if fieldSelectorArg, ok := request.Params.Arguments["field_selector"].(string); ok { + if fieldSelectorArg, ok := request.GetArguments()["field_selector"].(string); ok { fieldSelector = fieldSelectorArg } limit := int64(0) // default to unlimited - if limitArg, ok := request.Params.Arguments["limit"].(float64); ok && limitArg > 0 { + if limitArg, ok := request.GetArguments()["limit"].(float64); ok && limitArg > 0 { limit = int64(limitArg) } @@ -347,7 +347,7 @@ func getPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx context.C return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_pod")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -358,7 +358,7 @@ func getPodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx context.C } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -387,7 +387,7 @@ func deletePodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_pod")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -398,12 +398,12 @@ func deletePodHandler(cm kai.ClusterManager, factory PodFactory) func(ctx contex } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } var force bool - if forceArg, ok := request.Params.Arguments["force"].(bool); ok { + if forceArg, ok := request.GetArguments()["force"].(bool); ok { force = forceArg } @@ -433,7 +433,7 @@ func streamLogsHandler(cm kai.ClusterManager, factory PodFactory) func(ctx conte return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "stream_pod_logs")) - podArg, ok := request.Params.Arguments["pod"] + podArg, ok := request.GetArguments()["pod"] if !ok || podArg == nil { return mcp.NewToolResultText(errMissingPod), nil } @@ -444,27 +444,27 @@ func streamLogsHandler(cm kai.ClusterManager, factory PodFactory) func(ctx conte } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } var containerName string - if containerArg, ok := request.Params.Arguments["container"].(string); ok { + if containerArg, ok := request.GetArguments()["container"].(string); ok { containerName = containerArg } var tailLines int64 // Default to all lines - if tailArg, ok := request.Params.Arguments["tail"].(float64); ok { + if tailArg, ok := request.GetArguments()["tail"].(float64); ok { tailLines = int64(tailArg) } var previous bool - if previousArg, ok := request.Params.Arguments["previous"].(bool); ok { + if previousArg, ok := request.GetArguments()["previous"].(bool); ok { previous = previousArg } var sinceDuration *time.Duration - if sinceArg, ok := request.Params.Arguments["since"].(string); ok && sinceArg != "" { + if sinceArg, ok := request.GetArguments()["since"].(string); ok && sinceArg != "" { duration, err := time.ParseDuration(sinceArg) if err != nil { return mcp.NewToolResultText(fmt.Sprintf("Failed to parse 'since' parameter: %v", err)), nil diff --git a/tools/pod_test.go b/tools/pod_test.go index 5d42e07..bb90492 100644 --- a/tools/pod_test.go +++ b/tools/pod_test.go @@ -232,11 +232,7 @@ func TestCreatePodHandler(t *testing.T) { handler := createPodHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -341,11 +337,7 @@ func TestListPodsHandler(t *testing.T) { handler := listPodsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -438,11 +430,7 @@ func TestGetPodHandler(t *testing.T) { handler := getPodHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -543,11 +531,7 @@ func TestDeletePodHandler(t *testing.T) { handler := deletePodHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -645,11 +629,7 @@ func TestStreamLogsHandler(t *testing.T) { handler := streamLogsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } diff --git a/tools/secret.go b/tools/secret.go index e479678..5a0e0c8 100644 --- a/tools/secret.go +++ b/tools/secret.go @@ -141,7 +141,7 @@ func createSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "create_secret")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -152,7 +152,7 @@ func createSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -161,26 +161,26 @@ func createSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx Namespace: namespace, } - if typeArg, ok := request.Params.Arguments["type"].(string); ok && typeArg != "" { + if typeArg, ok := request.GetArguments()["type"].(string); ok && typeArg != "" { if err := validateSecretType(typeArg); err != nil { return mcp.NewToolResultText(err.Error()), nil } params.Type = typeArg } - if dataArg, ok := request.Params.Arguments["data"].(map[string]interface{}); ok { + if dataArg, ok := request.GetArguments()["data"].(map[string]interface{}); ok { params.Data = dataArg } - if stringDataArg, ok := request.Params.Arguments["string_data"].(map[string]interface{}); ok { + if stringDataArg, ok := request.GetArguments()["string_data"].(map[string]interface{}); ok { params.StringData = stringDataArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } @@ -203,7 +203,7 @@ func getSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx con return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_secret")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -214,7 +214,7 @@ func getSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx con } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -243,13 +243,13 @@ func listSecretsHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx c slog.Debug("tool invoked", slog.String("tool", "list_secrets")) var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -257,7 +257,7 @@ func listSecretsHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx c } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -285,7 +285,7 @@ func deleteSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "delete_secret")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -296,7 +296,7 @@ func deleteSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -324,7 +324,7 @@ func updateSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "update_secret")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -335,7 +335,7 @@ func updateSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -344,26 +344,26 @@ func updateSecretHandler(cm kai.ClusterManager, factory SecretFactory) func(ctx Namespace: namespace, } - if typeArg, ok := request.Params.Arguments["type"].(string); ok && typeArg != "" { + if typeArg, ok := request.GetArguments()["type"].(string); ok && typeArg != "" { if err := validateSecretType(typeArg); err != nil { return mcp.NewToolResultText(err.Error()), nil } params.Type = typeArg } - if dataArg, ok := request.Params.Arguments["data"].(map[string]interface{}); ok { + if dataArg, ok := request.GetArguments()["data"].(map[string]interface{}); ok { params.Data = dataArg } - if stringDataArg, ok := request.Params.Arguments["string_data"].(map[string]interface{}); ok { + if stringDataArg, ok := request.GetArguments()["string_data"].(map[string]interface{}); ok { params.StringData = stringDataArg } - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labelsArg } - if annotationsArg, ok := request.Params.Arguments["annotations"].(map[string]interface{}); ok { + if annotationsArg, ok := request.GetArguments()["annotations"].(map[string]interface{}); ok { params.Annotations = annotationsArg } diff --git a/tools/secret_test.go b/tools/secret_test.go index 240fb57..5fc56e3 100644 --- a/tools/secret_test.go +++ b/tools/secret_test.go @@ -282,11 +282,7 @@ func TestCreateSecretHandler(t *testing.T) { handler := createSecretHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -394,11 +390,7 @@ func TestGetSecretHandler(t *testing.T) { handler := getSecretHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -500,11 +492,7 @@ func TestListSecretsHandler(t *testing.T) { handler := listSecretsHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -612,11 +600,7 @@ func TestDeleteSecretHandler(t *testing.T) { handler := deleteSecretHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -817,11 +801,7 @@ func TestUpdateSecretHandler(t *testing.T) { handler := updateSecretHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } diff --git a/tools/service.go b/tools/service.go index ea629b5..2599397 100644 --- a/tools/service.go +++ b/tools/service.go @@ -202,13 +202,13 @@ func listServicesHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx var allNamespaces bool - if allNamespacesArg, ok := request.Params.Arguments["all_namespaces"].(bool); ok { + if allNamespacesArg, ok := request.GetArguments()["all_namespaces"].(bool); ok { allNamespaces = allNamespacesArg } var namespace string if !allNamespaces { - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } else { namespace = cm.GetCurrentNamespace() @@ -216,7 +216,7 @@ func listServicesHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx } var labelSelector string - if labelSelectorArg, ok := request.Params.Arguments["label_selector"].(string); ok { + if labelSelectorArg, ok := request.GetArguments()["label_selector"].(string); ok { labelSelector = labelSelectorArg } @@ -245,7 +245,7 @@ func getServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx c return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { slog.Debug("tool invoked", slog.String("tool", "get_service")) - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -256,7 +256,7 @@ func getServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx c } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -288,7 +288,7 @@ func createServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct params := kai.ServiceParams{} - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -298,7 +298,7 @@ func createServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct return mcp.NewToolResultText(errEmptyName), nil } - portsArg, ok := request.Params.Arguments["ports"] + portsArg, ok := request.GetArguments()["ports"] if !ok || portsArg == nil { return mcp.NewToolResultText(errMissingPorts), nil } @@ -314,12 +314,12 @@ func createServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } var serviceType string - if typeArg, ok := request.Params.Arguments["type"].(string); ok && typeArg != "" { + if typeArg, ok := request.GetArguments()["type"].(string); ok && typeArg != "" { validTypes := map[string]bool{ "ClusterIP": true, "NodePort": true, @@ -335,22 +335,22 @@ func createServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct } var selector map[string]interface{} - if selectorArg, ok := request.Params.Arguments["selector"].(map[string]interface{}); ok && len(selectorArg) > 0 { + if selectorArg, ok := request.GetArguments()["selector"].(map[string]interface{}); ok && len(selectorArg) > 0 { selector = selectorArg } var labels map[string]interface{} - if labelsArg, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok && len(labelsArg) > 0 { + if labelsArg, ok := request.GetArguments()["labels"].(map[string]interface{}); ok && len(labelsArg) > 0 { labels = labelsArg } var clusterIP string - if clusterIPArg, ok := request.Params.Arguments["cluster_ip"].(string); ok && clusterIPArg != "" { + if clusterIPArg, ok := request.GetArguments()["cluster_ip"].(string); ok && clusterIPArg != "" { clusterIP = clusterIPArg } var externalIPs []string - if externalIPsArg, ok := request.Params.Arguments["external_ips"].([]interface{}); ok && len(externalIPsArg) > 0 { + if externalIPsArg, ok := request.GetArguments()["external_ips"].([]interface{}); ok && len(externalIPsArg) > 0 { for _, ip := range externalIPsArg { if ipStr, ok := ip.(string); ok && ipStr != "" { externalIPs = append(externalIPs, ipStr) @@ -359,12 +359,12 @@ func createServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct } var externalName string - if externalNameArg, ok := request.Params.Arguments["external_name"].(string); ok && externalNameArg != "" { + if externalNameArg, ok := request.GetArguments()["external_name"].(string); ok && externalNameArg != "" { externalName = externalNameArg } var sessionAffinity string - if sessionAffinityArg, ok := request.Params.Arguments["session_affinity"].(string); ok && sessionAffinityArg != "" { + if sessionAffinityArg, ok := request.GetArguments()["session_affinity"].(string); ok && sessionAffinityArg != "" { validAffinities := map[string]bool{ "None": true, "ClientIP": true, @@ -413,12 +413,12 @@ func deleteServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct params := kai.ServiceParams{} namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } params.Namespace = namespace - nameArg, nameOk := request.Params.Arguments["name"] + nameArg, nameOk := request.GetArguments()["name"] if nameOk && nameArg != nil { name, ok := nameArg.(string) if !ok || name == "" { @@ -427,7 +427,7 @@ func deleteServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct params.Name = name } - labelsArg, labelsOk := request.Params.Arguments["labels"] + labelsArg, labelsOk := request.GetArguments()["labels"] if labelsOk && labelsArg != nil { labels, ok := labelsArg.(map[string]interface{}) if !ok { @@ -584,7 +584,7 @@ func processPortsArray(portsArray []interface{}) ([]kai.ServicePort, error) { func updateServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -595,7 +595,7 @@ func updateServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } @@ -604,19 +604,19 @@ func updateServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct Namespace: namespace, } - if serviceType, ok := request.Params.Arguments["type"].(string); ok && serviceType != "" { + if serviceType, ok := request.GetArguments()["type"].(string); ok && serviceType != "" { params.Type = serviceType } - if labels, ok := request.Params.Arguments["labels"].(map[string]interface{}); ok { + if labels, ok := request.GetArguments()["labels"].(map[string]interface{}); ok { params.Labels = labels } - if selector, ok := request.Params.Arguments["selector"].(map[string]interface{}); ok { + if selector, ok := request.GetArguments()["selector"].(map[string]interface{}); ok { params.Selector = selector } - if portsArg, ok := request.Params.Arguments["ports"].([]interface{}); ok && len(portsArg) > 0 { + if portsArg, ok := request.GetArguments()["ports"].([]interface{}); ok && len(portsArg) > 0 { ports, err := processPortsArray(portsArg) if err != nil { return mcp.NewToolResultText(err.Error()), nil @@ -624,11 +624,11 @@ func updateServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct params.Ports = ports } - if clusterIP, ok := request.Params.Arguments["cluster_ip"].(string); ok && clusterIP != "" { + if clusterIP, ok := request.GetArguments()["cluster_ip"].(string); ok && clusterIP != "" { params.ClusterIP = clusterIP } - if externalIPsArg, ok := request.Params.Arguments["external_ips"].([]interface{}); ok { + if externalIPsArg, ok := request.GetArguments()["external_ips"].([]interface{}); ok { externalIPs := make([]string, 0, len(externalIPsArg)) for _, ip := range externalIPsArg { if ipStr, ok := ip.(string); ok { @@ -638,11 +638,11 @@ func updateServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct params.ExternalIPs = externalIPs } - if externalName, ok := request.Params.Arguments["external_name"].(string); ok && externalName != "" { + if externalName, ok := request.GetArguments()["external_name"].(string); ok && externalName != "" { params.ExternalName = externalName } - if sessionAffinity, ok := request.Params.Arguments["session_affinity"].(string); ok && sessionAffinity != "" { + if sessionAffinity, ok := request.GetArguments()["session_affinity"].(string); ok && sessionAffinity != "" { params.SessionAffinity = sessionAffinity } @@ -658,7 +658,7 @@ func updateServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ct func patchServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - nameArg, ok := request.Params.Arguments["name"] + nameArg, ok := request.GetArguments()["name"] if !ok || nameArg == nil { return mcp.NewToolResultText(errMissingName), nil } @@ -668,7 +668,7 @@ func patchServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx return mcp.NewToolResultText(errEmptyName), nil } - patchArg, ok := request.Params.Arguments["patch"] + patchArg, ok := request.GetArguments()["patch"] if !ok || patchArg == nil { return mcp.NewToolResultText("missing required parameter: patch"), nil } @@ -679,7 +679,7 @@ func patchServiceHandler(cm kai.ClusterManager, factory ServiceFactory) func(ctx } namespace := cm.GetCurrentNamespace() - if namespaceArg, ok := request.Params.Arguments["namespace"].(string); ok && namespaceArg != "" { + if namespaceArg, ok := request.GetArguments()["namespace"].(string); ok && namespaceArg != "" { namespace = namespaceArg } diff --git a/tools/service_test.go b/tools/service_test.go index fd16db9..881b04c 100644 --- a/tools/service_test.go +++ b/tools/service_test.go @@ -152,11 +152,7 @@ func TestListServicesHandler(t *testing.T) { handler := listServicesHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -251,11 +247,7 @@ func TestGetServiceHandler(t *testing.T) { handler := getServiceHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -585,11 +577,7 @@ func TestCreateServiceHandler(t *testing.T) { handler := createServiceHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -824,11 +812,7 @@ func TestDeleteServiceHandler(t *testing.T) { handler := deleteServiceHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -1018,11 +1002,7 @@ func TestUpdateServiceHandler(t *testing.T) { handler := updateServiceHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, } @@ -1198,11 +1178,7 @@ func TestPatchServiceHandler(t *testing.T) { handler := patchServiceHandler(mockCM, mockFactory) request := mcp.CallToolRequest{ - Params: struct { - Name string `json:"name"` - Arguments map[string]any `json:"arguments,omitempty"` - Meta *mcp.Meta `json:"_meta,omitempty"` - }{ + Params: mcp.CallToolParams{ Arguments: tc.args, }, }