Skip to content

Commit 52a6bc6

Browse files
committed
uses go-sdk 1.0.0
Signed-off-by: ChrisJBurns <[email protected]>
1 parent 2d6a56f commit 52a6bc6

28 files changed

+847
-693
lines changed

Taskfile.yml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ tasks:
4949
platforms: [linux, darwin]
5050
internal: true
5151
cmds:
52-
- go install github.com/gotesttools/gotestfmt/v2/cmd/gotestfmt@latest
53-
# we have to use ldflags to avoid the LC_DYSYMTAB linker error.
52+
# Temporarily bypass gotestfmt due to panic issue with empty package names
53+
# - go install github.com/gotesttools/gotestfmt/v2/cmd/gotestfmt@latest
54+
# we have to use ldflags to avoid the LC_DYSYMTAB linker error.
5455
# https://github.com/stacklok/toolhive/issues/1687
55-
- go test -ldflags=-extldflags=-Wl,-w -v -json -race $(go list ./... | grep -v '/test/e2e' | grep -v '/cmd/thv-operator/test-integration') | gotestfmt -hide "all"
56+
# - go test -ldflags=-extldflags=-Wl,-w -v -json -race $(go list ./... | grep -v '/test/e2e' | grep -v '/cmd/thv-operator/test-integration') | gotestfmt -hide "all"
57+
- go test -ldflags=-extldflags=-Wl,-w -v -race $(go list ./... | grep -v '/test/e2e' | grep -v '/cmd/thv-operator/test-integration')
5658

5759
test-windows:
5860
desc: Run unit tests (excluding e2e tests) on Windows with race detection

