تخطى إلى المحتوى

API، CLI وMCP

ثلاث طرق للوصول إلى نفس الحساب، بنفس حدود الخطة ونفس الأذونات التي يمنحها دورك بالفعل. كل ما يلي هو أحد هذه الثلاثة، لذا من المفيد معرفة أي منها جئت من أجله.

API

REST، من خط أنابيب، نص برمجي أو أدواتك الخاصة. رمز مميز تصدره وتلغيه بنفسك، وJSON في كلا الاتجاهين.

واجهة برمجة التطبيقات (API)

CLI

ملف Python واحد، لا حاجة للتثبيت. نفس API، لشخص في محطة طرفية بدلاً من برنامج: عرض ما هو معطل، إضافة مراقب.

عميل سطر الأوامر

MCP

عنوان واحد، يتم لصقه في Claude أو أي شيء آخر يدعم البروتوكول. يقرأ الحساب ويغيره، كأنك، في محادثة.

للمساعد

رمز API الخاص بك

قم بإنشاء واحد تحت رموز API في حسابك. يتم عرضه مرة واحدة، نحن نحتفظ فقط ببصمة منه، وهو يخصك وليس المنظمة: لا يمكنه فعل أكثر مما يمكنك، ويتوقف عن العمل إذا غادرت أو تغير دورك. اختر القراءة، أو القراءة والكتابة.

أرسله كـ Authorization: Bearer n404_... في كل مكالمة. الأول الذي يستحق القيام به هو /api/v1/me، والذي يجيب عن المنظمة التي يعمل الرمز المميز لصالحها، الدور الذي يحمله وأي من النطاقين لديه: الشخص الذي لديه حسابان لديه رمزان مميزان ولا توجد طريقة أخرى لمعرفة أيهما موجود في متغير البيئة.

ما هو موجود في الإصدار 1

الاتصال ما تفعله
GET /api/v1/me ما هو هذا الرمز المميز، ولأي منظمة يعمل
GET /api/v1/monitors كل المراقبين، الأقدم أولاً
POST /api/v1/monitors إنشاء واحد، وفقًا لنفس القواعد التي يلتزم بها النموذج
GET /api/v1/monitors/{id} مراقب واحد
PATCH /api/v1/monitors/{id} تغيير اسمه، عنوانه، الفاصل الزمني أو الإعدادات، أو إيقافه مؤقتًا
DELETE /api/v1/monitors/{id} حذفه، وتاريخه معه
GET /api/v1/monitors/{id}/status ما يفعله الآن، ومدة تشغيله خلال نافذة زمنية
GET /api/v1/groups كل مجموعة، مع عدد المراقبين فيها
POST /api/v1/groups أنشئ واحدة؛ الاسم الموجود يعيد المجموعة التي تحمل هذا الاسم
GET /api/v1/groups/{id} مجموعة واحدة
PATCH /api/v1/groups/{id} أعد تسميتها، أو غيّر وصفها
DELETE /api/v1/groups/{id} احذفها. مراقبوها يبقون بدون مجموعة
GET /api/v1/incidents انقطاعات، الأحدث أولاً، مفلترة حسب الحالة، المراقب أو الفترة
GET /api/v1/incidents/{id} حادث واحد، مع المجسات التي رصدته وأكدته
GET /api/v1/maintenance نوافذ الصيانة وما تغطيه
GET /api/v1/maintenance/{id} نافذة واحدة، مع المراقبين والمجموعات التي تغطيها
POST /api/v1/maintenance جدول واحدة، على ساعة مؤسستك، ليتمكن النشر من فتح نافذة قبل أن يبدأ
DELETE /api/v1/maintenance/{id} احذفها. ما كانت تغطيه يبقى مغطى
GET /api/v1/status-pages كل صفحة حالة، وما إذا كانت مفعّلة
GET /api/v1/status-pages/{id} صفحة واحدة، وما يتم نشره عليها
POST /api/v1/status-pages/{id}/monitors ضع مراقباً على الصفحة، تحت الاسم الذي يجب أن يقرأه الجمهور
DELETE /api/v1/status-pages/{id}/monitors/{id} أزله من هذه الصفحة. الصفحات الأخرى تحتفظ به
POST /api/v1/status-pages/{id}/groups ضع مجموعة على الصفحة؛ المراقبون فيها يأتون أيضاً
DELETE /api/v1/status-pages/{id}/groups/{id} أزل العنوان. مراقبوها يبقون منشورين

كل معرف في مسار أو جسم هو UUID، وليس رقماً. الكتابة تحتاج إلى رمز قراءة وكتابة و دور يسمح بالكتابة: النطاق هو ما قدمته للبرنامج، والدور هو ما سمح لك بتقديمه.

openapi.json

المستند هو OpenAPI 3.1. يصف كل استدعاء، شكل كل جسم، ورمز الحامل، بحيث يمكن إنشاء عميل منه بدلاً من كتابته: openapi-generator، oapi-codegen والبقية تقرأه كما هو. العمليات مسماة لشخص، لذا الطرق المُنشأة هي listMonitors وcreateMonitor.

الإصدار 1 ينمو فقط: قد يتم إضافة حقل، ولا يتم إزالة أي حقل أو إعادة كتابته، والإصدار الثاني سيكون مساراً ثانياً. لذا العميل المُنشأ يستمر في العمل، وإعادة إنشائه هي الطريقة للحصول على الجديد.

