Skip to content

Remove Server#notify_progress broadcast API#276

Merged
koic merged 1 commit intomodelcontextprotocol:mainfrom
koic:remove_notify_progress_broadcast
Mar 29, 2026
Merged

Remove Server#notify_progress broadcast API#276
koic merged 1 commit intomodelcontextprotocol:mainfrom
koic:remove_notify_progress_broadcast

Conversation

@koic
Copy link
Copy Markdown
Member

@koic koic commented Mar 29, 2026

Motivation and Context

Server#notify_progress broadcasts progress notifications to all connected clients. Progress notifications are tied to a specific request's progressToken and have no meaningful broadcast use case. Neither the Python SDK nor the TypeScript SDK provides a server-level progress broadcast capability.

The MCP specification requires that progress notifications only reference tokens provided in an active request:

Progress notifications MUST only reference tokens that:

  • Were provided in an active request
  • Are associated with an in-progress operation

Ref: https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/progress

Broadcasting progress to all clients does not comply with this requirement, since clients that did not originate the request have no matching progressToken.

The introduction of ServerSession for per-connection state (#275) made this removal possible: Progress and ServerContext now use notification_target: (a ServerSession) to route notifications to the originating session only.

Changes

  • Removed Server#notify_progress entirely. The method is no longer needed as notification_target in call_tool_with_args now passes session directly (nil when no session is available, in which case Progress#report and ServerContext#notify_log_message are no-ops).
  • Removed ServerContext#notify_progress as well. Progress notifications should only be sent via server_context.report_progress, which enforces the correct progressToken from the originating request.
  • Added nil guards to Progress#report and ServerContext#notify_log_message for when no session is available.
  • Rewrote progress tests to use ServerSession#handle instead of Server#handle, reflecting that progress notifications are always session-scoped.
  • Removed 4 tests that called server.notify_progress directly as a public broadcast API.
  • Removed notify_progress from the README.md notification methods list.
  • Removed the "Server-Side: Direct notify_progress Usage" section from the README.md.

Progress notifications should be sent via server_context.report_progress inside tool handlers, which automatically scopes them to the originating client session.

Breaking Changes

Progress notifications are scoped to a specific request via progressToken per the MCP specification, so the broadcast behavior of Server#notify_progress was a spec violation. This is treated as a bug fix and is made without a deprecation period. This aligns the Ruby SDK with the Python and TypeScript SDKs, neither of which provides a server-level progress broadcast API.

Server#notify_progress and ServerContext#notify_progress are no longer available. Users should use server_context.report_progress inside tool handlers instead, which provides session-scoped delivery with the correct progressToken.

This feature was only recently introduced in mcp 0.9.0: https://github.com/modelcontextprotocol/ruby-sdk/releases/tag/v0.9.0

So an early release should help limit its impact on adoption.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update

Checklist

  • I have read the MCP Documentation
  • My code follows the repository's style guidelines
  • New and existing tests pass locally
  • I have added appropriate error handling
  • I have added or updated documentation as needed

## Motivation and Context

`Server#notify_progress` broadcasts progress notifications to all connected clients.
Progress notifications are tied to a specific request's `progressToken` and have no
meaningful broadcast use case. Neither the Python SDK nor the TypeScript SDK provides
a server-level progress broadcast capability.

The MCP specification requires that progress notifications only reference tokens
provided in an active request:

> Progress notifications MUST only reference tokens that:
> - Were provided in an active request
> - Are associated with an in-progress operation

Ref: https://modelcontextprotocol.io/specification/2025-11-25/basic/utilities/progress

Broadcasting progress to all clients does not comply with this requirement,
since clients that did not originate the request have no matching `progressToken`.

The introduction of `ServerSession` for per-connection state (modelcontextprotocol#275) made
this removal possible: `Progress` and `ServerContext` now use `notification_target:`
(a `ServerSession`) to route notifications to the originating session only.

### Changes

- Removed `Server#notify_progress` entirely. The method is no longer needed as
  `notification_target` in `call_tool_with_args` now passes `session` directly
  (nil when no session is available, in which case `Progress#report` and
  `ServerContext#notify_log_message` are no-ops).
- Removed `ServerContext#notify_progress` as well. Progress notifications should
  only be sent via `server_context.report_progress`, which enforces the correct
  `progressToken` from the originating request.
- Added nil guards to `Progress#report` and `ServerContext#notify_log_message`
  for when no session is available.
- Rewrote progress tests to use `ServerSession#handle` instead of
  `Server#handle`, reflecting that progress notifications are always session-scoped.
- Removed 4 tests that called `server.notify_progress` directly as a public broadcast API.
- Removed `notify_progress` from the README.md notification methods list.
- Removed the "Server-Side: Direct `notify_progress` Usage" section from the README.md.

Progress notifications should be sent via `server_context.report_progress` inside tool handlers,
which automatically scopes them to the originating client session.

## Breaking Changes

Progress notifications are scoped to a specific request via `progressToken` per the MCP specification,
so the broadcast behavior of `Server#notify_progress` was a spec violation.
This is treated as a bug fix and is made without a deprecation period.
This aligns the Ruby SDK with the Python and TypeScript SDKs, neither of which provides
a server-level progress broadcast API.

`Server#notify_progress` and `ServerContext#notify_progress` are no longer available.
Users should use `server_context.report_progress` inside tool handlers instead, which
provides session-scoped delivery with the correct `progressToken`.

This feature was only recently introduced in mcp 0.9.0:
https://github.com/modelcontextprotocol/ruby-sdk/releases/tag/v0.9.0

So an early release should help limit its impact on adoption.
@koic koic merged commit 9f3435a into modelcontextprotocol:main Mar 29, 2026
11 checks passed
@koic koic deleted the remove_notify_progress_broadcast branch March 29, 2026 06:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants