From 8847e77482f44fffa5f6d5e79080f7309eec91c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Barthelet?= Date: Sat, 31 May 2025 16:53:12 +0200 Subject: [PATCH 1/4] Fix typo in docs regarding server capabilities key for completions https://modelcontextprotocol.io/specification/2025-03-26/server/utilities/completion#capabilities states it should be completions and not completion --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 412143a9f5..2207399308 100644 --- a/README.md +++ b/README.md @@ -1204,13 +1204,13 @@ The MCP protocol defines three core primitives that servers can implement: MCP servers declare capabilities during initialization: -| Capability | Feature Flag | Description | -|-------------|------------------------------|------------------------------------| -| `prompts` | `listChanged` | Prompt template management | -| `resources` | `subscribe`
`listChanged`| Resource exposure and updates | -| `tools` | `listChanged` | Tool discovery and execution | -| `logging` | - | Server logging configuration | -| `completion`| - | Argument completion suggestions | +| Capability | Feature Flag | Description | +|--------------|------------------------------|------------------------------------| +| `prompts` | `listChanged` | Prompt template management | +| `resources` | `subscribe`
`listChanged`| Resource exposure and updates | +| `tools` | `listChanged` | Tool discovery and execution | +| `logging` | - | Server logging configuration | +| `completions`| - | Argument completion suggestions | ## Documentation From d9d4038a316b168a7192a9891faa5e63139a5dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Barthelet?= Date: Sat, 31 May 2025 16:54:12 +0200 Subject: [PATCH 2/4] Adding completions in server capabilities --- src/mcp/server/lowlevel/server.py | 6 ++++++ src/mcp/types.py | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/mcp/server/lowlevel/server.py b/src/mcp/server/lowlevel/server.py index faad95aca6..562de31b79 100644 --- a/src/mcp/server/lowlevel/server.py +++ b/src/mcp/server/lowlevel/server.py @@ -190,6 +190,7 @@ def get_capabilities( resources_capability = None tools_capability = None logging_capability = None + completions_capability = None # Set prompt capabilities if handler exists if types.ListPromptsRequest in self.request_handlers: @@ -209,12 +210,17 @@ def get_capabilities( if types.SetLevelRequest in self.request_handlers: logging_capability = types.LoggingCapability() + # Set completions capabilities if handler exists + if types.CompleteRequest in self.request_handlers: + completions_capability = types.CompletionsCapability() + return types.ServerCapabilities( prompts=prompts_capability, resources=resources_capability, tools=tools_capability, logging=logging_capability, experimental=experimental_capabilities, + completions=completions_capability, ) @property diff --git a/src/mcp/types.py b/src/mcp/types.py index 4a9c2bf1a2..e3ba1d7df9 100644 --- a/src/mcp/types.py +++ b/src/mcp/types.py @@ -286,6 +286,12 @@ class LoggingCapability(BaseModel): model_config = ConfigDict(extra="allow") +class CompletionsCapability(BaseModel): + """Capability for completions operations.""" + + model_config = ConfigDict(extra="allow") + + class ServerCapabilities(BaseModel): """Capabilities that a server may support.""" @@ -299,6 +305,10 @@ class ServerCapabilities(BaseModel): """Present if the server offers any resources to read.""" tools: ToolsCapability | None = None """Present if the server offers any tools to call.""" + completions: CompletionsCapability | None = None + """ + Present if the server offers autocompletion suggestions for prompts and resources. + """ model_config = ConfigDict(extra="allow") From 7619ded43840343293badc3548b2572f335b7a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Barthelet?= Date: Sat, 31 May 2025 17:31:45 +0200 Subject: [PATCH 3/4] Add test for completions capability exposition by server --- tests/server/test_session.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/server/test_session.py b/tests/server/test_session.py index 69321f87c5..2a205a7d0d 100644 --- a/tests/server/test_session.py +++ b/tests/server/test_session.py @@ -11,8 +11,13 @@ from mcp.shared.session import RequestResponder from mcp.types import ( ClientNotification, + Completion, + CompletionArgument, + CompletionsCapability, InitializedNotification, + PromptReference, PromptsCapability, + ResourceReference, ResourcesCapability, ServerCapabilities, ) @@ -80,6 +85,7 @@ async def test_server_capabilities(): caps = server.get_capabilities(notification_options, experimental_capabilities) assert caps.prompts is None assert caps.resources is None + assert caps.completions is None # Add a prompts handler @server.list_prompts() @@ -89,6 +95,7 @@ async def list_prompts(): caps = server.get_capabilities(notification_options, experimental_capabilities) assert caps.prompts == PromptsCapability(listChanged=False) assert caps.resources is None + assert caps.completions is None # Add a resources handler @server.list_resources() @@ -98,6 +105,21 @@ async def list_resources(): caps = server.get_capabilities(notification_options, experimental_capabilities) assert caps.prompts == PromptsCapability(listChanged=False) assert caps.resources == ResourcesCapability(subscribe=False, listChanged=False) + assert caps.completions is None + + # Add a complete handler + @server.completion() + async def complete( + ref: PromptReference | ResourceReference, argument: CompletionArgument + ): + return Completion( + values=["completion1", "completion2"], + ) + + caps = server.get_capabilities(notification_options, experimental_capabilities) + assert caps.prompts == PromptsCapability(listChanged=False) + assert caps.resources == ResourcesCapability(subscribe=False, listChanged=False) + assert caps.completions == CompletionsCapability() @pytest.mark.anyio From 0dfa3430d383e434aeacc8a02edbe8f47a747030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Barthelet?= Date: Mon, 7 Jul 2025 09:11:49 +0200 Subject: [PATCH 4/4] Run format --- src/mcp/types.py | 4 +--- tests/server/test_session.py | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/mcp/types.py b/src/mcp/types.py index e3ba1d7df9..91432d69c5 100644 --- a/src/mcp/types.py +++ b/src/mcp/types.py @@ -306,9 +306,7 @@ class ServerCapabilities(BaseModel): tools: ToolsCapability | None = None """Present if the server offers any tools to call.""" completions: CompletionsCapability | None = None - """ - Present if the server offers autocompletion suggestions for prompts and resources. - """ + """Present if the server offers autocompletion suggestions for prompts and resources.""" model_config = ConfigDict(extra="allow") diff --git a/tests/server/test_session.py b/tests/server/test_session.py index 2a205a7d0d..d00eda8750 100644 --- a/tests/server/test_session.py +++ b/tests/server/test_session.py @@ -109,9 +109,7 @@ async def list_resources(): # Add a complete handler @server.completion() - async def complete( - ref: PromptReference | ResourceReference, argument: CompletionArgument - ): + async def complete(ref: PromptReference | ResourceReference, argument: CompletionArgument): return Completion( values=["completion1", "completion2"], )