قابلیت MCP Tasks به Claude Code اضافه شد؛ اجرای وظایف طولانی در پس‌زمینه

pasqualepillitteri.it

انتشار در منبع: انتشار در سایت ما:

مقاله اصلی · English

Claude Code اکنون از MCP Tasks پشتیبانی می‌کند؛ افزونه‌ای برای پروتکل MCP که به سرور اجازه می‌دهد هنگام دریافت درخواست‌های زمان‌بر، به‌جای منتظر گذاشتن دستیار تا آماده شدن نتیجه نهایی، شناسه‌ای برای پیگیری وظیفه در حال اجرا برگرداند. به این ترتیب، Claude می‌تواند در مدت پردازش درخواست توسط سرور، همچنان به تعامل با کاربر ادامه دهد و Claude Code نیز با ارسال درخواست‌های دوره‌ای، وضعیت پیشرفت کار را بررسی کند. طبق مستندات رسمی، این قابلیت فعلاً در نسخه خط فرمان (CLI) به‌صورت آزمایشی عمومی عرضه شده و به نسخه 2.1.304 یا جدیدتر Claude Code نیاز دارد؛ نسخه‌ای که ۱۹ اکتبر منتشر شد.

پروتکل MCP یا Model Context Protocol استانداردی باز است که ابتدا در آنتروپیک توسعه یافت و دستیارهایی مانند Claude را از طریق سرورهای اختصاصی به ابزارها و داده‌های خارجی متصل می‌کند. فراخوانی ابزار با دستور tools/call اساساً همگام طراحی شده است؛ یعنی دستیار درخواست را ارسال می‌کند و تا دریافت پاسخ منتظر می‌ماند. این روش برای کارهایی مانند خواندن یک فایل مناسب است، اما هنگام تهیه گزارشی که خروجی گرفتن از آن ده دقیقه طول می‌کشد یا اجرای فرایند ساخت نرم‌افزار، کارایی چندانی ندارد.

قابلیت MCP Tasks در Claude Code؛ نمایی از ترمینال که تغییر وضعیت یک وظیفه از در حال اجرا به تکمیل‌شده را نشان می‌دهد
چرخه حیات یک وظیفه MCP شامل پذیرش درخواست، بررسی دوره‌ای وضعیت، درخواست اطلاعات از کاربر و دریافت نتیجه است. (تصویرسازی اختصاصی)

قابلیت MCP Tasks چیست و چه تغییری در Claude Code ایجاد می‌کند؟

وظیفه MCP در واقع عملیاتی زمان‌بر، مانند خروجی گرفتن از یک گزارش، ساخت نرم‌افزار یا اجرای یک خط پردازش است که سرور MCP آن را مستقل از Claude Code انجام می‌دهد. به‌محض پذیرش درخواست از سوی سرور، فراخوانی Claude Code پایان می‌یابد و سرور شناسه‌ای برای پیگیری وظیفه برمی‌گرداند. Claude این شناسه را بلافاصله دریافت می‌کند و به فعالیت خود ادامه می‌دهد. در همین حال، در نوار پایین Claude Code شمارنده‌ای مانند 1 MCP task نمایش داده می‌شود. پس از پایان عملیات نیز پیامی با قالب MCP task <id> (server/tool) completed. در تاریخچه مکالمه ظاهر می‌شود، اما نتیجه واقعی عملیات به Claude تحویل داده می‌شود و در متن تاریخچه نمایش داده نمی‌شود.

اجرای عملیات در پس‌زمینه به‌خودی‌خود قابلیت تازه‌ای نیست. Claude Code از نسخه 2.1.212 به بعد، فراخوانی‌های MCP را که بیش از دو دقیقه طول می‌کشند، از جریان اصلی مکالمه خارج می‌کند و به پس‌زمینه می‌فرستد. بااین‌حال، این سازوکار در سمت برنامه کاربر اجرا می‌شد و ادامه عملیات به باز ماندن نشست وابسته بود. با بستن Claude Code، کار نیز متوقف می‌شد. در سازوکار جدید Tasks، پردازش روی سرور باقی می‌ماند و Claude Code فقط شناسه لازم برای پیگیری وضعیت آن را نگه می‌دارد.

یک وظیفه MCP چگونه اجرا می‌شود؟

