In depth
Progress notifications solve the 'is this thing still working?' problem for long-running MCP tool calls. Without them, the client (and the user) sees a frozen UI until the tool returns. With them, the server streams updates — 'downloading', '42% complete', 'parsing' — keeping the UX responsive.
The mechanism: when the client calls a tool, it can include a `_meta.progressToken` in the request (any opaque value it chooses). The server sends `notifications/progress` messages with that token, a `progress` number, and optional `total` plus `message` text. The client routes these to the UI.
Progress is one-way (server→client) and advisory — not every operation needs to emit progress. Fast tools skip it. Long-running data imports, video processing, or multi-step scrapes benefit enormously.
The progress token convention also enables cancellation: the client can send `notifications/cancelled` with the same token, and a well-behaved server will abort the in-flight work.