Ana içeriğe geç

İptal

Makine çevirisi

Bu sayfa İngilizce dokümantasyondan otomatik olarak çevrildi; esas alınması gereken sürüm İngilizce sayfadır. Yanlış görünen bir şey varsa, nasıl bildireceğinizi Çeviriler sayfası açıklar.

İstemci bir çağrıdan vazgeçebilir: kullanıcı durdur düğmesine basmıştır ya da zaman aşımı süresi dolmuştur.

Bu olduğunda SDK işleyicinizi iptal eder. İşleyicinin beklediği await istisna fırlatır, fonksiyon geri sarılır ve döndürdüğü hiçbir şey gönderilmez. Çoğu işleyicinin bu konuda bir şey yapması gerekmez.

İki tür işleyicinin ise gerekir: temizlemesi gereken bir şey olan işleyici ve düz bir def olan işleyici.

async def araçta temizlik yapma

Temizliği bir finally bloğuna koyun:

server.py
import anyio

from mcp.server import MCPServer

mcp = MCPServer("Bookshop")

holds: set[str] = set()


async def take_payment(title: str) -> None:
    await anyio.sleep(30)  # the customer is typing a card number


async def release_hold(title: str) -> None:
    await anyio.sleep(0.1)  # a round trip to the stock system
    holds.discard(title)


@mcp.tool()
async def order_book(title: str) -> str:
    """Hold a copy of a book while the customer pays for it."""
    holds.add(title)
    try:
        await take_payment(title)
        return f"Ordered {title!r}."
    finally:
        with anyio.move_on_after(5, shield=True):
            await release_hold(title)
  • finally, araç nasıl biterse bitsin çalışır: değer döndürmüş, istisna fırlatmış ya da iptal edilmiş olabilir.
  • await kullanmak zorunda olan temizlik için shield=True gerekir. İptal edilmiş bir işleyicide sonraki her await de istisna fırlatır; bu yüzden koruma olmadan release_hold ilk satırında dururdu.
  • Korumalı bir bloğu hiçbir şey iptal edemez, bu yüzden ona bir süre sınırı verin. Burada bu sınır 5 saniye.

Tip

except değil, finally kullanın. Temizliğiniz bittikten sonra iptalin yukarı doğru ilerlemeye devam etmesi gerekir; finally buna izin verir.

Düz def araçta erken durma

Düz bir def araç bir iş parçacığında çalışır ve bir iş parçacığını dışarıdan hiçbir şey kesemez. Aracın kendisinin sorması gerekir:

server.py
import time

import anyio.from_thread

from mcp.server import MCPServer

mcp = MCPServer("Bookshop")

offline: set[str] = set()


def index_book(title: str) -> None:
    time.sleep(1)  # slow work with nothing to await


@mcp.tool()
def rebuild_index(titles: list[str]) -> str:
    """Take search offline and rebuild its index, one book at a time."""
    offline.add("search")
    try:
        for title in titles:
            anyio.from_thread.check_cancelled()
            index_book(title)
        return f"Indexed {len(titles)} books."
    finally:
        offline.discard("search")
  • anyio.from_thread.check_cancelled(), çağrı sürerken hiçbir şey yapmaz; çağrı iptal edildikten sonra ise istisna fırlatır. Onu iş birimleri arasında çağırın.
  • Temizlik burada da bir finally bloğuna girer. İş parçacığında hiçbir şey await kullanmaz, bu yüzden korumaya gerek yok.
  • Hiç sormayan bir def araç sonuna kadar çalışır ve sonucu atılır.

Geçerli olduğu yerler

Prompt ve kaynak fonksiyonları tam olarak araçlar gibi iptal edilir.

İptal, stdio ve Streamable HTTP üzerinde aynı şekilde çalışır. Bu SDK'nın Client'ında vazgeçmek, call_tool'u bekleyen görevi iptal etmek ya da read_timeout_seconds süresinin dolmasına izin vermek demektir.

Warning

İki Streamable HTTP seçeneği bu haberi işleyicinize ulaştırmaz: 2026-07-28 bağlantısında json_response=True ve eski nesil bağlantıda stateless_http=True. Bu durumlarda işleyici, istemci ne yapmış olursa olsun sonuna kadar çalışır.

Özet

  • İstemci bir çağrıdan vazgeçtiğinde SDK işleyiciyi iptal eder: araç, prompt ya da kaynak.
  • async def: temizliği bir finally bloğunda yapın, await kullanan temizliği de anyio.move_on_after(seconds, shield=True) içine koyun.
  • Düz def: iş birimleri arasında anyio.from_thread.check_cancelled() fonksiyonunu çağırın, yoksa araç sonuna kadar çalışır. Temizlik için düz bir finally yeter.
  • json_response=True (modern bağlantılar) ve stateless_http=True (eski nesil bağlantılar) iptali devre dışı bırakır.

İlerleme ve iptal, çalışan bir araç ile onu çağıran arasındadır. Aracın sizin için, yani sunucuyu işleten kişi için log'a yazdığı satırlar ise ayrı bir kanaldır: Log kaydı.