Skip to content

Commit d030400

Browse files
authored
updates to go-sdk 1.0.0 (#36)
* updates to go-sdk 1.0.0 Signed-off-by: ChrisJBurns <[email protected]> * removes claude.md file as it doesn't really add value Signed-off-by: ChrisJBurns <[email protected]> * fix: resolve lint issue with unused parameter in echoHandler - Changed 'req *mcp.CallToolRequest' to '_ *mcp.CallToolRequest' in echoHandler - Fixes revive unused-parameter lint warning - All tests continue to pass * fix: correct Go version to 1.23.0 and remove toolchain directive - Set Go version to 1.23.0 (the actual minimum requirement) - Removed unnecessary toolchain directive - The previous 1.24.x versions appear to be future/development versions * upgrades golang to 1.25 Signed-off-by: ChrisJBurns <[email protected]> --------- Signed-off-by: ChrisJBurns <[email protected]>
1 parent a014648 commit d030400

File tree

7 files changed

+98
-99
lines changed

7 files changed

+98
-99
lines changed

cmd/yardstick-client/main.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,11 @@ func (c *Client) Connect(ctx context.Context) error {
5959
return fmt.Errorf("failed to create transport: %w", err)
6060
}
6161

62-
c.client = mcp.NewClient("yardstick-client", "1.0.0", nil)
63-
session, err := c.client.Connect(ctx, transport)
62+
c.client = mcp.NewClient(&mcp.Implementation{
63+
Name: "yardstick-client",
64+
Version: "1.0.0",
65+
}, nil)
66+
session, err := c.client.Connect(ctx, transport, nil)
6467
if err != nil {
6568
return err
6669
}
@@ -76,23 +79,23 @@ func (c *Client) connectStdio() (mcp.Transport, error) {
7679

7780
// #nosec G204 - Command and args are from user configuration, this is intentional
7881
cmd := exec.Command(c.config.Command, c.config.Args...)
79-
return mcp.NewCommandTransport(cmd), nil
82+
return &mcp.CommandTransport{Command: cmd}, nil
8083
}
8184

8285
// connectSSE creates an SSE transport connection
8386
//
8487
//nolint:unparam
8588
func (c *Client) connectSSE() (mcp.Transport, error) {
8689
url := fmt.Sprintf("http://%s:%d/sse", c.config.Address, c.config.Port)
87-
return mcp.NewSSEClientTransport(url, nil), nil
90+
return &mcp.SSEClientTransport{Endpoint: url}, nil
8891
}
8992

9093
// connectStreamableHTTP creates a streamable HTTP transport connection
9194
//
9295
//nolint:unparam
9396
func (c *Client) connectStreamableHTTP() (mcp.Transport, error) {
9497
url := fmt.Sprintf("http://%s:%d/mcp", c.config.Address, c.config.Port)
95-
return mcp.NewStreamableClientTransport(url, nil), nil
98+
return &mcp.StreamableClientTransport{Endpoint: url}, nil
9699
}
97100

98101
// Close closes the client connection

cmd/yardstick-client/main_test.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -168,26 +168,24 @@ func createMockMCPServer(_ *testing.T, transport string) *httptest.Server {
168168
mux := http.NewServeMux()
169169

170170
// Create a mock MCP server
171-
server := mcp.NewServer("test-server", "1.0.0", nil)
171+
server := mcp.NewServer(&mcp.Implementation{
172+
Name: "test-server",
173+
Version: "1.0.0",
174+
}, nil)
172175

173176
// Add a simple echo tool for testing
174-
echoTool := mcp.NewServerTool("echo", "Echo tool for testing",
175-
func(_ context.Context, _ *mcp.ServerSession, _ *mcp.CallToolParamsFor[map[string]interface{}]) (*mcp.CallToolResultFor[map[string]interface{}], error) {
176-
return &mcp.CallToolResultFor[map[string]interface{}]{
177-
Content: []mcp.Content{
178-
&mcp.TextContent{Text: "test response"},
179-
},
180-
}, nil
181-
},
182-
mcp.Input(),
183-
)
184-
server.AddTools(echoTool)
177+
mcp.AddTool(server, &mcp.Tool{
178+
Name: "echo",
179+
Description: "Echo tool for testing",
180+
}, func(_ context.Context, _ *mcp.CallToolRequest, _ map[string]interface{}) (*mcp.CallToolResult, map[string]interface{}, error) {
181+
return nil, map[string]interface{}{"message": "test response"}, nil
182+
})
185183

186184
switch transport {
187185
case "sse":
188186
handler := mcp.NewSSEHandler(func(_ *http.Request) *mcp.Server {
189187
return server
190-
})
188+
}, nil)
191189
mux.Handle("/sse", handler)
192190
case "streamable-http":
193191
handler := mcp.NewStreamableHTTPHandler(func(_ *http.Request) *mcp.Server {

cmd/yardstick-server/integration_test.go

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -162,24 +162,22 @@ func TestEndToEndEchoFunctionality(t *testing.T) {
162162
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
163163
defer cancel()
164164

165-
params := &mcp.CallToolParamsFor[EchoRequest]{
166-
Arguments: EchoRequest{Input: tc.input},
167-
}
165+
// Create a CallToolRequest for testing
166+
req := &mcp.CallToolRequest{}
167+
params := EchoRequest{Input: tc.input}
168168

169-
result, err := echoHandler(ctx, nil, params)
169+
result, response, err := echoHandler(ctx, req, params)
170170

171171
if tc.expectedError {
172-
assert.Error(t, err)
173-
assert.Nil(t, result)
174-
} else {
172+
// For invalid input, we expect an error result, not an error
175173
assert.NoError(t, err)
176174
assert.NotNil(t, result)
177-
assert.Len(t, result.Content, 1)
178-
179-
// Check that the content is TextContent
180-
textContent, ok := result.Content[0].(*mcp.TextContent)
181-
assert.True(t, ok)
182-
assert.Equal(t, tc.input, textContent.Text)
175+
assert.True(t, result.IsError)
176+
} else {
177+
assert.NoError(t, err)
178+
assert.Nil(t, result) // When successful, result is nil and response contains the data
179+
assert.NotNil(t, response)
180+
assert.Equal(t, tc.input, response.Output)
183181
}
184182
})
185183
}
@@ -203,13 +201,13 @@ func TestServerStartup(t *testing.T) {
203201
assert.False(t, validateAlphanumeric("test@123"))
204202

205203
// Verify echo handler works
206-
params := &mcp.CallToolParamsFor[EchoRequest]{
207-
Arguments: EchoRequest{Input: "test123"},
208-
}
204+
req := &mcp.CallToolRequest{}
205+
params := EchoRequest{Input: "test123"}
209206

210-
result, err := echoHandler(context.Background(), nil, params)
207+
result, response, err := echoHandler(context.Background(), req, params)
211208
assert.NoError(t, err)
212-
assert.NotNil(t, result)
209+
assert.Nil(t, result)
210+
assert.NotNil(t, response)
213211
})
214212
}
215213
}
@@ -225,30 +223,23 @@ func TestConcurrentEchoRequests(t *testing.T) {
225223

226224
for i := 0; i < numConcurrentRequests; i++ {
227225
go func(id int) {
228-
params := &mcp.CallToolParamsFor[EchoRequest]{
229-
Arguments: EchoRequest{Input: fmt.Sprintf("test%d", id)},
230-
}
226+
req := &mcp.CallToolRequest{}
227+
params := EchoRequest{Input: fmt.Sprintf("test%d", id)}
231228

232-
result, err := echoHandler(ctx, nil, params)
229+
result, response, err := echoHandler(ctx, req, params)
233230
if err != nil {
234231
results <- err
235232
return
236233
}
237234

238-
if result == nil || len(result.Content) == 0 {
239-
results <- fmt.Errorf("invalid result for request %d", id)
240-
return
241-
}
242-
243-
textContent, ok := result.Content[0].(*mcp.TextContent)
244-
if !ok {
245-
results <- fmt.Errorf("expected TextContent for request %d", id)
235+
if result != nil {
236+
results <- fmt.Errorf("expected nil result for request %d", id)
246237
return
247238
}
248239

249240
expectedOutput := fmt.Sprintf("test%d", id)
250-
if textContent.Text != expectedOutput {
251-
results <- fmt.Errorf("expected %s, got %s", expectedOutput, textContent.Text)
241+
if response.Output != expectedOutput {
242+
results <- fmt.Errorf("expected %s, got %s", expectedOutput, response.Output)
252243
return
253244
}
254245

cmd/yardstick-server/main.go

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"strconv"
1212
"time"
1313

14-
"github.com/modelcontextprotocol/go-sdk/jsonschema"
14+
"github.com/google/jsonschema-go/jsonschema"
1515
"github.com/modelcontextprotocol/go-sdk/mcp"
1616
)
1717

@@ -33,53 +33,58 @@ func validateAlphanumeric(input string) bool {
3333
return alphanumericRegex.MatchString(input)
3434
}
3535

36-
func echoHandler(_ context.Context, _ *mcp.ServerSession, params *mcp.CallToolParamsFor[EchoRequest]) (
37-
*mcp.CallToolResultFor[EchoResponse], error,
38-
) {
39-
if !validateAlphanumeric(params.Arguments.Input) {
40-
return nil, fmt.Errorf("input must be alphanumeric only")
36+
func echoHandler(_ context.Context, _ *mcp.CallToolRequest, params EchoRequest) (*mcp.CallToolResult, EchoResponse, error) {
37+
if !validateAlphanumeric(params.Input) {
38+
return &mcp.CallToolResult{
39+
Content: []mcp.Content{&mcp.TextContent{Text: "input must be alphanumeric only"}},
40+
IsError: true,
41+
}, EchoResponse{}, nil
4142
}
4243

4344
response := EchoResponse{
44-
Output: params.Arguments.Input,
45+
Output: params.Input,
4546
}
4647

47-
return &mcp.CallToolResultFor[EchoResponse]{
48-
Content: []mcp.Content{
49-
&mcp.TextContent{Text: response.Output},
50-
},
51-
}, nil
48+
return nil, response, nil
5249
}
5350

5451
func main() {
5552
// Parse command line flags
5653
parseConfig()
5754

5855
// Create MCP server
59-
server := mcp.NewServer("echo-server", "1.0.0", nil)
60-
61-
// Add echo tool to server
62-
echoTool := mcp.NewServerTool("echo", "Echo back an alphanumeric string for deterministic testing", echoHandler,
63-
mcp.Input(
64-
mcp.Property("input",
65-
mcp.Description("Alphanumeric string to echo back"),
66-
mcp.Schema(&jsonschema.Schema{
67-
Type: "string",
68-
Pattern: "^[a-zA-Z0-9]+$",
69-
}),
70-
),
71-
),
72-
)
73-
74-
server.AddTools(echoTool)
56+
server := mcp.NewServer(&mcp.Implementation{
57+
Name: "echo-server",
58+
Version: "1.0.0",
59+
}, nil)
60+
61+
// Create custom schema for input validation
62+
inputSchema := &jsonschema.Schema{
63+
Type: "object",
64+
Properties: map[string]*jsonschema.Schema{
65+
"input": {
66+
Type: "string",
67+
Pattern: "^[a-zA-Z0-9]+$",
68+
Description: "Alphanumeric string to echo back",
69+
},
70+
},
71+
Required: []string{"input"},
72+
}
73+
74+
// Add echo tool to server using the new API
75+
mcp.AddTool(server, &mcp.Tool{
76+
Name: "echo",
77+
Description: "Echo back an alphanumeric string for deterministic testing",
78+
InputSchema: inputSchema,
79+
}, echoHandler)
7580

7681
ctx := context.Background()
7782

7883
switch transport {
7984
case "stdio":
8085
log.Println("Starting MCP server with stdio transport")
81-
transport := mcp.NewStdioTransport()
82-
if err := server.Run(ctx, transport); err != nil {
86+
stdioTransport := &mcp.StdioTransport{}
87+
if err := server.Run(ctx, stdioTransport); err != nil {
8388
log.Fatal("Failed to run server:", err)
8489
}
8590

@@ -90,7 +95,7 @@ func main() {
9095

9196
handler := mcp.NewSSEHandler(func(_ *http.Request) *mcp.Server {
9297
return server
93-
})
98+
}, nil)
9499

95100
// Mount the SSE handler at /sse - it will handle both GET (SSE stream) and POST (messages) requests
96101
http.Handle("/sse", handler)

cmd/yardstick-server/main_test.go

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -79,26 +79,22 @@ func TestEchoHandler(t *testing.T) {
7979
for _, tt := range tests {
8080
t.Run(tt.name, func(t *testing.T) {
8181
// Create request with the new API
82-
echoReq := EchoRequest{Input: tt.input}
83-
params := &mcp.CallToolParamsFor[EchoRequest]{
84-
Arguments: echoReq,
85-
}
82+
req := &mcp.CallToolRequest{}
83+
params := EchoRequest{Input: tt.input}
8684

8785
// Call handler
88-
result, err := echoHandler(context.Background(), nil, params)
86+
result, response, err := echoHandler(context.Background(), req, params)
8987

9088
if tt.expectError {
91-
assert.Error(t, err)
92-
assert.Nil(t, result)
93-
} else {
89+
// For invalid input, we expect an error result, not an error
9490
assert.NoError(t, err)
9591
assert.NotNil(t, result)
96-
assert.Len(t, result.Content, 1)
97-
98-
// Check that the content is TextContent
99-
textContent, ok := result.Content[0].(*mcp.TextContent)
100-
assert.True(t, ok)
101-
assert.Equal(t, tt.expectedOutput, textContent.Text)
92+
assert.True(t, result.IsError)
93+
} else {
94+
assert.NoError(t, err)
95+
assert.Nil(t, result)
96+
assert.NotNil(t, response)
97+
assert.Equal(t, tt.expectedOutput, response.Output)
10298
}
10399
})
104100
}

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
module github.com/stackloklabs/yardstick
22

3-
go 1.24.0
3+
go 1.25.0
44

55
require (
6-
github.com/modelcontextprotocol/go-sdk v0.1.0
6+
github.com/google/jsonschema-go v0.3.0
7+
github.com/modelcontextprotocol/go-sdk v1.0.0
78
github.com/stretchr/testify v1.11.1
89
)
910

1011
require (
1112
github.com/davecgh/go-spew v1.1.1 // indirect
1213
github.com/pmezard/go-difflib v1.0.0 // indirect
14+
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
1315
gopkg.in/yaml.v3 v3.0.1 // indirect
1416
)

go.sum

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
33
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
44
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
5-
github.com/modelcontextprotocol/go-sdk v0.1.0 h1:ItzbFWYNt4EHcUrScX7P8JPASn1FVYb29G773Xkl+IU=
6-
github.com/modelcontextprotocol/go-sdk v0.1.0/go.mod h1:DcXfbr7yl7e35oMpzHfKw2nUYRjhIGS2uou/6tdsTB0=
5+
github.com/google/jsonschema-go v0.3.0 h1:6AH2TxVNtk3IlvkkhjrtbUc4S8AvO0Xii0DxIygDg+Q=
6+
github.com/google/jsonschema-go v0.3.0/go.mod h1:r5quNTdLOYEz95Ru18zA0ydNbBuYoo9tgaYcxEYhJVE=
7+
github.com/modelcontextprotocol/go-sdk v1.0.0 h1:Z4MSjLi38bTgLrd/LjSmofqRqyBiVKRyQSJgw8q8V74=
8+
github.com/modelcontextprotocol/go-sdk v1.0.0/go.mod h1:nYtYQroQ2KQiM0/SbyEPUWQ6xs4B95gJjEalc9AQyOs=
79
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
810
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
911
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
1012
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
13+
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
14+
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
1115
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
1216
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
1317
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

0 commit comments

Comments
 (0)