---
schema: rendered-html/v1
title: "Progress Monitoring - FastMCP"
source_url: https://gofastmcp.com/clients/progress
generated_at: 2026-06-11T19:37:23.913952+00:00
---




[FastMCP home page![light logo](images/gofastmcp__com__clients__progress__wordmark.avif)![dark logo](images/gofastmcp__com__clients__progress__wordmark-white.avif)](gofastmcp__com.md)







Operations

Progress Monitoring

















  - [Tools](gofastmcp__com__clients__tools.md)
  - [Resources](gofastmcp__com__clients__resources.md)
  - [Prompts](gofastmcp__com__clients__prompts.md)
  - [Sampling](gofastmcp__com__clients__sampling.md)
  - [Elicitation](gofastmcp__com__clients__elicitation.md)
  - [Tasks

    NEW](gofastmcp__com__clients__tasks.md)
  - [Progress](/clients/progress)
  - [Logging](gofastmcp__com__clients__logging.md)
  - [Roots](gofastmcp__com__clients__roots.md)
  - [Notifications](gofastmcp__com__clients__notifications.md)






- [Progress Handler](#progress-handler)
- [Per-Call Handler](#per-call-handler)

Operations

# Progress Monitoring


Handle progress notifications from long-running server operations.


New in version `2.3.5`
Use this when you need to track progress of long-running operations.
MCP servers can report progress during operations. The client receives these updates through a progress handler.

## [​](#progress-handler) Progress Handler

Set a handler when creating the client:


async def progress_handler(
    progress: float,
    total: float | None,
    message: str | None
) -> None:
    if total is not None:
        percentage = (progress / total) * 100
        print(f"Progress: {percentage:.1f}% - {message or ''}")
    else:
        print(f"Progress: {progress} - {message or ''}")

client = Client(
    "my_mcp_server.py",
    progress_handler=progress_handler

The handler receives three parameters:

## Handler Parameters

[​](#param-progress)

progress

float

Current progress value

[​](#param-total)

total

float | None

Expected total value (may be None if unknown)

[​](#param-message)

message

str | None

Optional status message

## [​](#per-call-handler) Per-Call Handler

Override the client-level handler for specific tool calls:

async with client:
    result = await client.call_tool(
        "long_running_task",
        {"param": "value"},
        progress_handler=my_progress_handler

[Background Tasks

Previous](gofastmcp__com__clients__tasks.md)[Server Logging

Next](gofastmcp__com__clients__logging.md)






