الجودة والتطوير

التطوير بمساعدة الذكاء الاصطناعي (MCP)

المنصّة توفّر خادمي MCP (Model Context Protocol) يربطان مساعدك البرمجي (Claude Code، Cursor، أو أي عميل MCP) بمعايير أوكتا وأدواتها — فيلتزم مساعدك بالمعايير من أول سطر بدل اكتشاف المخالفات عند مراجعة الـ PR.

1) الخادم المحلي — داخل مستودعك (بلا حساب)

كل مستودع تطبيق مُنشأ من المنصّة يأتي ومعه خادم MCP محلي جاهز في scripts/mcp/ مع ملف .mcp.json في الجذر:

  • Claude Code: يكتشفه تلقائياً بمجرد فتح المستودع — لا إعداد إطلاقاً.
  • Cursor: أضِف إلى .cursor/mcp.json:
{ "mcpServers": { "okta-partner": { "command": "php", "args": ["scripts/mcp/server.php"] } } }

يتطلّب php في الـ PATH فقط (بلا Composer وبلا اتصال شبكة). أدواته تلفّ نفس فاحصات CI (scan_code، validate_manifest، lint_permission، component_catalog، feature_service، search_standards، list_scopes) — أي ما يمرّ محلياً يمرّ في بوّابة الدمج. راجع scripts/mcp/README.md داخل مستودعك للتفاصيل.

2) الخادم المستضاف — من حسابك (بموافقة، بلا توكن)

الخادم المستضاف يضيف فوق أدوات المعايير أدوات حيّة مرتبطة بهويّتك: تطبيقاتك وإصداراتها، الكتالوج الحيّ للنطاقات، المتابعة (صحة التطبيق وتسليمات الـ webhooks)، المحاكي، وأدوات التحكّم ولوحة التحكّم.

الربط (مرة واحدة):

# Claude Code
claude mcp add --transport http okta-partner https://partners.getokta.io/mcp
// Cursor — .cursor/mcp.json
{ "mcpServers": { "okta-partner": { "url": "https://partners.getokta.io/mcp" } } }

أول استخدام يفتح المتصفح على شاشة الموافقة في منصّة الشركاء: سجّل دخولك بحسابك المعتاد، راجع ما ستستطيع الأداة فعله، ووافق. لا يوجد أي توكن يُنسخ أو يُلصق — التفويض OAuth (PKCE) بالكامل.

صلاحية الكتابة: افتراضياً الربط قراءة فقط (تطبيقاتك + المعايير + المتابعة). لتمكين أدوات التحكّم (تقديم للمراجعة، إنشاء إصدار، تعديل الـ changelog وقناة الإصدار، ضبط أنواع الحسابات، برمجة لوحة تحكّم التطبيق وإعدادات الـ webhooks) فعّل خيار «سماح بالكتابة (التحكّم في التطبيق)» في شاشة الموافقة نفسها. كل الكتابات تمرّ بنفس ضوابط الواجهة (لا تجاوز لحالة النشر، ولا كتابة على إصدار منشور).

أبرز الأدوات الحيّة:

الأداة الوظيفة
whoami / list_my_modules هويّتك وتطبيقات جهتك
get_module / list_versions تفاصيل تطبيق + manifest المبني + إصداراته
module_health تقرير صحة: الحالة، الإصدارات، فحوصات النشر، sandbox
webhook_deliveries / delivery_stats / replay_delivery سجل تسليمات External وإحصاءاتها وإعادة الإرسال
notification_deliveries ما جرى لإشعارات كتالوج تطبيقك عبر كل مدرسة ثبّتته: إجماليات بحسب الحالة والقناة والمفتاح، ثم آخر الإخفاقات بنصّ الخطأ — أول مكان تنظر فيه حين تقول مدرسة «لم يصل الإشعار»
preview_module / store_listing محاكاة بطاقة المتجر والظهور في لوحة الجهة + رابط صفحة المعاينة
create_module إنشاء تطبيق جديد كمسودة — الخطوة الأولى قبل create_version (تتطلّب صلاحية الكتابة)
submit_module / create_version / update_changelog / set_release_channel / sync_from_manifest التحكّم في دورة الحياة (تتطلّب صلاحية الكتابة)
get/set_developer_ui / get/set_webhook_config برمجة لوحة تحكّم التطبيق وإعداداته (تتطلّب صلاحية الكتابة)
set_landing_widgets تصريح ويدجتس صفحة الهبوط على تطبيقك المدمج مباشرةً — أو كتجاوز لإصدار — دون المرور بـ manifest.json. القائمة المُمرَّرة تستبدل المخزَّن، و[] تمسح التصريح (وعلى إصدار تُلغي التجاوز فيعود للوراثة). القواعد هي قواعد النشر في okta-web نفسها (تتطلّب صلاحية الكتابة)
get/set_notification_config قراءة وتعديل كتلة مزوّد الإشعار/الدفع — على مستوى التطبيق أو كتجاوز لإصدار (التعديل يتطلّب صلاحية الكتابة)
list_notifications / create_notification / update_notification / delete_notification كتالوج الإشعارات التي يُرسلها الإصدار (الكتابة تتطلّب صلاحية الكتابة)
discover_notifications / import_notifications فحص المستودع عن مفاتيح إشعارات غير مُعلَنة واستيرادها (الاستيراد يتطلّب صلاحية الكتابة)
list_account_types / get_account_types / set_account_types كتالوج أنواع الحسابات، والمُعلَن منها على إصداراتك، وضبطها (الضبط يتطلّب صلاحية الكتابة)
list_shared_data ما تشاركه التطبيقات الأخرى مع غيرها — القائمة التي تختار منها قبل طلب الوصول. تُقرَأ من آخر إصدار منشور لكل تطبيق، فما زال في مسوّدة لا يظهر
list_app_links / request_app_access / answer_access_request / revoke_app_access الروابط بين التطبيقات: عرضها في الاتجاهين، وطلب الوصول، والردّ عليه، وسحب موافقة سبق منحها (الكتابة تتطلّب صلاحية الكتابة)
set_shared_data إعلان ما يشاركه تطبيقك مع غيره على إصدار قابل للتعديل — الخطوة الأولى، إذ لا يستطيع أحد طلب ما لم تُعلنه. استبدال كامل للقائمة، و[] تمسحها. الأسماء والأوصاف تُكتَب للمدرسة لا للمبرمج (تتطلّب صلاحية الكتابة)
get_app_dependencies / set_app_dependencies ما يعتمد عليه تطبيقك من تطبيقات أخرى: المُعلَن حالياً، والمتاح إعلانه (ما مُنِح لك ولا يزال منشوراً)، وضبطه على إصدار قابل للتعديل. استبدال كامل، ولا يُقبل بند بلا منح ساري (الضبط يتطلّب صلاحية الكتابة)
get_org_profile / set_org_profile ملف جهتك وملف المطوّر الذي يظهر في المتجر، ولغة واجهتك. كلمة مرور الحساب لا تُقرأ ولا تُكتَب عبر MCP إطلاقاً، والشعار يُرفَع من البوابة فقط (التعديل يتطلّب صلاحية الكتابة)
optimize_screenshots إعادة ترميز لقطات إصدارٍ مخزَّنة إلى WebP وتصغير ما هو أعرض من اللازم. اللقطات الجديدة تُحوَّل عند الرفع أصلاً، فهذه للمكتبة الأقدم (تتطلّب صلاحية الكتابة)