عميل، إذا كنت تريد واحداً

ملف واحد، Python 3.9 أو أحدث، بدون تبعيات. قم بتنزيله، اجعله قابلاً للتنفيذ، وضع رمزك في البيئة. يقوم بكل ما تقوم به API، لأن كل أمر هو استدعاء واحد للمسارات أعلاه.

nomore404.py nomore404_mcp.py

curl -O https://nomore404.com/api/nomore404.py
curl -s https://nomore404.com/api/nomore404.py.sha256 | sha256sum -c
chmod +x nomore404.py
export N404_TOKEN=n404_...

./nomore404.py monitors list
./nomore404.py monitors add --type https --target shop.example.com
./nomore404.py incidents --state open

السطر الثاني يستحق التشغيل. يتحقق من الملف مقابل الملخص الذي ننشره بجانبه، وهو ملخص ما يرسله هذا الخادم بالضبط، لذا التنزيل الذي تم تغييره في الطريق لا يتطابق. ./nomore404.py --version يقول من أي إصدار جاء، وكل طلب يقوم به يقول نفس الشيء في User-Agent الخاص به.

الرمز يأتي من N404_TOKEN أو من ملف nomore404.env بجانب النص البرمجي، وليس من علامة سطر الأوامر: الحجة تكون مرئية في ps لكل مستخدم على الجهاز وتبقى في سجل القشرة الخاص بك.

للمساعد

المساعد يمكنه قراءة هذا الحساب وتغييره، عبر بروتوكول Model Context. هناك طريقتان للدخول وهما ليستا نفس الشيء.

عنوان واحد، لا شيء للتثبيت

الصق هذا حيث يطلب مساعدك موصلًا مخصصًا. سيرسلك هنا لتسجيل الدخول ولتحديد المنظمة التي يكون الاتصال لها، وهذا هو الإعداد بالكامل.

يتصرف كأنك: يتم قراءة دورك في كل استدعاء، لذا المساعد المتصل بواسطة شخص يمكنه القراءة فقط يمكنه القراءة فقط. يقرأ المراقبين، الانقطاعات، وقت التشغيل، نوافذ الصيانة والمجموعات، ويمكنه إضافتها وتغييرها، بما في ذلك حذف مراقب والتاريخ معه. افصله متى شئت من رموز API، حيث يتم إدراجه بجانبها.

أو قم بتشغيله بنفسك، واستمر في القراءة

nomore404_mcp.py يقدم نفس API كالأدوات من جهازك الخاص. احتفظ به بجانب nomore404.py، الذي يستخدمه للرمز وللتصفح. يقرأ ولا يكتب أبداً، وهو السبب لاختياره: المساعد هو متصل يمكن إقناعه بأشياء، وأداة تحذف مراقباً وتاريخه هي على بعد خطوة واحدة من الاستخدام.

ملفان، رمز بجانبهما، وسطر واحد لتسجيل الخادم. Claude Code:

curl -O https://nomore404.com/api/nomore404.py
curl -O https://nomore404.com/api/nomore404_mcp.py
echo 'N404_TOKEN=n404_...' > nomore404.env

claude mcp add nomore404 -- python3 "$PWD/nomore404_mcp.py"

أي شيء آخر يتحدث البروتوكول هو نفس الأمر مكتوب كـ JSON، أينما يحتفظ ذلك العميل بخوادمه:

{
  "mcpServers": {
    "nomore404": {
      "command": "python3",
      "args": ["/path/to/nomore404_mcp.py"]
    }
  }
}

لا يسمي أي منهما الرمز، لأنه لا ينبغي: يتم قراءته من nomore404.env بجانب النصوص البرمجية، أو من N404_TOKEN في البيئة التي يبدأ بها المساعد. ثم اسأله ما هو معطل، لماذا فتح حادث، أو كيف كان أداء المراقب هذا الشهر.

كلاهما بضعة مئات من الأسطر ويستحق القراءة قبل تشغيلهما. لا يتم تغليف أي منهما أو توقيعه، ولا شيء يمنعك من إنشاء عميلك الخاص من المستند بدلاً من ذلك.

الإخفاقات، والقوائم الطويلة

شكل خطأ واحد

الحالة تقول الفئة. الجسم يقول أي إخفاق كان، مع رمز للتفرع عليه وجملة للقراءة. الجملة قد يتم إعادة صياغتها في أي إصدار، لذا لا ينبغي تحليلها.

{
  "error": {
    "code": "monitor_not_found",
    "message": "Nothing here with that id."
  }
}

مؤشرات، وليس إزاحات

القائمة تجيب بـ items وnext_cursor. أعد المؤشر للحصول على الصفحة التالية، وتوقف عندما يكون null. الحوادث تصل أثناء قراءتك لها، والإزاحة ستعرض لك صفاً مرتين بهدوء ولن تعرض الصف التالي.

GET /api/v1/incidents?limit=50
GET /api/v1/incidents?limit=50&cursor=...

كم يمكنك أن تطلب

رمز واحد يمكنه إجراء مئة وعشرين مكالمة في الدقيقة. كل إجابة تحتوي على RateLimit-Remaining وRateLimit-Reset، لذا يمكن للعميل المنضبط أن ينظم نفسه بدلاً من اكتشاف الحد عن طريق تجاوزه. تجاوز الحد يعطي 429 مع Retry-After.

أنشئ حسابًا مجانيًا