اگر امروز برای اتوماسیون تبلیغات متا روی مدلهای زبانی هزینه میکنید، احتمالاً ساعتها وقت خود را صرف بازنویسی پرامپتهایی کردهاید که در واقع هیچ مشکلی نداشتند. توسعهدهندگانی که از GPT-5، Claude یا Llama برای خودکارسازی بازاریابی استفاده میکنند، بهطور غریزی نقص را به گردن پرامپتهای سیستمی یا منطق فراخوانی ابزارها (Tool-calling) میاندازند. اما حقیقت این است که خطای ۴۰۱ (Unauthorized) در سامانه mcp.facebook.com/ads تقریباً هیچگاه به دلیل نقص در منطق مدل نیست.
طبق گزارش فنی مفصلی که در ۱۲ سپتامبر ۲۰۲۶ منتشر شد، این شکستها ریشه در مسائل خستهکننده اما حیاتی زیرساختی و چرخه حیات توکنها دارند. این تفکیک بسیار حیاتی است زیرا عاملهای هوش مصنوعی — مثل دستیارهای هوشمندی که میتوانند بهجای شما ابزارها را اجرا کنند — معمولاً علت اصلی شکست را میپوشانند. وقتی یک فراخوانی ابزار شکست میخورد، عامل صرفاً یک خطا گزارش میکند و این باعث میشود توسعهدهندگان ساعتها وقت خود را صرف بازنویسی پرامپت برای مدلی کنند که در واقع دقیقاً همان کاری را انجام میداد که به او گفته شده بود. این وضعیت شبیه به همان الگوی گستردهتر عدم اطمینانی است که در پوشش پیشین ما دربارهی نقصهای حفاظتی چتبات متا دیدیم؛ جایی که متا مجبور شد چتبات خود را اصلاح کند چون بهطور نامناسب از کاربران دادههای شخصی کودکان را میخواست. در آن مورد نیز مشکل یک نقص سیستمی در نردههای حفاظتی (Guardrails) بود، نه یک خطای تصادفی مدل.
تلهٔ توکنها
خطرناکترین بخش پروتکل زمینهٔ مدل (MCP) — که شبیه به یک مترجم است و به مدل اجازه میدهد مستقیماً با دادههای خارجی حرف بزند — این است که یک توکن میتواند برای Graph API استاندارد معتبر باشد اما همچنان توسط نقطه انتهایی MCP رد شود. این موضوع باعث ایجاد حس امنیت کاذب در مرحله تست میشود. توسعهدهنده ممکن است با موفقیت لیست حسابهای تبلیغاتی را از طریق Graph API بگیرد، اما در سطح MCP با خطای ۴۰۱ و پیام «این منبع محدود به کاربران خاصی است» (This resource is restricted to certain users) مواجه شود.
این یک تلهی خاص است که در آن موفقیت در Graph API لزوماً به معنای دسترسی به MCP نیست؛ بلکه فقط ثابت میکند توکن برای Graph API معتبر است. در یک مورد واقعی در جامعه توسعهدهندگان، سازندهای داشت که اپلیکیشن Marketing API او برای لیست کردن حسابها بهدرستی کار میکرد، اما همچنان در mcp.facebook.com/ads با خطای ۴۰۱ مواجه میشد. در همان گزارش ذکر شده بود که ثبتنام پویا (Dynamic Client Registration) خطای 400 invalid_client_metadata را برمیگرداند که نشاندهنده یک سد دسترسی عمیقتر است.
این اتفاق به این دلیل رخ میدهد که متا مکانیزمهای کنترل دسترسی (Gating) مجزایی برای MCP به کار میگیرد. این موارد میتوانند شامل موارد زیر باشند:
- الزامات ثبتنام در MCP
- پرچمهای عرضه مرحلهای (مانند
is_ads_mcp_enabled:false) - الزامات ثبتنام کلاینت در لیست سفید (Allowlist)
- قوانین دسترسی خاص MCP که برای Graph API مورد نیاز نیستند
درک چرخه حیات توکن
بسیاری از اتوماسیونهای «تسخیر شده» در ابزارهایی مثل n8n، Make یا Zapier صرفاً نتیجه انقضای توکن هستند. متا هنگام پایان یک نشست (Session) بهطور فعال به توسعهدهنده اطلاع نمیدهد. به همین دلیل است که یک گردشکار ممکن است در ساعت ۲:۱۳ سالم باشد و در ۲:۱۴ کاملاً از کار بیفتد، بدون اینکه هیچ افت کیفیت یا نوسانی در سیستم دیده شود. این موضوع ربطی به این ندارد که مدل ناگهان بدتر شده است؛ بلکه توکن در حالی منقضی شده که توسعهدهنده در خواب بوده است.
بر اساس گزارش مذکور، سه نوع توکن اصلی در محیط عملیاتی رفتارهای بسیار متفاوتی دارند:
- توکنهای کاربر کوتاهمدت (Short-lived user tokens): این توکنها حدود ۱ تا ۲ ساعت اعتبار دارند و به یک نشست ورود انسانی گره خوردهاند. آنها برای کارهای زمانبندیشده (Scheduled jobs) کاملاً نامناسب هستند.
- توکنهای کاربر بلندمدت (Long-lived user tokens): اینها معمولاً حدود ۶۰ روز اعتبار دارند اما همچنان به چرخه احراز هویت مجدد کاربر وابسته هستند و برای عاملهای بدون نظارت (Unattended agents) شکنندهاند.
- توکنهای کاربر سیستمی (System user tokens): این توکنها برای استفاده سرور-به-سرور طراحی شدهاند. طبق مستندات متا، این توکنها منقضی نمیشوند و تنها گزینه viable و عملی برای گردشکارهای Cron در محیط عملیاتی هستند.

