From a4c3b94bee4f07149e5af15b67f8132ff73526ef Mon Sep 17 00:00:00 2001 From: Sam Thanawalla Date: Thu, 31 Jul 2025 15:10:16 +0000 Subject: [PATCH] mcp/server: advertise completions only if installed Previously, completions would always be advertised as a capability even if the CompletionHandler was not installed by the server. This CL fixes that. --- mcp/server.go | 7 +-- mcp/server_test.go | 51 +++++++++++-------- mcp/streamable_test.go | 10 ++-- .../conformance/server/bad_requests.txtar | 1 - mcp/testdata/conformance/server/prompts.txtar | 1 - .../conformance/server/resources.txtar | 1 - mcp/testdata/conformance/server/tools.txtar | 1 - .../conformance/server/version-latest.txtar | 1 - .../conformance/server/version-older.txtar | 1 - 9 files changed, 38 insertions(+), 36 deletions(-) diff --git a/mcp/server.go b/mcp/server.go index 220c28d3..5cd280c9 100644 --- a/mcp/server.go +++ b/mcp/server.go @@ -238,9 +238,7 @@ func (s *Server) capabilities() *serverCapabilities { defer s.mu.Unlock() caps := &serverCapabilities{ - // TODO(samthanawalla): check for completionHandler before advertising capability. - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, + Logging: &loggingCapabilities{}, } if s.opts.HasTools || s.tools.len() > 0 { caps.Tools = &toolCapabilities{ListChanged: true} @@ -254,6 +252,9 @@ func (s *Server) capabilities() *serverCapabilities { caps.Resources.Subscribe = true } } + if s.opts.CompletionHandler != nil { + caps.Completions = &completionCapabilities{} + } return caps } diff --git a/mcp/server_test.go b/mcp/server_test.go index 79c607e9..0b853a33 100644 --- a/mcp/server_test.go +++ b/mcp/server_test.go @@ -242,8 +242,7 @@ func TestServerCapabilities(t *testing.T) { name: "No capabilities", configureServer: func(s *Server) {}, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, + Logging: &loggingCapabilities{}, }, }, { @@ -252,9 +251,8 @@ func TestServerCapabilities(t *testing.T) { s.AddPrompt(&Prompt{Name: "p"}, nil) }, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Prompts: &promptCapabilities{ListChanged: true}, + Logging: &loggingCapabilities{}, + Prompts: &promptCapabilities{ListChanged: true}, }, }, { @@ -263,9 +261,8 @@ func TestServerCapabilities(t *testing.T) { s.AddResource(&Resource{URI: "file:///r"}, nil) }, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Resources: &resourceCapabilities{ListChanged: true}, + Logging: &loggingCapabilities{}, + Resources: &resourceCapabilities{ListChanged: true}, }, }, { @@ -274,9 +271,8 @@ func TestServerCapabilities(t *testing.T) { s.AddResourceTemplate(&ResourceTemplate{URITemplate: "file:///rt"}, nil) }, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Resources: &resourceCapabilities{ListChanged: true}, + Logging: &loggingCapabilities{}, + Resources: &resourceCapabilities{ListChanged: true}, }, }, { @@ -293,9 +289,8 @@ func TestServerCapabilities(t *testing.T) { }, }, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Resources: &resourceCapabilities{ListChanged: true, Subscribe: true}, + Logging: &loggingCapabilities{}, + Resources: &resourceCapabilities{ListChanged: true, Subscribe: true}, }, }, { @@ -304,9 +299,21 @@ func TestServerCapabilities(t *testing.T) { s.AddTool(tool, nil) }, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, + Logging: &loggingCapabilities{}, + Tools: &toolCapabilities{ListChanged: true}, + }, + }, + { + name: "With completions", + configureServer: func(s *Server) {}, + serverOpts: ServerOptions{ + CompletionHandler: func(ctx context.Context, ss *ServerSession, params *CompleteParams) (*CompleteResult, error) { + return nil, nil + }, + }, + wantCapabilities: &serverCapabilities{ Logging: &loggingCapabilities{}, - Tools: &toolCapabilities{ListChanged: true}, + Completions: &completionCapabilities{}, }, }, { @@ -324,6 +331,9 @@ func TestServerCapabilities(t *testing.T) { UnsubscribeHandler: func(ctx context.Context, up *UnsubscribeParams) error { return nil }, + CompletionHandler: func(ctx context.Context, ss *ServerSession, params *CompleteParams) (*CompleteResult, error) { + return nil, nil + }, }, wantCapabilities: &serverCapabilities{ Completions: &completionCapabilities{}, @@ -342,11 +352,10 @@ func TestServerCapabilities(t *testing.T) { HasTools: true, }, wantCapabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Prompts: &promptCapabilities{ListChanged: true}, - Resources: &resourceCapabilities{ListChanged: true}, - Tools: &toolCapabilities{ListChanged: true}, + Logging: &loggingCapabilities{}, + Prompts: &promptCapabilities{ListChanged: true}, + Resources: &resourceCapabilities{ListChanged: true}, + Tools: &toolCapabilities{ListChanged: true}, }, }, } diff --git a/mcp/streamable_test.go b/mcp/streamable_test.go index 81af2760..af06bd39 100644 --- a/mcp/streamable_test.go +++ b/mcp/streamable_test.go @@ -314,9 +314,8 @@ func TestStreamableServerTransport(t *testing.T) { initReq := req(1, methodInitialize, &InitializeParams{}) initResp := resp(1, &InitializeResult{ Capabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Tools: &toolCapabilities{ListChanged: true}, + Logging: &loggingCapabilities{}, + Tools: &toolCapabilities{ListChanged: true}, }, ProtocolVersion: latestProtocolVersion, ServerInfo: &Implementation{Name: "testServer", Version: "v1.0.0"}, @@ -732,9 +731,8 @@ func TestStreamableClientTransportApplicationJSON(t *testing.T) { } initResult := &InitializeResult{ Capabilities: &serverCapabilities{ - Completions: &completionCapabilities{}, - Logging: &loggingCapabilities{}, - Tools: &toolCapabilities{ListChanged: true}, + Logging: &loggingCapabilities{}, + Tools: &toolCapabilities{ListChanged: true}, }, ProtocolVersion: latestProtocolVersion, ServerInfo: &Implementation{Name: "testServer", Version: "v1.0.0"}, diff --git a/mcp/testdata/conformance/server/bad_requests.txtar b/mcp/testdata/conformance/server/bad_requests.txtar index d2f278bc..97031c0d 100644 --- a/mcp/testdata/conformance/server/bad_requests.txtar +++ b/mcp/testdata/conformance/server/bad_requests.txtar @@ -41,7 +41,6 @@ code_review "id": 2, "result": { "capabilities": { - "completions": {}, "logging": {}, "prompts": { "listChanged": true diff --git a/mcp/testdata/conformance/server/prompts.txtar b/mcp/testdata/conformance/server/prompts.txtar index 078e0915..9868a659 100644 --- a/mcp/testdata/conformance/server/prompts.txtar +++ b/mcp/testdata/conformance/server/prompts.txtar @@ -25,7 +25,6 @@ code_review "id": 1, "result": { "capabilities": { - "completions": {}, "logging": {}, "prompts": { "listChanged": true diff --git a/mcp/testdata/conformance/server/resources.txtar b/mcp/testdata/conformance/server/resources.txtar index 5bb5515d..edbda73b 100644 --- a/mcp/testdata/conformance/server/resources.txtar +++ b/mcp/testdata/conformance/server/resources.txtar @@ -45,7 +45,6 @@ info.txt "id": 1, "result": { "capabilities": { - "completions": {}, "logging": {}, "resources": { "listChanged": true diff --git a/mcp/testdata/conformance/server/tools.txtar b/mcp/testdata/conformance/server/tools.txtar index 07ad942a..03f47d73 100644 --- a/mcp/testdata/conformance/server/tools.txtar +++ b/mcp/testdata/conformance/server/tools.txtar @@ -28,7 +28,6 @@ greet "id": 1, "result": { "capabilities": { - "completions": {}, "logging": {}, "tools": { "listChanged": true diff --git a/mcp/testdata/conformance/server/version-latest.txtar b/mcp/testdata/conformance/server/version-latest.txtar index 89454fb3..75317676 100644 --- a/mcp/testdata/conformance/server/version-latest.txtar +++ b/mcp/testdata/conformance/server/version-latest.txtar @@ -18,7 +18,6 @@ response with its latest supported version. "id": 1, "result": { "capabilities": { - "completions": {}, "logging": {} }, "protocolVersion": "2025-06-18", diff --git a/mcp/testdata/conformance/server/version-older.txtar b/mcp/testdata/conformance/server/version-older.txtar index 55240954..82292630 100644 --- a/mcp/testdata/conformance/server/version-older.txtar +++ b/mcp/testdata/conformance/server/version-older.txtar @@ -18,7 +18,6 @@ support. "id": 1, "result": { "capabilities": { - "completions": {}, "logging": {} }, "protocolVersion": "2024-11-05",