این سازوکار مطابق مشخصات رسمی افزونه Tasks عمل می‌کند و پنج مرحله اصلی دارد:

  1. Claude Code پشتیبانی از افزونه io.modelcontextprotocol/tasks را در قابلیت‌های خود اعلام می‌کند. سرور برای هر درخواست به‌طور مستقل تصمیم می‌گیرد که آن را به‌صورت یک وظیفه اجرا کند یا نه.
  2. سرور در پاسخ به tools/call شیئی شامل taskId، وضعیت working و فاصله زمانی پیشنهادی برای بررسی وضعیت برمی‌گرداند.
  3. Claude Code بلافاصله پس از دریافت پاسخ و سپس در فاصله‌های زمانی تعیین‌شده با pollIntervalMs، دستور tasks/get را برای بررسی وضعیت اجرا می‌کند.
  4. اگر سرور برای ادامه عملیات به تصمیم کاربر نیاز داشته باشد، وضعیت به input_required تغییر می‌کند و درخواست اطلاعات در ساختار inputRequests ارسال می‌شود.
  5. پس از پایان موفق عملیات، وضعیت به completed تغییر می‌کند و فیلد result همان نتیجه‌ای را در اختیار می‌گذارد که در اجرای همگام بازگردانده می‌شد. در صورت شکست عملیات نیز وضعیت failed همراه با فیلد error ثبت می‌شود.

توالی ارتباط میان Claude Code و سرور MCP به این صورت است: ابتدا Claude Code درخواست tools/call را می‌فرستد و سرور با پذیرش وظیفه، شناسه taskId و وضعیت working را برمی‌گرداند. Claude در این فاصله به کار با کاربر ادامه می‌دهد و با tasks/get در فاصله‌های تعیین‌شده توسط pollIntervalMs وضعیت را بررسی می‌کند. سرور ممکن است همچنان وضعیت working را گزارش کند یا با input_required و inputRequests به اطلاعات بیشتری نیاز داشته باشد. در حالت دوم، پاسخ از طریق tasks/update و inputResponses ارسال می‌شود. در نهایت، بررسی بعدی با tasks/get می‌تواند وضعیت completed و نتیجه result را برگرداند. شناسه وظیفه نقش مرجعی پایدار را دارد و سرور راه دور می‌تواند پردازش را مستقل از برنامه کاربر ادامه دهد.

برای وظایف MCP پنج وضعیت تعریف شده است: working، input_required، completed، failed و cancelled. سه وضعیت آخر نهایی هستند؛ یعنی وظیفه‌ای که به یکی از آن‌ها برسد، دیگر تغییر وضعیت نمی‌دهد. سرور همچنین می‌تواند با استفاده از notifications/tasks به‌صورت مستقیم به‌روزرسانی ارسال کند، اما روش پایه همچنان بررسی دوره‌ای وضعیت است.

وقتی اجرای وظیفه به تأیید کاربر نیاز دارد

ممکن است یک وظیفه در حال اجرا متوقف شود و از کاربر پرسشی بپرسد. در این حالت، وضعیت به input_required تغییر می‌کند و Claude Code پنجره‌ای برای دریافت ورودی ساختاریافته از کاربر باز می‌کند. سپس پاسخ را با دستور tasks/update به سرور می‌فرستد. اگر پنل /tasks باز باشد، این پنجره تا زمان بسته شدن پنل نمایش داده نمی‌شود. رد کردن درخواست یا فشردن کلید Esc نیز نوعی پاسخ محسوب می‌شود و سرور باید تصمیم بگیرد که پس از آن چگونه ادامه دهد.

موضوع در نشست‌های غیرتعاملی پیچیده‌تر می‌شود. در چنین نشست‌هایی Claude Code نمی‌تواند از کاربر پرسش کند؛ بنابراین از سرور می‌خواهد وظیفه را لغو کند، بدون آنکه هوک‌های Elicitation یا تابع بازفراخوانی onElicitation در Agent SDK اجرا شوند. در نتیجه، هر عملیاتی که در میانه راه به تأیید یا انتخاب کاربر نیاز داشته باشد، مانند تأیید استقرار نرم‌افزار یا تصمیم درباره گنجاندن بخشی از داده‌ها، باید در ترمینالی انجام شود که کاربری برای پاسخ‌گویی حضور دارد. این وضعیت با داده‌های آنتروپیک درباره نشست‌های Claude نیز همخوانی دارد؛ داده‌هایی که نشان می‌دهند ۸۰ درصد زمان این نشست‌ها صرف انتظار برای پاسخ انسان می‌شود.

