Bring the Server implementation up to date with the spec by renaming ServerConnection to ServerSession. Also update variable names, which were in various states of disarray from the multiple renamings of this type. Change-Id: I4aec883db6d0500fb91e6daa51b702614877cf8a Reviewed-on: https://go-review.googlesource.com/c/tools/+/672655 Auto-Submit: Robert Findley <rfindley@google.com> TryBot-Bypass: Robert Findley <rfindley@google.com> Commit-Queue: Robert Findley <rfindley@google.com> Reviewed-by: Jonathan Amsterdam <jba@google.com>
90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
// Copyright 2025 The Go MCP SDK Authors. All rights reserved.
|
|
// Use of this source code is governed by an MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package mcp_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/google/go-cmp/cmp/cmpopts"
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
"github.com/modelcontextprotocol/go-sdk/jsonschema"
|
|
)
|
|
|
|
// testToolHandler is used for type inference in TestNewTool.
|
|
func testToolHandler[T any](context.Context, *mcp.ServerSession, T) ([]*mcp.Content, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func TestNewTool(t *testing.T) {
|
|
tests := []struct {
|
|
tool *mcp.ServerTool
|
|
want *jsonschema.Schema
|
|
}{
|
|
{
|
|
mcp.NewTool("basic", "", testToolHandler[struct {
|
|
Name string `json:"name"`
|
|
}]),
|
|
&jsonschema.Schema{
|
|
Type: "object",
|
|
Required: []string{"name"},
|
|
Properties: map[string]*jsonschema.Schema{
|
|
"name": {Type: "string"},
|
|
},
|
|
AdditionalProperties: &jsonschema.Schema{Not: new(jsonschema.Schema)},
|
|
},
|
|
},
|
|
{
|
|
mcp.NewTool("enum", "", testToolHandler[struct{ Name string }], mcp.Input(
|
|
mcp.Property("Name", mcp.Enum("x", "y", "z")),
|
|
)),
|
|
&jsonschema.Schema{
|
|
Type: "object",
|
|
Required: []string{"Name"},
|
|
Properties: map[string]*jsonschema.Schema{
|
|
"Name": {Type: "string", Enum: []any{"x", "y", "z"}},
|
|
},
|
|
AdditionalProperties: &jsonschema.Schema{Not: new(jsonschema.Schema)},
|
|
},
|
|
},
|
|
{
|
|
mcp.NewTool("required", "", testToolHandler[struct {
|
|
Name string `json:"name"`
|
|
Language string `json:"language"`
|
|
X int `json:"x,omitempty"`
|
|
Y int `json:"y,omitempty"`
|
|
}], mcp.Input(
|
|
mcp.Property("x", mcp.Required(true)))),
|
|
&jsonschema.Schema{
|
|
Type: "object",
|
|
Required: []string{"name", "language", "x"},
|
|
Properties: map[string]*jsonschema.Schema{
|
|
"language": {Type: "string"},
|
|
"name": {Type: "string"},
|
|
"x": {Type: "integer"},
|
|
"y": {Type: "integer"},
|
|
},
|
|
AdditionalProperties: &jsonschema.Schema{Not: new(jsonschema.Schema)},
|
|
},
|
|
},
|
|
{
|
|
mcp.NewTool("set_schema", "", testToolHandler[struct {
|
|
X int `json:"x,omitempty"`
|
|
Y int `json:"y,omitempty"`
|
|
}], mcp.Input(
|
|
mcp.Schema(&jsonschema.Schema{Type: "object"})),
|
|
),
|
|
&jsonschema.Schema{
|
|
Type: "object",
|
|
},
|
|
},
|
|
}
|
|
for _, test := range tests {
|
|
if diff := cmp.Diff(test.want, test.tool.Definition.InputSchema, cmpopts.IgnoreUnexported(jsonschema.Schema{})); diff != "" {
|
|
t.Errorf("NewTool(%v) mismatch (-want +got):\n%s", test.tool.Definition.Name, diff)
|
|
}
|
|
}
|
|
}
|