Skip to content

Commit 75f9999

Browse files
mattlgyspachava753
andauthored
feat(mcp): export initialized result in client session (#320)
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. Fixes: #166 Co-authored-by: Shashank Pachava <[email protected]>
1 parent 767dacb commit 75f9999

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)