چیت‌شیت

کلاینت‌ها و بسترهای انتقال MCP

MCP Clients and Transports

آزمون ارزیابی، merge و هدایت طرف‌های ارتباط MCP 2026-07-28 روی stdio و پروتکل HTTP جریانی. تلاش مجدد دورهای MRTR. قالب‌بندی فریم‌های JSON-RPC.

  • ۱۲ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. کلاینت چندسروری
  2. آزمون ارزیابی دوره‌ی stdio
  3. وظایف کلاینت در کد
  4. اجرای درس‌ها
  5. درج مهر روی تمام درخواست‌های مدرن
  6. stdio یا پروتکل HTTP جریانی
  7. دور MRTR برای نمونه‌برداری (Sampling)
  8. مقادیر پیش‌فرض در کد درس
  9. کدهای وضعیت و خطا
  10. پرسش‌ها
  11. پروژه: میز کار شناسایی ابزار MCP
  12. نکات

کلاینت چندسروری

معماری
نام استانداردجستجو_meta on each request_meta on each requestیک آزمون ارزیابی initializeمیزبانمدل و رابط کاربریکلاس MultiServerClientیک طرف ارتباط به ازای هر سروررجیسترینام استاندارد به طرف ارتباطیادداشت‌هاطرف ارتباط مدرنفایل‌هاطرف ارتباط مدرنبایگانیمیراثی، allow_legacy=True

آزمون ارزیابی دوره‌ی stdio

گام‌به‌گام
  1. کلاینتserver/discover را قبل از هر درخواست دیگری می‌فرستد.
  2. نتیجهمدرن. انتخاب بالاترین نسخه‌ی مشترک.
  3. -32022مدرن. انتخاب از data.supported. تلاش مجدد با شناسه جدید.
  4. -32020, -32021مدرن. اصلاح درخواست. بدون initialize.
  5. پایان مهلت، قطع اتصال، خطای ناشناختهمبهم. پایان امن با خطا (Fail closed).
  6. طرف ارتباط در لیست مجازیک initialize محدود. بررسی protocolVersion، capabilities، serverInfo.
  7. کش دوره‌ی سازگارینگهداری آن در طول عمر بستر انتقال.

وظایف کلاینت در کد

کار و کد
وظیفهکد
ثبت یک طرف ارتباط مدرنclient.add_server("notes", notes)
مجوز یک آزمون ارزیابی میراثیclient.add_server("archive", archive, allow_legacy=True)
آزمون ارزیابی تمام طرف‌های ارتباط به ترتیب نامclient.connect_all()
فهرست‌کردن ابزارهای هر طرف ارتباط فعالclient.discover_tools()
رد نام‌های تکراریclient.merge(policy="reject")
فراخوانی با نام استانداردclient.call("notes/search", {})
بازتاب فیلدهای بدنه در هدرهاhttp_headers_for(message)
پاسخ‌دهی به خطوط JSON-RPC تا رسیدن به EOFserve(handler, StdioTransport(stdin, stdout))

اجرای درس‌ها

دستورها
دستورعملکرد
python3 code/main.py11.14: شناسایی demo-server در نسخه‌ی 2026-07-28
python3 main.py13.08 در code/: طرف‌های ارتباط، ابزارهای merge شده، فراخوانی‌ها
python3 main.py --probe13.09: اجرای آزمون ارزیابی HTTP روی یک پورت آزاد
python3 main.py --serve13.09: ارائه‌ی سرویس روی http://127.0.0.1:8017/mcp
python3 main.py13.11 در code/: شناسه‌های درخواست [1, 2, 3]
python3 code/main.py19.22: دموی BytesIO، چاپ server_responses
python3 -m unittest discover tests -vاجرای آزمون‌ها از code/

درج مهر روی تمام درخواست‌های مدرن

کد
python
def modern_request(request_id, method, params, version, capabilities=None):
    body_params = dict(params or {})
    body_params["_meta"] = request_meta(version, capabilities)   # جدید در هر فراخوانی
    return {"jsonrpc": "2.0", "id": request_id, "method": method, "params": body_params}
VERSION_KEY = "io.modelcontextprotocol/protocolVersion"          # الزامی
CAPABILITIES_KEY = "io.modelcontextprotocol/clientCapabilities"  # الزامی
CLIENT_INFO_KEY = "io.modelcontextprotocol/clientInfo"           # هویت کلاینت
RECOGNIZED_MODERN_ERRORS = {-32020, -32021, -32022}              # هرگز به نسخه‌ی پایین‌تر برنگردید

stdio یا پروتکل HTTP جریانی

مقایسه
عاملstdioپروتکل HTTP جریانی
مورد استفاده برایزیرفرایند راه‌اندازی‌شده توسط کلاینتسرویس شبکه
قالب‌بندی فریم‌هایک پیام JSON-RPC به صورت UTF-8 در هر خطیک پیام JSON-RPC به ازای هر POST
زمینه‌ی نسخهparams._metaparams._meta به همراه هدرهای بازتاب‌یافته
پاسخیک خط روی stdoutپاسخ JSON یا رویدادهای ارسالی سرور در دامنه‌ی درخواست
اعلانبدون خط پاسخ202 Accepted، بدون بدنه
عیب‌یابیفقط stderrوضعیت HTTP به همراه خطای JSON-RPC
رویدادهای تغییربازگشایی مجدد پس از راه‌اندازی دوبارهجریان POST مربوط به subscriptions/listen
امنیتخروج با دریافت EOF در stdinاعتبارسنجی Origin، اتصال به 127.0.0.1

