ה-OAuth של MCP לא חושף את כל ה-scopes
שאלה תמימה בבוקר: יש Security Insights פתוחים על הדומיין? פתחתי את ה-MCP של Cloudflare, ביקשתי את /zones/{id}/security-center/insights, וקיבלתי:
Error: Cloudflare API error: 10000: Authentication error
/zones עובד. /security-center/* לא. ההסבר היחיד הוא scope חסר בטוקן. הרפלקס היה ברור — /mcp → reconnect, אסמן את ה-checkbox של Security Center, נמשיך הלאה.
הציפייה שלא התקיימה
המודל המנטלי שלי לגבי OAuth הוא של Google/GitHub: כשאתה מבקש re-authorize, מסך ההסכמה מציג את כל ה-scopes שהאפליקציה מסוגלת לבקש, ואתה מסמן מה לתת. אם משהו חסר, פשוט תחזור על הזרימה.
אצל Cloudflare זה לא ככה. עברתי את ה-OAuth שוב — Authentication successful. Reconnected. — וקיבלתי בדיוק את אותו 10000. ה-consent screen בכלל לא הציג את Security Center כאופציה. ה-scopes ש-MCP server יכול לבקש מקודדים במניפסט שלו, ואם הוא לא רשם את Account Security Center Insights ברשימה — אין דרך להוסיף אותו בזמן ההסכמה. אתה מקבל בדיוק את מה שהמפתח של ה-MCP החליט להציע, ולא מה ש-Cloudflare מסוגל לתת.
הפינה השנייה: account-scope בלבד
חיפשתי בדוקומנטציה את השם המדויק של ההרשאה. הציפייה הייתה לזוג: Account Security Center Insights: Read ו-Zone Security Center Insights: Read. ה-API הרי חושף גם /zones/{id}/security-center/... וגם /accounts/{id}/security-center/..., אז למה לא?
ב-permissions reference יש רק אחת:
Account Security Center Insights
Read: Grants read access to Security Center Insights
Edit: Grants write access to Security Center Insights
Scope: com.cloudflare.api.account
זהו. אין variant של zone. הקריאה ל-/zones/{id}/security-center/insights מורשית בכל זאת — היא פשוט נבדקת מול ה-account-scope של הטוקן, לא מול ה-zone. ה-URL מטעה: הוא נראה zone-scoped, מתנהג account-scoped. אם הייתי מנסה לפתור את זה רק לפי הצורה של ה-path, הייתי מבזבז עוד שעה.
איפה זה השאיר אותי
OAuth של MCP — לפחות בגרסה הזו של Cloudflare — הוא רשימה סגורה. אם ה-scope שאתה צריך לא ברשימה, reconnect לא עוזר; צריך טוקן ידני עם Authorization: Bearer ולעקוף את ה-OAuth לגמרי. וגם בטוקן הידני, אל תחפש את ההרשאה לפי צורת ה-URL — תחפש לפי שם רשמי, כי Cloudflare מצמידה הרשאות ל-API endpoints בצורה שלא תמיד תואמת את ה-path.
ההפסד הקטן יותר: בזבזתי את הזמן על reconnect כי הנחתי ש-OAuth זה OAuth. ההפסד הגדול יותר הוא עקרוני — מודל ההרשאות של MCP יותר נוקשה ממה שנראה. כשהוא נשבר, הפתרון לא בתוך הזרימה של MCP אלא מחוצה לה.