Context, Progress Reporting & Lifespan în Servere MCP în Model Context Protocol (MCP)

Gestionarea conexiunilor persistente la baze de date (Lifespan), raportarea progresului în timp real către utilizator și logarea structurată în timpul execuției unei unelte MCP.

Specificație & cod MCP
@mcp.tool()
async def proceseaza_lot(fisiere: list[str], ctx: Context) -> str:
    """Procesează fișierele cu raportare de progres."""
    for i, f in enumerate(fisiere):
        await ctx.info(f"Procesez {f}...")
        await ctx.report_progress(i + 1, len(fisiere))
    return "Lot finalizat cu succes!"

Descriere & Utilizare

Într-un server MCP de producție, nu vrei să deschizi și să închizi conexiunea la baza de date PostgreSQL sau clientul HTTP la fiecare apel de unealtă. De asemenea, când o unealtă durează 15 secunde, utilizatorul și Host-ul au nevoie de feedback că operațiunea avansează.

În FastMCP, poți defini un context manager asincron lifespan la inițializarea serverului: acesta creează pool-ul de conexiuni o singură dată la pornirea serverului și îl închide curat la oprire.

În interiorul oricărei unelte, adăugarea parametrului tipizat ctx: Context îți oferă acces la conexiunile din lifespan, la logare structurată către client (ctx.info(), ctx.warning(), ctx.error()) și la bara de progres în timp real (ctx.report_progress(curent, total)).

Cum să o reții ușor

💡 Lifespan este încălzirea motorului și deschiderea atelierului dimineața (o singură dată), iar obiectul Context este stația walkie-talkie prin care îi transmiți clientului „Sunt la pasul 3 din 5, mai durează puțin”.

Opțiuni și parametri tehnici

  • ctx: Context: injectat automat de FastMCP în orice unealtă care declară acest parametru (nu apare în schema văzută de LLM!).
  • await ctx.report_progress(progress, total): trimite notificări notifications/progress către aplicația Host.
  • await ctx.info(...) / ctx.error(...): trimite mesaje de log oficiale prin protocolul MCP fără a polua fluxul stdout.
  • ctx.request_context.lifespan_context: accesează obiectele partajate (pool DB, client API) inițializate la pornire.

Exemple practice și cazuri de utilizare

  • Citirea unei resurse din interiorul unei unelte: date = await ctx.read_resource("config://app/setari")
  • Solicitarea unei completări LLM (Sampling) din unealtă: rezultat = await ctx.session.create_message(...)
  • Raportare progres la descărcări sau indexări: apelează await ctx.report_progress(pas, total_pasi) în bucla for.

Sfaturi de configurare & capcane

Parametrul ctx: Context este invizibil pentru LLM — FastMCP îl exclude automat din JSON Schema și îl populează singur la momentul execuției.

Comenzi și ghiduri înrudite