دور MRTR برای نمونه‌برداری (Sampling)

گام‌به‌گام
  1. کلاینتtools/call را فراخوانی می‌کند. قابلیت‌ها شامل sampling هستند.
  2. سرورمقادیر input_required، inputRequests و requestState را برمی‌گرداند.
  3. کلاینتخط‌مشی را بررسی کرده و از مدل خود می‌پرسد.
  4. کلاینتهمان متد و آرگومان‌ها، شناسه‌ی جدید، inputResponses، دقیقاً همان requestState.
  5. سروراعتبارسنجی HMAC، هویت اصلی، خلاصه‌ی آرگومان‌ها و انقضا.
  6. سرورآخرین دور resultType: "complete" را برمی‌گرداند.

مقادیر پیش‌فرض در کد درس

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
discovery_timeout_ms1_000باید مثبت باشد
legacy_probe_timeout_ms1_000ارسال‌شده به تطبیق‌دهنده‌ی بستر انتقال
`merge` policyprefix-on-collisionیا reject
Discovery `ttl_ms`3_600_000cache_scope="public"
MAX_REQUEST_BYTES1_048_576بدنه‌ی بزرگ‌تر خطای -32700 می‌دهد
READ_TIMEOUT_SECONDS5.0مهلت زمانی سوکت هنگام خواندن بدنه
maxTokens400به ازای هر درخواست نمونه‌برداری تعبیه‌شده
`requestState` expiry300ثانیه‌های پس از اولین فراخوانی

کدهای وضعیت و خطا

عیب‌یابی
  • کد HTTP 400، -32020

    علت
    هدر موجود نیست یا با بدنه تفاوت دارد
    راه‌حل
    ساخت هدرها از روی بدنه‌ی نهایی
  • کد HTTP 400، -32022

    علت
    نسخه پشتیبانی نمی‌شود
    راه‌حل
    تلاش مجدد با مقداری از supported
  • -32021

    علت
    کلاینت فاقد قابلیت الزامی است
    راه‌حل
    خواندن data.requiredCapabilities
  • -32602

    علت
    _meta ناموجود یا requestState نامعتبر
    راه‌حل
    ارسال _meta و بازتاب وضعیت
  • کد HTTP 403

    علت
    Origin در لیست مجاز نیست
    راه‌حل
    استفاده از تطابق دقیق Origin
  • کد HTTP 404، -32601

    علت
    متد مدرن ناشناخته
    راه‌حل
    آن را به عنوان اثبات میراثی تلقی نکنید
  • کد HTTP 405

    علت
    متد GET یا DELETE روی /mcp
    راه‌حل
    استفاده از POST و subscriptions/listen
  • -32700، با id برابر null

    علت
    یک خط stdio فرمت JSON نامعتبر دارد
    راه‌حل
    حلقه با خط بعدی ادامه می‌یابد

پرسش‌ها

پرسش و پاسخ
آیا -32601 اثبات سرور میراثی است؟
خیر. فقط به یک طرف ارتباط در لیست مجاز اجازه‌ی یک آزمون ارزیابی می‌دهد.
آیا جریان می‌تواند از سر گرفته شود؟
خیر. Last-Event-ID نادیده گرفته می‌شود. یک درخواست جدید با شناسه‌ی جدید بفرستید.
وضعیت جریان کاری کجا ذخیره می‌شود؟
درون هندلی که توسط سرور صادر شده و کلاینت آن را به عنوان آرگومان ارسال می‌کند.
آیا سرور می‌تواند کلاینت را فراخوانی کند؟
خیر. input_required برمی‌گرداند و کلاینت دوباره تلاش می‌کند.
آیا ترجیحات مدل به یک جمع می‌شوند؟
خیر. آن‌ها راهنمایی‌های مستقلی هستند.

پروژه: میز کار شناسایی ابزار MCP

دستورها
دستورعملکرد
python3 scripts/project_test.py mcp-at-scale --all --path <dir> --strictاجرای تصحیح‌کننده. ابتدا مقداردهی اولیه با --init <dir>
python3 cli.py samples/inventory.json --query "pods count" --max-chars 500بهترین اسکیماها در چارچوب بودجه
python3 cli.py /absolute/inventory.json --serveسرور stdio با catalog_search
Checksقبل از initialize: کد -32002. صفحه‌های 32 ابزاری. 250 نام در 8 صفحه

نکات

نکته‌ها
  • درخواست سریال‌سازی‌شده‌ی نهایی را بازرسی کنید.
  • ارسال Mcp-Name غیر ASCII به صورت =?base64?{Base64EncodedValue}?=.
  • ایجاد سقف برای دورهای MRTR. اعتبارسنجی هر پاسخ نمونه‌برداری.
  • در صورت قطع جریان، ارسال مجدد subscriptions/listen و واکشی مجدد.
  • در حالت stdio، پیام‌های عیب‌یابی را در stderr بنویسید.