لوكلاء الذكاء الاصطناعي
خادم SendHQ MCP
امنح وكيل ذكاء اصطناعي تحكمًا كاملًا وآمنًا في مساحة عمل SendHQ واحدة: أرسل البريد واستقبله، ووثّق النطاقات، وانشر القوالب، وتحرَّ قابلية التسليم، عبر 59 أداة محددة الأنواع بصرامة. كُتب للوكلاء أولًا؛ والبشر مرحَّب بهم.
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcpما هذا الخادم
يتيح خادم SendHQ MCP لوكيل ذكاء اصطناعي تشغيل مساحة عمل SendHQ واحدة عبر بروتوكول سياق النموذج (Model Context Protocol): إرسال البريد (المفرد والدفعي وبالقوالب والردود والمرفقات وإعادة المحاولة غير المكرِّرة)، وقراءة البريد المرسل والمستلَم والبحث فيه (الموضوعات والنصوص وأسماء المرفقات) وأحداث تسليمه، وتنظيم البريد في تصنيفات بقواعد فرز تلقائي، وإدارة المسودات والمرفقات الخاصة، وتأليف القوالب المستضافة ونشرها، وإضافة النطاقات وتوثيقها مع DNS الخاص بها، وإعداد استقبال البريد الوارد وعناوينه، وفحص قابلية التسليم والارتدادات والشكاوى وقوائم المنع، وقراءة استخدام الحساب وحالة الفوترة والتحليلات والبيانات الوصفية لمفاتيح API.
وهو خادم stdio محلي مدمج في الملف التنفيذي لـ CLI باسم sendhq. يشغّل عميل MCP لديك الأمر sendhq mcp بوصفه عملية فرعية ويتخاطب بـ JSON-RPC عبر stdin/stdout. وكل استدعاء أداة يتحول إلى طلب موثَّق واحد إلى SendHQ REST API على https://sendhq.cc/api/v1 بمصادقة مفتاح API الخاص بمساحة عملك، فتكون لخادم MCP صلاحيات ذلك المفتاح تمامًا ولا تزيد.
- 59 أداة في 8 مجموعات، مولَّدة من فهرس واحد يُنشَر أيضًا بصيغة tools.json.
- مخططات JSON Schema صارمة: تُرفض الوسائط غير المعروفة والأنواع الخاطئة والحقول المطلوبة المفقودة محليًا قبل أن يصل أي شيء إلى SendHQ.
- أخطاء منظَّمة تتضمن
codeثابتًا، وstatusبحالة HTTP، وexplanation، وremedyملموسًا، وما إذا كانت إعادة المحاولة قد تفيد. - كل أداة ترسل بريدًا حقيقيًا أو تتلف بيانات تنص على ذلك في أولى كلمات وصفها وتحمل توصيفات أمان MCP.
- يُخفي وضع
--read-onlyكل أداة إرسال وكل أداة تُغيّر الحالة. - لا يُسجَّل شيء. يحمل stdout رسائل البروتوكول فقط؛ ولا يصل مفتاح API ولا محتوى الرسائل إلى أي سجل.
https://sendhq.cc/api/mcp (بحث في الأسعار والتوثيق، دون وصول إلى الحساب). أما الخادم في هذه الصفحة فهو الكامل المرتبط بنطاق الحساب؛ ويعمل محليًا أو بوصفه الموصّل المستضاف أدناه.استخدم SendHQ في Claude وChatGPT
لا حاجة إلى تثبيت: تشغّل SendHQ هذا الخادم أيضًا بوصفه موصّلًا (connector) مستضافًا على https://mcp.sendhq.cc/mcp بالأدوات نفسها. وتسجّل الدخول بحساب SendHQ بدل لصق مفتاح.
Claude
- افتح Settings ← Connectors وابحث عن SendHQ في الدليل، أو اختر Add custom connector والصق
https://mcp.sendhq.cc/mcp. - انقر Connect، وسجّل الدخول إلى SendHQ، وراجع الصلاحيات ثم انقر Allow.
- اطلب من Claude فحص صندوق الوارد، أو إرسال رسالة من نطاقك الموثَّق، أو شرح سبب ارتداد.
ChatGPT
- Open Settings → Security and login and turn on Developer mode.
- Go to chatgpt.com/plugins, click Create MCP app, name it SendHQ and enter
https://mcp.sendhq.cc/mcp. - Sign in to SendHQ and click Allow, then pick SendHQ from the tools menu in a new chat.
Muse by Meta
In Muse, open Connectors and search for SendHQ. Click Connect, sign in to SendHQ and click Allow.
الموافقة وقطع الاتصال
- The
request_featuretool sends a feature request to the SendHQ team with your account details, so we can follow up by email. - الأدوات التي ترسل بريدًا حقيقيًا أو تحذف بيانات موسومة بذلك. وما إذا كان المساعد يسألك أولًا يُضبط لكل أداة في المساعد نفسه: في Claude، اختر Needs approval لتلك الأدوات ضمن Settings ← Connectors ← SendHQ.
- يحصل الموصّل على مفتاح API خاص به، يحمل اسم المساعد (مثل «Claude (AI connector)»). احذفه ضمن API Keys لقطع الاتصال فورًا.
- لا يستطيع إنشاء مفاتيح API أو إلغاءها ولا تغيير الفوترة. تُرسَل المرفقات وتُعاد بترميز base64؛ ولا يوجد وصول إلى الملفات المحلية.
- لا يمكن لمساحات العمل غير المدفوعة (الفترة التجريبية للتكامل) التسليم إلا إلى البريد الإلكتروني للحساب أو إلى عنوان محاكاة في AWS SES.
للاستفسارات: postmaster@sendhq.cc. الخصوصية: sendhq.cc/privacy.
التثبيت
ثبّت الملف التنفيذي sendhq (Linux وmacOS وWindows على x86-64 وarm64). يتحقق المثبّت من المجموع الاختباري للإصدار ويضع الملف التنفيذي في ~/.local/bin افتراضيًا.
curl -fsSL https://downloads.sendhq.cc/install.sh | shirm https://downloads.sendhq.cc/install.ps1 | iexsendhq version
SENDHQ_API_KEY=re_your_key sendhq doctorأنشئ مفتاح API في لوحة التحكم على https://sendhq.cc/app#/keys. لا يستطيع خادم MCP إنشاء المفاتيح. والأمر الوحيد الذي يشغّل الخادم هو:
SENDHQ_API_KEY=re_your_key sendhq mcpلا تشغّل ذلك يدويًا عادةً: يطلقه عميل MCP. وعند تشغيله في طرفية ينتظر JSON-RPC على stdin.
اضبط عميلك
Claude Code
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp
# read-only variant
claude mcp add sendhq-readonly --env SENDHQ_API_KEY=re_your_key -- sendhq mcp --read-onlyأضف --scope user لإتاحته في كل مشروع، أو --scope project لكتابته في ملف .mcp.json الخاص بالمشروع. وفي ملف .mcp.json المشترك، أشِر إلى المفتاح من البيئة بدل إيداعه في المستودع؛ إذ يوسّع Claude Code القيمة ${VAR} في .mcp.json.
{
"mcpServers": {
"sendhq": {
"command": "sendhq",
"args": [
"mcp"
],
"env": {
"SENDHQ_API_KEY": "${SENDHQ_API_KEY}"
}
}
}
}OpenAI Codex
[mcp_servers.sendhq]
command = "sendhq"
args = ["mcp"]
env = { SENDHQ_API_KEY = "re_your_key" }أو من سطر الأوامر: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.
Claude Desktop
عدّل claude_desktop_config.json (في macOS: ~/Library/Application Support/Claude/، وفي Windows: %APPDATA%\Claude\) وأعد تشغيل التطبيق. لا ترث تطبيقات سطح المكتب PATH الخاص بالصدفة لديك، فاستخدم المسار المطلق للملف التنفيذي (which sendhq).
{
"mcpServers": {
"sendhq": {
"command": "/Users/you/.local/bin/sendhq",
"args": [
"mcp"
],
"env": {
"SENDHQ_API_KEY": "re_your_key"
}
}
}
}أي عميل MCP آخر
اضبط خادم stdio بالأمر sendhq والوسائط ["mcp"] (مع "--read-only" اختياريًا) ومتغيرات البيئة أدناه. يدعم الخادم إصدارات بروتوكول MCP 2024-11-05 و2025-03-26 و2025-06-18 و2025-11-25، وينفّذ initialize وping وtools/list وtools/call. وتحمل نتائج الأدوات كتلة نصية بصيغة JSON وstructuredContent معًا.
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_service_health","arguments":{}}}لا يوجد نقل HTTP مستضاف للخادم المرتبط بنطاق الحساب. فنقطة نهاية MCP بعيدة وقادرة على الكتابة تتطلب OAuth لكل مستخدم، وهو ما لا تقدّمه SendHQ؛ ويُبقي الملف التنفيذي المحلي المفتاح على الجهاز الذي يحتفظ به أصلًا.
البيئة والخيارات
| المتغير أو الخيار | مطلوب | المعنى |
|---|---|---|
SENDHQ_API_KEY | نعم | مفتاح API لمساحة العمل (re_…). تحتاجه كل أداة عدا get_service_health. وبدونه يبدأ الخادم مع ذلك ويُعيد كل استدعاء auth_error منظَّمًا يشرح كيفية الإصلاح. |
SENDHQ_API_BASE_URL | لا | عنوان URL الأساسي لـ API. القيمة الافتراضية https://sendhq.cc/api/v1. استخدمه فقط لنشر محلي أو تجريبي (staging). ويُقبل SENDHQ_BASE_URL بوصفه اسمًا مستعارًا أقدم. |
SENDHQ_MCP_READ_ONLY | لا | القيمة 1 أو true أو yes تعمل مثل --read-only. |
--read-only | لا | لا يكشف إلا الأدوات التي لا ترسل بريدًا ولا تغيّر الحالة. وتُرفض الأدوات المخفية أيضًا إذا استُدعيت بالاسم. |
SENDHQ_PROFILE / --profile | لا | استخدم مفتاحًا مخزَّنًا بـ sendhq auth login في سلسلة مفاتيح نظام التشغيل بدل SENDHQ_API_KEY. ويتقدّم متغير البيئة عند وجود الاثنين. |
يُرسَل المفتاح فقط في الترويسة Authorization: Bearer إلى عنوان URL الأساسي المضبوط. ولا يُطبع ولا يُسجَّل ولا يتردد في الأخطاء ولا يُدرج في نتائج الأدوات.
نموذج الأمان للوكلاء
- يرسل بريدًا حقيقيًا. تسلّم
send_emailوsend_batchوsend_template_testالرسائل إلى أشخاص حقيقيين وتستهلك أرصدة التسليم. تبدأ أوصافها بعبارةSENDS REAL EMAIL. لا تستدعها إلا عندما يطلب المستخدم صراحةً إرسال تلك الرسالة بعينها، بعد تأكيد المستلِمين والمُرسِل والمحتوى. - مُتلِفة. الأدوات
delete_emailوdelete_draftوdelete_attachmentوdelete_domainوdelete_inboxوremove_suppressionموسومة بـdestructiveHint: trueوتبدأ أوصافها بـDESTRUCTIVE. أكّد مع المستخدم أولًا. تُضعفremove_suppressionحاجز أمان ولا تناسب إلا عندما يؤكد إنسان أن العنوان يعمل مجددًا. - تغيّر الحالة. إنشاء المسودات والقوالب والنطاقات وصناديق البريد أو تحديثها، ونشر القوالب، وبدء التوثيق، كلها تغيّر مساحة العمل لكنها لا ترسل بريدًا.
- للقراءة فقط. كل ما عدا ذلك موسوم بـ
readOnlyHint: trueويمكن استدعاؤه بحرية. - لا يغيّر هذا الخادم DNS أبدًا. تُعيد
add_domainسجلات ينشرها إنسان؛ وتُعيدget_domain_connect_linkعنوان URL للموافقة يجب أن يفتحه شخص ويوافق عليه لدى مزوّد DNS الخاص به. - لا يغيّر هذا الخادم الفوترة أبدًا. تقرأ
get_accountالباقة والاستخدام وحالة الاشتراك فقط. - مساحات العمل غير المدفوعة (الفترة التجريبية للتكامل) لا يمكنها التسليم إلا إلى البريد الإلكتروني لمالك الحساب (
get_account←user.email) أو إلى عنوان محاكاة في AWS SES مثلsuccess@simulator.amazonses.com، ولا يمكنها إرسال مرفقات. - القبول ليس تسليمًا. يُعيد الإرسال الناجح معرّفًا؛ وتصل أدلة التسليم والارتداد والشكوى لاحقًا في
list_email_events. لا تدّعِ أبدًا الوصول إلى صندوق الوارد أو أن شخصًا قرأ الرسالة. - لا تبدّل إلى عنوان From مختلف للالتفاف على إيقاف
423، ولا تُعِد أبدًا إضافة مستلِمين ألغوا اشتراكهم أو قدّموا شكاوى.
مفاتيح API خارج النطاق
بحكم التصميم لا توجد أدوات تنشئ مفاتيح API أو تعدّلها أو تدوّرها أو تلغيها أو تحذفها. يجب ألا يُنشئ الوكيل بيانات اعتماد أو يتلفها. تُعيد list_api_keys الأسماء والبادئات غير السرية وأوقات آخر استخدام فقط. وتبقى إدارة المفاتيح في لوحة التحكم مع إنسان مسجَّل الدخول.
سير العمل
1. أول إرسال
- تؤكد
get_service_healthأن API يمكن الوصول إليها (تعمل دون مفتاح). - تعرض
get_accountالباقة (access.tier) والحصة المتبقية وuser.email. وفي الفترة التجريبية، هذا البريد هو المستلِم الحقيقي الوحيد المسموح به. - تسرد
list_sending_identitiesعناوين From التي يمكنك استخدامها. وإذا كانت فارغة، فابدأ بسير عمل النطاق. - أكّد المُرسِل والمستلِم والموضوع والنص مع المستخدم، ثم استخدم
send_emailمعidempotency_key. - تُظهر
list_email_eventsمعidالمُعاد الأحداثdeliveryأوbounceأوcomplaintأوrejectبمجرد أن يبلّغ عنها المزوّد (عادةً بعد ثوانٍ إلى دقائق).
{
"name": "send_email",
"arguments": {
"from": "Acme <hello@example.com>",
"to": [
"owner@example.com"
],
"subject": "SendHQ is connected",
"text": "It works.",
"idempotency_key": "first-send-2026-09-26"
}
}2. توثيق النطاق من البداية إلى النهاية
- استخدم
add_domainمعname: "example.com". تتضمن النتيجة سجلات DNS (سجلات DKIM من نوع CNAME، والتحقق من SES، وSPF، وDMARC الموصى به). - تكتشف
get_dns_providerمعdomain_idمزوّد DNS المعتمد وتُعيد المضيف النسبي الدقيق الذي تُدخله لكل سجل لدى ذلك المزوّد. - إذا كانت
providers.domainConnect.availableمساوية لـ true، فإنget_domain_connect_linkتُعيد عنوان URL للموافقة. سلّمه إلى الإنسان؛ فلا يتغير شيء إلى أن يوافق لدى المزوّد. وإلا فسلّم الإنسان السجلات لينشرها. لا تنشر سجل SPF ثانيًا أبدًا: ادمجinclude:amazonses.comفي قيمةv=spf1الحالية. - تعيد
verify_domainفحص DNS وSES. تنتقل الحالة عبرpendingوcheckingوpropagatingإلىverified. استعلم دوريًا عبرverify_domainأوget_domainكل 30 إلى 60 ثانية؛ فقد يستغرق DNS من دقائق إلى ساعات. - عندما تكون
statusمساوية لـverified، تظهر عناوين النطاق فيlist_sending_identities.
3. الارتدادات والشكاوى وقوائم المنع
- تُعيد
list_blocked_recipientsكل عنوان محظور مع سببه (bounceأوcomplaintأوunsubscribe) وعددًا إجماليًا. - تُعيد
list_suppressionsعناصر المنع الناتجة عن الارتداد الدائم والشكاوى؛ وتعطيdeliverability_statsمعدلات التسليم والارتداد والشكاوى لآخر 30 يومًا؛ وتُظهرlist_sender_reputationعناوين From التي خُنقت أو أُوقفت مؤقتًا. - يخفق الإرسال الذي يتضمن مستلِمًا مدرجًا في قائمة المنع بالخطأ
422 recipient_suppressed. أزل ذلك المستلِم وأعد الإرسال. - لا تستدعِ
remove_suppressionإلا عندما يؤكد إنسان أن صندوق بريد ارتدت رسائله صار يعمل. وعناصر المنع الناتجة عن الشكاوى دائمة (409 complaint_suppression_locked).
4. استقبال البريد الوارد
- يجب أن يكون النطاق (وغالبًا نطاق فرعي مثل
inbound.example.com) موثَّقًا. - تهيّئ
setup_inboundالاستقبال وتُعيد سجل MX واحدًا. وينشره إنسان. - استخدم
verify_inboundإلى أن تصبحstatusمساوية لـready. - تنشئ
create_inboxمعdomain_idوlocal_part(مثلsupport) العنوانsupport@inbound.example.com. - استعلم دوريًا عبر
list_emailsمعdirection: "in"وunread: true(وinbox_idاختياريًا). اقرأ رسالة بـget_emailومحادثتها بـget_threadومرفقاتها بـdownload_attachment، وعلّمها على أنها عولجت بـmark_email(read: true). - ردّ ضمن السلسلة بـ
send_emailوreply_to_email_id؛ وتضبط SendHQ قيم In-Reply-To وReferences والسلسلة.
5. Webhooks وإشعارات الأحداث
لا تقدّم SendHQ حاليًا webhooks قابلة للضبط من العميل، ولذلك لا توجد أداة webhook. تُعالَج إشعارات المزوّد داخل SendHQ وتُتاح عبر عمليات القراءة. استعلم دوريًا بدل ذلك: list_email_events لنتيجة رسالة واحدة، وlist_emails مع status (مثل bounced) أو after للتغييرات الأخيرة، وlist_emails مع direction: "in" وunread: true للبريد الوارد الجديد، وlist_blocked_recipients لعناصر المنع الجديدة. لا تستعلم أكثر من مرة واحدة تقريبًا كل دقيقة لكل سؤال.
6. تشخيص إخفاق التسليم
- جد الرسالة:
list_emailsمعdirection: "out"وtoأوquery، أوget_emailإذا كان لديك المعرّف. تعنيstatus: failedأن SendHQ أو المزوّد رفضها عند الإرسال؛ ويوضح خطأ الرسالة السبب. list_email_events:bounce(دائم أو عابر، مع تشخيص المزوّد)، أوcomplaint، أوreject، أوdelivery. وعدم وجود أحداث بعد يعني أن المزوّد لم يبلّغ؛ فانتظر وأعد الفحص.- إذا أخفق استدعاء الإرسال نفسه، فاقرأ
codeالخطأ:sender_domain_unverified← أكمل توثيق النطاق؛recipient_suppressed← ارتدت رسائل العنوان ارتدادًا دائمًا أو قدّم شكوى سابقًا؛sender_paused← افحصlist_sender_reputationوأصلح مصدر القائمة؛trial_recipient_restricted← حدود الفترة التجريبية؛quota_exhausted← استخدامget_account. - تتحقق
get_domainمن أن DKIM وSPF وDMARC لا تزال منشورة؛ وتُظهرdeliverability_statsما إذا كانت المشكلة في رسالة واحدة أم اتجاهًا عامًا. - أبلغ بما تُظهره الأدلة. فحدث
deliveryيعني أن خادم المستلِم قبِل الرسالة، لا أنها وصلت إلى صندوق الوارد أو قُرئت.
7. امتلاك مجموعة مهام (التصنيفات)
- استخدم
create_labelمعname(مثلAgent/Orders) وskip_inbox: true. وهذا يحوّل التصنيف إلى مجموعة: يُؤرشَف البريد المستلَم الذي يحصل عليه، فيظهر داخل التصنيف فقط ولا يظهر أبدًا في صندوق وارد الإنسان. - أرسل بريد المهمة بـ
send_email(أوsend_batch) معlabels: ["Agent/Orders"]. وترث الردود على تلك المحادثة التصنيف تلقائيًا وتتخطى صندوق الوارد. - للبريد الذي يبدأ خارج محادثاتك، أضف قاعدة فرز:
create_label_ruleمعinbox_id(عنوان مخصص مثلorders@…) أوfromأوtoأوsubject. ومرّرapply_to_existing: trueلفرز البريد المستلَم أصلًا. - اعمل على المجموعة:
list_emailsمعlabel: "Agent/Orders"وdirection: "in"وunread: true؛ واقرأ بـget_emailأوget_thread، وردّ بـsend_emailوreply_to_email_id، وطبّقmark_emailمعread: trueعند المعالجة. - انقل رسالة شاردة إلى تصنيف أو خارجه بـ
label_email(add/remove). وإضافة تصنيف مجموعة إلى رسالة مستلَمة تؤرشفها أيضًا. - اختياريًا، ترسل
set_inbox_forwardingنسخة من كل ما يستقبله عنوان استقبال إلى صندوق بريد آخر (يؤكد الهدف بالبريد أولًا).
{
"name": "send_email",
"arguments": {
"from": "Orders <orders@example.com>",
"to": [
"customer@example.net"
],
"subject": "Order 1042: confirm delivery window",
"text": "Reply with a time that works.",
"labels": [
"Agent/Orders"
],
"idempotency_key": "order-1042-window"
}
}8. المرفقات والقوالب
أرفق حتى 10 ملفات بالمعلمة attachments في send_email (يحتاج كل ملف إلى content_base64 أو file_path محلي؛ وتكون قيمة filename الافتراضية اسم الملف الأساسي) في باقة مدفوعة. وللقوالب المستضافة: create_template ← update_template_draft ← render_template للمعاينة ببيانات عيّنة ← send_template_test (يرسل اختبارًا حقيقيًا واحدًا) ← publish_template، ثم أرسل بـ send_email أو send_batch باستخدام template: {key, data} ومستلِم to واحد بالضبط.
النتائج والترقيم والأخطاء
يُعيد الاستدعاء الناجح كائن JSON الخاص بـ API بوصفه structuredContent وككتلة نصية JSON. وتقبل كل أداة list_* المعلمة limit (من 1 إلى 200، والافتراضي 50) وoffset، وتضيف كائن pagination. واصل الاستدعاء بـ offset: pagination.next_offset ما دامت has_more مساوية لـ true.
{
"data": [
"…"
],
"count": 50,
"pagination": {
"offset": 0,
"limit": 50,
"returned": 50,
"total": 180,
"has_more": true,
"next_offset": 50
}
}يُعيد الاستدعاء الفاشل isError: true مع خطأ منظَّم. اتبع remedy بدل إعادة المحاولة عشوائيًا؛ ولا تعد المحاولة إلا عندما تكون retryable مساوية لـ true.
{
"error": {
"code": "trial_recipient_restricted",
"status": 402,
"message": "The integration trial can deliver only to your account email or an AWS SES simulator address",
"retryable": false,
"explanation": "This workspace is on the unpaid integration trial. Trial sends can be delivered only to the account owner's email address or an AWS SES simulator address.",
"remedy": "Send to the account email (get_account -> user.email) or a simulator address such as success@simulator.amazonses.com to test. To email anyone else, the account owner must activate a paid plan in the dashboard (Profile & Billing). Do not retry the same recipients."
}
}حقول الخطأ الاختيارية: request_id (اذكره للدعم)، وretry_after_seconds، وproblems (قائمة بمخالفات المخطط لـ invalid_arguments)، وidempotent_replayed (انظر عدم التكرار).
عدم التكرار (Idempotency)
تقبل send_email وsend_batch المعلمة idempotency_key (200 حرف كحد أقصى)، وتُرسَل بوصفها الترويسة Idempotency-Key. ولّد مفتاحًا ثابتًا واحدًا لكل رسالة منطقية، مثل invoice-4812-receipt.
- يجب أن تعيد المحاولة استخدام المفتاح نفسه مع جسم طلب مطابق. المفتاح نفسه مع أي تغيير (المستلِم أو الموضوع أو النص أو الترويسة أو بيانات القالب، وحتى قيم الوسائط) يُعيد
409 idempotency_conflict. - المفتاح نفسه والجسم نفسه وانتهاء الطلب الأصلي: تُعيد SendHQ النتيجة المخزَّنة دون إرسال مجددًا. بهذه الطريقة تعيد المحاولة بأمان بعد انتهاء المهلة أو
network_error. - المفتاح نفسه بينما الطلب الأصلي لا يزال قيد التنفيذ:
409 idempotency_in_progress، ويمكن إعادة المحاولة بعد انتظار قصير. - الرسالة المنطقية الجديدة تحتاج إلى مفتاح جديد.
- تُعاد الإخفاقات المخزَّنة كذلك. فإذا أخفقت المحاولة الأولى، فإن إعادة المحاولة بالمفتاح نفسه تُعيد الإخفاق نفسه مع
idempotent_replayed: trueوretryable: false. افحصlist_emails(direction: out) للتأكد من أن شيئًا لم يُرسَل، وأصلح السبب، ثم أرسل بمفتاح جديد. - لا يعيد الخادم محاولة POST من تلقاء نفسه أبدًا. تُعاد استدعاءات GET للقراءة فقط تلقائيًا (حتى 3 محاولات عند أخطاء الشبكة و429 و5xx).
- لا يمكن لـ
send_emailمعattachmentsالمضمَّنة أن تأخذidempotency_key، لأنها تنفّذ عدة طلبات. ولإرسال مرفقات آمن لإعادة المحاولة:create_draft←upload_attachment←send_emailمعdraft_idوidempotency_key.
{
"name": "send_email",
"arguments": {
"from": "Acme <billing@example.com>",
"to": [
"owner@example.com"
],
"subject": "Receipt #4812",
"text": "Thanks for your payment.",
"idempotency_key": "receipt-4812"
}
}حدود المعدّل والحصص
لا تنشر SendHQ حدًّا ثابتًا لعدد الطلبات في الثانية لـ API. والحدود التي يواجهها الوكيل فعلًا هي حدود استخدام تُعاد بالرمز 429:
- عمليات التسليم الشهرية للمستلِمين لكل باقة. يُحتسب كل عنوان في To وCc وBcc تسليمًا واحدًا. راجع
get_account←usage.recipientDeliveriesمقابلusage.emailQuotaMonth. - المستلِمون اليوميون لكل عنوان From بعينه، ويحدّدهم حال سمعة ذلك المُرسِل (
list_sender_reputation←dailyLimit، والافتراضي 2,000 في الباقات المدفوعة). - الفترة التجريبية للتكامل: 100 مستلِم إجمالًا، فقط إلى البريد الإلكتروني للحساب أو عناوين محاكاة SES.
- المرفقات: 10 ملفات كحد أقصى و10 MB لكل رسالة؛ و10 GB من نقل المرفقات المرجَّح بعدد المستلِمين شهريًا في الباقات المدفوعة.
- لكل طلب: To + Cc + Bcc حتى 100 عنوان؛ و
send_batchحتى 100 رسالة. - قاطع دائرة السمعة (circuit breaker): في نافذة متجددة مدتها 7 أيام، تؤدي الارتدادات أو الشكاوى التي تتجاوز الحد إلى خنق عنوان From واحد أو إيقافه مؤقتًا (
423 sender_paused). ويتعافى تلقائيًا بمجرد انخفاض المعدلات.
quota_exhausted غير قابل لإعادة المحاولة إلى أن تُعاد ضبط الفترة أو تتغير الباقة. أما rate_limited فيمكن إعادة المحاولة بعد retry_after_seconds؛ وفي الإرسال، أعد المحاولة بـ idempotency_key نفسه وجسم مطابق.
فهرس الأخطاء
قيمة code ثابتة؛ فرّع عليها بدل message.
| code | HTTP | إعادة المحاولة؟ | المعنى وما يجب فعله |
|---|---|---|---|
invalid_arguments | — | لا | أخفقت الوسائط في مخطط JSON Schema الخاص بالأداة محليًا؛ ولم يصل شيء إلى SendHQ. أصلح الحقول المذكورة في problems. |
auth_error | 401 | لا | مفتاح API مفقود أو ملغى أو خاطئ. اضبط SENDHQ_API_KEY لعملية الخادم؛ وينشئ إنسان المفاتيح في لوحة التحكم. |
trial_recipient_restricted | 402 | لا | لا تستطيع الفترة التجريبية للتكامل التسليم إلا إلى البريد الإلكتروني للحساب أو عنوان محاكاة SES. أرسل إليه، أو يفعّل المالك باقة مدفوعة. |
payment_required | 402 | لا | الميزة تتطلب باقة مدفوعة (مثل المرفقات). أرسل بدونها أو رقِّ الباقة. |
sender_domain_not_owned | 403 | لا | نطاق From ليس في مساحة العمل هذه. استخدم list_sending_identities أو add_domain. |
sender_domain_unverified | 403 | لا | نطاق From لم يُوثَّق بعد. استخدم get_domain، وانشر السجلات الناقصة، ثم verify_domain. |
domain_limit_reached | 403 | لا | بلغ حد النطاقات في الباقة. أزل نطاقًا غير مستخدم (بموافقة) أو رقِّ الباقة. |
marketing_not_enabled | 403 | لا | الفئة التسويقية غير مفعّلة لهذا النطاق أو هذه الباقة. لا تستخدم transactional إلا إذا كانت الرسالة كذلك فعلًا. |
forbidden | 403 | لا | السياسة لا تسمح بالعملية. عدّل الطلب. |
not_found | 404 | لا | المعرّف ليس في مساحة العمل هذه. اعرض المورد للعثور على المعرّف الصحيح؛ واستعد القوالب المؤرشفة أولًا. |
idempotency_conflict | 409 | لا | أُعيد استخدام المفتاح مع جسم مختلف. أعد إرسال الأصل تمامًا، أو استخدم مفتاحًا جديدًا لرسالة جديدة. |
idempotency_in_progress | 409 | نعم | الطلب الأصلي لا يزال قيد التنفيذ. انتظر ثم أعد المحاولة بالمفتاح والجسم نفسيهما. |
revision_conflict | 409 | لا | تغيّرت مسودة القالب منذ قراءتك لها. استخدم get_template، ثم ادمج، وأعد الحفظ. |
complaint_suppression_locked | 409 | لا | قدّم المستلِم شكوى. لا تراسله مرة أخرى أبدًا. |
inbound_not_ready | 409 | لا | استقبال البريد الوارد غير جاهز. استخدم setup_inbound، وانشر MX، ثم verify_inbound. |
conflict | 409 | لا | المورد موجود بالفعل أو في حالة خاطئة. اقرأه وعدّل. |
attachments_too_large | 413 | لا | أكثر من 10 ملفات أو 10 MB. أزل المرفقات أو قلّص حجمها. |
recipient_suppressed | 422 | لا | ارتدت رسائل مستلِم ارتدادًا دائمًا أو قدّم شكوى سابقًا. أزله؛ وراجع list_blocked_recipients. |
recipient_unsubscribed | 422 | لا | ألغى مستلِم اشتراكه في البريد التسويقي. أزله نهائيًا. |
validation_failed | 422 | لا | رُفض المحتوى، مثل بيانات قالب تخالف عقد المتغيّرات. أصلح المدخلات. |
sender_paused | 423 | لا | عنوان From هذا موقوف مؤقتًا بواسطة قاطع الدائرة الخاص بارتدادات وشكاوى الأيام السبعة. توقف، وأصلح القائمة، وانتظر التعافي التلقائي. |
quota_exhausted | 429 | لا | بلغت الحد الشهري أو اليومي لكل مُرسِل أو حد المرفقات أو حد الفترة التجريبية. افحص get_account؛ وانتظر إعادة الضبط أو رقِّ الباقة. |
rate_limited | 429 | نعم | خفّف السرعة؛ وانتظر retry_after_seconds. في الإرسال: المفتاح نفسه والجسم نفسه. |
server_error | 5xx | نعم | إخفاق مؤقت في SendHQ أو لدى المزوّد. تراجع وأعد المحاولة؛ وفي الإرسال بالمفتاح والجسم نفسيهما. وإذا كانت idempotent_replayed مساوية لـ true، فاستخدم مفتاحًا جديدًا بعد التأكد من أن شيئًا لم يُرسَل. |
network_error | — | نعم | فُقد الطلب أو الاستجابة. أعد المحاولة؛ وفي الإرسال يجعل idempotency_key نفسه ذلك آمنًا. |
invalid_request | 400 | لا | طلب مشوَّه. اقرأ message وصحّحه. |
tool_error | — | لا | إخفاق محلي داخل خادم MCP (مثل file_path غير قابل للقراءة). اقرأ message. |
مرجع الأدوات
كل أداة مع فئة الأمان الخاصة بها ونقطة نهاية REST التي تستدعيها ومعلماتها وشكل القيمة المُعادة ومثال على كائن معلمات tools/call. المعلمات دقيقة: يرفض الخادم أي شيء غير مدرج.
الرسائل وسلاسل الرسائل: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
التصنيفات وقواعد الفرز التلقائي: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
المسودات والمرفقات وهويات الإرسال: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
القوالب المستضافة: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
النطاقات وDNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
البريد الوارد: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
قابلية التسليم والارتدادات وقوائم المنع: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
الحساب والاستخدام والتحليلات والمفاتيح: get_account, get_analytics, list_api_keys, get_service_health
لا توجد أدوات تطابق عامل التصفية هذا.
الرسائل وسلاسل الرسائل
send_emailإرسال رسالة واحدة
SENDS REAL EMAIL. أرسل رسالة واحدة من نطاق موثَّق: html/text خام، أو قالب مستضاف منشور، أو ردًّا في سلسلة قائمة، أو رسالة بمرفقات. مرّر idempotency_key حتى لا يؤدي إعادة المحاولة إلى إرسال مزدوج؛ ويجب أن تعيد المحاولة استخدام المفتاح نفسه مع طلب مطابق، وإلا تُعيد SendHQ الرمز 409. المعلمة attachments وسيلة مريحة تنشئ مسودة وترفع كل ملف وترسل بتلك المسودة؛ ولا يمكن دمجها مع idempotency_key أو draft_id (استخدم create_draft + upload_attachment + send_email مع draft_id لإرسال مرفقات آمن لإعادة المحاولة). لا يمكن لمساحات العمل غير المدفوعة (الفترة التجريبية للتكامل) التسليم إلا إلى البريد الإلكتروني للحساب أو إلى عنوان محاكاة في AWS SES، ولا يمكنها إرسال مرفقات.
قدّم واحدًا على الأقل من: html أو text أو template.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
from | string | نعم | المُرسِل، مثل Acme <hello@example.com>. يجب أن يكون النطاق موثَّقًا في مساحة العمل هذه (راجع list_sending_identities). (حتى 998 حرفًا) |
to | string[] | نعم | المستلِمون. كل عنصر عنوان، مع اسم عرض اختياري. يمكن أن يبلغ مجموع to وcc وbcc 100 على الأكثر؛ وتستهلك كل وجهة رصيد تسليم واحدًا. (من 1 إلى 100 عنصر) |
cc | string[] | لا | مستلِمو النسخة الكربونية. (من 0 إلى 100 عنصر) |
bcc | string[] | لا | مستلِمو النسخة المخفية. (من 0 إلى 100 عنصر) |
subject | string | لا | سطر الموضوع. احذفه عند إرسال قالب. (حتى 998 حرفًا) |
text | string | لا | نص الرسالة العادي. قدّم text أو html أو template. |
html | string | لا | نص الرسالة بصيغة HTML. تعقّمه SendHQ وتشتق النص العادي عند حذف text. |
reply_to | string | لا | عنوان Reply-To. |
headers | object | لا | ترويسات مخصصة آمنة إضافية (قيم نصية)، مثل {"X-Entity-Ref-ID": "123"}. أما ترويسات التوجيه مثل From/To/Message-ID فتتحكم فيها SendHQ. |
message_class | string | لا | transactional (الافتراضي) أو marketing. تتطلب marketing باقة أو نطاقًا مفعَّلًا للتسويق وتضيف معالجة إلغاء الاشتراك. (إحدى القيم transactional أو marketing) |
reply_to_email_id | string | لا | الرد داخل محادثة قائمة: معرّف em_… للرسالة التي يُردّ عليها. تضبط SendHQ In-Reply-To/References والسلسلة. |
thread_id | string | لا | معرّف سلسلة صريح لحفظ الرسالة تحته. |
draft_id | string | لا | أرسل مرفقات مسودة مخزَّنة مع هذه الرسالة (dr_…). تُحذف المسودة بعد إرسال ناجح. |
template | object | لا | أرسل قالبًا مستضافًا منشورًا بدل html/text خام. يتطلب مستلِمًا واحدًا بالضبط في to ودون cc/bcc؛ ويوفّر القالب الموضوع. قدّم واحدًا على الأقل من: id أو key. |
template.id | string | لا | معرّف القالب (tmpl_…). قدّم id أو key. |
template.key | string | لا | مفتاح القالب مثل account-welcome. قدّم id أو key. |
template.version_id | string | لا | معرّف إصدار منشور اختياري (tmplv_…). الافتراضي هو الإصدار المنشور الحالي. |
template.data | object | لا | قيم المتغيّرات المُنمَّطة في القالب. |
labels | string[] | لا | أسماء تصنيفات أو معرّفات lbl_… لحفظ هذه الرسالة تحتها. تُنشأ الأسماء غير المعروفة. وترث الردود في المحادثة التصنيفات، ويُبقي تصنيف المجموعة (skip_inbox) تلك الردود خارج صندوق الوارد. 10 كحد أقصى. (من 0 إلى 10 عناصر) |
idempotency_key | string | لا | ترويسة Idempotency-Key (حتى 200 حرف). أعد استخدامه فقط لإعادة محاولة هذا الطلب نفسه تمامًا. (حتى 200 حرف) |
attachments | object[] | لا | الملفات المراد إرفاقها (10 ملفات و10 MB إجمالًا كحد أقصى). يحتاج كل ملف إلى content_base64 (مع filename) أو file_path محلي. (من 0 إلى 10 عناصر) قدّم واحدًا على الأقل من: content_base64 أو file_path. |
attachments[].filename | string | لا | اسم الملف الظاهر للمستلِم. مطلوب مع content_base64؛ والافتراضي هو الاسم الأساسي لـ file_path. (حتى 255 حرفًا) |
attachments[].content_type | string | لا | نوع MIME، مثل application/pdf. الافتراضي application/octet-stream. |
attachments[].content_base64 | string | لا | محتوى الملف بترميز base64 القياسي. |
attachments[].file_path | string | لا | المسار المطلق لملف محلي يمكن لعملية خادم MCP قراءته. |
{
"name": "send_email",
"arguments": {
"from": "Acme <hello@example.com>",
"to": [
"owner@example.com"
],
"subject": "Your export is ready",
"text": "Download it from your dashboard.",
"idempotency_key": "export-ready-42"
}
}send_batchإرسال دفعة من الرسائل المخصّصة
SENDS REAL EMAIL. أرسل من 1 إلى 100 رسالة مستقلة في طلب واحد (استخدمها لتخصيص القالب لكل مستلِم). لكل عنصر الشكل نفسه كما في send_email (دون attachments/idempotency_key). تنجح العناصر أو تخفق فرديًا: يعني HTTP 207 نجاحًا جزئيًا؛ فافحص data[i].ok وdata[i].error لكل عنصر. ويغطي idempotency_key واحد جسم الدفعة كله.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
emails | object[] | نعم | الرسائل المراد إرسالها. (من 1 إلى 100 عنصر) قدّم واحدًا على الأقل من: html أو text أو template. |
idempotency_key | string | لا | Idempotency-Key للدفعة كلها (حتى 200 حرف). (حتى 200 حرف) |
{
"name": "send_batch",
"arguments": {
"emails": [
{
"from": "Acme <hello@example.com>",
"to": [
"owner@example.com"
],
"template": {
"key": "account-welcome",
"data": {
"first_name": "Asha"
}
}
}
],
"idempotency_key": "welcome-batch-2026-09-26"
}
}list_emailsعرض البريد والبحث فيه
اعرض البريد المرسل (direction: out) والمستلَم (direction: in) من الأحدث إلى الأقدم مع عوامل تصفية. يُصنَّف البريد المستلَم: اقرأ صندوق الوارد البشري بـ direction: in وarchived: false وcategory: primary؛ وافرز بـ important: true؛ ويُخفى البريد المزعج ما لم تستخدم category: spam أو include_spam: true. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
direction | string | لا | in للمستلَم، وout للمرسَل. (إحدى القيم in أو out) |
status | string | لا | عامل تصفية الحالة، مثل queued أو sent أو delivered أو bounced أو complained أو failed. |
domain | string | لا | الرسائل الخاصة بهذا النطاق فقط، أو بقائمة نطاقات مفصولة بفواصل (تُطابَق أي قيمة منها). |
inbox_id | string | لا | الرسائل التي استلمها صندوق البريد هذا فقط (inb_…). |
label | string | لا | الرسائل التي تحمل هذا التصنيف فقط: معرّف تصنيف lbl_… أو اسم مطابق تمامًا، أو قائمة مفصولة بفواصل (تُطابَق أي قيمة منها). استخدم list_labels لرؤية المجلدات. |
archived | boolean | لا | false = عرض صندوق الوارد (البريد المستلَم غير المؤرشف)، وtrue = المؤرشف فقط. احذفها لعرض كل البريد. |
category | string | لا | primary (الأشخاص)، أو updates (النشرات والبريد الجماعي والآلي)، أو spam؛ أو قائمة مفصولة بفواصل. يُخفى البريد المزعج ما لم يُطلب. |
important | boolean | لا | true = الرسائل الموسومة بأنها مهمة فقط (الردود على محادثات بدأتَها، والمُرسِلون الموسومون بالأهمية). |
include_spam | boolean | لا | تضمين البريد المزعج في النتائج (للبحث في كل المجلدات). |
from | string | لا | عنوان المُرسِل يحتوي على هذه القيمة. |
to | string | لا | عنوان المستلِم يحتوي على هذه القيمة. |
unread | boolean | لا | true = غير المقروء فقط، وfalse = المقروء فقط. |
after | string | لا | طابع زمني بصيغة ISO-8601؛ الرسائل المُنشأة بعده فقط. (date-time) |
before | string | لا | طابع زمني بصيغة ISO-8601؛ الرسائل المُنشأة قبله فقط. (date-time) |
query | string | لا | بحث نصي حر في الموضوعات والنصوص وعناوين المُرسِل/المستلِم وأسماء ملفات المرفقات. (حتى 200 حرف) |
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_emails",
"arguments": {
"direction": "in",
"unread": true,
"limit": 25
}
}get_emailاسترجاع رسالة واحدة
استرجع رسالة واحدة مع الترويسات ونص html/text والحالة وبيانات السلسلة الوصفية وبيانات المرفقات الوصفية (نزّل البايتات بـ download_attachment).
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
email_id | string | نعم | معرّف الرسالة (يبدأ بـ em_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "get_email",
"arguments": {
"email_id": "em_123"
}
}mark_emailتعليم رسالة كمقروءة أو مؤرشفة أو مزعجة أو مهمة
حدّث رسالة واحدة: read وarchived وcategory (primary أو updates أو spam؛ للبريد المستلَم فقط) وimportant. يُعلِّم الإبلاغ عن بريد مزعج أو الوسم بالأهمية نظام SendHQ عن ذلك المُرسِل للبريد المستقبلي؛ ومرّر learn: false لتغيير هذه الرسالة وحدها. مرّر حقلًا واحدًا على الأقل.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
email_id | string | نعم | معرّف الرسالة (يبدأ بـ em_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
read | boolean | لا | true = مقروءة، وfalse = غير مقروءة. |
archived | boolean | لا | true = أرشفة (تخطي صندوق الوارد)، وfalse = إعادتها إلى صندوق الوارد. |
category | string | لا | انقل رسالة مستلَمة إلى primary أو updates أو spam. (إحدى القيم primary أو updates أو spam) |
important | boolean | لا | وسم الرسالة بأنها مهمة أو إزالة الوسم. |
learn | boolean | لا | false = لا تتذكر هذا الحكم بشأن المُرسِل (الافتراضي true). |
{
"name": "mark_email",
"arguments": {
"email_id": "em_123",
"read": true
}
}delete_emailحذف رسالة
DESTRUCTIVE: احذف نهائيًا رسالة محفوظة ومرفقاتها المخزَّنة من SendHQ. لا يسحب ذلك رسالة سُلِّمت بالفعل.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
email_id | string | نعم | معرّف الرسالة (يبدأ بـ em_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "delete_email",
"arguments": {
"email_id": "em_123"
}
}list_email_eventsعرض أحداث التسليم لرسالة
أحداث المزوّد لرسالة مرسَلة واحدة: delivery وbounce وcomplaint وreject وopen وclick. وهذا هو الدليل على ما إذا كانت الرسالة سُلِّمت أو سبب إخفاقها. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
email_id | string | نعم | معرّف الرسالة (يبدأ بـ em_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_email_events",
"arguments": {
"email_id": "em_123"
}
}get_threadاسترجاع محادثة
استرجع كل رسالة في محادثة بترتيب زمني (المرسلة والمستلَمة)، مع بيانات المرفقات الوصفية لكل منها.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
thread_id | string | نعم | معرّف السلسلة (عادةً معرّف em_… للرسالة الأولى؛ راجع threadId في أي رسالة). (حتى 128 حرفًا) |
{
"name": "get_thread",
"arguments": {
"thread_id": "em_123"
}
}التصنيفات وقواعد الفرز التلقائي
list_labelsعرض التصنيفات
اعرض تصنيفات مساحة العمل (المجلدات) مع الأعداد الإجمالية وغير المقروءة وقواعد الفرز التلقائي الخاصة بها. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_labels",
"arguments": {}
}get_labelاسترجاع تصنيف
استرجع تصنيفًا واحدًا مع الأعداد وقواعد الفرز التلقائي.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
label_id | string | نعم | معرّف التصنيف (يبدأ بـ lbl_) أو اسم التصنيف المطابق تمامًا. (حتى 128 حرفًا) |
{
"name": "get_label",
"arguments": {
"label_id": "Billing"
}
}create_labelإنشاء تصنيف
أنشئ تصنيفًا على هيئة مجلد. اضبط skip_inbox: true لتحويله إلى مجموعة يملكها الوكيل: أرسل بـ labels: [name] فتُفرز الردود إلى التصنيف وتبقى خارج صندوق الوارد. وتفرز قواعد الفرز التلقائي الاختيارية البريد المرسل/المستلَم الجديد (يجب أن تتحقق كل الشروط في القاعدة). واضبط apply_to_existing لفرز البريد المحفوظ أيضًا.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
name | string | نعم | اسم التصنيف، مثل Billing أو Clients/Acme. فريد لكل مساحة عمل (دون مراعاة حالة الأحرف). (حتى 64 حرفًا) |
color | string | لا | لون بصيغة hex مثل #1a73e8. اختياري. |
skip_inbox | boolean | لا | وضع المجموعة: يُؤرشَف البريد المستلَم الذي يحصل على هذا التصنيف (بقاعدة، أو بالرد على محادثة أُرسلت بهذا التصنيف، أو يدويًا) فيظهر داخل التصنيف فقط وليس في صندوق الوارد. |
rules | object[] | لا | قواعد فرز تلقائي اختيارية (20 كحد أقصى). تحتاج كل قاعدة إلى واحد على الأقل من inbox_id أو from أو to أو subject. (من 0 إلى 20 عنصرًا) |
rules[].direction | string | لا | البريد in (المستلَم) أو out (المرسَل) فقط. احذفها للاثنين معًا. (إحدى القيم in أو out) |
rules[].inbox_id | string | لا | البريد الذي استلمه صندوق البريد هذا فقط (inb_…). يفرز كل عنوان استقبال في مجلده الخاص. |
rules[].from | string | لا | المُرسِل يحتوي على هذا النص (دون مراعاة حالة الأحرف)، مثل @stripe.com. (حتى 200 حرف) |
rules[].to | string | لا | To/Cc يحتوي على هذا النص (دون مراعاة حالة الأحرف). (حتى 200 حرف) |
rules[].subject | string | لا | الموضوع يحتوي على هذا النص (دون مراعاة حالة الأحرف). (حتى 200 حرف) |
rules[].skip_inbox | boolean | لا | أرشفة البريد المستلَم المطابق ليظهر داخل مجلد التصنيف فقط وليس في صندوق الوارد. |
apply_to_existing | boolean | لا | فرز البريد المحفوظ أصلًا الذي يطابق القواعد أيضًا. |
{
"name": "create_label",
"arguments": {
"name": "Agent/Orders",
"skip_inbox": true,
"rules": [
{
"from": "@stripe.com"
}
]
}
}update_labelإعادة تسمية تصنيف أو تغيير لونه أو تحويله إلى مجموعة
أعد تسمية تصنيف أو غيّر لونه أو بدّل وضع المجموعة (skip_inbox). يؤدي تفعيل وضع المجموعة إلى أرشفة البريد المستلَم الموجود أصلًا في التصنيف.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
label_id | string | نعم | معرّف التصنيف (يبدأ بـ lbl_) أو اسم التصنيف المطابق تمامًا. (حتى 128 حرفًا) |
name | string | لا | الاسم الجديد. (حتى 64 حرفًا) |
color | string | لا | لون hex الجديد. |
skip_inbox | boolean | لا | وضع المجموعة: يُؤرشَف البريد المستلَم الذي يحصل على هذا التصنيف (بقاعدة، أو بالرد على محادثة أُرسلت بهذا التصنيف، أو يدويًا) فيظهر داخل التصنيف فقط وليس في صندوق الوارد. |
{
"name": "update_label",
"arguments": {
"label_id": "lbl_123",
"name": "Finance/Billing"
}
}delete_labelحذف تصنيف
DESTRUCTIVE: احذف تصنيفًا وقواعده. تبقى الرسالة نفسها؛ وتفقد هذا التصنيف فقط.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
label_id | string | نعم | معرّف التصنيف (يبدأ بـ lbl_) أو اسم التصنيف المطابق تمامًا. (حتى 128 حرفًا) |
{
"name": "delete_label",
"arguments": {
"label_id": "lbl_123"
}
}create_label_ruleإضافة قاعدة فرز تلقائي
أضف قاعدة إلى تصنيف ليُفرز البريد الجديد المطابق تلقائيًا. يجب أن تتحقق كل الشروط التي تضبطها. استخدم inbox_id لمنح عنوان استقبال مجلده الخاص؛ وأضف skip_inbox لإبقائه خارج صندوق الوارد.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
label_id | string | نعم | معرّف التصنيف (يبدأ بـ lbl_) أو اسم التصنيف المطابق تمامًا. (حتى 128 حرفًا) |
direction | string | لا | البريد in (المستلَم) أو out (المرسَل) فقط. احذفها للاثنين معًا. (إحدى القيم in أو out) |
inbox_id | string | لا | البريد الذي استلمه صندوق البريد هذا فقط (inb_…). يفرز كل عنوان استقبال في مجلده الخاص. |
from | string | لا | المُرسِل يحتوي على هذا النص (دون مراعاة حالة الأحرف)، مثل @stripe.com. (حتى 200 حرف) |
to | string | لا | To/Cc يحتوي على هذا النص (دون مراعاة حالة الأحرف). (حتى 200 حرف) |
subject | string | لا | الموضوع يحتوي على هذا النص (دون مراعاة حالة الأحرف). (حتى 200 حرف) |
skip_inbox | boolean | لا | أرشفة البريد المستلَم المطابق ليظهر داخل مجلد التصنيف فقط وليس في صندوق الوارد. |
apply_to_existing | boolean | لا | فرز البريد المحفوظ أصلًا الذي يطابق أيضًا. |
{
"name": "create_label_rule",
"arguments": {
"label_id": "Billing",
"inbox_id": "inb_123",
"skip_inbox": true
}
}delete_label_ruleحذف قاعدة فرز تلقائي
DESTRUCTIVE: أزل قاعدة فرز تلقائي واحدة. يحتفظ البريد المفروز أصلًا بتصنيفه.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
label_id | string | نعم | معرّف التصنيف (يبدأ بـ lbl_) أو اسم التصنيف المطابق تمامًا. (حتى 128 حرفًا) |
rule_id | string | نعم | معرّف القاعدة (يبدأ بـ lrule_)، من get_label. (حتى 128 حرفًا) |
{
"name": "delete_label_rule",
"arguments": {
"label_id": "lbl_123",
"rule_id": "lrule_123"
}
}label_emailإضافة تصنيفات إلى رسالة أو إزالتها منها
انقل رسالة بين المجلدات: أضف و/أو أزل تصنيفات بالاسم أو بمعرّف lbl_…. تُنشأ الأسماء غير المعروفة في add ما لم تكن create مساوية لـ false.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
email_id | string | نعم | معرّف الرسالة (يبدأ بـ em_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
add | string[] | لا | التصنيفات المراد إضافتها. (من 0 إلى 10 عناصر) |
remove | string[] | لا | التصنيفات المراد إزالتها. (من 0 إلى 10 عناصر) |
create | boolean | لا | إنشاء التصنيفات غير المعروفة في add (الافتراضي true). |
{
"name": "label_email",
"arguments": {
"email_id": "em_123",
"add": [
"Billing"
],
"remove": [
"Support"
]
}
}المسودات والمرفقات وهويات الإرسال
list_sending_identitiesعرض هويات الإرسال الموثَّقة
العناوين والنطاقات التي يمكن لمساحة العمل الإرسال منها الآن (النطاقات الموثَّقة وعنوان From الافتراضي لكل منها وعناوين صناديق البريد النشطة). استدعِها قبل send_email لاختيار قيمة from صالحة.
لا توجد معلمات.
{
"name": "list_sending_identities",
"arguments": {}
}create_draftإنشاء مسودة
أنشئ مسودة في المحرّر. تحتفظ المسودات بالمرفقات: أنشئ مسودة، ثم upload_attachment، ثم send_email مع draft_id. لا ترسل أي شيء.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
from | string | لا | عنوان المُرسِل على نطاق موثَّق (قد يكون فارغًا أثناء الصياغة). |
to | string[] | لا | المستلِمون. (من 0 إلى 100 عنصر) |
cc | string[] | لا | مستلِمو النسخة الكربونية. (من 0 إلى 100 عنصر) |
bcc | string[] | لا | مستلِمو النسخة المخفية. (من 0 إلى 100 عنصر) |
subject | string | لا | سطر الموضوع. (حتى 998 حرفًا) |
html | string | لا | نص الرسالة بصيغة HTML. |
text | string | لا | نص الرسالة العادي. |
reply_to_email_id | string | لا | معرّف الرسالة التي تردّ عليها هذه المسودة. |
thread_id | string | لا | معرّف السلسلة التي تنتمي إليها هذه المسودة. |
{
"name": "create_draft",
"arguments": {
"from": "hello@example.com",
"to": [
"owner@example.com"
],
"subject": "Invoice"
}
}list_draftsعرض المسودات
اعرض مسودات المحرّر، الأحدث تحديثًا أولًا. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_drafts",
"arguments": {}
}get_draftاسترجاع مسودة
استرجع مسودة واحدة مع بيانات مرفقاتها الوصفية.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
draft_id | string | نعم | معرّف المسودة (يبدأ بـ dr_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "get_draft",
"arguments": {
"draft_id": "dr_123"
}
}update_draftاستبدال محتوى مسودة
استبدل محتوى مسودة ومستلِميها. وهذا استبدال كامل: تُمسح الحقول التي تحذفها، فاقرأ get_draft أولًا وأرسل كل حقل تريد الاحتفاظ به. لا تتأثر المرفقات.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
draft_id | string | نعم | معرّف المسودة (يبدأ بـ dr_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
from | string | لا | عنوان المُرسِل على نطاق موثَّق (قد يكون فارغًا أثناء الصياغة). |
to | string[] | لا | المستلِمون. (من 0 إلى 100 عنصر) |
cc | string[] | لا | مستلِمو النسخة الكربونية. (من 0 إلى 100 عنصر) |
bcc | string[] | لا | مستلِمو النسخة المخفية. (من 0 إلى 100 عنصر) |
subject | string | لا | سطر الموضوع. (حتى 998 حرفًا) |
html | string | لا | نص الرسالة بصيغة HTML. |
text | string | لا | نص الرسالة العادي. |
reply_to_email_id | string | لا | معرّف الرسالة التي تردّ عليها هذه المسودة. |
thread_id | string | لا | معرّف السلسلة التي تنتمي إليها هذه المسودة. |
{
"name": "update_draft",
"arguments": {
"draft_id": "dr_123",
"from": "hello@example.com",
"to": [
"owner@example.com"
],
"subject": "Invoice (updated)",
"text": "Attached."
}
}delete_draftتجاهل مسودة
DESTRUCTIVE: تجاهل مسودة واحذف مرفقاتها المخزَّنة نهائيًا.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
draft_id | string | نعم | معرّف المسودة (يبدأ بـ dr_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "delete_draft",
"arguments": {
"draft_id": "dr_123"
}
}upload_attachmentرفع مرفق إلى مسودة
ارفع ملفًا واحدًا إلى مسودة (10 ملفات و10 MB إجمالًا كحد أقصى لكل رسالة). قدّم content_base64 أو file_path محليًا. تتطلب المرفقات باقة مدفوعة وقت الإرسال.
قدّم واحدًا على الأقل من: content_base64 أو file_path.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
draft_id | string | نعم | معرّف المسودة (يبدأ بـ dr_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
filename | string | لا | اسم الملف الظاهر للمستلِم. الافتراضي هو الاسم الأساسي لـ file_path. (حتى 255 حرفًا) |
content_type | string | لا | نوع MIME، مثل application/pdf. الافتراضي application/octet-stream. |
content_base64 | string | لا | محتوى الملف بترميز base64 القياسي. |
file_path | string | لا | المسار المطلق لملف محلي يمكن لعملية خادم MCP قراءته. |
{
"name": "upload_attachment",
"arguments": {
"draft_id": "dr_123",
"filename": "invoice.pdf",
"content_type": "application/pdf",
"file_path": "/tmp/invoice.pdf"
}
}download_attachmentتنزيل مرفق
نزّل مرفقًا خاصًا (مرسَلًا أو مستلَمًا أو في مسودة). يُعيد المحتوى بترميز base64، أو يكتب الملف عند ضبط save_to_path (ويرفض الكتابة فوق ملف موجود ما لم تكن overwrite مساوية لـ true).
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
attachment_id | string | نعم | معرّف المرفق (يبدأ بـ att_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
save_to_path | string | لا | مسار محلي مطلق اختياري لكتابة الملف إليه بدل إعادة base64. |
overwrite | boolean | لا | السماح باستبدال ملف موجود في save_to_path. الافتراضي false. |
{
"name": "download_attachment",
"arguments": {
"attachment_id": "att_123",
"save_to_path": "/tmp/invoice.pdf"
}
}delete_attachmentحذف مرفق
DESTRUCTIVE: احذف نهائيًا مرفقًا مخزَّنًا (مثلًا لإزالة ملف من مسودة قبل الإرسال).
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
attachment_id | string | نعم | معرّف المرفق (يبدأ بـ att_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "delete_attachment",
"arguments": {
"attachment_id": "att_123"
}
}القوالب المستضافة
list_templatesعرض القوالب المستضافة
اعرض قوالب البريد المستضافة مع حالة النشر والاستخدام. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
lifecycle | string | لا | active (الافتراضي) أو archived أو all. (إحدى القيم active أو archived أو all) |
query | string | لا | بحث بالاسم أو المفتاح. (حتى 120 حرفًا) |
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_templates",
"arguments": {
"lifecycle": "active"
}
}create_templateإنشاء قالب مستضاف
أنشئ قالبًا بمسودة قابلة للتعديل، ويمكن أن يبدأ اختياريًا من قالب ابتدائي (welcome أو reset أو receipt أو blank). انشره قبل الإرسال بالمفتاح.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
name | string | نعم | اسم مقروء للبشر. (حتى 120 حرفًا) |
key | string | لا | مفتاح إرسال ثابت: أحرف لاتينية صغيرة وأرقام وواصلات، ويبدأ بحرف (من 2 إلى 64 حرفًا). يُشتق من الاسم عند حذفه. |
starter | string | لا | محتوى ابتدائي. (إحدى القيم blank أو welcome أو reset أو receipt) |
{
"name": "create_template",
"arguments": {
"name": "Account welcome",
"key": "account-welcome",
"starter": "welcome"
}
}get_templateاسترجاع قالب
استرجع المسودة الحالية للقالب (مع revision) والإصدار المنشور النشط وسجل الإصدارات والاستخدام. يقبل المعرّف أو المفتاح.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب (tmpl_…) أو مفتاحه. (حتى 128 حرفًا) |
{
"name": "get_template",
"arguments": {
"template_id": "account-welcome"
}
}update_template_draftحفظ مسودة قالب
احفظ المسودة القابلة للتعديل للقالب باستخدام التزامن المتفائل: مرّر revision الحالية من get_template (يعني 409 أن شخصًا آخر حفظ أولًا؛ فأعد القراءة وأعد المحاولة). وهذا استبدال كامل لمحتوى المسودة: تُمسح الحقول المحذوفة، فأرسل كل حقل تريد الاحتفاظ به. استخدم العناصر النائبة {{variable}}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
revision | integer | نعم | مراجعة المسودة الحالية من get_template. (من 1 فصاعدًا) |
name | string | لا | اسم القالب. (حتى 120 حرفًا) |
subject_template | string | لا | الموضوع مع عناصر نائبة. (حتى 998 حرفًا) |
preheader_template | string | لا | نص المعاينة. (حتى 240 حرفًا) |
html_template | string | لا | نص HTML مع عناصر نائبة. |
text_template | string | لا | النص العادي مع عناصر نائبة. |
from | string | لا | المُرسِل الافتراضي لعمليات إرسال هذا القالب. |
reply_to | string | لا | Reply-To الافتراضي. |
variables | object[] | لا | عقد المتغيّرات المُنمَّطة. كل عنصر: {key (أحرف صغيرة/شرطات سفلية), label, type: text|number|url|boolean, required (الافتراضي true), fallback, description}. |
variables[].key | string | نعم | |
variables[].label | string | لا | |
variables[].type | string | لا | (إحدى القيم text أو number أو url أو boolean) |
variables[].required | boolean | لا | |
variables[].fallback | any | لا | |
variables[].description | string | لا | |
sample_data | object | لا | قيم عيّنة تُستخدم في المعاينات والاختبارات. |
{
"name": "update_template_draft",
"arguments": {
"template_id": "account-welcome",
"revision": 3,
"name": "Account welcome",
"subject_template": "Welcome, {{first_name}}",
"text_template": "Hi {{first_name}}",
"variables": [
{
"key": "first_name",
"type": "text",
"required": true
}
],
"sample_data": {
"first_name": "Asha"
}
}
}create_template_draftبدء مسودة جديدة من الإصدار المنشور
أنشئ مسودة جديدة قابلة للتعديل منسوخة من الإصدار المنشور الحالي (409 إذا كانت هناك مسودة قائمة أو لم يُنشر شيء).
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
{
"name": "create_template_draft",
"arguments": {
"template_id": "account-welcome"
}
}render_templateتوليد معاينة قالب
ولّد المخرجات الدقيقة كما يُنتجها الخادم (subject وhtml وtext) للمسودة أو للإصدار المنشور أو لإصدار محدد بالبيانات المعطاة. لا يرسل. يُعيد 422 مع findings عندما تخالف البيانات عقد المتغيّرات.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
version_id | string | لا | معرّف إصدار اختياري؛ الافتراضي المسودة، ثم الإصدار المنشور. |
data | object | لا | قيم المتغيّرات؛ والافتراضي بيانات العيّنة للإصدار. |
{
"name": "render_template",
"arguments": {
"template_id": "account-welcome",
"data": {
"first_name": "Asha"
}
}
}send_template_testإرسال رسالة اختبار للقالب
SENDS REAL EMAIL. أرسل لقطة للمسودة (أو لإصدار معيّن) مسبوقة بـ [Test] إلى المستلِمين المحددين. تُحتسب ضمن الاستخدام؛ ولا يمكن لمساحات العمل التجريبية الإرسال إلا إلى البريد الإلكتروني للحساب أو إلى عنوان محاكاة في SES.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
to | string[] | نعم | مستلِمو الاختبار. (من 1 إلى 100 عنصر) |
from | string | لا | المُرسِل على نطاق موثَّق؛ والافتراضي From الخاص بالقالب. |
version_id | string | لا | معرّف إصدار اختياري. |
data | object | لا | قيم المتغيّرات؛ والافتراضي بيانات العيّنة. |
{
"name": "send_template_test",
"arguments": {
"template_id": "account-welcome",
"to": [
"owner@example.com"
]
}
}publish_templateنشر إصدار قالب
انشر المسودة الحالية بوصفها إصدارًا غير قابل للتعديل ستستخدمه send_email مع template.key. يخفق مع نتائج 422 عند أخطاء التحقق، أو 409 إذا كان النشر سيخالف عقد المتغيّرات الحي لقالب مستخدم أصلًا في بيئة الإنتاج.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
{
"name": "publish_template",
"arguments": {
"template_id": "account-welcome"
}
}archive_templateأرشفة قالب
أوقف عمليات الإرسال الجديدة التي تستخدم هذا القالب (يُحتفظ بالسجل؛ ويمكن التراجع بـ restore_template). وأي تكامل يرسل بهذا المفتاح سيبدأ بالإخفاق بالرمز 404.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
{
"name": "archive_template",
"arguments": {
"template_id": "account-welcome"
}
}restore_templateاستعادة قالب مؤرشف
أعِد تفعيل قالب مؤرشف.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
template_id | string | نعم | معرّف القالب أو مفتاحه. (حتى 128 حرفًا) |
{
"name": "restore_template",
"arguments": {
"template_id": "account-welcome"
}
}النطاقات وDNS
list_domainsعرض النطاقات
اعرض نطاقات الإرسال مع setup_status إجمالية (verified | checking | pending) وحالة DNS لكل سجل وحالة الوارد. قد تكون بطيئة: تُعاد مراجعة النطاقات غير الموثَّقة مباشرةً. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_domains",
"arguments": {}
}get_domainاسترجاع تفاصيل إعداد النطاق
استرجع نطاقًا واحدًا مع سجلات DNS الدقيقة المطلوب نشرها (النوع والاسم والقيمة)، والحالة الحية لكل سجل من محلّلَي DNS عامّين، وdns_issues مع الإصلاحات، وحالة الوارد.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "get_domain",
"arguments": {
"domain_id": "dom_123"
}
}add_domainإضافة نطاق إرسال
سجّل نطاقًا تتحكم فيه للإرسال. يُعيد سجلات DNS (سجلات SES Easy DKIM من نوع CNAME) التي يجب على المالك نشرها. لا يغيّر DNS بنفسه. ويُحتسب ضمن حد النطاقات في الباقة.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
name | string | نعم | اسم نطاق مجرد، مثل example.com أو mail.example.com. (حتى 253 حرفًا) |
default_from | string | لا | عنوان مُرسِل افتراضي اختياري على هذا النطاق. |
{
"name": "add_domain",
"arguments": {
"name": "example.com"
}
}verify_domainتوثيق نطاق
شغّل فحص تحقق حيًا من SES/DNS الآن. آمن للتكرار؛ استعلم دوريًا كل 30 إلى 60 ثانية بعد تغييرات DNS (قد يستغرق الانتشار من دقائق إلى ساعات). يُسمح بالإرسال بمجرد أن تصبح الحالة verified.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "verify_domain",
"arguments": {
"domain_id": "dom_123"
}
}delete_domainحذف نطاق
DESTRUCTIVE: أزل النطاق من مساحة العمل، بما في ذلك مسار استقبال الوارد الخاص به. وتخفق عمليات الإرسال منه فورًا بعد ذلك. لا يحذف سجلات DNS لدى مزوّد DNS الخاص بك.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "delete_domain",
"arguments": {
"domain_id": "dom_123"
}
}get_dns_providerاكتشاف مزوّد DNS ومضيفات السجلات
اكتشف مزوّد DNS المعتمد للنطاق وأعِد المضيف النسبي الذي تكتبه لدى ذلك المزوّد لكل سجل، وسجل DMARC الموصى به، وإرشادات MX للوارد، وما إذا كان الإعداد بنقرة واحدة (Domain Connect) متاحًا.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "get_dns_provider",
"arguments": {
"domain_id": "dom_123"
}
}get_domain_connect_linkالحصول على رابط إعداد DNS بنقرة واحدة
عندما تُبلغ get_dns_provider بأن providers.domainConnect.available متاحة، أنشئ عنوان URL موقَّعًا للموافقة. سلّمه إلى الإنسان: يفتحه ويوافق على تغيير DNS لدى مزوّده. لا يتغير شيء إلى أن يوافق. تُعيد 409 إذا لم يكن مدعومًا.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "get_domain_connect_link",
"arguments": {
"domain_id": "dom_123"
}
}البريد الوارد
setup_inboundتفعيل استقبال الوارد لنطاق
هيّئ استقبال الوارد في SES لنطاق موثَّق. يستخدم النطاق الجذر عندما لا يكون له MX متعارض، وإلا يستخدم inbound.<domain>. يُعيد سجل MX الذي يجب على المالك نشره؛ ولا يعدّل DNS.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "setup_inbound",
"arguments": {
"domain_id": "dom_123"
}
}verify_inboundالتحقق من MX الوارد
أعد فحص سجل MX الوارد. تصبح الحالة ready عندما يراه محلّلا DNS العامّان كلاهما.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "verify_inbound",
"arguments": {
"domain_id": "dom_123"
}
}list_inboxesعرض عناوين الوارد
اعرض عناوين الاستقبال، ولنطاق واحد اختياريًا. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | لا | عامل تصفية اختياري بمعرّف النطاق. |
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_inboxes",
"arguments": {
"domain_id": "dom_123"
}
}get_inboxاسترجاع صندوق بريد
استرجع عنوان وارد واحدًا.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
inbox_id | string | نعم | معرّف صندوق البريد (يبدأ بـ inb_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "get_inbox",
"arguments": {
"inbox_id": "inb_123"
}
}create_inboxإنشاء عنوان وارد
أنشئ عنوانًا مثل support@<receiving domain> على نطاق حالة الوارد فيه ready (شغّل setup_inbound وverify_inbound أولًا). يظهر البريد المستلَم في list_emails مع الاتجاه in.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
domain_id | string | نعم | معرّف النطاق (يبدأ بـ dom_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
local_part | string | نعم | الجزء الذي يسبق @، مثل support. (حتى 64 حرفًا) |
name | string | لا | اسم عرض اختياري. |
{
"name": "create_inbox",
"arguments": {
"domain_id": "dom_123",
"local_part": "support",
"name": "Support"
}
}update_inboxإعادة تسمية صندوق بريد أو تفعيله أو تعطيله
أعد تسمية صندوق بريد أو اضبط حالته على active / disabled.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
inbox_id | string | نعم | معرّف صندوق البريد (يبدأ بـ inb_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
name | string | لا | اسم العرض الجديد. |
status | string | لا | الحالة الجديدة. (إحدى القيم active أو disabled) |
{
"name": "update_inbox",
"arguments": {
"inbox_id": "inb_123",
"status": "disabled"
}
}set_inbox_forwardingإعادة توجيه صندوق بريد إلى عنوان آخر
SENDS REAL EMAIL عند إعادة التوجيه إلى شخص غير مالك الحساب: يحدد الوجهة التي يُعاد توجيه البريد المستلَم في صندوق البريد إليها. يُفعَّل عنوان المالك نفسه فورًا؛ أما أي عنوان آخر فيتلقى رسالة تأكيد وتبقى إعادة التوجيه pending إلى أن يؤكدها أحد هناك. مرّر forward_to: null لإيقاف إعادة التوجيه. تصدر النسخ المُعاد توجيهها من عنوان صندوق البريد مع المُرسِل الأصلي في Reply-To.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
inbox_id | string | نعم | معرّف صندوق البريد (يبدأ بـ inb_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
forward_to | string,null | نعم | عنوان البريد الإلكتروني المستهدف لإعادة التوجيه، أو null لإيقاف إعادة التوجيه. (حتى 254 حرفًا) |
{
"name": "set_inbox_forwarding",
"arguments": {
"inbox_id": "inb_123",
"forward_to": "team@example.net"
}
}delete_inboxحذف صندوق بريد
DESTRUCTIVE: احذف عنوان وارد. يُحتفظ بالبريد المستلَم أصلًا؛ ولا يُفرز البريد الجديد المرسَل إلى العنوان إليه بعد ذلك.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
inbox_id | string | نعم | معرّف صندوق البريد (يبدأ بـ inb_)، كما تُعيده أداة عرض أو إنشاء. (حتى 128 حرفًا) |
{
"name": "delete_inbox",
"arguments": {
"inbox_id": "inb_123"
}
}قابلية التسليم والارتدادات وقوائم المنع
deliverability_statsالحصول على إحصاءات التسليم لآخر 30 يومًا
إجماليات آخر 30 يومًا على مستوى مساحة العمل: sent وdelivery وbounce وcomplaint وreject وopen وclick وdeliveryRate (%).
لا توجد معلمات.
{
"name": "deliverability_stats",
"arguments": {}
}list_sender_reputationعرض سمعة المُرسِل
حالة السمعة لكل عنوان From بعينه: active أو throttled (حد يومي أقل) أو paused (تُعيد عمليات الإرسال 423)، مع السبب والحد اليومي. افحصها عندما تخفق عمليات الإرسال بالرمز 423 أو 429. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_sender_reputation",
"arguments": {}
}list_suppressionsعرض عناصر المنع
قائمة المنع في مساحة العمل: المستلِمون المحظورون بعد ارتداد دائم أو شكوى بريد مزعج. تخفق عمليات الإرسال إليهم بالرمز 422. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_suppressions",
"arguments": {}
}remove_suppressionإزالة عنصر منع ناتج عن ارتداد
DESTRUCTIVE (يُضعف حاجز أمان): أزل عنصر منع ناتجًا عن ارتداد ليصبح بالإمكان مراسلة العنوان مجددًا. لا تفعل ذلك إلا عندما يؤكد الإنسان أن العنوان صار صالحًا. لا يمكن إزالة عناصر المنع الناتجة عن الشكاوى (409).
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
email | string | نعم | عنوان المستلِم المدرج في قائمة المنع. (حتى 320 حرفًا) |
{
"name": "remove_suppression",
"arguments": {
"email": "fixed-mailbox@example.net"
}
}list_blocked_recipientsعرض المستلِمين المحظورين
كل مستلِم سترفضه SendHQ: الارتدادات والشكاوى وعمليات إلغاء الاشتراك التسويقية على مستوى النطاق، مع ملخص حسب النوع. تقرأ حتى أحدث 500. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_blocked_recipients",
"arguments": {}
}الحساب والاستخدام والتحليلات والمفاتيح
get_accountالحصول على الحساب والاستخدام والفوترة
البريد الإلكتروني لمالك الحساب، والباقة/مستوى الوصول، وعمليات تسليم المستلِمين المستخدمة في الفترة الحالية مقابل الحصة، والنطاقات المستخدمة مقابل الحد، ونقل المرفقات، وملخص السمعة، وحالة الاشتراك، والباقات المنشورة، وأعداد مساحة العمل. استخدمها لمعرفة الحصة المتبقية أو الجهة التي يمكن للفترة التجريبية التسليم إليها (البريد الإلكتروني للحساب).
لا توجد معلمات.
{
"name": "get_account",
"arguments": {}
}get_analyticsالحصول على تحليلات الإرسال
تحليلات لوحة التحكم لآخر 7 أو 30 أو 90 يومًا: إجماليات المرسل/المستلَم/المسلَّم/المرتد/المحظور/المفتوح/المنقور/الشكاوى، وجدول زمني يومي، وأكثر نطاقات الإرسال استخدامًا، وأكثر الموضوعات تكرارًا.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
days | integer | لا | النافذة بالأيام: 7 أو 30 (الافتراضي) أو 90. (إحدى القيم 7 أو 30 أو 90) |
{
"name": "get_analytics",
"arguments": {
"days": 30
}
}list_api_keysعرض البيانات الوصفية لمفاتيح API
اعرض أسماء مفاتيح API والبادئات غير السرية وأوقات آخر استخدام. للقراءة فقط: لا يستطيع خادم MCP هذا إنشاء المفاتيح أو تدويرها أو إلغاءها؛ يفعل ذلك إنسان في لوحة التحكم. مقسَّمة إلى صفحات: تتضمن النتيجة pagination {offset, limit, returned, total?, has_more, next_offset}.
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
limit | integer | لا | حجم الصفحة. الافتراضي 50. (الافتراضي 50؛ من 1 إلى 200) |
offset | integer | لا | عدد السجلات المراد تخطيها. استخدم pagination.next_offset من الصفحة السابقة. (الافتراضي 0؛ من 0 فصاعدًا) |
{
"name": "list_api_keys",
"arguments": {}
}get_service_healthفحص سلامة خدمة SendHQ
تحقق من أن SendHQ API تعمل ومن مزوّد البريد النشط. لا تحتاج إلى مفتاح API صالح.
لا توجد معلمات.
{
"name": "get_service_health",
"arguments": {}
}جرد تغطية API
كل عملية في API العامة والأداة التي تغطيها. كل ما يمكن للمستخدم فعله في لوحة التحكم ولديه API مغطًّى؛ أما الاستثناءات أدناه فمقصودة.
| نقطة النهاية | الأداة | ملاحظات |
|---|---|---|
| POST /emails | send_email | إرسال رسالة واحدة |
| POST /emails/batch | send_batch | إرسال ما يصل إلى 100 رسالة مخصّصة |
| GET /emails | list_emails | عرض الرسائل المرسلة والمستلَمة |
| GET /emails/:id | get_email | استرجاع رسالة ومرفقاتها |
| PATCH /emails/:id | mark_email | تحديث حالة القراءة أو الأرشفة أو التصنيف كبريد مزعج أو الفئة أو الأهمية |
| POST /emails/:id/labels | label_email | إضافة تصنيفات إلى رسالة أو إزالتها منها |
| DELETE /emails/:id | delete_email | حذف رسالة محفوظة |
| GET /emails/:id/events | list_email_events | عرض أحداث التسليم لرسالة |
| GET /threads/:id | get_thread | استرجاع محادثة بترتيب زمني |
| GET /labels | list_labels | عرض التصنيفات مع أعداد الرسائل وقواعد الفرز |
| POST /labels | create_label | إنشاء تصنيف، مع قواعد فرز تلقائي اختيارية |
| GET /labels/:id | get_label | استرجاع تصنيف بمعرّفه أو اسمه |
| PATCH /labels/:id | update_label | إعادة تسمية تصنيف أو تغيير لونه أو تحويله إلى مجموعة |
| DELETE /labels/:id | delete_label | حذف تصنيف دون حذف رسائله |
| POST /labels/:id/rules | create_label_rule | إضافة قاعدة فرز تلقائي إلى تصنيف |
| DELETE /labels/:id/rules/:rule_id | delete_label_rule | حذف قاعدة فرز تلقائي |
| POST /drafts | create_draft | إنشاء مسودة في المحرّر |
| GET /drafts | list_drafts | عرض مسودات المحرّر |
| GET /drafts/:id | get_draft | استرجاع مسودة ومرفقاتها |
| PUT /drafts/:id | update_draft | استبدال محتوى مسودة |
| DELETE /drafts/:id | delete_draft | تجاهل مسودة |
| POST /drafts/:id/attachments | upload_attachment | رفع مرفق إلى مسودة |
| GET /attachments/:id | download_attachment | تنزيل مرفق خاص |
| DELETE /attachments/:id | delete_attachment | حذف مرفق خاص |
| GET /sending-identities | list_sending_identities | عرض هويات الإرسال الموثَّقة |
| GET /templates | list_templates | عرض القوالب المستضافة |
| POST /templates | create_template | إنشاء قالب مستضاف |
| GET /templates/:id | get_template | استرجاع المسودات والإصدارات المنشورة والاستخدام |
| PUT /templates/:id/draft | update_template_draft | الحفظ التلقائي لمسودة قالب |
| POST /templates/:id/draft | create_template_draft | إنشاء مسودة جديدة من الإصدار المنشور |
| POST /templates/:id/render | render_template | توليد المخرجات الدقيقة كما يُنتجها الخادم |
| POST /templates/:id/test | send_template_test | إرسال لقطة اختبارية |
| POST /templates/:id/publish | publish_template | نشر إصدار قالب غير قابل للتعديل |
| POST /templates/:id/archive | archive_template | أرشفة قالب |
| POST /templates/:id/restore | restore_template | استعادة قالب مؤرشف |
| POST /domains | add_domain | إضافة نطاق إرسال |
| GET /domains | list_domains | عرض النطاقات وحالة DNS المخزَّنة مؤقتًا |
| GET /domains/:id | get_domain | استرجاع تفاصيل إعداد النطاق |
| POST /domains/:id/verify | verify_domain | تحديث حالة التحقق في SES وDNS |
| POST /domains/:id/inbound/setup | setup_inbound | تهيئة استقبال الوارد في SES |
| POST /domains/:id/inbound/verify | verify_inbound | التحقق من توجيه MX الوارد |
| DELETE /domains/:id | delete_domain | حذف نطاق |
| GET /dns/provider | get_dns_provider | اكتشاف مزوّد DNS المعتمد ومضيفات السجلات النسبية |
| GET /dns/domain-connect/connect | get_domain_connect_link | إنشاء رابط موافقة Domain Connect لإعداد DNS بنقرة واحدة |
| POST /inboxes | create_inbox | إنشاء عنوان وارد |
| GET /inboxes | list_inboxes | عرض عناوين الوارد |
| GET /inboxes/:id | get_inbox | استرجاع عنوان وارد |
| PATCH /inboxes/:id | update_inbox | إعادة تسمية صندوق بريد أو تفعيله أو تعطيله |
| PUT /inboxes/:id/forwarding | set_inbox_forwarding | إعادة توجيه البريد المستلَم في صندوق بريد إلى عنوان آخر |
| DELETE /inboxes/:id | delete_inbox | حذف صندوق بريد مع الاحتفاظ بالرسائل |
| GET /deliverability/stats | deliverability_stats | استرجاع إحصاءات التسليم لآخر 30 يومًا |
| GET /deliverability/reputation | list_sender_reputation | عرض حالة السمعة حسب هوية المُرسِل بدقة |
| GET /suppressions | list_suppressions | عرض عناصر قائمة المنع في مساحة العمل |
| DELETE /suppressions/:email | remove_suppression | إزالة عنصر منع ناتج عن ارتداد مؤهَّل للإزالة |
| GET /blocked-recipients | list_blocked_recipients | عرض الارتدادات والشكاوى وطلبات إلغاء الاشتراك |
| GET /account | get_account | استرجاع الحساب والاستخدام وحالة الفوترة وأعداد مساحة العمل بمفتاح API |
| GET /analytics | get_analytics | استرجاع تحليلات الإرسال في لوحة التحكم لمدة 7 أو 30 أو 90 يومًا |
| GET /profile | get_account | النظير الخاص بالجلسات فقط لـ GET /account؛ ويقرأ خادم MCP مسار مفتاح API. |
| POST /billing/checkout | غير مكشوفة | تغييرات الفوترة مخصصة للجلسات فقط بحكم التصميم وتتطلب مالك الحساب في لوحة التحكم. يمكن قراءة حالة الفوترة بـ get_account. |
| POST /billing/cancel | غير مكشوفة | تغييرات الفوترة مخصصة للجلسات فقط بحكم التصميم وتتطلب مالك الحساب في لوحة التحكم. يمكن قراءة حالة الفوترة بـ get_account. |
| POST /keys | غير مكشوفة | مستبعَدة عمدًا: يجب ألا يُنشئ الوكيل بيانات اعتماد أو يتلفها. يدير إنسان المفاتيح في لوحة التحكم. |
| GET /keys | list_api_keys | عرض البيانات الوصفية لمفاتيح API |
| DELETE /keys/:id | غير مكشوفة | مستبعَدة عمدًا: يجب ألا يُنشئ الوكيل بيانات اعتماد أو يتلفها. يدير إنسان المفاتيح في لوحة التحكم. |
غير متاحة عمدًا
| القدرة | نقاط النهاية | السبب |
|---|---|---|
| إنشاء مفاتيح API أو تدويرها أو إلغاؤها أو حذفها | POST /keys, DELETE /keys/:id | مستبعَدة عمدًا: يجب ألا يُنشئ الوكيل بيانات اعتماد أو يتلفها. يدير إنسان المفاتيح في لوحة التحكم. |
| بدء عملية دفع أو إلغاء اشتراك | POST /billing/checkout, POST /billing/cancel | تغييرات الفوترة مخصصة للجلسات فقط بحكم التصميم وتتطلب مالك الحساب في لوحة التحكم. يمكن قراءة حالة الفوترة بـ get_account. |
| إعداد DNS بنقرة واحدة عبر Cloudflare (OAuth) | GET /api/dns/cloudflare/connect | يتطلب جلسة متصفح تفاعلية وموافقة OAuth من Cloudflare. استخدم سجلات get_domain أو مضيفات get_dns_provider أو get_domain_connect_link بدلًا من ذلك. |
| التسجيل وتسجيل الدخول وتسجيل الخروج وربط حساب Google | /api/auth/* | مصادقة بشرية عبر المتصفح؛ ويصادق خادم MCP بمفتاح API. |
| نموذج الاتصال بالدعم | POST /api/contact | نموذج عام في موقع التسويق للبشر، وليس عملية في مساحة العمل. |
الفهرس المقروء آليًا: /docs/mcp/tools.json (المخططات والتوصيفات وربط نقاط النهاية والاستثناءات). نسخة Markdown من هذه الصفحة: /docs/mcp.md. وعند تثبيت CLI، تطبع sendhq commands --format json الفهرس نفسه.