Skip to content

Commit 9a2bd4f

Browse files
g97iulio1609Copilot
andcommitted
feat(server): expose progress_callback on ServerSession request methods
Add progress_callback parameter to create_message(), elicit_form(), elicit_url(), and the deprecated elicit() wrapper so that server code can receive bidirectional progress notifications from the client during sampling and elicitation requests. BaseSession.send_request() already supports progress_callback, but none of the ServerSession convenience methods forwarded it — callers had no way to pass the parameter without dropping down to send_request(). Closes #1650 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 62575ed commit 9a2bd4f

1 file changed

Lines changed: 12 additions & 1 deletion

File tree

src/mcp/server/session.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ async def handle_list_prompts(ctx: RequestContext, params) -> ListPromptsResult:
4646
from mcp.shared.message import ServerMessageMetadata, SessionMessage
4747
from mcp.shared.session import (
4848
BaseSession,
49+
ProgressFnT,
4950
RequestResponder,
5051
)
5152
from mcp.shared.version import SUPPORTED_PROTOCOL_VERSIONS
@@ -245,6 +246,7 @@ async def create_message(
245246
tools: None = None,
246247
tool_choice: types.ToolChoice | None = None,
247248
related_request_id: types.RequestId | None = None,
249+
progress_callback: ProgressFnT | None = None,
248250
) -> types.CreateMessageResult:
249251
"""Overload: Without tools, returns single content."""
250252
...
@@ -264,6 +266,7 @@ async def create_message(
264266
tools: list[types.Tool],
265267
tool_choice: types.ToolChoice | None = None,
266268
related_request_id: types.RequestId | None = None,
269+
progress_callback: ProgressFnT | None = None,
267270
) -> types.CreateMessageResultWithTools:
268271
"""Overload: With tools, returns array-capable content."""
269272
...
@@ -282,6 +285,7 @@ async def create_message(
282285
tools: list[types.Tool] | None = None,
283286
tool_choice: types.ToolChoice | None = None,
284287
related_request_id: types.RequestId | None = None,
288+
progress_callback: ProgressFnT | None = None,
285289
) -> types.CreateMessageResult | types.CreateMessageResultWithTools:
286290
"""Send a sampling/create_message request.
287291
@@ -338,11 +342,13 @@ async def create_message(
338342
request=request,
339343
result_type=types.CreateMessageResultWithTools,
340344
metadata=metadata_obj,
345+
progress_callback=progress_callback,
341346
)
342347
return await self.send_request(
343348
request=request,
344349
result_type=types.CreateMessageResult,
345350
metadata=metadata_obj,
351+
progress_callback=progress_callback,
346352
)
347353

348354
async def list_roots(self) -> types.ListRootsResult:
@@ -359,6 +365,7 @@ async def elicit(
359365
message: str,
360366
requested_schema: types.ElicitRequestedSchema,
361367
related_request_id: types.RequestId | None = None,
368+
progress_callback: ProgressFnT | None = None,
362369
) -> types.ElicitResult:
363370
"""Send a form mode elicitation/create request.
364371
@@ -374,13 +381,14 @@ async def elicit(
374381
This method is deprecated in favor of elicit_form(). It remains for
375382
backward compatibility but new code should use elicit_form().
376383
"""
377-
return await self.elicit_form(message, requested_schema, related_request_id)
384+
return await self.elicit_form(message, requested_schema, related_request_id, progress_callback=progress_callback)
378385

379386
async def elicit_form(
380387
self,
381388
message: str,
382389
requested_schema: types.ElicitRequestedSchema,
383390
related_request_id: types.RequestId | None = None,
391+
progress_callback: ProgressFnT | None = None,
384392
) -> types.ElicitResult:
385393
"""Send a form mode elicitation/create request.
386394
@@ -406,6 +414,7 @@ async def elicit_form(
406414
),
407415
types.ElicitResult,
408416
metadata=ServerMessageMetadata(related_request_id=related_request_id),
417+
progress_callback=progress_callback,
409418
)
410419

411420
async def elicit_url(
@@ -414,6 +423,7 @@ async def elicit_url(
414423
url: str,
415424
elicitation_id: str,
416425
related_request_id: types.RequestId | None = None,
426+
progress_callback: ProgressFnT | None = None,
417427
) -> types.ElicitResult:
418428
"""Send a URL mode elicitation/create request.
419429
@@ -444,6 +454,7 @@ async def elicit_url(
444454
),
445455
types.ElicitResult,
446456
metadata=ServerMessageMetadata(related_request_id=related_request_id),
457+
progress_callback=progress_callback,
447458
)
448459

449460
async def send_ping(self) -> types.EmptyResult: # pragma: no cover

0 commit comments

Comments
 (0)