اگر نشست Claude Code را ببندید چه اتفاقی می‌افتد؟

پاسخ به محل اجرای سرور بستگی دارد. این موضوع ملموس‌ترین تفاوت سازوکار جدید با اجرای خودکار در پس‌زمینه است. مستندات رسمی حالت‌های زیر را توضیح می‌دهند:

وضعیتسرنوشت وظیفه
خروج از Claude Code هنگام استفاده از سرور راه دوروظیفه همچنان روی سرور اجرا می‌شود.
خروج از Claude Code هنگام استفاده از سرور stdioفرایند محلی متوقف می‌شود و وظیفه نیز همراه آن پایان می‌یابد.
اجرای /clear، /branch یا /resume برای نشست دیگرتا زمانی که Claude Code باز باشد، نتیجه در مکالمه جاری دریافت می‌شود.
ازسرگیری تعاملی با claude --resume، --continue یا /resumeClaude Code پیگیری وظیفه را دوباره آغاز می‌کند.
اجرای claude -p همراه با --resume یا --continueاجرای جدید وظیفه را پیگیری نمی‌کند.
نشست جدید یا استفاده از --fork-sessionنشست جدید وظیفه قبلی را پیگیری نمی‌کند.

بنابراین، امکان بستن کامل برنامه و بازگشت به کار پس از یک ساعت، در مورد سرورهای راه دور و با ازسرگیری نشست در حالت تعاملی فراهم است. در مقابل، سرور stdio که Claude Code آن را به‌صورت یک فرایند محلی راه‌اندازی می‌کند، با پایان نشست متوقف می‌شود و عملیات در حال اجرا نیز از بین می‌رود.

چه کسانی اکنون می‌توانند از MCP Tasks استفاده کنند؟

فعال شدن این قابلیت به مجموعه‌ای از شرایط وابسته است که همگی باید هم‌زمان برقرار باشند. بنابراین بهتر است پیش از انتظار برای اجرای یک وظیفه، این پیش‌نیازها بررسی شوند.

  • استفاده از Claude Code در ترمینال، Agent SDK یا GitHub Actions. آنتروپیک هنوز این قابلیت را در افزونه VS Code یا برنامه دسکتاپ Claude Code فعال نکرده است.
  • اتصال یک سرور HTTP، سرور stdio یا کانکتور claude.ai با نسخه 2026-07-28 پروتکل. بنابراین تنظیمات MCP_SDK_GENERATION=v1 یا MCP_PROTOCOL_NEGOTIATION=legacy نباید فعال باشند.
  • استفاده از نشستی که پرچم‌های قابلیت را دریافت می‌کند. این شرط ارائه‌دهندگان شخص ثالث مانند Amazon Bedrock و نصب‌هایی را که تله‌متری یا پرچم‌های قابلیت در آن‌ها غیرفعال شده‌اند، کنار می‌گذارد.
  • آغاز فراخوانی از مکالمه اصلی؛ زیرا فراخوانی‌های عامل‌های فرعی و سرورهای محیط توسعه یکپارچه (IDE) به وظایف MCP تبدیل نمی‌شوند.

نسخه‌های MCP با تاریخ انتشارشان شناخته می‌شوند و نسخه ۲۸ ژوئیه ۲۰۲۶ با شناسه 2026-07-28 نخستین نسخه‌ای است که Tasks را به‌عنوان افزونه‌ای رسمی معرفی می‌کند. سرورهایی که به این نسخه ارتقا یافته‌اند می‌توانند از قابلیت جدید استفاده کنند، اما سرورهای قدیمی‌تر آن را ارائه نمی‌دهند و مانند گذشته به درخواست‌ها به‌صورت همگام پاسخ می‌دهند.

همچنین اجرای یک‌باره دستور claude -p "<prompt>" از وظایف MCP پشتیبانی نمی‌کند.

نکاتی برای توسعه‌دهندگان سرورهای MCP

توسعه‌دهندگانی که سرویس‌های موجود خود را از طریق سرور MCP ارائه می‌کنند، مانند کاری که MCP Adapter برای وردپرس انجام می‌دهد، باید مشخص کنند کدام عملیات به‌صورت وظیفه بازگردانده شوند. سرور در پاسخ به tools/call شیئی از نوع وظیفه ارسال می‌کند. نمونه زیر از مستندات Claude Code گرفته شده است:

{
 "resultType": "task",
 "taskId": "build-7f3a9c2e",
 "status": "working",
 "createdAt": "2026-10-22T14:03:07Z",
 "lastUpdatedAt": "2026-10-22T14:03:07Z",
 "ttlMs": null,
 "pollIntervalMs": 5000
}

وجود فیلد taskId الزامی است و مقدار آن حداکثر می‌تواند ۱۲۸ نویسه قابل چاپ ASCII داشته باشد؛ استفاده از فاصله مجاز نیست. Claude Code مقدار pollIntervalMs را در بازه ۲۵۰ تا ۳۰ هزار میلی‌ثانیه محدود می‌کند و اگر این مقدار مشخص نشده باشد، ۲ هزار میلی‌ثانیه را در نظر می‌گیرد. در ارتباطات HTTP و کانکتورهای claude.ai، پاسخ حاوی شناسه وظیفه باید پیش از پایان مهلت زمانی همان درخواست دریافت شود. بنابراین سرور باید ابتدا عملیات را بپذیرد و پاسخ دهد و سپس پردازش اصلی را آغاز کند. Claude Code برای توقف وظیفه از tasks/cancel استفاده می‌کند، اما لغو عملیات به همکاری سرور وابسته است و ممکن است سرور با وجود دریافت درخواست لغو، کار را به پایان برساند.

از قابلیت آزمایشی سال ۲۰۲۵ تا افزونه رسمی ۲۰۲۶

قابلیت Tasks از نوامبر ۲۰۲۵ در پروتکل MCP وجود داشته است. در آن زمان، نسخه 2025-11-25 آن را به‌عنوان قابلیتی آزمایشی در هسته پروتکل معرفی کرد. درخواست‌ها شامل فیلد task بودند، نتیجه با tasks/result دریافت می‌شد که تا پایان عملیات منتظر می‌ماند و دستور tasks/list نیز فهرست وظایف در حال اجرا را ارائه می‌کرد.

نسخه ۲۸ ژوئیه ۲۰۲۶ این رویکرد را تغییر داد. هسته پروتکل به معماری بدون حالت (Stateless) منتقل شد و Tasks به افزونه io.modelcontextprotocol/tasks انتقال یافت؛ افزونه‌ای که در پیشنهاد SEP-2663 تعریف شده است. این پیشنهاد با وضعیت نهایی (Final)، در ۲۷ آوریل توسط لوکا چانگ و کیتی مک‌کافری برای گروه کاری Agents ایجاد شد. سازوکار جدید سه متد tasks/get، tasks/update و tasks/cancel دارد. تصمیم درباره ایجاد وظیفه همیشه با سرور است و برنامه کاربر فقط یک‌بار پشتیبانی خود را اعلام می‌کند و سپس پاسخ دریافتی را، با هر ساختاری که داشته باشد، مدیریت می‌کند. اعلان‌ها نیز از طریق یک جریان واحد به نام subscriptions/listen منتقل می‌شوند. آنتروپیک همان روز در مطلبی درباره نسخه جدید پروتکل اعلام کرد که Tasks و MCP Apps همراه با چارچوبی برای نسخه‌بندی افزونه‌ها ارائه می‌شوند و پشتیبانی از آن‌ها به‌تدریج در محصولات Claude گسترش می‌یابد.

کسانی که روند توسعه این قابلیت را دنبال کرده‌اند، احتمالاً به یاد دارند که درخواست افزودن پشتیبانی از Tasks در مخزن Claude Code روز ۱۹ ژوئن با برچسب «برنامه‌ریزی نشده» بسته شد. اکنون اما مستندات رسمی این قابلیت را به‌طور کامل شرح می‌دهند.

پرسش‌های متداول

۱. آیا می‌توان انتقال خودکار عملیات به پس‌زمینه را غیرفعال کرد؟

بله، با استفاده از دو متغیر محیطی. اگر مقدار CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS را برابر 0 قرار دهید، مثلاً در بخش env فایل settings.json، Claude در نشست تعاملی منتظر پاسخ تمام فراخوانی‌های MCP می‌ماند. با تنظیم CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND=1 نیز Claude منتظر نتیجه وظیفه می‌ماند. بااین‌حال، اگر انتقال خودکار به پس‌زمینه فعال باشد، فراخوانی پس از دو دقیقه مانند یک فراخوانی معمولی به پس‌زمینه منتقل می‌شود و با خروج از برنامه ادامه پیدا نمی‌کند.

