diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4b81462 --- /dev/null +++ b/Makefile @@ -0,0 +1,42 @@ +# If you update this file, please follow +# https://suva.sh/posts/well-documented-makefiles + +## -------------------------------------- +## General +## -------------------------------------- + +.DEFAULT_GOAL := help + +BINARY_NAME=kubernetes-mcp-server +LD_FLAGS=-s -w \ + -X '$(PACKAGE)/pkg/version.CommitHash=$(COMMIT_HASH)' \ + -X '$(PACKAGE)/pkg/version.BuildTime=$(BUILD_TIME)' \ + -X '$(PACKAGE)/pkg/version.BinaryName=$(BINARY_NAME)' +COMMON_BUILD_ARGS=-ldflags "$(LD_FLAGS)" +CLEAN_TARGETS:= + +# The help will print out all targets with their descriptions organized bellow their categories. The categories are represented by `##@` and the target descriptions by `##`. +# The awk commands is responsible to read the entire set of makefiles included in this invocation, looking for lines of the file as xyz: ## something, and then pretty-format the target and help. Then, if there's a line with ##@ something, that gets pretty-printed as a category. +# More info over the usage of ANSI control characters for terminal formatting: https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters +# More info over awk command: http://linuxcommand.org/lc3_adv_awk.php +# +# Notice that we have a little modification on the awk command to support slash in the recipe name: +# origin: /^[a-zA-Z_0-9-]+:.*?##/ +# modified /^[a-zA-Z_0-9\/\.-]+:.*?##/ +.PHONY: help +help: ## Display this help + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9\/\.-]+:.*?##/ { printf " \033[36m%-21s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +.PHONY: clean +clean: ## Clean up all build artifacts + rm -rf $(CLEAN_TARGETS) + +.PHONY: build +build: ## Build the project + go build $(COMMON_BUILD_ARGS) -o $(BINARY_NAME) ./cmd/kubernetes-mcp-server + +CLEAN_TARGETS+='$(BINARY_NAME)' + +.PHONY: tidy +tidy: ## Tidy up the go modules + go mod tidy diff --git a/cmd/kubernetes-mcp-server/main.go b/cmd/kubernetes-mcp-server/main.go new file mode 100644 index 0000000..571f244 --- /dev/null +++ b/cmd/kubernetes-mcp-server/main.go @@ -0,0 +1,7 @@ +package main + +import "github.com/manusa/kubernetes-mcp-server/pkg/kubernetes-mcp-server/cmd" + +func main() { + cmd.Execute() +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..5c654c5 --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module github.com/manusa/kubernetes-mcp-server + +go 1.23.5 + +require github.com/spf13/cobra v1.8.1 + +require ( + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..912390a --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/kubernetes-mcp-server/cmd/root.go b/pkg/kubernetes-mcp-server/cmd/root.go new file mode 100644 index 0000000..ffb4c25 --- /dev/null +++ b/pkg/kubernetes-mcp-server/cmd/root.go @@ -0,0 +1,26 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +var rootCmd = &cobra.Command{ + Use: "kubernetes-mcp-server [command] [options]", + Short: "Kubernetes Model Context Protocol (MCP) server", + Long: ` +Kubernetes Model Context Protocol (MCP) server + + # show this help + kubernetes-mcp-server -h + + # TODO: add more examples`, + Run: func(cmd *cobra.Command, args []string) { + + }, +} + +func Execute() { + if err := rootCmd.Execute(); err != nil { + panic(err) + } +}