Skip to content

Commit 9e66f7c

Browse files
aksheydihrpr
andauthored
feat: add message to ProgressNotification (#435)
Co-authored-by: ihrpr <[email protected]>
1 parent c578212 commit 9e66f7c

File tree

9 files changed

+387
-12
lines changed

9 files changed

+387
-12
lines changed

src/mcp/client/session.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@ async def send_ping(self) -> types.EmptyResult:
168168
)
169169

170170
async def send_progress_notification(
171-
self, progress_token: str | int, progress: float, total: float | None = None
171+
self,
172+
progress_token: str | int,
173+
progress: float,
174+
total: float | None = None,
175+
message: str | None = None,
172176
) -> None:
173177
"""Send a progress notification."""
174178
await self.send_notification(
@@ -179,6 +183,7 @@ async def send_progress_notification(
179183
progressToken=progress_token,
180184
progress=progress,
181185
total=total,
186+
message=message,
182187
),
183188
),
184189
)

src/mcp/server/fastmcp/server.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -952,13 +952,14 @@ def request_context(self) -> RequestContext[ServerSessionT, LifespanContextT]:
952952
return self._request_context
953953

954954
async def report_progress(
955-
self, progress: float, total: float | None = None
955+
self, progress: float, total: float | None = None, message: str | None = None
956956
) -> None:
957957
"""Report progress for the current operation.
958958
959959
Args:
960960
progress: Current progress value e.g. 24
961961
total: Optional total value e.g. 100
962+
message: Optional message e.g. Starting render...
962963
"""
963964

964965
progress_token = (
@@ -971,7 +972,10 @@ async def report_progress(
971972
return
972973

973974
await self.request_context.session.send_progress_notification(
974-
progress_token=progress_token, progress=progress, total=total
975+
progress_token=progress_token,
976+
progress=progress,
977+
total=total,
978+
message=message,
975979
)
976980

977981
async def read_resource(self, uri: str | AnyUrl) -> Iterable[ReadResourceContents]:

src/mcp/server/lowlevel/server.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ async def handle_list_resource_templates() -> list[types.ResourceTemplate]:
3737
3. Define notification handlers if needed:
3838
@server.progress_notification()
3939
async def handle_progress(
40-
progress_token: str | int, progress: float, total: float | None
40+
progress_token: str | int, progress: float, total: float | None,
41+
message: str | None
4142
) -> None:
4243
# Implementation
4344
@@ -427,13 +428,18 @@ async def handler(req: types.CallToolRequest):
427428

428429
def progress_notification(self):
429430
def decorator(
430-
func: Callable[[str | int, float, float | None], Awaitable[None]],
431+
func: Callable[
432+
[str | int, float, float | None, str | None], Awaitable[None]
433+
],
431434
):
432435
logger.debug("Registering handler for ProgressNotification")
433436

434437
async def handler(req: types.ProgressNotification):
435438
await func(
436-
req.params.progressToken, req.params.progress, req.params.total
439+
req.params.progressToken,
440+
req.params.progress,
441+
req.params.total,
442+
req.params.message,
437443
)
438444

439445
self.notification_handlers[types.ProgressNotification] = handler

src/mcp/server/session.py

+2
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ async def send_progress_notification(
282282
progress_token: str | int,
283283
progress: float,
284284
total: float | None = None,
285+
message: str | None = None,
285286
related_request_id: str | None = None,
286287
) -> None:
287288
"""Send a progress notification."""
@@ -293,6 +294,7 @@ async def send_progress_notification(
293294
progressToken=progress_token,
294295
progress=progress,
295296
total=total,
297+
message=message,
296298
),
297299
)
298300
),

src/mcp/shared/progress.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ class ProgressContext(
4343
total: float | None
4444
current: float = field(default=0.0, init=False)
4545

46-
async def progress(self, amount: float) -> None:
46+
async def progress(self, amount: float, message: str | None = None) -> None:
4747
self.current += amount
4848

4949
await self.session.send_progress_notification(
50-
self.progress_token, self.current, total=self.total
50+
self.progress_token, self.current, total=self.total, message=message
5151
)
5252

5353

src/mcp/shared/session.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,11 @@ async def _received_notification(self, notification: ReceiveNotificationT) -> No
401401
"""
402402

403403
async def send_progress_notification(
404-
self, progress_token: str | int, progress: float, total: float | None = None
404+
self,
405+
progress_token: str | int,
406+
progress: float,
407+
total: float | None = None,
408+
message: str | None = None,
405409
) -> None:
406410
"""
407411
Sends a progress notification for a request that is currently being

src/mcp/types.py

+5
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,11 @@ class ProgressNotificationParams(NotificationParams):
337337
total is unknown.
338338
"""
339339
total: float | None = None
340+
"""
341+
Message related to progress. This should provide relevant human readable
342+
progress information.
343+
"""
344+
message: str | None = None
340345
"""Total number of items to process (or total progress required), if known."""
341346
model_config = ConfigDict(extra="allow")
342347

tests/issues/test_176_progress_token.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ async def test_progress_token_zero_first_call():
3939
mock_session.send_progress_notification.call_count == 3
4040
), "All progress notifications should be sent"
4141
mock_session.send_progress_notification.assert_any_call(
42-
progress_token=0, progress=0.0, total=10.0
42+
progress_token=0, progress=0.0, total=10.0, message=None
4343
)
4444
mock_session.send_progress_notification.assert_any_call(
45-
progress_token=0, progress=5.0, total=10.0
45+
progress_token=0, progress=5.0, total=10.0, message=None
4646
)
4747
mock_session.send_progress_notification.assert_any_call(
48-
progress_token=0, progress=10.0, total=10.0
48+
progress_token=0, progress=10.0, total=10.0, message=None
4949
)

0 commit comments

Comments
 (0)