Skip to content

Commit 73c35f7

Browse files
spachava753mattlgy
andcommitted
mcp: export server capabilities and add ClientSession InitializeResult accessor
Export ServerCapabilities and related subtypes and update protocol, server, and tests to use exported types. Add InitializeResult method on ClientSession for accessing the initialize result from sessions. Co-authored-by: Matt Liegey <[email protected]>
1 parent eb5eb06 commit 73c35f7

File tree

5 files changed

+64
-57
lines changed

5 files changed

+64
-57
lines changed

mcp/client.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ type clientSessionState struct {
177177
InitializeResult *InitializeResult
178178
}
179179

180+
func (cs *ClientSession) InitializeResult() *InitializeResult { return cs.state.InitializeResult }
181+
182+
func (cs *ClientSession) setConn(c Connection) {
183+
cs.mcpConn = c
184+
}
185+
180186
func (cs *ClientSession) ID() string {
181187
if c, ok := cs.mcpConn.(hasSessionID); ok {
182188
return c.SessionID()

mcp/protocol.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ type InitializeResult struct {
338338
// This property is reserved by the protocol to allow clients and servers to
339339
// attach additional metadata to their responses.
340340
Meta `json:"_meta,omitempty"`
341-
Capabilities *serverCapabilities `json:"capabilities"`
341+
Capabilities *ServerCapabilities `json:"capabilities"`
342342
// Instructions describing how to use the server and its features.
343343
//
344344
// This can be used by clients to improve the LLM's understanding of available
@@ -971,19 +971,19 @@ type Implementation struct {
971971
}
972972

973973
// Present if the server supports argument autocompletion suggestions.
974-
type completionCapabilities struct{}
974+
type CompletionCapabilities struct{}
975975

976976
// Present if the server supports sending log messages to the client.
977-
type loggingCapabilities struct{}
977+
type LoggingCapabilities struct{}
978978

979979
// Present if the server offers any prompt templates.
980-
type promptCapabilities struct {
980+
type PromptCapabilities struct {
981981
// Whether this server supports notifications for changes to the prompt list.
982982
ListChanged bool `json:"listChanged,omitempty"`
983983
}
984984

985985
// Present if the server offers any resources to read.
986-
type resourceCapabilities struct {
986+
type ResourceCapabilities struct {
987987
// Whether this server supports notifications for changes to the resource list.
988988
ListChanged bool `json:"listChanged,omitempty"`
989989
// Whether this server supports subscribing to resource updates.
@@ -993,23 +993,23 @@ type resourceCapabilities struct {
993993
// Capabilities that a server may support. Known capabilities are defined here,
994994
// in this schema, but this is not a closed set: any server can define its own,
995995
// additional capabilities.
996-
type serverCapabilities struct {
996+
type ServerCapabilities struct {
997997
// Present if the server supports argument autocompletion suggestions.
998-
Completions *completionCapabilities `json:"completions,omitempty"`
998+
Completions *CompletionCapabilities `json:"completions,omitempty"`
999999
// Experimental, non-standard capabilities that the server supports.
10001000
Experimental map[string]struct{} `json:"experimental,omitempty"`
10011001
// Present if the server supports sending log messages to the client.
1002-
Logging *loggingCapabilities `json:"logging,omitempty"`
1002+
Logging *LoggingCapabilities `json:"logging,omitempty"`
10031003
// Present if the server offers any prompt templates.
1004-
Prompts *promptCapabilities `json:"prompts,omitempty"`
1004+
Prompts *PromptCapabilities `json:"prompts,omitempty"`
10051005
// Present if the server offers any resources to read.
1006-
Resources *resourceCapabilities `json:"resources,omitempty"`
1006+
Resources *ResourceCapabilities `json:"resources,omitempty"`
10071007
// Present if the server offers any tools to call.
1008-
Tools *toolCapabilities `json:"tools,omitempty"`
1008+
Tools *ToolCapabilities `json:"tools,omitempty"`
10091009
}
10101010

10111011
// Present if the server offers any tools to call.
1012-
type toolCapabilities struct {
1012+
type ToolCapabilities struct {
10131013
// Whether this server supports notifications for changes to the tool list.
10141014
ListChanged bool `json:"listChanged,omitempty"`
10151015
}

mcp/server.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -242,27 +242,27 @@ func (s *Server) RemoveResourceTemplates(uriTemplates ...string) {
242242
func() bool { return s.resourceTemplates.remove(uriTemplates...) })
243243
}
244244

245-
func (s *Server) capabilities() *serverCapabilities {
245+
func (s *Server) capabilities() *ServerCapabilities {
246246
s.mu.Lock()
247247
defer s.mu.Unlock()
248248

249-
caps := &serverCapabilities{
250-
Logging: &loggingCapabilities{},
249+
caps := &ServerCapabilities{
250+
Logging: &LoggingCapabilities{},
251251
}
252252
if s.opts.HasTools || s.tools.len() > 0 {
253-
caps.Tools = &toolCapabilities{ListChanged: true}
253+
caps.Tools = &ToolCapabilities{ListChanged: true}
254254
}
255255
if s.opts.HasPrompts || s.prompts.len() > 0 {
256-
caps.Prompts = &promptCapabilities{ListChanged: true}
256+
caps.Prompts = &PromptCapabilities{ListChanged: true}
257257
}
258258
if s.opts.HasResources || s.resources.len() > 0 || s.resourceTemplates.len() > 0 {
259-
caps.Resources = &resourceCapabilities{ListChanged: true}
259+
caps.Resources = &ResourceCapabilities{ListChanged: true}
260260
if s.opts.SubscribeHandler != nil {
261261
caps.Resources.Subscribe = true
262262
}
263263
}
264264
if s.opts.CompletionHandler != nil {
265-
caps.Completions = &completionCapabilities{}
265+
caps.Completions = &CompletionCapabilities{}
266266
}
267267
return caps
268268
}

mcp/server_test.go

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -236,43 +236,43 @@ func TestServerCapabilities(t *testing.T) {
236236
name string
237237
configureServer func(s *Server)
238238
serverOpts ServerOptions
239-
wantCapabilities *serverCapabilities
239+
wantCapabilities *ServerCapabilities
240240
}{
241241
{
242242
name: "No capabilities",
243243
configureServer: func(s *Server) {},
244-
wantCapabilities: &serverCapabilities{
245-
Logging: &loggingCapabilities{},
244+
wantCapabilities: &ServerCapabilities{
245+
Logging: &LoggingCapabilities{},
246246
},
247247
},
248248
{
249249
name: "With prompts",
250250
configureServer: func(s *Server) {
251251
s.AddPrompt(&Prompt{Name: "p"}, nil)
252252
},
253-
wantCapabilities: &serverCapabilities{
254-
Logging: &loggingCapabilities{},
255-
Prompts: &promptCapabilities{ListChanged: true},
253+
wantCapabilities: &ServerCapabilities{
254+
Logging: &LoggingCapabilities{},
255+
Prompts: &PromptCapabilities{ListChanged: true},
256256
},
257257
},
258258
{
259259
name: "With resources",
260260
configureServer: func(s *Server) {
261261
s.AddResource(&Resource{URI: "file:///r"}, nil)
262262
},
263-
wantCapabilities: &serverCapabilities{
264-
Logging: &loggingCapabilities{},
265-
Resources: &resourceCapabilities{ListChanged: true},
263+
wantCapabilities: &ServerCapabilities{
264+
Logging: &LoggingCapabilities{},
265+
Resources: &ResourceCapabilities{ListChanged: true},
266266
},
267267
},
268268
{
269269
name: "With resource templates",
270270
configureServer: func(s *Server) {
271271
s.AddResourceTemplate(&ResourceTemplate{URITemplate: "file:///rt"}, nil)
272272
},
273-
wantCapabilities: &serverCapabilities{
274-
Logging: &loggingCapabilities{},
275-
Resources: &resourceCapabilities{ListChanged: true},
273+
wantCapabilities: &ServerCapabilities{
274+
Logging: &LoggingCapabilities{},
275+
Resources: &ResourceCapabilities{ListChanged: true},
276276
},
277277
},
278278
{
@@ -288,19 +288,19 @@ func TestServerCapabilities(t *testing.T) {
288288
return nil
289289
},
290290
},
291-
wantCapabilities: &serverCapabilities{
292-
Logging: &loggingCapabilities{},
293-
Resources: &resourceCapabilities{ListChanged: true, Subscribe: true},
291+
wantCapabilities: &ServerCapabilities{
292+
Logging: &LoggingCapabilities{},
293+
Resources: &ResourceCapabilities{ListChanged: true, Subscribe: true},
294294
},
295295
},
296296
{
297297
name: "With tools",
298298
configureServer: func(s *Server) {
299299
s.AddTool(tool, nil)
300300
},
301-
wantCapabilities: &serverCapabilities{
302-
Logging: &loggingCapabilities{},
303-
Tools: &toolCapabilities{ListChanged: true},
301+
wantCapabilities: &ServerCapabilities{
302+
Logging: &LoggingCapabilities{},
303+
Tools: &ToolCapabilities{ListChanged: true},
304304
},
305305
},
306306
{
@@ -311,9 +311,9 @@ func TestServerCapabilities(t *testing.T) {
311311
return nil, nil
312312
},
313313
},
314-
wantCapabilities: &serverCapabilities{
315-
Logging: &loggingCapabilities{},
316-
Completions: &completionCapabilities{},
314+
wantCapabilities: &ServerCapabilities{
315+
Logging: &LoggingCapabilities{},
316+
Completions: &CompletionCapabilities{},
317317
},
318318
},
319319
{
@@ -335,12 +335,12 @@ func TestServerCapabilities(t *testing.T) {
335335
return nil, nil
336336
},
337337
},
338-
wantCapabilities: &serverCapabilities{
339-
Completions: &completionCapabilities{},
340-
Logging: &loggingCapabilities{},
341-
Prompts: &promptCapabilities{ListChanged: true},
342-
Resources: &resourceCapabilities{ListChanged: true, Subscribe: true},
343-
Tools: &toolCapabilities{ListChanged: true},
338+
wantCapabilities: &ServerCapabilities{
339+
Completions: &CompletionCapabilities{},
340+
Logging: &LoggingCapabilities{},
341+
Prompts: &PromptCapabilities{ListChanged: true},
342+
Resources: &ResourceCapabilities{ListChanged: true, Subscribe: true},
343+
Tools: &ToolCapabilities{ListChanged: true},
344344
},
345345
},
346346
{
@@ -351,11 +351,11 @@ func TestServerCapabilities(t *testing.T) {
351351
HasResources: true,
352352
HasTools: true,
353353
},
354-
wantCapabilities: &serverCapabilities{
355-
Logging: &loggingCapabilities{},
356-
Prompts: &promptCapabilities{ListChanged: true},
357-
Resources: &resourceCapabilities{ListChanged: true},
358-
Tools: &toolCapabilities{ListChanged: true},
354+
wantCapabilities: &ServerCapabilities{
355+
Logging: &LoggingCapabilities{},
356+
Prompts: &PromptCapabilities{ListChanged: true},
357+
Resources: &ResourceCapabilities{ListChanged: true},
358+
Tools: &ToolCapabilities{ListChanged: true},
359359
},
360360
},
361361
}

mcp/streamable_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -409,9 +409,9 @@ func TestStreamableServerTransport(t *testing.T) {
409409
// Predefined steps, to avoid repetition below.
410410
initReq := req(1, methodInitialize, &InitializeParams{})
411411
initResp := resp(1, &InitializeResult{
412-
Capabilities: &serverCapabilities{
413-
Logging: &loggingCapabilities{},
414-
Tools: &toolCapabilities{ListChanged: true},
412+
Capabilities: &ServerCapabilities{
413+
Logging: &LoggingCapabilities{},
414+
Tools: &ToolCapabilities{ListChanged: true},
415415
},
416416
ProtocolVersion: latestProtocolVersion,
417417
ServerInfo: &Implementation{Name: "testServer", Version: "v1.0.0"},
@@ -891,9 +891,10 @@ func TestStreamableClientTransportApplicationJSON(t *testing.T) {
891891
}
892892
}
893893
initResult := &InitializeResult{
894-
Capabilities: &serverCapabilities{
895-
Logging: &loggingCapabilities{},
896-
Tools: &toolCapabilities{ListChanged: true},
894+
Capabilities: &ServerCapabilities{
895+
Completions: &CompletionCapabilities{},
896+
Logging: &LoggingCapabilities{},
897+
Tools: &ToolCapabilities{ListChanged: true},
897898
},
898899
ProtocolVersion: latestProtocolVersion,
899900
ServerInfo: &Implementation{Name: "testServer", Version: "v1.0.0"},

0 commit comments

Comments
 (0)