شکاف عملیاتی: حالت توسعه در برابر واقعیت
مدل دسترسی متا باعث میشود تستهای مدیر-توسعهدهنده سالمتر از واقعیت به نظر برسند. یک توسعهدهنده ممکن است متوجه شود که Graph API Explorer کار میکند، اسکریپتهای محلیاش درست هستند و عامل OpenClaw در طول تستهای دستی بهدرستی عمل میکند. با این حال، یک اتوماسیون زمانبندیشده یا یک کاربر واقعی بعداً با خطاهای عدم دسترسی مواجه میشود.
این تفاوت به این دلیل است که متا مرز سختی بین دسترسی حالت توسعه (Dev-mode) و مجوزهای عملیاتی (Production authorization) قائل است. اگر اپلیکیشن فقط برای کاربرانی با نقشهای خاص در اپلیکیشن کار کند، یا اگر بررسی اپلیکیشن (App Review)، سطح دسترسی یا تنظیمات داراییهای تجاری (Business asset setup) ناقص باشد، تستهای دستی حس امنیت کاذب میدهند. این یک شکست در استفاده از ابزار (Tool Use) توسط LLM نیست، بلکه شکست در احراز هویت عملیاتی است.
عیبیابی خطای ۴۰۱
وقتی یک نشست منقضی میشود، متا یک OAuthException با کد ۱۹۰ برمیگرداند. توسعهدهندگان باید بهطور خاص به زیرکدها (Subcodes) دقت کنند تا از حدس زدن دست بردارند:
- زیرکد ۴۶۳: نشاندهنده این است که نشست منقضی شده است (Session has expired).
- زیرکد ۴۶۰: نشاندهنده این است که نشست ابطال شده است (Session was invalidated).
یک نمونه پاسخ توکن منقضیشده به این شکل است:{ "error": { "message": "Error validating access token: Session has expired...", "type": "OAuthException", "code": 190, "error_subcode": 463 } }
برای حل این مشکلات، گزارش مذکور یک جریان تأیید سه مرحلهای را پیشنهاد میکند:
۱. عیبیابی مستقیم توکن: از Token Debugger متا یا نقطه انتهایی debug_token استفاده کنید. شما باید موارد is_valid ،expires_at ،data_access_expires_at و Scopeهای خاص اعطا شده را بررسی کنید. میتوانید این کار را از طریق curl انجام دهید:curl -i -X GET "https://graph.facebook.com/debug_token?input_token={input-token}&access_token={valid-access-token}"
۲. اعتبارسنجی Graph API: توکن را روی graph.facebook.com/v23.0/me/adaccounts تست کنید. اگر این تست شکست بخورد، توکن مرده است. اگر از توکن کوتاهمدت استفاده میکنید، میتوانید برای زمان بیشتر آن را مبادله کنید:curl -i -X GET "https://graph.facebook.com/{graph-api-version}/oauth/access_token?grant_type=fb_exchange_token&client_id={app-id}&client_secret={app-secret}&fb_exchange_token={your-access-token}"
۳. تست سطح MCP: اگر Graph API کار میکند اما نقطه انتهایی MCP شکست میخورد، مشکل یک گیت اختصاصی MCP است، نه توکن یا پرامپت. در این مرحله باید بپرسید:
- آیا اپلیکیشن برای مورد استفاده مورد نظر تأیید شده است؟
- آیا کاربر سیستمی به داراییهای تجاری درست اختصاص یافته است؟
- آیا کلاینت اجازه ثبتنام صحیح را دارد؟
- آیا MCP برای این ترکیب خاص از حساب/اپلیکیشن فعال شده است؟
پیادهسازی توکنهای کاربر سیستمی
برای ساختهای جدی، انتقال به توکن کاربر سیستمی راهکار اصلی برای گردشکارهای سرور-به-سرور است. این زیربنای توصیه شده برای موارد زیر است:
- همگامسازی روزانه حسابهای تبلیغاتی
- عاملهای نظارت بر کمپین
- خط لولههای تشخیص ناهنجاری
- خلاصههای مدل زبانی که به Slack یا Discord ارسال میشوند
- کارهای زمانبندیشده بدون نظارت در n8n، Make و Zapier
با این حال، توکنهای کاربر سیستمی یک راهکار جادویی نیستند. آنها همچنان به موارد زیر نیاز دارند:
- تخصیص درست داراییهای تجاری (Business asset assignments)
- مجوزهای مناسب (مانند
ads_readیاads_management) - سطح دسترسی درست به Marketing API
- بررسی اپلیکیشن (App Review) اگر مورد استفاده شامل کاربرانی خارج از نقشهای تعریف شده باشد
هزینه غفلت از زیرساخت
تلقی کردن شکستهای زیرساختی به عنوان شکستهای پرامپت، هزینه مالی مستقیم دارد. در محیطهای عملیاتی که پرداخت به ازای توکن است، عاملی که بهطور مکرر تلاش میکند یک ابزار را با توکن منقضیشده فراخوانی کند، بودجه استنتاج (Inference) را میسوزاند. مدل شکست نخورده است؛ او فقط سعی میکند دستوری را با کلیدی شکسته اجرا کند. به همین دلیل است که قابلیت اطمینان در استفاده از ابزارهای LLM با نظم زیرساختی خستهکننده — یعنی توکنهای بهتر و بهداشت بهتر در بررسی اپلیکیشن — شروع میشود، نه با یک پرامپت سیستمی بهتر.
برای کسانی که عاملهای خود را روی مدلهای مختلفی مثل Claude Opus 4.6، GPT-5.4 یا Grok 4.20 اجرا میکنند، گزارش پیشنهاد میکند که گزینههای محاسباتی با نرخ ثابت (Flat-rate compute) — مانند آنچه توسط Standard Compute ارائه میشود — پایدارتر از تماشای هر تلاش مجدد (Retry) ناشی از احراز هویت است که به یک ردیف جدید در صورتحساب تبدیل میشود. این موضوع بهویژه زمانی دردناک است که باگ واقعی، توکنی باشد که شش ساعت پیش منقضی شده است.
توالی عملیاتی عیبیابی
برای اجتناب از تله مهندسی پرامپت، هنگام مشاهده خطای ۴۰۱ این توالی سختگیرانه را دنبال کنید:
- گام ۱: تأیید مستقیم توکن. دستور
curl -s "https://graph.facebook.com/debug_token?input_token=$INPUT_TOKEN&access_token=$APP_ACCESS_TOKEN" | jqرا اجرا کنید. به دنبال اعتبار توکن، برچسبهای زمانی انقضا، Scopeهای اعطا شده و هرگونه عدم تطابق بین اپلیکیشن و کاربر باشید. - گام ۲: تست مجزای Graph API. دستور
curl -s -H "Authorization: Bearer $TOKEN" "https://graph.facebook.com/v23.0/me/adaccounts" | jqرا اجرا کنید. اگر این شکست بخورد، ابتدا احراز هویت استاندارد را اصلاح کنید. اگر کار کرد، شما فقط دسترسی Graph API را ثابت کردهاید، نه دسترسی MCP را. - گام ۳: تست MCP به عنوان یک سطح مجزا. اگر MCP همچنان شکست میخورد در حالی که Graph API موفق است، با آن به عنوان یک مشکل دسترسی MCP برخورد کنید. این کار سوالات را از «آیا توکن معتبر است؟» به «آیا کلاینت اجازه ثبتنام دارد؟» یا «آیا پرچم عرضه فعال است؟» تغییر میدهد.
این تغییر در طرز فکر — از «مدل بیثبات است» به «احراز هویت خراب است» — تنها راه دستیابی به قابلیت اطمینان واقعی در عاملهای هوشمند است. قابلیت اطمینان با نظم زیرساختی شروع میشود: توکنهای بهتر، بهداشت سختگیرانه در بررسی اپلیکیشن و تفکیک واضح بین تستهای حالت توسعه و مجوزهای عملیاتی.
گام بعدی شما
- توکنهای فعلی خود را در Token Debugger متا بررسی کنید تا از تاریخ انقضا و Scopeهای فعال مطمئن شوید.
- اگر از اتوماسیونهای زمانبندیشده استفاده میکنید، فوراً از توکنهای کاربر کوتاهمدت به توکنهای کاربر سیستمی (System User Tokens) مهاجرت کنید.
- در صورت مشاهده خطای ۴۰۱، ابتدا Graph API را تست کنید و سپس به سراغ بررسی مجوزهای MCP بروید تا از اتلاف بودجه استنتاج جلوگیری کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو