Skip to content

Commit 6d1ff20

Browse files
committed
change other features
1 parent 1aaa3ec commit 6d1ff20

File tree

9 files changed

+105
-166
lines changed

9 files changed

+105
-166
lines changed

README.md

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ import (
9999
)
100100

101101
type HiParams struct {
102-
Name string `json:"name"`
102+
Name string `json:"name", mcp:"the name of the person to greet"`
103103
}
104104

105105
func SayHi(ctx context.Context, cc *mcp.ServerSession, params *mcp.CallToolParamsFor[HiParams]) (*mcp.CallToolResultFor[any], error) {
@@ -111,11 +111,8 @@ func SayHi(ctx context.Context, cc *mcp.ServerSession, params *mcp.CallToolParam
111111
func main() {
112112
// Create a server with a single tool.
113113
server := mcp.NewServer("greeter", "v1.0.0", nil)
114-
server.AddTools(
115-
mcp.NewServerTool("greet", "say hi", SayHi, mcp.Input(
116-
mcp.Property("name", mcp.Description("the name of the person to greet")),
117-
)),
118-
)
114+
115+
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
119116
// Run the server over stdin/stdout, until the client disconnects
120117
if err := server.Run(context.Background(), mcp.NewStdioTransport()); err != nil {
121118
log.Fatal(err)

examples/hello/main.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import (
1919
var httpAddr = flag.String("http", "", "if set, use streamable HTTP at this address, instead of stdin/stdout")
2020

2121
type HiArgs struct {
22-
Name string `json:"name"`
22+
Name string `json:"name" mcp:"the name to say hi to"`
2323
}
2424

2525
func SayHi(ctx context.Context, ss *mcp.ServerSession, params *mcp.CallToolParamsFor[HiArgs]) (*mcp.CallToolResultFor[struct{}], error) {
@@ -43,21 +43,13 @@ func main() {
4343
flag.Parse()
4444

4545
server := mcp.NewServer("greeter", "v0.0.1", nil)
46-
server.AddTools(mcp.NewServerTool("greet", "say hi", SayHi, mcp.Input(
47-
mcp.Property("name", mcp.Description("the name to say hi to")),
48-
)))
49-
server.AddPrompts(&mcp.ServerPrompt{
50-
Prompt: &mcp.Prompt{Name: "greet"},
51-
Handler: PromptHi,
52-
})
53-
server.AddResources(&mcp.ServerResource{
54-
Resource: &mcp.Resource{
55-
Name: "info",
56-
MIMEType: "text/plain",
57-
URI: "embedded:info",
58-
},
59-
Handler: handleEmbeddedResource,
60-
})
46+
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
47+
server.AddPrompt(&mcp.Prompt{Name: "greet"}, PromptHi)
48+
server.AddResource(&mcp.Resource{
49+
Name: "info",
50+
MIMEType: "text/plain",
51+
URI: "embedded:info",
52+
}, handleEmbeddedResource)
6153

6254
if *httpAddr != "" {
6355
handler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server {

examples/sse/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ func main() {
3535
}
3636

3737
server1 := mcp.NewServer("greeter1", "v0.0.1", nil)
38-
server1.AddTools(mcp.NewServerTool("greet1", "say hi", SayHi))
38+
mcp.AddTool(server1, &mcp.Tool{Name: "greet1", Description: "say hi"}, SayHi)
3939

4040
server2 := mcp.NewServer("greeter2", "v0.0.1", nil)
41-
server2.AddTools(mcp.NewServerTool("greet2", "say hello", SayHi))
41+
mcp.AddTool(server2, &mcp.Tool{Name: "greet2", Description: "say hello"}, SayHi)
4242

43-
log.Printf("MCP servers serving at %s\n", *httpAddr)
43+
log.Printf("MCP servers serving at %s", *httpAddr)
4444
handler := mcp.NewSSEHandler(func(request *http.Request) *mcp.Server {
4545
url := request.URL.Path
4646
log.Printf("Handling request for URL %s\n", url)

internal/readme/server/server.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
)
1414

1515
type HiParams struct {
16-
Name string `json:"name"`
16+
Name string `json:"name", mcp:"the name of the person to greet"`
1717
}
1818

1919
func SayHi(ctx context.Context, cc *mcp.ServerSession, params *mcp.CallToolParamsFor[HiParams]) (*mcp.CallToolResultFor[any], error) {
@@ -25,11 +25,8 @@ func SayHi(ctx context.Context, cc *mcp.ServerSession, params *mcp.CallToolParam
2525
func main() {
2626
// Create a server with a single tool.
2727
server := mcp.NewServer("greeter", "v1.0.0", nil)
28-
server.AddTools(
29-
mcp.NewServerTool("greet", "say hi", SayHi, mcp.Input(
30-
mcp.Property("name", mcp.Description("the name of the person to greet")),
31-
)),
32-
)
28+
29+
mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
3330
// Run the server over stdin/stdout, until the client disconnects
3431
if err := server.Run(context.Background(), mcp.NewStdioTransport()); err != nil {
3532
log.Fatal(err)

mcp/client_list_test.go

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@ func TestList(t *testing.T) {
2424
t.Run("tools", func(t *testing.T) {
2525
var wantTools []*mcp.Tool
2626
for _, name := range []string{"apple", "banana", "cherry"} {
27-
wantTools = append(wantTools, &mcp.Tool{Name: name, Description: name + " tool"})
28-
}
29-
30-
for _, t := range wantTools {
27+
t := &mcp.Tool{Name: name, Description: name + " tool"}
28+
wantTools = append(wantTools, t)
3129
mcp.AddTool(server, t, SayHi)
3230
}
3331
t.Run("list", func(t *testing.T) {
@@ -45,12 +43,13 @@ func TestList(t *testing.T) {
4543
})
4644

4745
t.Run("resources", func(t *testing.T) {
48-
resourceA := &mcp.ServerResource{Resource: &mcp.Resource{URI: "http://apple"}}
49-
resourceB := &mcp.ServerResource{Resource: &mcp.Resource{URI: "http://banana"}}
50-
resourceC := &mcp.ServerResource{Resource: &mcp.Resource{URI: "http://cherry"}}
51-
wantResources := []*mcp.Resource{resourceA.Resource, resourceB.Resource, resourceC.Resource}
52-
resources := []*mcp.ServerResource{resourceA, resourceB, resourceC}
53-
server.AddResources(resources...)
46+
var wantResources []*mcp.Resource
47+
for _, name := range []string{"apple", "banana", "cherry"} {
48+
r := &mcp.Resource{URI: "http://" + name}
49+
wantResources = append(wantResources, r)
50+
server.AddResource(r, nil)
51+
}
52+
5453
t.Run("list", func(t *testing.T) {
5554
res, err := clientSession.ListResources(ctx, nil)
5655
if err != nil {
@@ -66,15 +65,12 @@ func TestList(t *testing.T) {
6665
})
6766

6867
t.Run("templates", func(t *testing.T) {
69-
resourceTmplA := &mcp.ServerResourceTemplate{ResourceTemplate: &mcp.ResourceTemplate{URITemplate: "http://apple/{x}"}}
70-
resourceTmplB := &mcp.ServerResourceTemplate{ResourceTemplate: &mcp.ResourceTemplate{URITemplate: "http://banana/{x}"}}
71-
resourceTmplC := &mcp.ServerResourceTemplate{ResourceTemplate: &mcp.ResourceTemplate{URITemplate: "http://cherry/{x}"}}
72-
wantResourceTemplates := []*mcp.ResourceTemplate{
73-
resourceTmplA.ResourceTemplate, resourceTmplB.ResourceTemplate,
74-
resourceTmplC.ResourceTemplate,
68+
var wantResourceTemplates []*mcp.ResourceTemplate
69+
for _, name := range []string{"apple", "banana", "cherry"} {
70+
rt := &mcp.ResourceTemplate{URITemplate: "http://" + name + "/{x}"}
71+
wantResourceTemplates = append(wantResourceTemplates, rt)
72+
server.AddResourceTemplate(rt, nil)
7573
}
76-
resourceTemplates := []*mcp.ServerResourceTemplate{resourceTmplA, resourceTmplB, resourceTmplC}
77-
server.AddResourceTemplates(resourceTemplates...)
7874
t.Run("list", func(t *testing.T) {
7975
res, err := clientSession.ListResourceTemplates(ctx, nil)
8076
if err != nil {
@@ -90,12 +86,12 @@ func TestList(t *testing.T) {
9086
})
9187

9288
t.Run("prompts", func(t *testing.T) {
93-
promptA := newServerPrompt("apple", "apple prompt")
94-
promptB := newServerPrompt("banana", "banana prompt")
95-
promptC := newServerPrompt("cherry", "cherry prompt")
96-
wantPrompts := []*mcp.Prompt{promptA.Prompt, promptB.Prompt, promptC.Prompt}
97-
prompts := []*mcp.ServerPrompt{promptA, promptB, promptC}
98-
server.AddPrompts(prompts...)
89+
var wantPrompts []*mcp.Prompt
90+
for _, name := range []string{"apple", "banana", "cherry"} {
91+
p := &mcp.Prompt{Name: name, Description: name + " prompt"}
92+
wantPrompts = append(wantPrompts, p)
93+
server.AddPrompt(p, testPromptHandler)
94+
}
9995
t.Run("list", func(t *testing.T) {
10096
res, err := clientSession.ListPrompts(ctx, nil)
10197
if err != nil {
@@ -125,14 +121,6 @@ func testIterator[T any](ctx context.Context, t *testing.T, seq iter.Seq2[*T, er
125121
}
126122
}
127123

128-
// testPromptHandler is used for type inference newServerPrompt.
129124
func testPromptHandler(context.Context, *mcp.ServerSession, *mcp.GetPromptParams) (*mcp.GetPromptResult, error) {
130125
panic("not implemented")
131126
}
132-
133-
func newServerPrompt(name, desc string) *mcp.ServerPrompt {
134-
return &mcp.ServerPrompt{
135-
Prompt: &mcp.Prompt{Name: name, Description: desc},
136-
Handler: testPromptHandler,
137-
}
138-
}

mcp/mcp_test.go

Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,23 @@ func TestEndToEnd(t *testing.T) {
7373
func(context.Context, *ServerSession, *CallToolParamsFor[map[string]any]) (*CallToolResult, error) {
7474
return nil, errTestFailure
7575
})
76-
add(prompts, s.AddPrompts, "code_review", "fail")
77-
add(resources, s.AddResources, "info.txt", "fail.txt")
76+
s.AddPrompt(&Prompt{
77+
Name: "code_review",
78+
Description: "do a code review",
79+
Arguments: []*PromptArgument{{Name: "Code", Required: true}},
80+
}, func(_ context.Context, _ *ServerSession, params *GetPromptParams) (*GetPromptResult, error) {
81+
return &GetPromptResult{
82+
Description: "Code review prompt",
83+
Messages: []*PromptMessage{
84+
{Role: "user", Content: &TextContent{Text: "Please review the following code: " + params.Arguments["Code"]}},
85+
},
86+
}, nil
87+
})
88+
s.AddPrompt(&Prompt{Name: "fail"}, func(_ context.Context, _ *ServerSession, _ *GetPromptParams) (*GetPromptResult, error) {
89+
return nil, errTestFailure
90+
})
91+
s.AddResource(resource1, readHandler)
92+
s.AddResource(resource2, readHandler)
7893

7994
// Connect the server.
8095
ss, err := s.Connect(ctx, st)
@@ -163,7 +178,7 @@ func TestEndToEnd(t *testing.T) {
163178
t.Errorf("fail returned unexpected error: got %v, want containing %v", err, errTestFailure)
164179
}
165180

166-
s.AddPrompts(&ServerPrompt{Prompt: &Prompt{Name: "T"}})
181+
s.AddPrompt(&Prompt{Name: "T"}, nil)
167182
waitForNotification(t, "prompts")
168183
s.RemovePrompts("T")
169184
waitForNotification(t, "prompts")
@@ -230,8 +245,7 @@ func TestEndToEnd(t *testing.T) {
230245
MIMEType: "text/template",
231246
URITemplate: "file:///{+filename}", // the '+' means that filename can contain '/'
232247
}
233-
st := &ServerResourceTemplate{ResourceTemplate: template, Handler: readHandler}
234-
s.AddResourceTemplates(st)
248+
s.AddResourceTemplate(template, readHandler)
235249
tres, err := cs.ListResourceTemplates(ctx, nil)
236250
if err != nil {
237251
t.Fatal(err)
@@ -276,7 +290,7 @@ func TestEndToEnd(t *testing.T) {
276290
}
277291
}
278292

279-
s.AddResources(&ServerResource{Resource: &Resource{URI: "http://U"}})
293+
s.AddResource(&Resource{URI: "http://U"}, nil)
280294
waitForNotification(t, "resources")
281295
s.RemoveResources("http://U")
282296
waitForNotification(t, "resources")
@@ -418,30 +432,6 @@ func TestEndToEnd(t *testing.T) {
418432
var (
419433
errTestFailure = errors.New("mcp failure")
420434

421-
prompts = map[string]*ServerPrompt{
422-
"code_review": {
423-
Prompt: &Prompt{
424-
Name: "code_review",
425-
Description: "do a code review",
426-
Arguments: []*PromptArgument{{Name: "Code", Required: true}},
427-
},
428-
Handler: func(_ context.Context, _ *ServerSession, params *GetPromptParams) (*GetPromptResult, error) {
429-
return &GetPromptResult{
430-
Description: "Code review prompt",
431-
Messages: []*PromptMessage{
432-
{Role: "user", Content: &TextContent{Text: "Please review the following code: " + params.Arguments["Code"]}},
433-
},
434-
}, nil
435-
},
436-
},
437-
"fail": {
438-
Prompt: &Prompt{Name: "fail"},
439-
Handler: func(_ context.Context, _ *ServerSession, _ *GetPromptParams) (*GetPromptResult, error) {
440-
return nil, errTestFailure
441-
},
442-
},
443-
}
444-
445435
resource1 = &Resource{
446436
Name: "public",
447437
MIMEType: "text/plain",
@@ -458,11 +448,6 @@ var (
458448
URI: "embedded:info",
459449
}
460450
readHandler = fileResourceHandler("testdata/files")
461-
resources = map[string]*ServerResource{
462-
"info.txt": {resource1, readHandler},
463-
"fail.txt": {resource2, readHandler},
464-
"info": {resource3, handleEmbeddedResource},
465-
}
466451
)
467452

468453
var embeddedResources = map[string]string{

mcp/prompt.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import (
1111
// A PromptHandler handles a call to prompts/get.
1212
type PromptHandler func(context.Context, *ServerSession, *GetPromptParams) (*GetPromptResult, error)
1313

14-
// A Prompt is a prompt definition bound to a prompt handler.
15-
type ServerPrompt struct {
16-
Prompt *Prompt
17-
Handler PromptHandler
14+
type serverPrompt struct {
15+
prompt *Prompt
16+
handler PromptHandler
1817
}

mcp/resource.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ import (
2020
"github.com/modelcontextprotocol/go-sdk/internal/util"
2121
)
2222

23-
// A ServerResource associates a Resource with its handler.
24-
type ServerResource struct {
25-
Resource *Resource
26-
Handler ResourceHandler
23+
// A serverResource associates a Resource with its handler.
24+
type serverResource struct {
25+
resource *Resource
26+
handler ResourceHandler
2727
}
2828

29-
// A ServerResourceTemplate associates a ResourceTemplate with its handler.
30-
type ServerResourceTemplate struct {
31-
ResourceTemplate *ResourceTemplate
32-
Handler ResourceHandler
29+
// A serverResourceTemplate associates a ResourceTemplate with its handler.
30+
type serverResourceTemplate struct {
31+
resourceTemplate *ResourceTemplate
32+
handler ResourceHandler
3333
}
3434

3535
// A ResourceHandler is a function that reads a resource.
@@ -156,8 +156,8 @@ func fileRoot(root *Root) (_ string, err error) {
156156

157157
// Matches reports whether the receiver's uri template matches the uri.
158158
// TODO: use "github.com/yosida95/uritemplate/v3"
159-
func (sr *ServerResourceTemplate) Matches(uri string) bool {
160-
re, err := uriTemplateToRegexp(sr.ResourceTemplate.URITemplate)
159+
func (sr *serverResourceTemplate) Matches(uri string) bool {
160+
re, err := uriTemplateToRegexp(sr.resourceTemplate.URITemplate)
161161
if err != nil {
162162
return false
163163
}

0 commit comments

Comments
 (0)