لوكلاء الذكاء الاصطناعي
شغّل `openemail` من Claude Code أو Codex أو مهمة CI: تسجيل دخول دون إشراف، ومساعدة في صورة بيانات، وتشغيل تجريبي، ونطاقات ناقصة، ورموز تحقق.
الدليل المدمج
يطبع openemail agents دليلًا قصيرًا بصيغة Markdown لوكيل ذكاء اصطناعي مثل Claude Code أو Codex، أو لسكربت في CI: كيف يسجّل الدخول دون إنسان، ويقرأ المخرجات، ويجد الأوامر، ويغيّر الأشياء بأمان، ويتنقّل بين صفحات القوائم، وما يفعله حين ينقص رمز تحقق أو نطاق، وخمس وصفات جاهزة للنسخ. وopenemail agent هو الأمر نفسه.
openemail agentsopenemail agents --json | jq -r '.recipes[].commands[]'مع --json يصبح الدليل مستندًا واحدًا فيه schemaVersion وtitle وintro وsections من { id, title, points } وexitCodes وrecipes من { id, title, commands }. وبدلًا من لصق هذه القواعد في كل موجّه، أخبر الوكيل مرة واحدة، في ملف التعليمات الذي يعطيه له مشروعك أصلًا، أن يشغّل openemail agents قبل أن يستخدم CLI.
تسجيل الدخول دون إنسان
- استخدم مفتاح API. اضبط
OPENEMAIL_API_KEY، أو مرّر--api-keyإلى أمر واحد. أنشئه من الإعدادات → مفاتيح API (openemail open api-keys) بالنطاقات التي يحتاجها الوكيل فقط. المفتاح لا يفتح متصفحًا أبدًا ولا يحتاج إلى رمز تحقق أبدًا. - أو أعد استخدام تسجيل دخول عبر المتصفح أجراه إنسان مرة واحدة على هذا الجهاز بـ
openemail login، واختره بـ--profile <name>. وتجدّد CLI رموزها بنفسها. - لا شيء يسأل دون طرفية. مع
--jsonأو--no-inputأوCI، أو دون طرفية متصلة، تتوقف القيمة التي كانت CLI ستسأل عنها برمز الخروج2مع ذكر الخيار الذي يجب تمريره. - يحتاج تسجيل الدخول عبر المتصفح إلى إنسان يوافق عليه، لذا يتوقف
openemail loginدون إشراف برمز الخروج2والرمزunattendedقبل أن يسجّل أي شيء، ويشير إلىopenemail login --with-token. - يعرض
openemail whoami --jsonمساحة العمل ونوع تسجيل الدخول وscopesالخاصة به.
قراءة المخرجات
مرّر --json إلى كل أمر. عندها يحمل stdout مستند JSON واحدًا بالضبط، أو كائنًا واحدًا في كل سطر مع --ndjson، ويبقى التقدّم على stderr. ويطبع الفشل سطر {"error":{...}} واحدًا على stderr: تفرّع حسب رمز الخروج وحسب code الخاص به، واعرض next على إنسان، ولا تحلّل message أبدًا، فصياغته قد تتغير. وتسرد صفحة «السكربتات» كل حقل وكل رمز خروج.
الأوامر في صورة بيانات
يطبع --help --json المساعدة مستندَ JSON واحدًا، مبنيًا من سجل الأوامر نفسه الذي تحلّل به CLI، فيطابق دائمًا الإصدار المثبّت. ويعمل على الجذر أو على مجموعة أو على أمر، ويطبع openemail help <command> --json الشيء نفسه.
openemail send --help --jsonopenemail domains delete --help --json | jq '.commands[0] | {scopes, destructive}'openemail help domains --json | jq -r '.commands[0].subcommands[].command'openemail --help --json | jq -r '.commands[].command'المستند
schemaVersionnumber- يتغير حين يتغير معنى حقل
cli, versionstring- دائمًا `openemail`، والإصدار الذي طبعه
pathstring[]- الأمر المسؤول عنه، فارغ للجذر
commandsobject[]- للجذر كل أمر من المستوى الأعلى، وإلا فالأمر المسؤول عنه، وكلٌّ مع أوامره الفرعية
globalFlagsobject[]- الخيارات التي يقبلها كل أمر، بالشكل نفسه لخيارات الأمر
subcommandAliasesobject- كل اسم مستعار مشترك، مثل `ls` أو `rm`، والأفعال التي يقوم مقامها
exitCodesobject[]- كل رمز خروج في صورة `{ code, name, meaning }`
أمر
namestring- الكلمة الأخيرة من الأمر
commandstring- الأمر كاملًا، مثل `openemail domains delete`
path, aliasesstring[]- الكلمات بعد `openemail` التي تصل إليه، وأسماؤه الأخرى
summary, descriptionstring- ما يفعله، في سطر واحد وبالتفصيل
usagestring[]- طريقة استدعائه
categorystring | null- قسمه في `openemail --help` لأمر من المستوى الأعلى، وإلا `null`
group, runnable, hiddenboolean- هل له أوامر فرعية، وهل يعمل وحده، وهل تخفيه المساعدة
authstring- تسجيل الدخول الذي يحتاجه: `required`، أو `browser` لتسجيل الدخول عبر المتصفح فقط، أو `optional` أو `none`
scopesstring[]- نطاقات API التي يحتاجها كل تشغيل له
destructiveboolean- هل يطلب التأكيد أولًا، والذي يجيب عنه `--yes`
argumentsobject[]- `name` و`description` و`required` و`variadic` لكل وسيط
flagsobject[]- `name` و`short` و`kind` و`required` و`repeatable` و`choices` و`placeholder` و`description` و`hidden` لكل خيار
notes, examplesobject[]- كتل المساعدة الإضافية في صورة `{ title, lines }`، والأمثلة في صورة `{ command, note }`
resourceobject | null- لأمر مورد، طريقة SDK واستدعاء REST اللذان خلفه، وإلا `null`
subcommandsobject[]- الأوامر تحت مجموعة، بالشكل نفسه
مورد
namespacestring- مساحة أسماء SDK، مثل `domains`
sdkMethodstring- طريقة SDK، مثل `openemail.domains.delete`
sdkMethodAllstring | null- لقائمة، طريقة `listAll` التي يمرّ عليها `--all --json`
httpMethod, httpPathstring- استدعاء REST، مثل `DELETE` و`/domains/{id}`
scopesstring[]- النطاقات التي تحتاجها الطريقة
authstring- `apiKey`، أو `none` و`inboxToken` لطريقة لا ترسل مفتاح API
returnsobject- `{ shape, type }`: شكل الإجابة، مثل `object` أو `page`، ونوعها في SDK
paginatesboolean- هل تعيد صفحة واحدة من قائمة
الشجرة كاملة نحو ميغابايت، وكلها تقريبًا الأوامر الـ 198 للموارد، لذا اطلب الأمر الذي تحتاجه أو صفِّ الشجرة بـ jq. ويحتفظ النص بعلامات الاقتباس المائلة ولا يحمل رموز ألوان، والأوامر المخفية مثل security مضمّنة مع ضبط hidden على true.
التشغيل التجريبي
يعمل --dry-run على كل أمر عدا mcp serve. تجري القراءات كالمعتاد، ثم يُطبع أول طلب كان سيغيّر شيئًا بدلًا من إرساله، ويخرج الأمر بالرمز 0 دون أن يفعل أي شيء آخر. وتُتخطى التأكيدات إذ لا يُرسَل شيء، فيستطيع الوكيل أن يرى ما كان سيفعله أمر مدمّر دون تمرير --yes.
openemail domains delete <domain-id> --dry-runopenemail send --from [email protected] --to [email protected] --subject "Hi" --text "Hello" --dry-run --json{ "dryRun": true, "request": { "method": "POST", "url": "https://api.openemail.uk/emails", "headers": { "accept": "application/json", "authorization": "Bearer [redacted]", "content-type": "application/json", "idempotency-key": "58e6fb61-ad2e-401e-b141-7a0546c7c749", "user-agent": "openemail-cli/0.0.1 openemail-sdk/0.0.5" }, "body": { "from": "[email protected]", "to": [ "[email protected]" ], "subject": "Hi", "text": "Hello" }, "raw": null }}- التغيير هو أي طلب عدا
GETوHEAD، واستدعاء أداة MCP، وطلبات تسجيل الدخول والخروج فيloginوlogout. أما تجديد الرموز وdocs askفيعملان كالمعتاد. - تعرض الخطة الطريقة، والعنوان الكامل، والترويسات مع اختصار قيمة
AuthorizationإلىBearer [redacted]، ومتن JSON مع حجب الحقول السرية مثل مفتاح Resend. ويعرض الرفع حجمه ونوع محتواه فقط. - التغيير الذي يبقى على هذا الجهاز، مثل
profile useأوlogin --with-tokenأو نسيان مفتاح API محفوظ، يطبع{"dryRun":true,"local":{"action","profile"}}ولا يحفظ شيئًا. - الأمر الذي يطبع ما قرأه قبل أول تغيير له يعرضه أولًا: يطبع
readالمحادثة، ثم الطلب الذي كان سيعلّمها مقروءة. مرّر--no-mark-readلإسقاط الثاني. - يرفض
mcp serveالخيار--dry-runبرمز الخروج2، لأن عميله هو الذي يقرر ما يُرسَل. بدلًا من ذلك عاين استدعاء أداة واحدًا بـopenemail mcp call <tool> --dry-run.
النطاقات الناقصة
يعرف كل أمر نطاقات API التي يحتاجها دائمًا، وتسردها مساعدته. وحين ينقص تسجيلَ دخول محفوظًا واحدٌ منها، يسأل الأمر API مرة واحدة عن القائمة الحالية، فيُحتسب فورًا الوصول الذي مُنح على الموقع بعد تسجيل الدخول. وإن بقي النطاق ناقصًا، يتوقف برمز الخروج 4 والرمز insufficient_scope قبل أن يسأل عن أي شيء أو يرسل طلبًا:
{"error":{"type":"cli_error","code":"insufficient_scope","message":"This sign-in does not have the emails:send permission, which openemail send needs.","hint":null,"next":"Give this app more access in Account settings, Connected apps (openemail open apps, then Edit access), or run openemail login --force and choose more access.","status":null,"requestId":null,"param":null,"docUrl":null,"exitCode":4}}- لتسجيل الدخول عبر المتصفح، يقول
nextأن تمنح التطبيق وصولًا أوسع في الحساب → سطر الأوامر (openemail open cli، ثم «تعديل الوصول»)، أو أن تشغّلopenemail login --forceوتختار وصولًا أوسع. ولا يُمنح تسجيل الدخول عبر المتصفحkeys:writeأوkeys:manageأبدًا، لذا يشير لهما إلى مفتاح API. - لمفتاح API، يقول
nextأن تستخدم مفتاحًا فيه النطاق. - المفتاح القادم من
--api-keyأوOPENEMAIL_API_KEYلا يُفحص مسبقًا، وAPI هي التي تقرر. وحين ترفض API استدعاءً بسبب نطاق ناقص، يحمل الخطأnextنفسه.
رموز التحقق
مفتاح API لا يحتاج إلى رمز تحقق أبدًا. أما تسجيل الدخول عبر المتصفح فيحتاج إلى رمز قبل تغيير حساس، مثل إضافة webhook أو إنشاء قاعدة أو تغيير عضو أو إزالة نطاق، والوكيل لا يستطيع كتابته. لذا قبل أن يعمل الوكيل، يشغّل إنسان openemail verify في طرفية بالملف الشخصي نفسه، أو يختار لتسجيل الدخول ذاك «السماح بالتغييرات لمدة 60 دقيقة» في الحساب → سطر الأوامر. وأيٌّ منهما يغطي الدقائق الستين التالية.
openemail verifyopenemail verify --status --jsonيخبر verify --status --json الوكيل هل الملف الشخصي متحقَّق منه، في elevated، وحتى متى، في elevatedUntil. ودون تحقق يتوقف التغيير برمز الخروج 4 والرمز step_up_required، ولا يتغير شيء:
{"error":{"type":"cli_error","code":"step_up_required","message":"This action needs a verification code, and there is no interactive terminal to ask for one.","hint":null,"next":"Run openemail verify in an interactive terminal first, then run this again within 60 minutes. An API key never needs a code.","status":403,"requestId":"req_9Qm4tV","param":null,"docUrl":"https://openemail.uk/docs/api/errors#step_up_required","exitCode":4}}عبر MCP
يستطيع الوكيل الذي يتحدث MCP أن يستخدم خادم MCP الخاص بـ OpenEmail بدلًا من ذلك. يطبع openemail mcp config --client claude-code، أو codex أو cursor أو غيرهما من العملاء الذين يسردهم، طريقة الإعداد، وopenemail mcp serve جسر محلي يعيد استخدام تسجيل الدخول عبر المتصفح لهذه CLI. ولا تصل مفاتيح API إلى خادم MCP. والتفاصيل في صفحة «الذكاء الاصطناعي وMCP».
وصفات
openemail inbox --unread --limit 20 --jsonopenemail inbox --unread --json | jq -r '.items[].id'openemail read CAHk7pQ2x9LmZ4 --no-mark-read --jsonopenemail send --from [email protected] --to [email protected] --subject "Weekly report" --body-file report.md --idempotency-key weekly-report-39 --jsonopenemail domains create --domain example.com --dry-run --jsonopenemail domains create --domain example.com --jsonopenemail whoami --json | jq '.scopes'