cmd/thv/app/mcp.go

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import (
1010
"text/tabwriter"
1111
"time"
1212

13-
"github.com/mark3labs/mcp-go/client"
14-
"github.com/mark3labs/mcp-go/mcp"
13+
"github.com/modelcontextprotocol/go-sdk/mcp"
1514
"github.com/spf13/cobra"
1615

1716
"github.com/stacklok/toolhive/pkg/logger"
@@ -119,23 +118,23 @@ func mcpListCmdFunc(cmd *cobra.Command, _ []string) error {
119118
data := make(map[string]interface{})
120119

121120
// List tools
122-
if tools, err := mcpClient.ListTools(ctx, mcp.ListToolsRequest{}); err != nil {
121+
if tools, err := mcpClient.ListTools(ctx, &mcp.ListToolsParams{}); err != nil {
123122
logger.Warnf("Failed to list tools: %v", err)
124123
data["tools"] = []mcp.Tool{}
125124
} else {
126125
data["tools"] = tools.Tools
127126
}
128127

129128
// List resources
130-
if resources, err := mcpClient.ListResources(ctx, mcp.ListResourcesRequest{}); err != nil {
129+
if resources, err := mcpClient.ListResources(ctx, &mcp.ListResourcesParams{}); err != nil {
131130
logger.Warnf("Failed to list resources: %v", err)
132131
data["resources"] = []mcp.Resource{}
133132
} else {
134133
data["resources"] = resources.Resources
135134
}
136135

137136
// List prompts
138-
if prompts, err := mcpClient.ListPrompts(ctx, mcp.ListPromptsRequest{}); err != nil {
137+
if prompts, err := mcpClient.ListPrompts(ctx, &mcp.ListPromptsParams{}); err != nil {
139138
logger.Warnf("Failed to list prompts: %v", err)
140139
data["prompts"] = []mcp.Prompt{}
141140
} else {
@@ -166,7 +165,7 @@ func mcpListToolsCmdFunc(cmd *cobra.Command, _ []string) error {
166165
return err
167166
}
168167

169-
result, err := mcpClient.ListTools(ctx, mcp.ListToolsRequest{})
168+
result, err := mcpClient.ListTools(ctx, &mcp.ListToolsParams{})
170169
if err != nil {
171170
return fmt.Errorf("failed to list tools: %w", err)
172171
}
@@ -195,7 +194,7 @@ func mcpListResourcesCmdFunc(cmd *cobra.Command, _ []string) error {
195194
return err
196195
}
197196

198-
result, err := mcpClient.ListResources(ctx, mcp.ListResourcesRequest{})
197+
result, err := mcpClient.ListResources(ctx, &mcp.ListResourcesParams{})
199198
if err != nil {
200199
return fmt.Errorf("failed to list resources: %w", err)
201200
}
@@ -224,7 +223,7 @@ func mcpListPromptsCmdFunc(cmd *cobra.Command, _ []string) error {
224223
return err
225224
}
226225

227-
result, err := mcpClient.ListPrompts(ctx, mcp.ListPromptsRequest{})
226+
result, err := mcpClient.ListPrompts(ctx, &mcp.ListPromptsParams{})
228227
if err != nil {
229228
return fmt.Errorf("failed to list prompts: %w", err)
230229
}
@@ -262,29 +261,45 @@ func resolveServerURL(ctx context.Context, serverInput string) (string, error) {
262261
}
263262

264263
// createMCPClient creates an MCP client based on the server URL and transport type
265-
func createMCPClient(serverURL string) (*client.Client, error) {
264+
func createMCPClient(serverURL string) (*mcp.ClientSession, error) {
266265
transportType := determineTransportType(serverURL, mcpTransport)
267266

267+
// Create the MCP client
268+
client := mcp.NewClient(
269+
&mcp.Implementation{
270+
Name: "thv-mcp-cli",
271+
Version: versions.Version,
272+
},
273+
&mcp.ClientOptions{},
274+
)
275+
276+
var transport mcp.Transport
277+
268278
switch transportType {
269279
case types.TransportTypeSSE:
270-
mcpClient, err := client.NewSSEMCPClient(serverURL)
271-
if err != nil {
272-
return nil, fmt.Errorf("failed to create SSE MCP client: %w", err)
280+
transport = &mcp.SSEClientTransport{
281+
Endpoint: serverURL,
273282
}
274-
return mcpClient, nil
275283
case types.TransportTypeStreamableHTTP:
276-
mcpClient, err := client.NewStreamableHttpClient(serverURL)
277-
if err != nil {
278-
return nil, fmt.Errorf("failed to create Streamable HTTP MCP client: %w", err)
284+
transport = &mcp.StreamableClientTransport{
285+
Endpoint: serverURL,
286+
MaxRetries: 5,
279287
}
280-
return mcpClient, nil
281288
case types.TransportTypeStdio:
282289
return nil, fmt.Errorf("stdio transport is not supported for MCP client connections")
283290
case types.TransportTypeInspector:
284291
return nil, fmt.Errorf("inspector transport is not supported for MCP client connections")
285292
default:
286293
return nil, fmt.Errorf("unsupported transport type: %s", transportType)
287294
}
295+
296+
// Connect using the transport
297+
session, err := client.Connect(context.Background(), transport, nil)
298+
if err != nil {
299+
return nil, fmt.Errorf("failed to connect to MCP server: %w", err)
300+
}
301+
302+
return session, nil
288303
}
289304

290305
// determineTransportType determines the transport type based on URL path and user preference
@@ -325,29 +340,15 @@ func determineTransportType(serverURL, transportFlag string) types.TransportType
325340
}
326341

327342
// initializeMCPClient initializes the MCP client connection
328-
func initializeMCPClient(ctx context.Context, mcpClient *client.Client) error {
329-
// Start the transport
330-
if err := mcpClient.Start(ctx); err != nil {
331-
return fmt.Errorf("failed to start MCP transport: %w", err)
343+
func initializeMCPClient(ctx context.Context, mcpClient *mcp.ClientSession) error {
344+
// Initialization happens during Connect, just verify we're connected
345+
if mcpClient == nil {
346+
return fmt.Errorf("client session not connected")
332347
}
333-
334-
// Initialize the connection
335-
initRequest := mcp.InitializeRequest{}
336-
initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
337-
initRequest.Params.Capabilities = mcp.ClientCapabilities{
338-
// Basic client capabilities for listing
339-
}
340-
versionInfo := versions.GetVersionInfo()
341-
initRequest.Params.ClientInfo = mcp.Implementation{
342-
Name: "toolhive-cli",
343-
Version: versionInfo.Version,
344-
}
345-
346-
_, err := mcpClient.Initialize(ctx, initRequest)
347-
if err != nil {
348-
return fmt.Errorf("failed to initialize MCP client: %w", err)
348+
result := mcpClient.InitializeResult()
349+
if result == nil {
350+
return fmt.Errorf("client session not initialized")
349351
}
350-
351352
return nil
352353
}
353354

@@ -438,7 +439,7 @@ func outputMCPPrompts(w *tabwriter.Writer, data map[string]interface{}) bool {
438439
}
439440

440441
// formatPromptArguments formats the prompt arguments for display
441-
func formatPromptArguments(arguments []mcp.PromptArgument) string {
442+
func formatPromptArguments(arguments []*mcp.PromptArgument) string {
442443
argCount := len(arguments)
443444
if argCount == 0 {
444445
return "0"

go.mod

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ require (
1919
github.com/google/uuid v1.6.0
2020
github.com/lestrrat-go/httprc/v3 v3.0.1
2121
github.com/lestrrat-go/jwx/v3 v3.0.11
22-
github.com/mark3labs/mcp-go v0.41.1
22+
github.com/modelcontextprotocol/go-sdk v1.0.0
2323
github.com/olekukonko/tablewriter v1.1.0
2424
github.com/onsi/ginkgo/v2 v2.26.0
2525
github.com/onsi/gomega v1.38.2
@@ -78,10 +78,8 @@ require (
7878
github.com/ProtonMail/go-crypto v1.1.6 // indirect
7979
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
8080
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
81-
github.com/bahlo/generic-list-go v0.2.0 // indirect
8281
github.com/beorn7/perks v1.0.1 // indirect
8382
github.com/blang/semver v3.5.1+incompatible // indirect
84-
github.com/buger/jsonparser v1.1.1 // indirect
8583
github.com/cespare/xxhash/v2 v2.3.0 // indirect
8684
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
8785
github.com/charmbracelet/x/ansi v0.10.1 // indirect
@@ -150,6 +148,7 @@ require (
150148
github.com/google/certificate-transparency-go v1.3.2 // indirect
151149
github.com/google/gnostic-models v0.7.0 // indirect
152150
github.com/google/go-cmp v0.7.0 // indirect
151+
github.com/google/jsonschema-go v0.3.0 // indirect
153152
github.com/google/pprof v0.0.0-20250820193118-f64d9cf942d6 // indirect
154153
github.com/google/s2a-go v0.1.9 // indirect
155154
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
@@ -163,7 +162,6 @@ require (
163162
github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b // indirect
164163
github.com/in-toto/attestation v1.1.2 // indirect
165164
github.com/in-toto/in-toto-golang v0.9.0 // indirect
166-
github.com/invopop/jsonschema v0.13.0 // indirect
167165
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
168166
github.com/jedisct1/go-minisign v0.0.0-20211028175153-1c139d1cc84b // indirect
169167
github.com/josharian/intern v1.0.0 // indirect
@@ -240,7 +238,6 @@ require (
240238
github.com/transparency-dev/merkle v0.0.2 // indirect
241239
github.com/transparency-dev/tessera v1.0.0-rc3 // indirect
242240
github.com/vbatts/tar-split v0.12.1 // indirect
243-
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
244241
github.com/x448/float16 v0.8.4 // indirect
245242
github.com/xanzy/ssh-agent v0.3.3 // indirect
246243
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect

go.sum

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -719,16 +719,12 @@ github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp
719719
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
720720
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
721721
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
722-
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
723-
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
724722
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
725723
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
726724
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
727725
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
728726
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
729727
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
730-
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
731-
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
732728
github.com/cedar-policy/cedar-go v1.2.6 h1:q6f1sRxhoBG7lnK/fH6oBG33ruf2yIpcfcPXNExANa0=
733729
github.com/cedar-policy/cedar-go v1.2.6/go.mod h1:h5+3CVW1oI5LXVskJG+my9TFCYI5yjh/+Ul3EJie6MI=
734730
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
@@ -1096,6 +1092,8 @@ github.com/google/go-containerregistry v0.20.6/go.mod h1:T0x8MuoAoKX/873bkeSfLD2
10961092
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
10971093
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
10981094
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
1095+
github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q=
1096+
github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
10991097
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
11001098
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
11011099
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -1208,8 +1206,6 @@ github.com/in-toto/in-toto-golang v0.9.0/go.mod h1:xsBVrVsHNsB61++S6Dy2vWosKhuA3
12081206
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
12091207
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
12101208
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
1211-
github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=
1212-
github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
12131209
github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
12141210
github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
12151211
github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
@@ -1346,8 +1342,6 @@ github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuz
13461342
github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
13471343
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
13481344
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
1349-
github.com/mark3labs/mcp-go v0.41.1 h1:w78eWfiQam2i8ICL7AL0WFiq7KHNJQ6UB53ZVtH4KGA=
1350-
github.com/mark3labs/mcp-go v0.41.1/go.mod h1:T7tUa2jO6MavG+3P25Oy/jR7iCeJPHImCZHRymCn39g=
13511345
github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo=
13521346
github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg=
13531347
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
@@ -1395,6 +1389,8 @@ github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7z
13951389
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
13961390
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
13971391
github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc=
1392+
github.com/modelcontextprotocol/go-sdk v1.0.0 h1:Z4MSjLi38bTgLrd/LjSmofqRqyBiVKRyQSJgw8q8V74=
1393+
github.com/modelcontextprotocol/go-sdk v1.0.0/go.mod h1:nYtYQroQ2KQiM0/SbyEPUWQ6xs4B95gJjEalc9AQyOs=
13981394
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
13991395
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
14001396
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -1649,8 +1645,6 @@ github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXV
16491645
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
16501646
github.com/vbatts/tar-split v0.12.1 h1:CqKoORW7BUWBe7UL/iqTVvkTBOF8UvOMKOIZykxnnbo=
16511647
github.com/vbatts/tar-split v0.12.1/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA=
1652-
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
1653-
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
16541648
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
16551649
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
16561650
github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=

0 commit comments

Comments
 (0)