ما يحتاجه الوكيل ولا تمنحه إياه REST API
توجد REST API على هذا الموقع، وأي مبرمج يدمجها سيبلي حسنًا. أما الوكيل فلن يفعل: فهو لا يستطيع فتح المرجع، وتحديد أي نقطة طرفية من ثلاث يريدها، وكتابة طلب يدويًا بسلسلة الاستعلام الصحيحة. إنه يسأل خادمًا عمّا يستطيع فعله، فيتلقى مخططات مقروءة آليًا، ويستدعي واحدًا منها.
لذا فكل ما تقوم به الخدمة مكشوف مرة ثانية، على هيئة أدوات. ستة منها، ولا حالة يجب إدارتها بين الاستدعاءات:
| الأداة | ما وظيفتها |
|---|---|
create_inbox | يبتكر عنوانًا جديدًا يستطيع الوكيل توزيعه فورًا. لا شيء محجوز على الخادم، لذا لا يمكن أن تفشل. تقبل prefix اختياريًا قابلاً للقراءة؛ ولاحقة عشوائية تُبقيه فريدًا. |
list_domains | النطاقات العامة التي يجوز لأي أحد استخدامها — مفيدة حين يرفض نموذج تسجيل أحدها للتو. |
list_messages | كل ما ينتظر عند عنوان، الأحدث أولاً. تعود فورًا، حتى حين لا يوجد شيء. |
read_message | رسالة واحدة كاملة: المرسِل، الموضوع، النص العادي، HTML، المرفقات. هنا يوجد الرمز أو رابط الدخول. |
wait_for_message | تنتظر حتى يصل شيء ما، ثم تعيده كاملاً. الأداة التي تُستدعى لحظة إرسال النموذج. |
delete_message | تزيل رسالة الآن بدل انتظار 5 يومًا حتى تنتهي صلاحيتها. تكرارها لا يُغيّر شيئًا، فإعادة المحاولة لا تكلّف الوكيل شيئًا. |
يجيب الخادم أيضًا عن initialize بفقرة قصيرة من التعليمات، تُمرّرها معظم العملاء مباشرة إلى النموذج. لذا يصل الوكيل وهو يعرف مسبقًا وظيفة هذه الخدمة وتحذيرها الحقيقي الوحيد، دون أن يكتب أحد ذلك في أي موجّه.
وصل عميلاً بسطر واحد
النقطة الطرفية هي رابط واحد، ولا شيء يستوجب التسجيل من أجله على النطاقات العامة. كل عميل MCP يأخذ الشكل نفسه من الإعداد — Claude Desktop وClaude Code وCursor وContinue وOpenAI Agents SDK وأي عميل آخر يتحدث البروتوكول:
{"mcpServers":{"grabmail":{"url":"https://grabmail.io/mcp"}}}النقل هو Streamable HTTP: طلب POST واحد يحمل JSON-RPC 2.0، ورد JSON واحد، بلا تدفق يبقى مفتوحًا. لذا يمكنك فحص الأمر كله من طرفية قبل أن يدخل أي وكيل في الصورة:
curl -sX POST https://grabmail.io/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'العملاء التي تبحث عن خادم قبل سؤال إنسان ستجد /.well-known/mcp.json على النطاق، وهو يسمّي النقطة الطرفية نفسها ونوع نقلها.
حلقة التسجيل كاملة، في أربعة استدعاءات أدوات
هذا هو التسلسل الذي يحتاجه كل وكيل تقريبًا، ولا شيء أكثر منه:
- استدعِ
create_inbox. يعود عنوان، ومستعار، والنطاق، وملاحظة تخبر الوكيل أيًا من الاثنين يوزّعه. لم يُنشأ شيء بعد — يبدأ وجود الصندوق مع وصول أول رسالة إليه. - ضع المستعار في النموذج. تحصل الخدمة التي يجري التسجيل فيها على عنوان يعمل ويصل إلى الصندوق، ولا يمكن استخدامه لقراءته.
- استدعِ
wait_for_messageبالعنوان. فور الإرسال مباشرة، لا بحسب مؤقّت. إنها تنتظر؛ ولا تستطلع في حلقة يكتبها الوكيل بنفسه. - اقرأ الرمز من الرسالة. يعود المتن كاملاً مع الانتظار، لذا لا حاجة عادةً إلى استدعاء ثانٍ على الإطلاق —
read_messageلازمة فقط لشيء وصل قبل ذلك.
لماذا تعود wait_for_message قبل وصول البريد
إنها الأداة التي تجعل الوكيل عمليًا، وهي أيضًا الأداة التي يفاجئ سلوكها الناس، فتستحق دقيقة من وقتك. الاستدعاء يبدو هكذا:
curl -sX POST https://grabmail.io/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":
{"name":"wait_for_message",
"arguments":{"address":"demo.5kuqarzuch@grabmail.io",
"subject_contains":"code"}}}'تنتظر حتى 25 ثانية كحد أقصى. وإن لم يصل شيء بحلول ذلك، فهي لا تفشل — بل تعود بجواب واضح وتطلب أن تُستدعى مرة أخرى:
{
"timed_out": true,
"waited_seconds": 25,
"message": null,
"note": "Nothing arrived yet. Call wait_for_message again ..."
}- لماذا هناك سقف من الأساس
- كل ثانية انتظار هي عامل خادم لا يفعل شيئًا سوى النوم، وعددهم محدود. انتظار قد يستمر خمس دقائق يعني وكيلاً واحدًا يشغل مكانًا يحتاجه مئة غيره. كما أن 25 ثانية تقع ضمن المهلة الافتراضية لكل عميل، فيعود الاستدعاء بدل أن يتخلى العميل عن انتظاره.
- 8 عمليات انتظار فقط في آن واحد
- بعد ذلك العدد تجيب الأداة فورًا بـ
timed_outوملاحظة تقول ذلك. أن يُقال لك عد مرة أخرى أفضل من أن تُصفّ خلف سبعة وكلاء آخرين دون أي وسيلة لمعرفة ذلك. - التصفية، حتى لا ينهيها بريد خاطئ
- تجعل
from_containsوsubject_containsالانتظار يتجاهل أي شيء آخر يصل في الأثناء. أماsince_idفهي ما تُمرَّر حين يكون في الصندوق شيء مسبقًا: أعطها آخر معرّف رأيته، ولن يُرضي الاستدعاءَ إلا بريد جديد فعلاً.
وزّع المستعار، وراقِب العنوان
لكل صندوق بريد هنا عنوان ثانٍ، طوله اثنا عشر حرفًا، يوصل الرسائل إلى الصندوق نفسه ولا يستطيع قراءتها. هذا الفارق يهم الوكيل أكثر بكثير مما يهم الإنسان، لأن الوكيل يلصق بارتياح أي شيء أُعطيه في أي حقل يجده.
لذا فإن create_inbox لا تكتفي بإعادة عنوان والتمني. إنها تعيد الاثنين معًا، وحقل next_step يوضّح أيهما أيهما — يقرأ الوكيل نتيجة أداته بنفسه، فتصل التعليمة إلى حيث تلزم بدل أن تبقى في صفحة توثيق لا يقرؤها أحد في الحلقة.
ما تكتبه في تعليمات الوكيل نفسه
تصف الأدوات نفسها بوضوح كافٍ يجعل نموذجًا قديرًا يفعل هذا بشكل صحيح دون توجيه. خمسة أسطر تجعل الأمر مضمونًا لا مرجّحًا فقط:
- عنوان واحد لكل تسجيل. لا عنوان واحد يُعاد استخدامه في كل مكان: صندوق بريد يحمل رسائل ست خدمات هو ستة تأكيدات على الوكيل تمييزها عن بعضها، وتسريب واحد يفضحها كلها.
- وزّع المستعار، لا العنوان أبدًا. يستحق القول صراحةً حتى وإن كانت نتيجة الأداة تقوله أيضًا.
- استدعِ
wait_for_messageفور الإرسال مباشرة، واستدعها مرة أخرى عندtimed_outبدل معاملتها كفشل. مرتان أو ثلاث أمر طبيعي. - مرّر
since_idحين لا يكون الصندوق جديدًا، وإلا أرضت رسالة قديمة الانتظار وقرأ الوكيل رمزًا انتهت صلاحيته منذ ساعة. - احذف الرسالة بعد استخدام الرمز. غير إلزامي — فكل شيء يزول خلال 5 يومًا على أي حال — لكنه يغلق النافذة مبكرًا، ولا يكلّف أكثر من استدعاء واحد آمن التكرار.
مكتوبةً على هيئة كتلة تعليمات، لا يتجاوز طولها هذا:
عند حاجتك إلى عنوان بريد إلكتروني، استدعِ create_inbox ووزّع ALIAS الذي\nتعيده، لا العنوان أبدًا. فور إرسال النموذج مباشرة، استدعِ\nwait_for_message بالعنوان. إن أجابت timed_out، استدعها مرة أخرى —\nهذا طبيعي ولم يضع شيء. مرّر since_id إن كان في الصندوق بريد\nمسبقًا. احذف الرسالة بعد استخدام الرمز.الحدود التي تستحق معرفتها قبل أن تبني عليها
جميعها معلنة لا مكتشَفة بالصدفة، ولا توجد باقة تدفع لرفع أي منها:
| الحد | القيمة | ماذا يعني ذلك للوكيل |
|---|---|---|
| الانتظار الواحد | 25 ثانية | ثم timed_out. استدعِ مرة أخرى؛ ولا تعاملها كخطأ. |
| الانتظارات في آن واحد | 8 | بعد ذلك العدد تعود الأداة فورًا وتقول ذلك. عُد إلى list_messages بدلاً منها. |
| القراءات | قراءة واحدة في الثانية، لكل عنوان | أعلى بكثير مما تفعله حلقة استدعاء أدوات عادية. الانتظار الحاجب طلب واحد، لا ستون طلبًا. |
| حجم الرسالة | 5 MB | تُرفض أثناء محادثة SMTP نفسها، فيُبلَّغ المرسِل بدل أن ينتظر الوكيل شيئًا لن يصل أبدًا. |
| الاحتفاظ | 5 يومًا | حد صارم تفرضه مهمة مجدولة. أي شيء يجب أن يحتفظ به الوكيل، عليه أن يدوّنه بنفسه. |
لا توجد نقطة طرفية للإرسال ولا أداة لذلك. هذه الخدمة تستقبل فقط، وهذا ما يمنع صندوق بريد بلا مصادقة من أن يتحول إلى مُرحِّل بريد مزعج — فالوكيل الذي يحتاج إلى الرد على إنسان يحتاج إلى صندوق بريد حقيقي في مكان آخر.
حين يرفض نموذج تسجيل النطاقات العامة
تحتفظ خدمات كثيرة بقوائم لنطاقات البريد المؤقت، والنطاقات العامة الثلاثة هنا مدرجة فيها. يواجه الوكيل هذا على هيئة نموذج يرفض العنوان الذي أُعطيه للتو، أو أسوأ من ذلك، يقبله ولا يرسل شيئًا أبدًا.
الحل الدائم هو نطاق تملكه أنت. سجل MX واحد يحوّل كل عنوان عليه إلى صندوق بريد هنا، وهو غير مدرج في قائمة أحد لأنه غير مطبوع في أي مكان على هذا الموقع، والأدوات الست نفسها تعمل عليه دون تغيير — ما عدا create_inbox وحدها، لأنها تبتكر عناوين على النطاقات العامة فقط. يكتفي الوكيل باستخدام you-pick-it@your-domain واستدعاء wait_for_message عليه.
سجل MX الخاص بنطاقك10 smtp.grabmail.io
الشرح الكامل خطوة بخطوة هنا — السجل، وما يثبته نشره، وحدود صندوق بريد بلا كلمة مرور عليه.
ما لا تسمح للوكيل بفعله بهذا
هذا هو الجزء الصادق، والجزء الذي يوفر عليك بعد ظهر كاملاً:
- لا شيء قد تحتاج إلى استرجاعه. أي شيء يحمل مالاً أو هوية أو عملاً. يعود الصندوق فارغًا خلال 5 يومًا، ويستطيع قراءته أي من يعرف العنوان، فإعادة تعيين كلمة مرور تُرسل إليه العام المقبل لا تصل إلى أحد — أو تصل إلى شخص آخر.
- ليس كعامل تحقق ثانٍ. صندوق بريد بلا كلمة مرور عليه ليس عامل تحقق.
- ليس لأي شيء خاص. ليس لأننا نقرؤه، بل لأن العنوان هو السر الوحيد المطروح، وقد يكون الوكيل قد كتبه في سجل، أو نص محادثة، أو رسالة commit.
- ليس للأعداد الكبيرة. وكيل يفتح حسابات بالمئات هو بالضبط السلوك الذي وُجدت كل قائمة حظر من أجله، وهو أسرع طريقة لجعل النطاقات العامة مرفوضة عند الجميع.
إن استُخدم لما هو مصمم له — خطوة التأكيد التي تقف بين الوكيل وما طُلب منه فعله فعلاً — فإنه يزيل الخطوة الوحيدة التي توقفه بثبات.
أسئلة
هل أحتاج إلى مفتاح API أو حساب؟
لا. النطاقات العامة، والأدوات، ونطاقك الخاص، كلها مجانية وبلا مصادقة. الحالة الوحيدة التي تستلزم مفتاحًا هي نطاق أُغلق بناءً على طلب، فيصبح حينها يطلب ترويسة Authorization.
مع أي عملاء يعمل هذا؟
أي عميل يتحدث Model Context Protocol — Claude Desktop وClaude Code وCursor وContinue وOpenAI Agents SDK وغيرها. النقل هو Streamable HTTP، وهو ما تعتمده العملاء الحالية افتراضيًا، وتُقبل ثلاثة إصدارات من البروتوكول حتى يتصل عميل أقدم أيضًا.
لماذا تعود wait_for_message بـtimed_out؟
لأن الانتظار الواحد مسقوف عمدًا عند 25 ثانية. ليس خطأً ولم يضع شيء: استدعها مرة أخرى. يستغرق البريد عادةً وقتًا أطول مما توحي به الصفحة التي وعدت به، وانتظاران أو ثلاثة متتالية أمر عادي في أي تسجيل.
هل يستطيع الوكيل استخدام نطاقي الخاص بدلاً من ذلك؟
نعم، ولا يتغيّر شيء سوى العنوان. وجّه سجل MX إلى smtp.grabmail.io ويصبح كل عنوان على ذلك النطاق قابلاً للقراءة عبر الأدوات نفسها. create_inbox وحدها مقصورة على النطاقات العامة، لأنها الأداة التي تبتكر لك اسمًا.
هل يستطيع الوكيل إرسال بريد إلكتروني عبر هذا؟
لا. لا توجد أداة إرسال ولا نقطة طرفية للإرسال، عن قصد: خدمة بلا مصادقة تستطيع إرسال البريد ستتحول إلى مُرحِّل بريد مزعج خلال يوم واحد. سجل SPF لدينا هو v=spf1 -all وسجل DMARC هو p=reject، لذا فأي رسالة تدّعي أنها صادرة من عنوان هنا هي رسالة مزوَّرة.
هل صندوق البريد خاص؟
لا، وهذا هو التحذير الوحيد الذي يجب إعطاؤه للوكيل صراحةً. على نطاق عام، يستطيع أي من يعرف العنوان أو يخمّنه قراءته. استخدم عنوانًا يصعب تخمينه، ووزّع المستعار لا العنوان، ولا تدع أي شيء خاص يقترب منه.
هل يستطيع وكيلان الانتظار على العنوان نفسه في آن واحد؟
نعم يستطيعان، وستُسلَّم الرسالة إلى كليهما عند وصولها. المسقوف هو عدد الانتظارات الجارية عبر الخدمة كلها في آن واحد، وهو 8؛ بعد هذا العدد تجيب الأداة فورًا وتقول ذلك، وتظل list_messages تعمل.
كم تدوم الرسائل؟
5 يومًا من لحظة الوصول، سواء قُرئت أم لا، ولا يوجد إعداد يمدّد ذلك. تحمل كل رسالة الحقل expires_at، فلا يضطر الوكيل أبدًا إلى حساب ذلك التاريخ بنفسه.
بم يختلف هذا عن استدعاء REST API من سكربت؟
بالنسبة إلى سكربت، لا فرق، وREST API هي الأنسب — يغطي دليل اختبار تدفقات التحقق ذلك الشكل، بمهلاته وأدواته المساعدة. أما MCP فمخصصة للحالة التي لم يكتب فيها أحد الحلقة: يقرر النموذج فتح صندوق بريد، ويحتاج إلى أدوات قابلة للاكتشاف لا موثّقة فقط.