۲. یک وظیفه تا چه مدت می‌تواند ادامه داشته باشد؟

Claude Code محدودیت زمانی مستقلی برای اجرای وظیفه در پس‌زمینه تعیین نمی‌کند. تا زمانی که سرور پاسخ حاوی شناسه وظیفه را برنگردانده است، محدودیت‌های زمانی یک فراخوانی معمولی اعمال می‌شوند. پس از آن، سقف کلی زمان اجرا را مقدار timeout سرور یا متغیر MCP_TOOL_TIMEOUT تعیین می‌کند که مقدار پیش‌فرض آن حدود ۲۸ ساعت است. محدودیت دیگری نیز برای زمان بیکاری وجود دارد که با CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT کنترل می‌شود. مقدار پیش‌فرض آن برای HTTP، SSE، WebSocket و کانکتورهای claude.ai پنج دقیقه و برای stdio سی دقیقه است. تنظیم این مقدار روی 0 محدودیت زمان بیکاری را غیرفعال می‌کند. پاسخ‌های سرور به درخواست‌های بررسی وضعیت نیز فعالیت محسوب می‌شوند.

۳. چگونه می‌توان یک وظیفه در حال اجرا را متوقف کرد؟

از طریق پنل /tasks یا با درخواست مستقیم از Claude. در پنل وظایف می‌توان وظیفه موردنظر را انتخاب کرد و کلید x را فشار داد. در این صورت Claude Code پیگیری وظیفه را متوقف می‌کند و از سرور می‌خواهد آن را لغو کند. فشردن کلید Esc باعث توقف وظیفه نمی‌شود. همچنین ممکن است سرور با وجود درخواست لغو، عملیات را به پایان برساند.

۴. آیا این قابلیت با کانکتورهای claude.ai نیز کار می‌کند؟

بله، به شرط آنکه کانکتور با نسخه 2026-07-28 پروتکل متصل شده باشد. محدودیت عملی همان مهلت زمانی هر درخواست در ارتباطات HTTP است. بنابراین در این حالت نیز سرور باید پیش از آغاز پردازش اصلی، پاسخ حاوی شناسه وظیفه را ارسال کند.

۵. وضعیت اجراهای غیرتعاملی با Agent SDK چگونه است؟

در این حالت شرایط بیشتری باید رعایت شود. برای استفاده از Agent SDK یا stream-json باید مقدار CLAUDE_AUTO_BACKGROUND_TASKS=1 تنظیم شده باشد. همچنین CLAUDE_CODE_DISABLE_MCP_TASK_BACKGROUND نباید برابر 1 و CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS نباید برابر 0 باشد.

اهمیت واقعی MCP Tasks در عمل

ارزش عملی این قابلیت تا حد زیادی به توسعه‌دهندگان سرورهای MCP بستگی دارد؛ سرورهایی که خود همچنان هدف آسیب‌پذیری‌های امنیتی هستند. کافی است ۱۴۳ هزار نقص امنیتی شناسایی‌شده در ۲۵ هزار سرور MCP در تابستان امسال را به یاد بیاوریم. تا زمانی که سرور به درخواست‌ها به‌صورت همگام پاسخ دهد، Claude Code وظیفه‌ای برای پیگیری نخواهد داشت و همان رفتار پیشین، یعنی انتقال عملیات به پس‌زمینه پس از دو دقیقه، ادامه پیدا می‌کند. اما در سرورهایی که از قبل سامانه مدیریت وظایف دارند، مانند سرویس‌های ابری، صف‌های کاری یا خطوط ساخت نرم‌افزار، این الگو کاملاً مناسب است. سرور مسئول نگهداری و اجرای عملیات می‌شود، شناسه‌ای برای آن فراهم می‌کند و برنامه کاربر هر زمان لازم باشد وضعیت را بررسی می‌کند. به این ترتیب، کاربر حتی می‌تواند روز بعد به نشست بازگردد و کار را از سر بگیرد.

بااین‌حال، وضعیت فعلی این قابلیت همچنان همان چیزی است که از یک نسخه آزمایشی انتظار می‌رود: پیش‌نیازهای سخت‌گیرانه و یک کمبود آشکار، یعنی نبود پشتیبانی در برنامه دسکتاپ. فعلاً منطقی‌ترین رویکرد، در نظر گرفتن ظرفیت‌های این قابلیت و انتظار برای آماده شدن سرورهای سازگار است.