From 7467e368749fcc2025d1ca291d42eac15dadd66a Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sat, 15 Feb 2025 15:06:06 +0530 Subject: [PATCH 01/16] feat(MCP): mcp SSE init (elasticsearch storage) Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 69 +++++++++++++++++++++++++++++++++++++++++++ cmd/karpor/main.go | 2 ++ 2 files changed, 71 insertions(+) create mode 100644 cmd/karpor/app/mcp.go diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go new file mode 100644 index 00000000..096ecbca --- /dev/null +++ b/cmd/karpor/app/mcp.go @@ -0,0 +1,69 @@ +// Copyright The Karpor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package app + +import ( + "context" + "fmt" + + _ "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + _ "github.com/elastic/go-elasticsearch/v8" // esclient + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +type mcpOptions struct { + SSEPort string + ElasticSearchAddresses []string +} + +func NewMCPOptions() *mcpOptions { + return &mcpOptions{} +} + +func (o *mcpOptions) AddFlags(fs *pflag.FlagSet) { + fs.StringVar(&o.SSEPort,"MCP SSE server exposure port", ":7999", "The address expossing the mcp server") + fs.StringSliceVar(&o.ElasticSearchAddresses, "elastic-search-addresses", nil, "The elastic search address") +} + +func NewMCPCommand(ctx context.Context) *cobra.Command { + options := NewMCPOptions() + cmd := &cobra.Command{ + Use: "mcp", + Short: "start a storage mcp server to enable natural language interaction capabilities with the storage backend", + RunE: func(cmd *cobra.Command, args []string) error { + return mcpRun(ctx, options) + }, + } + options.AddFlags(cmd.Flags()) + return cmd +} + +func mcpRun(ctx context.Context, options *mcpOptions) error { + + //TODO integrate MCP-GOLANG SSE Server functionality here + // https://mcpgolang.com/introduction + // rough outline: + // - Logger setup + // - registering the exposure points of the elastic search storage + // - elastic search client setup : + // - map from KusionStack/karpor/pkg/infra/search/storage/elasticsearch + // - running the server + // + + fmt.Println("TODO: yet to implement mcp functionality") + fmt.Println("see /cmd/karpor/app/mcp.go for further directives") + return nil +} diff --git a/cmd/karpor/main.go b/cmd/karpor/main.go index 748bcd08..047ba87b 100644 --- a/cmd/karpor/main.go +++ b/cmd/karpor/main.go @@ -33,7 +33,9 @@ func main() { cmd := app.NewServerCommand(ctx) syncCmd := app.NewSyncerCommand(ctx) + mcpCmd := app.NewMCPCommand(ctx) cmd.AddCommand(syncCmd) + cmd.AddCommand(mcpCmd) code := cli.Run(cmd) os.Exit(code) From 0b0764d48a44a2cbac44148881c2bbb0c5969bcd Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 16 Feb 2025 07:36:13 +0530 Subject: [PATCH 02/16] chore(fmt): gofumpted mcp.go Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index 096ecbca..c006d27d 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -19,13 +19,13 @@ import ( "fmt" _ "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" - _ "github.com/elastic/go-elasticsearch/v8" // esclient + _ "github.com/elastic/go-elasticsearch/v8" // esclient "github.com/spf13/cobra" "github.com/spf13/pflag" ) type mcpOptions struct { - SSEPort string + SSEPort string ElasticSearchAddresses []string } @@ -34,7 +34,7 @@ func NewMCPOptions() *mcpOptions { } func (o *mcpOptions) AddFlags(fs *pflag.FlagSet) { - fs.StringVar(&o.SSEPort,"MCP SSE server exposure port", ":7999", "The address expossing the mcp server") + fs.StringVar(&o.SSEPort, "MCP SSE server exposure port", ":7999", "The address expossing the mcp server") fs.StringSliceVar(&o.ElasticSearchAddresses, "elastic-search-addresses", nil, "The elastic search address") } @@ -52,7 +52,6 @@ func NewMCPCommand(ctx context.Context) *cobra.Command { } func mcpRun(ctx context.Context, options *mcpOptions) error { - //TODO integrate MCP-GOLANG SSE Server functionality here // https://mcpgolang.com/introduction // rough outline: From cd142980b018db5afa74ce6993491cfb3d368092 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 16 Feb 2025 07:56:47 +0530 Subject: [PATCH 03/16] chore(logging): ctrl, klog setup for uniformity Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index c006d27d..6eef1093 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -16,12 +16,13 @@ package app import ( "context" - "fmt" _ "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" _ "github.com/elastic/go-elasticsearch/v8" // esclient "github.com/spf13/cobra" "github.com/spf13/pflag" + "k8s.io/klog/v2" + ctrl "sigs.k8s.io/controller-runtime" ) type mcpOptions struct { @@ -55,14 +56,22 @@ func mcpRun(ctx context.Context, options *mcpOptions) error { //TODO integrate MCP-GOLANG SSE Server functionality here // https://mcpgolang.com/introduction // rough outline: + // - Logger setup + + ctrl.SetLogger(klog.NewKlogr()) + log := ctrl.Log.WithName("mcp") + + log.Info("Starting MCP SSE server", "port", options.SSEPort) + // - registering the exposure points of the elastic search storage // - elastic search client setup : - // - map from KusionStack/karpor/pkg/infra/search/storage/elasticsearch + // - + // map from KusionStack/karpor/pkg/infra/search/storage/elasticsearch // - running the server // - fmt.Println("TODO: yet to implement mcp functionality") - fmt.Println("see /cmd/karpor/app/mcp.go for further directives") + log.Info("TODO: yet to implement mcp functionality") + log.Info("see /cmd/karpor/app/mcp.go for further directives") return nil } From 7285acec1b870de88ca0c92694011ec351a13573 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 16 Feb 2025 17:15:55 +0530 Subject: [PATCH 04/16] chore(esclient): mcp elasticsearch client setup Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index 6eef1093..5200bac7 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -17,8 +17,8 @@ package app import ( "context" - _ "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" - _ "github.com/elastic/go-elasticsearch/v8" // esclient + "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + esclient "github.com/elastic/go-elasticsearch/v8" "github.com/spf13/cobra" "github.com/spf13/pflag" "k8s.io/klog/v2" @@ -53,23 +53,22 @@ func NewMCPCommand(ctx context.Context) *cobra.Command { } func mcpRun(ctx context.Context, options *mcpOptions) error { - //TODO integrate MCP-GOLANG SSE Server functionality here - // https://mcpgolang.com/introduction - // rough outline: - - // - Logger setup ctrl.SetLogger(klog.NewKlogr()) log := ctrl.Log.WithName("mcp") - log.Info("Starting MCP SSE server", "port", options.SSEPort) + log.Info("Starting MCP SSE server", + "port", options.SSEPort, + "esAddress", options.ElasticSearchAddresses) + + es,err := elasticsearch.NewStorage(esclient.Config{ + Addresses: options.ElasticSearchAddresses, + }) + if err != nil { + log.Error(err, "unable to init elasticsearch client") + } - // - registering the exposure points of the elastic search storage - // - elastic search client setup : - // - - // map from KusionStack/karpor/pkg/infra/search/storage/elasticsearch - // - running the server - // + //TODO : integrate mcp-golang SSE server log.Info("TODO: yet to implement mcp functionality") log.Info("see /cmd/karpor/app/mcp.go for further directives") From 557456c94f146c06969e26894e87fb612b9919ac Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 16 Feb 2025 18:51:46 +0530 Subject: [PATCH 05/16] chore(format): make format Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index 5200bac7..a41ab5da 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -53,22 +53,21 @@ func NewMCPCommand(ctx context.Context) *cobra.Command { } func mcpRun(ctx context.Context, options *mcpOptions) error { - ctrl.SetLogger(klog.NewKlogr()) log := ctrl.Log.WithName("mcp") log.Info("Starting MCP SSE server", "port", options.SSEPort, - "esAddress", options.ElasticSearchAddresses) + "esAddresses", options.ElasticSearchAddresses) - es,err := elasticsearch.NewStorage(esclient.Config{ + es, err := elasticsearch.NewStorage(esclient.Config{ Addresses: options.ElasticSearchAddresses, }) if err != nil { log.Error(err, "unable to init elasticsearch client") } - //TODO : integrate mcp-golang SSE server + // TODO : integrate mcp-golang SSE server log.Info("TODO: yet to implement mcp functionality") log.Info("see /cmd/karpor/app/mcp.go for further directives") From 2e440c360dfd483c6ac7b697ba0319168d21f5d0 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Mon, 17 Feb 2025 09:35:31 +0530 Subject: [PATCH 06/16] fix(cilint): unused contexts and vars fix Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index a41ab5da..1e6a9950 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -52,6 +52,7 @@ func NewMCPCommand(ctx context.Context) *cobra.Command { return cmd } +//nolint:unparam func mcpRun(ctx context.Context, options *mcpOptions) error { ctrl.SetLogger(klog.NewKlogr()) log := ctrl.Log.WithName("mcp") @@ -60,12 +61,14 @@ func mcpRun(ctx context.Context, options *mcpOptions) error { "port", options.SSEPort, "esAddresses", options.ElasticSearchAddresses) + //nolint:contextcheck es, err := elasticsearch.NewStorage(esclient.Config{ Addresses: options.ElasticSearchAddresses, }) if err != nil { log.Error(err, "unable to init elasticsearch client") } + log.Info("Acquired elasticsearch storage backend", "esStorage", es) // TODO : integrate mcp-golang SSE server From 320e8b517f0c2f1019185d2ce573917711e7434e Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Mon, 17 Feb 2025 09:43:58 +0530 Subject: [PATCH 07/16] fix(lint): golangci-lint govet fix Signed-off-by: Raj Patil fieldalignment also occurs in the enable section and buildssa raises an error with `golangci-lint config verify` leading to failed ci runs need to review if they are correct --- .golangci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 92c1b1b5..20a0941f 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -99,9 +99,6 @@ linters-settings: - unreachable - unsafeptr - unusedresult - disable: - - buildssa - - fieldalignment settings: printf: funcs: From d5b5b7af3c7391a7af42422779f274830ab05a3a Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 07:45:04 +0530 Subject: [PATCH 08/16] fix(err): error return for esclient failure Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index 1e6a9950..54cd20dd 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -67,6 +67,7 @@ func mcpRun(ctx context.Context, options *mcpOptions) error { }) if err != nil { log.Error(err, "unable to init elasticsearch client") + return err } log.Info("Acquired elasticsearch storage backend", "esStorage", es) From 0d52bb5b3c0b63f8a3432e696b8a47a83d62795b Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 07:45:33 +0530 Subject: [PATCH 09/16] feat(pkg/mcp): structure init for pkg/mcp Signed-off-by: Raj Patil --- cmd/karpor/app/mcp.go | 1 + pkg/mcp/server.go | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 pkg/mcp/server.go diff --git a/cmd/karpor/app/mcp.go b/cmd/karpor/app/mcp.go index 54cd20dd..d1837ad8 100644 --- a/cmd/karpor/app/mcp.go +++ b/cmd/karpor/app/mcp.go @@ -18,6 +18,7 @@ import ( "context" "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + "github.com/KusionStack/karpor/pkg/mcp" esclient "github.com/elastic/go-elasticsearch/v8" "github.com/spf13/cobra" "github.com/spf13/pflag" diff --git a/pkg/mcp/server.go b/pkg/mcp/server.go new file mode 100644 index 00000000..f3105704 --- /dev/null +++ b/pkg/mcp/server.go @@ -0,0 +1,19 @@ +// Copyright The Karpor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mcp + +import ( + _ "github.com/metoro-io/mcp-golang" +) From 1831e4ed97fb6bd37d24cbe79da23c4e8af7bf3a Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 07:59:39 +0530 Subject: [PATCH 10/16] chore(mod): go mod tidy post get mcp-golang Signed-off-by: Raj Patil --- go.mod | 13 +++++++++++-- go.sum | 27 ++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 2238ecf7..1d4e7ac1 100644 --- a/go.mod +++ b/go.mod @@ -17,13 +17,14 @@ require ( github.com/google/gofuzz v1.2.0 github.com/google/uuid v1.4.0 github.com/hupe1980/go-huggingface v0.0.15 + github.com/metoro-io/mcp-golang v0.8.0 github.com/mitchellh/hashstructure/v2 v2.0.2 github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 github.com/pkg/errors v0.9.1 github.com/sashabaranov/go-openai v1.27.0 github.com/spf13/cobra v1.6.1 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.9.0 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.2 github.com/xwb1989/sqlparser v0.0.0-20171128062118-da747e0c62c4 @@ -72,8 +73,10 @@ require ( github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/ajg/form v1.5.1 // indirect github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/buger/jsonparser v1.1.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/coreos/go-oidc v2.1.0+incompatible // indirect @@ -106,6 +109,7 @@ require ( github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/invopop/jsonschema v0.12.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect @@ -134,8 +138,13 @@ require ( github.com/smartystreets/goconvey v1.8.1 // indirect github.com/spf13/cast v1.3.1 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect + github.com/tidwall/gjson v1.18.0 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/sjson v1.2.5 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect go.etcd.io/etcd/api/v3 v3.5.5 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect go.etcd.io/etcd/client/v3 v3.5.5 // indirect diff --git a/go.sum b/go.sum index a319e47f..601a3c6e 100644 --- a/go.sum +++ b/go.sum @@ -57,6 +57,8 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -65,6 +67,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bytedance/mockey v1.2.13 h1:jokWZAm/pUEbD939Rhznz615MKUCZNuvCFQlJ2+ntoo= github.com/bytedance/mockey v1.2.13/go.mod h1:1BPHF9sol5R1ud/+0VEHGQq/+i2lN+GTsr3O2Q9IENY= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= @@ -283,6 +287,8 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -322,6 +328,8 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/metoro-io/mcp-golang v0.8.0 h1:DkigHa3w7WwMFomcEz5wiMDX94DsvVm/3mCV3d1obnc= +github.com/metoro-io/mcp-golang v0.8.0/go.mod h1:ifLP9ZzKpN1UqFWNTpAHOqSvNkMK6b7d1FSZ5Lu0lN0= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.1.1 h1:Bp6x9R1Wn16SIz3OfeDr0b7RnCG2OB66Y7PQyC/cvq4= github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= @@ -424,8 +432,9 @@ github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/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 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -435,16 +444,28 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= github.com/swaggo/http-swagger/v2 v2.0.2 h1:FKCdLsl+sFCx60KFsyM0rDarwiUSZ8DqbfSyIKC9OBg= github.com/swaggo/http-swagger/v2 v2.0.2/go.mod h1:r7/GBkAWIfK6E/OLnE8fXnviHiDeAHmgIyooa4xm3AQ= github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xwb1989/sqlparser v0.0.0-20171128062118-da747e0c62c4 h1:w96oitIHwAbUymu2zUSla/82gOKNzpJYkFdwCHE/UOA= From 481ea313a881b744ebb6eb06bc2593f7fcb86022 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 08:00:19 +0530 Subject: [PATCH 11/16] feat(mcp): MCPServer type init Signed-off-by: Raj Patil --- pkg/mcp/server.go | 6 +++++- pkg/mcp/types.go | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 pkg/mcp/types.go diff --git a/pkg/mcp/server.go b/pkg/mcp/server.go index f3105704..7f2ae922 100644 --- a/pkg/mcp/server.go +++ b/pkg/mcp/server.go @@ -15,5 +15,9 @@ package mcp import ( - _ "github.com/metoro-io/mcp-golang" + "github.com/KusionStack/karpor/pkg/infra/search/storage" + "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + mcpg "github.com/metoro-io/mcp-golang" + ctrl "sigs.k8s.io/controller-runtime" ) + diff --git a/pkg/mcp/types.go b/pkg/mcp/types.go new file mode 100644 index 00000000..7070163d --- /dev/null +++ b/pkg/mcp/types.go @@ -0,0 +1,25 @@ +// Copyright The Karpor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mcp + +import ( + "github.com/KusionStack/karpor/pkg/infra/search/storage" + "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" +) + +// MCPServer is the main object that holds the necessary fields and components for the mcp server component. +type MCPServer struct { + Storage storage.Storage +} From 4003a969bc0e4aea8e72a061f013251293ee4689 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 08:27:57 +0530 Subject: [PATCH 12/16] fix(mcp-go): mcp-golang -> mcp-go Signed-off-by: Raj Patil mcp-golang does not implement SSE explictly yet and that section is completely commented out/under developement. see --- go.mod | 16 +++++----------- go.sum | 26 ++++---------------------- pkg/mcp/server.go | 3 ++- 3 files changed, 11 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 1d4e7ac1..71e37562 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/KusionStack/karpor -go 1.22 +go 1.23 + +toolchain go1.23.5 require ( github.com/Masterminds/sprig/v3 v3.2.2 @@ -15,9 +17,9 @@ require ( github.com/go-chi/render v1.0.3 github.com/go-logr/logr v1.2.3 github.com/google/gofuzz v1.2.0 - github.com/google/uuid v1.4.0 + github.com/google/uuid v1.6.0 github.com/hupe1980/go-huggingface v0.0.15 - github.com/metoro-io/mcp-golang v0.8.0 + github.com/mark3labs/mcp-go v0.8.5 github.com/mitchellh/hashstructure/v2 v2.0.2 github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 github.com/pkg/errors v0.9.1 @@ -73,10 +75,8 @@ require ( github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/ajg/form v1.5.1 // indirect github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect - github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/buger/jsonparser v1.1.1 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/coreos/go-oidc v2.1.0+incompatible // indirect @@ -109,7 +109,6 @@ require ( github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect - github.com/invopop/jsonschema v0.12.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jtolds/gls v4.20.0+incompatible // indirect @@ -140,11 +139,6 @@ require ( github.com/stoewer/go-strcase v1.2.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/swaggo/files/v2 v2.0.0 // indirect - github.com/tidwall/gjson v1.18.0 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.1 // indirect - github.com/tidwall/sjson v1.2.5 // indirect - github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect go.etcd.io/etcd/api/v3 v3.5.5 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect go.etcd.io/etcd/client/v3 v3.5.5 // indirect diff --git a/go.sum b/go.sum index 601a3c6e..2a317813 100644 --- a/go.sum +++ b/go.sum @@ -57,8 +57,6 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= -github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= -github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -67,8 +65,6 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bytedance/mockey v1.2.13 h1:jokWZAm/pUEbD939Rhznz615MKUCZNuvCFQlJ2+ntoo= github.com/bytedance/mockey v1.2.13/go.mod h1:1BPHF9sol5R1ud/+0VEHGQq/+i2lN+GTsr3O2Q9IENY= github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= @@ -258,8 +254,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= @@ -287,8 +283,6 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= -github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= @@ -325,11 +319,11 @@ github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 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.8.5 h1:s5oRwQfs83Jim3ZAcQMyUQNHzCEVIuGD12GV8vhJqqc= +github.com/mark3labs/mcp-go v0.8.5/go.mod h1:cjMlBU0cv/cj9kjlgmRhoJ5JREdS7YX83xeIG9Ko/jE= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2 h1:hAHbPm5IJGijwng3PWk09JkG9WeqChjprR5s9bBZ+OM= github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/metoro-io/mcp-golang v0.8.0 h1:DkigHa3w7WwMFomcEz5wiMDX94DsvVm/3mCV3d1obnc= -github.com/metoro-io/mcp-golang v0.8.0/go.mod h1:ifLP9ZzKpN1UqFWNTpAHOqSvNkMK6b7d1FSZ5Lu0lN0= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.1.1 h1:Bp6x9R1Wn16SIz3OfeDr0b7RnCG2OB66Y7PQyC/cvq4= github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= @@ -452,20 +446,8 @@ github.com/swaggo/http-swagger/v2 v2.0.2 h1:FKCdLsl+sFCx60KFsyM0rDarwiUSZ8DqbfSy github.com/swaggo/http-swagger/v2 v2.0.2/go.mod h1:r7/GBkAWIfK6E/OLnE8fXnviHiDeAHmgIyooa4xm3AQ= github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= -github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= -github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= -github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xwb1989/sqlparser v0.0.0-20171128062118-da747e0c62c4 h1:w96oitIHwAbUymu2zUSla/82gOKNzpJYkFdwCHE/UOA= diff --git a/pkg/mcp/server.go b/pkg/mcp/server.go index 7f2ae922..2f44066e 100644 --- a/pkg/mcp/server.go +++ b/pkg/mcp/server.go @@ -17,7 +17,8 @@ package mcp import ( "github.com/KusionStack/karpor/pkg/infra/search/storage" "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" - mcpg "github.com/metoro-io/mcp-golang" + "github.com/mark3labs/mcp-go/mcp" ctrl "sigs.k8s.io/controller-runtime" ) + From 11433b7ed4d770bd608c4471e027c9941cfd337f Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 16:08:41 +0530 Subject: [PATCH 13/16] feat(mcptypes): basic MCP entity type aliases Signed-off-by: Raj Patil --- pkg/mcp/types.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/mcp/types.go b/pkg/mcp/types.go index 7070163d..0576232e 100644 --- a/pkg/mcp/types.go +++ b/pkg/mcp/types.go @@ -15,6 +15,7 @@ package mcp import ( + "github.com/KusionStack/karpor/pkg/infra/search/storage" "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" ) @@ -23,3 +24,14 @@ import ( type MCPServer struct { Storage storage.Storage } + +//MCPToolName is a string tag for an mcp server tool +type MCPToolName string + + +//MCPResourceName is a string tag for an mcp server resource +type MCPResourceName string + + +//MCPPromptName is a string tag for an mcp server prompt +type MCPPromptName string From 972d24759c303d332e08127c574e109d363a3e82 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 16:32:16 +0530 Subject: [PATCH 14/16] feat(mcp): MCPStorageServer struct,New, Serve init Signed-off-by: Raj Patil --- pkg/mcp/server.go | 17 +++++++++++++++++ pkg/mcp/types.go | 21 ++++++++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/pkg/mcp/server.go b/pkg/mcp/server.go index 2f44066e..4177a38e 100644 --- a/pkg/mcp/server.go +++ b/pkg/mcp/server.go @@ -18,7 +18,24 @@ import ( "github.com/KusionStack/karpor/pkg/infra/search/storage" "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" "github.com/mark3labs/mcp-go/mcp" + "github.com/mark3labs/mcp-go/server" ctrl "sigs.k8s.io/controller-runtime" ) +// NewMCPStorageServer yields a storage initialized MCPServer struct +func NewMCPStorageServer(storageEndpoint storage.Storage, sseBaseURL string, sseAddr string) MCPStorageServer { + mcpServer := server.NewMCPServer("MCP Storage Server", "0.0.1") + sseServer := server.NewSSEServer(mcpServer, sseBaseURL) + return MCPStorageServer{ + Storage: storageEndpoint, + MCPServer: mcpServer, + sseServerBaseURL: sseBaseURL, + sseServerBaseURLAddr: sseAddr, + sseServer: sseServer, + } +} +// Serve starts an SSE server on the baseaddr provided +func (m *MCPStorageServer) Serve() error { + return m.sseServer.Start(m.sseServerBaseURLAddr) +} diff --git a/pkg/mcp/types.go b/pkg/mcp/types.go index 0576232e..575cd2b5 100644 --- a/pkg/mcp/types.go +++ b/pkg/mcp/types.go @@ -15,23 +15,26 @@ package mcp import ( - "github.com/KusionStack/karpor/pkg/infra/search/storage" "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + "github.com/mark3labs/mcp-go/mcp" + "github.com/mark3labs/mcp-go/server" ) -// MCPServer is the main object that holds the necessary fields and components for the mcp server component. -type MCPServer struct { - Storage storage.Storage +// MCPServer is the main object that holds the necessary fields and components for the mcp server component to expose the storage backend via resources, tools and prompts +type MCPStorageServer struct { + Storage storage.Storage //the storage backend to be exposed by the MCPStorageServer + MCPServer server.MCPServer //manages configurations of tools, resources, prompts and their handlers + sseServerBaseURL string //baseURL on which the sse server is exposed + sseServerBaseURLAddr string //port on which the sse server is exposed + sseServer server.SSEServer //manages configuration of the HTTP based SSE server on which the MCPServer is exposed } -//MCPToolName is a string tag for an mcp server tool +// MCPToolName is a string tag for an mcp server tool type MCPToolName string - -//MCPResourceName is a string tag for an mcp server resource +// MCPResourceName is a string tag for an mcp server resource type MCPResourceName string - -//MCPPromptName is a string tag for an mcp server prompt +// MCPPromptName is a string tag for an mcp server prompt type MCPPromptName string From f0422557f53205f85c52ca8526a7adecbdc57d3d Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Sun, 23 Feb 2025 16:32:55 +0530 Subject: [PATCH 15/16] feat(mcp): prompts,tools,resources init Signed-off-by: Raj Patil --- pkg/mcp/prompts.go | 4 ++++ pkg/mcp/resources.go | 4 ++++ pkg/mcp/tools.go | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 pkg/mcp/prompts.go create mode 100644 pkg/mcp/resources.go create mode 100644 pkg/mcp/tools.go diff --git a/pkg/mcp/prompts.go b/pkg/mcp/prompts.go new file mode 100644 index 00000000..6e396274 --- /dev/null +++ b/pkg/mcp/prompts.go @@ -0,0 +1,4 @@ +package mcp + +import ( +) diff --git a/pkg/mcp/resources.go b/pkg/mcp/resources.go new file mode 100644 index 00000000..6e396274 --- /dev/null +++ b/pkg/mcp/resources.go @@ -0,0 +1,4 @@ +package mcp + +import ( +) diff --git a/pkg/mcp/tools.go b/pkg/mcp/tools.go new file mode 100644 index 00000000..ae9f96bb --- /dev/null +++ b/pkg/mcp/tools.go @@ -0,0 +1,17 @@ +// Copyright The Karpor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package mcp + +import ( +) From 5294e1cab7d47ceaf8f56e9df3eb2abfa098c799 Mon Sep 17 00:00:00 2001 From: Raj Patil Date: Wed, 7 May 2025 17:09:31 +0530 Subject: [PATCH 16/16] [skip ci] tdd base --- pkg/mcp/server.go | 6 +++--- pkg/mcp/types.go | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/mcp/server.go b/pkg/mcp/server.go index 4177a38e..60cac029 100644 --- a/pkg/mcp/server.go +++ b/pkg/mcp/server.go @@ -16,10 +16,10 @@ package mcp import ( "github.com/KusionStack/karpor/pkg/infra/search/storage" - "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" - "github.com/mark3labs/mcp-go/mcp" + _ "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + _ "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" - ctrl "sigs.k8s.io/controller-runtime" + _ "sigs.k8s.io/controller-runtime" ) // NewMCPStorageServer yields a storage initialized MCPServer struct diff --git a/pkg/mcp/types.go b/pkg/mcp/types.go index 575cd2b5..9611c8f9 100644 --- a/pkg/mcp/types.go +++ b/pkg/mcp/types.go @@ -16,18 +16,18 @@ package mcp import ( "github.com/KusionStack/karpor/pkg/infra/search/storage" - "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" - "github.com/mark3labs/mcp-go/mcp" + _ "github.com/KusionStack/karpor/pkg/infra/search/storage/elasticsearch" + _ "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" ) // MCPServer is the main object that holds the necessary fields and components for the mcp server component to expose the storage backend via resources, tools and prompts type MCPStorageServer struct { Storage storage.Storage //the storage backend to be exposed by the MCPStorageServer - MCPServer server.MCPServer //manages configurations of tools, resources, prompts and their handlers + MCPServer *server.MCPServer //manages configurations of tools, resources, prompts and their handlers sseServerBaseURL string //baseURL on which the sse server is exposed sseServerBaseURLAddr string //port on which the sse server is exposed - sseServer server.SSEServer //manages configuration of the HTTP based SSE server on which the MCPServer is exposed + sseServer *server.SSEServer //manages configuration of the HTTP based SSE server on which the MCPServer is exposed } // MCPToolName is a string tag for an mcp server tool