Include context into completions (#966)

This commit is contained in:
Inna Harper
2025-06-17 09:33:25 +01:00
committed by GitHub
parent 7b420656de
commit a3bcabdce2
7 changed files with 363 additions and 7 deletions

View File

@@ -304,8 +304,13 @@ class ClientSession(
self,
ref: types.ResourceTemplateReference | types.PromptReference,
argument: dict[str, str],
context_arguments: dict[str, str] | None = None,
) -> types.CompleteResult:
"""Send a completion/complete request."""
context = None
if context_arguments is not None:
context = types.CompletionContext(arguments=context_arguments)
return await self.send_request(
types.ClientRequest(
types.CompleteRequest(
@@ -313,6 +318,7 @@ class ClientSession(
params=types.CompleteRequestParams(
ref=ref,
argument=types.CompletionArgument(**argument),
context=context,
),
)
),

View File

@@ -364,6 +364,24 @@ class FastMCP:
return decorator
def completion(self):
"""Decorator to register a completion handler.
The completion handler receives:
- ref: PromptReference or ResourceTemplateReference
- argument: CompletionArgument with name and partial value
- context: Optional CompletionContext with previously resolved arguments
Example:
@mcp.completion()
async def handle_completion(ref, argument, context):
if isinstance(ref, ResourceTemplateReference):
# Return completions based on ref, argument, and context
return Completion(values=["option1", "option2"])
return None
"""
return self._mcp_server.completion()
def add_resource(self, resource: Resource) -> None:
"""Add a resource to the server.

View File

@@ -433,6 +433,7 @@ class Server(Generic[LifespanResultT, RequestT]):
[
types.PromptReference | types.ResourceTemplateReference,
types.CompletionArgument,
types.CompletionContext | None,
],
Awaitable[types.Completion | None],
],
@@ -440,7 +441,7 @@ class Server(Generic[LifespanResultT, RequestT]):
logger.debug("Registering handler for CompleteRequest")
async def handler(req: types.CompleteRequest):
completion = await func(req.params.ref, req.params.argument)
completion = await func(req.params.ref, req.params.argument, req.params.context)
return types.ServerResult(
types.CompleteResult(
completion=completion

View File

@@ -1028,11 +1028,21 @@ class CompletionArgument(BaseModel):
model_config = ConfigDict(extra="allow")
class CompletionContext(BaseModel):
"""Additional, optional context for completions."""
arguments: dict[str, str] | None = None
"""Previously-resolved variables in a URI template or prompt."""
model_config = ConfigDict(extra="allow")
class CompleteRequestParams(RequestParams):
"""Parameters for completion requests."""
ref: ResourceTemplateReference | PromptReference
argument: CompletionArgument
context: CompletionContext | None = None
"""Additional, optional context for completions"""
model_config = ConfigDict(extra="allow")