أنواع الحسابات عبر MCP

تبويب «أنواع الحسابات» في محرّر الإصدار متاح كاملاً من مساعدك:

  • list_account_types — الكتالوج الحيّ (نفس قائمة البوابة): لكل نوع key وtarget (role = دور داخل الجهة، portal = بوابة عامّة) وتسمية عربية/إنجليزية. أي مفتاح خارج القائمة يُقبل كـ دور مخصّص؛ البوابتان مجموعة مغلقة (student | guardian).
  • get_account_types — ما يُعلنه تطبيقك فعلاً. أنواع الحسابات تُعلَن على الإصدار (لا قيمة على مستوى التطبيق تُورَّث)، فالتقرير سرد لكل إصدار؛ مرّر {version} للتضييق.
  • set_account_types — استبدال كامل للقائمة على إصدار قابل للتعديل، تماماً كما يفعل حفظ محرّر الإصدار. اقرأ الحالي أولاً وأعد إرساله كاملاً بعد التعديل؛ account_types: [] تمسح الكل.

كل نوع: key (مطابق لاسم الدور أو البوابة) + kind (primary | dependent) + هدف واحد فقط: roles (دور واحد) أو portal + سطح واحد على الأقل: web_route (اسم مسار Laravel مثل school-app.admin — ليس رابطاً ولا /path) و/أو mobile_entry (بالشكل الذي يفرضه وضع الجوال على الإصدار) — ومع صفّ native له mobile_entry، min_contract اختياري (عدد صحيح ≥ 1: أرضية عقد المضيف لهذا النوع وحده؛ أسقطه ليرث افتراض الكتلة). هذا الإعلان الواحد هو ما يبني menu.audiences[] في okta-web وmobile.audiences[] في تطبيق أوكتا، والأداة ترفض مسبقاً كل ما يرفضه المُحقِّق عند النشر.

الأدوار المخصّصة للجهة. يُسمَح بمفتاح دور خارج كتالوج أنواع الحسابات — فالجهات تعرّف أدوارها الخاصة — لكنه يُعلَن صراحةً: الجمهور الناتج يحمل "custom": true في الـ manifest، وset_account_types تُنبّهك عند تخزين واحد. أما نشر مفتاح خارج الكتالوج بلا هذه العلامة فمرفوض عمداً: المنصّة تطابق مفتاح الدور كنص على الأدوار التي يحملها المستخدمون فعلاً، فالمفتاح المخترَع أو المكتوب خطأً لا يطابق أحداً — يُنشَر الإصدار، ويبدو الـ manifest سليماً، ثم تُرفض كل صفحات ذلك الجمهور لكل مستخدم تحت بوّابة الجماهير التي ترفض بالافتراض. إن كنت تقصد نوعاً معروفاً فاختر مفتاحه بالضبط (list_account_types)، وإن كنت تقصد فعلاً دوراً تعرّفه الجهة فتأكّد أنها تملكه بهذا الاسم حرفياً. ولا تصحّ custom أبداً على جمهور portal.

ملاحظة أمان: التوكن مرتبط بك وبجهتك فقط — لا يرى ولا يلمس تطبيقات أي جهة أخرى، وسرّ الـ webhooks لا يُقرأ ولا يُعرض عبر أي أداة. يمكنك إعادة الربط في أي وقت، والموافقة على الكتابة قرارك في كل ربط.


عرض الدليل كاملاً في صفحة واحدة · ↧ Markdown خام