ربط أودو بـ MCP خطوة بخطوة
من التثبيت لين أول طلب: المتطلبات، والرابط العام والبروكسي، والمستخدم اللي يتصل الوكيل باسمه، والربط مع جنتال وClaude وChatGPT، وقائمة أمان، والتحقق من الـ webhooks، وحل المشاكل الشائعة.
نُشر
باختصار
عشان تربط أودو بـ MCP: ثبّت موديول «MCP Server for AI Agents» من متجر أودو على أودو ١٧ إلى ٢٠ (على سيرفرك أو Odoo.sh)، وحط رابط https العام وشغّل فحص الوصول، وسوّ مستخدم «Gental Agent» بأقل صلاحيات وضيفه لمجموعة «Gental MCP: Connect»، واختار وش ينفتح، وبعدين الصق رابط أودو مع /mcp في جنتال أو Claude أو ChatGPT وادخل بالمستخدم ووافق.
قبل ما تبدأ
- أودو ١٧ أو ١٨ أو ١٩ أو ٢٠، Community أو Enterprise، على سيرفرك أو على Odoo.sh. أودو أونلاين ما يسمح بتثبيت موديولات خاصة.
- رابط https عام يوصل لأودو. جنتال والعملاء السحابية ما يتصلون بعناوين http أو بعناوين داخلية.
- صلاحيات مدير على أودو (Settings) عشان تثبت الموديول وتسوي المستخدمين.
ثبّت الموديول
نزّل الموديول
من متجر تطبيقات أودو لنسخة أودو حقك، أو انسخ الفرع اللي يطابق نسختك (مثل git clone -b 19.0) في مجلد الإضافات.
حدّث قائمة التطبيقات
فعّل وضع المطور، وبعدين من Apps اضغط Update Apps List.
ثبّت «MCP Server for AI Agents»
دوّر عليه في Apps وثبّته. تطلع لك قائمة «Gental MCP» فوق، والمدير يشوفها كاملة.
الرابط العام وفحص الوصول
من Gental MCP › Configuration › General: حط رابط أودو العام (الافتراضي هو web.base.url)، وانسخ رابط الـ MCP اللي ينتهي بـ /mcp، واضغط فحص الوصول.
| اللي تشوفه | وش معناه | وش تسوي |
|---|---|---|
| الرابط http مو https | العملاء ما يتصلون إلا بـ https | فعّل شهادة TLS على الدومين وحدّث الرابط |
| العنوان داخلي (مثل 10.x أو 192.168.x) | جنتال والعملاء السحابية ما يوصلون للشبكة الداخلية | اعرض أودو برابط عام عبر بروكسي عكسي |
| الفحص نجح بس كل طلب يرجع 401 | البروكسي يشيل ترويسة Authorization | مرّر الترويسة وطفّ التخزين المؤقت (الإعداد تحت) |
إعداد البروكسي العكسي
لو أودو ورا nginx، تأكد إنه يمرر ترويسة Authorization وما يخزن الردود. وفعّل proxy_mode في أودو عشان يعرف إن الرابط https.
# Inside the server block that serves Odoo over https
location / {
proxy_pass http://odoo; # your Odoo upstream
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Authorization $http_authorization;
proxy_buffering off;
}
# odoo.conf: trust the forwarded headers
# proxy_mode = Trueسوّ مستخدم «Gental Agent»
كل طلب يشتغل باسم مستخدم أودو، فهذا المستخدم هو حد اللي يقدر الوكيل يوصله.
مستخدم داخلي جديد
من Settings › Users سوّ مستخدم اسمه «Gental Agent» بإيميل خاص فيه.
أقل المجموعات اللازمة
عطه بس المجموعات اللي يحتاجها الوكيل، مثل مستخدم المبيعات بدون صلاحيات المدير. قواعد السجلات حقتك تنطبق عليه.
ضيفه لمجموعة «Gental MCP: Connect»
بدونها ما يقدر يتصل ولا يوافق على أي عميل. تقدر تغير المجموعات المسموحة من Configuration › Access.
اختار وش ينفتح للوكيل
المجالات الجاهزة
من Configuration › Curated tools فعّل جهات الاتصال أو المبيعات أو الفوترة أو CRM أو المخزون أو نقاط البيع، وطفّ أي أداة لحالها. المجال اللي تطبيقه مو مثبت يطلع مقفل مع السبب.
الموديلات والدوال
من Configuration › Models & methods أضف أي موديل، وحدد القراءة والإنشاء والتعديل والحذف، والدوال العامة المسموحة ونوع كل وحدة.
الحقول المخفية
أخفِ أي حقل ما تبي الوكيل يشوفه. كلمات المرور والتوكنات والحقول الثنائية مخفية دايمًا.
نطاق إضافي
أضف نطاق أودو فوق قواعد السجلات، مثل [('company_id', '=', 1)] عشان شركة وحدة بس.
اربط عميل MCP
جنتال
من التطبيقات (Connectors) اختار «خادم MCP مخصص»، والصق رابط أودو مع /mcp، وادخل بمستخدم Gental Agent ووافق. ولأدوات «طلباتي» و«فواتيري» حق العميل، الصق سر الهوية اللي يعرضه جنتال مرة وحدة في Configuration › General.
Claude
أضف موصل مخصص (custom connector) بنفس الرابط، وادخل بمستخدم أودو ووافق.
ChatGPT
أضف موصل (من وضع المطور) بنفس الرابط، وادخل بمستخدم أودو ووافق.
سكربتاتك
من Clients › New API key اختار المستخدم ومدة الصلاحية. المفتاح يطلع مرة وحدة، وترسله في ترويسة Authorization: Bearer.
أول طلب من سكربت
طلب initialize بمفتاح API، والرد JSON فيه اسم السيرفر ونسخة البروتوكول:
curl https://odoo.example.com/mcp \
-H "Authorization: Bearer $ODOO_MCP_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"my-script","version":"1.0"}}}'قائمة الأمان
- الوكيل يتصل بمستخدم مخصص بأقل صلاحيات، مو بحساب مدير.
- راجع صندوق الوارد (Logs › Inbox) كل أسبوع، خصوصًا الطلبات المرفوضة.
- ألغِ أي عميل أو مفتاح ما تستخدمه من Clients، والإلغاء يوقفه على طول.
- غيّر مفاتيح API وسر الهوية بشكل دوري، وحط مدة انتهاء للمفاتيح.
- خلّ أودو والموديول محدثين.
اشترك في الـ webhooks
اشتراك جديد
من Configuration › Webhooks: اسم، ورابط https، والأحداث (فاتورة انترحلت أو انسددت، طلب انشأ أو تأكد أو انلغى، توصيل تم، عميل محتمل جديد أو تغيرت مرحلته، جهة اتصال جديدة، أو أي سجل في موديل مفتوح)، والمستخدم اللي تنقرى البيانات باسمه.
انسخ السر
كل اشتراك له سر خاص يبدأ بـ gmwh_. احفظه عندك، وتقدر تغيره من Rotate.
جرّب
اضغط Send test، وتابع كل إرسال في Logs › Outbox › Webhooks. الإرسال الفاشل ينعاد لين ثماني محاولات خلال يوم تقريبًا.
تحقق من توقيع الـ webhook
كل إرسال فيه X-Gental-Event وX-Gental-Delivery وX-Gental-Timestamp وX-Gental-Signature. التوقيع HMAC-SHA256 بالسر على timestamp + "." + الجسم الخام، بصيغة hex. قارن بوقت ثابت، وارفض أي توقيت أقدم من خمس دقايق.
import { createHmac, timingSafeEqual } from 'node:crypto';
// rawBody: the request body exactly as received (a Buffer), before any JSON parsing.
// headers: Node's lower-cased request headers.
export function verifyGentalWebhook(headers, rawBody, secret, now = Date.now() / 1000) {
const timestamp = headers['x-gental-timestamp'];
const signature = headers['x-gental-signature'];
if (!timestamp || !signature) return false;
// Reject anything older (or newer) than 5 minutes.
const ts = Number(timestamp);
if (!Number.isFinite(ts) || Math.abs(now - ts) > 300) return false;
const expected = createHmac('sha256', secret)
.update(`${timestamp}.`)
.update(rawBody)
.digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(String(signature));
return a.length === b.length && timingSafeEqual(a, b);
}import hashlib
import hmac
import time
def verify_gental_webhook(headers, raw_body: bytes, secret: str, now: float | None = None) -> bool:
"""headers: a case-insensitive mapping (Flask, Django, FastAPI request headers)."""
timestamp = headers.get("X-Gental-Timestamp")
signature = headers.get("X-Gental-Signature")
if not timestamp or not signature:
return False
# Reject anything older (or newer) than 5 minutes.
try:
ts = int(timestamp)
except ValueError:
return False
if abs((time.time() if now is None else now) - ts) > 300:
return False
expected = hmac.new(
secret.encode(), timestamp.encode() + b"." + raw_body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected.encode(), signature.encode())الإرسال ممكن يوصل أكثر من مرة، فتجاهل أي X-Gental-Delivery استلمته قبل.
حل المشاكل الشائعة
| المشكلة | السبب الغالب | الحل |
|---|---|---|
| 401 | التوكن أو المفتاح انلغى، أو المستخدم انشال من مجموعة الاتصال أو تعطّل | رجّع المستخدم للمجموعة، واربط العميل من جديد |
| 403 | السيرفر مطفي في الإعدادات، أو مستخدم المفتاح مو في مجموعة الاتصال، أو الطلب من متصفح أصله مو مسموح | شغّل السيرفر، أو ضيف المستخدم للمجموعة، أو اسمح بالأصل في Configuration › Access |
| 429 | تعدّى حد الطلبات (الافتراضي ١٢٠ بالدقيقة لكل عميل) | انتظر دقيقة، أو ارفع الحد في Configuration › Access |
| أداة رجّعت «مرفوض» | المجال أو الموديل أو الحقل مو مفتوح، أو صلاحيات المستخدم ما تسمح | افتح الطلب في Logs › Inbox وشوف أي حاجز رفضه |
المصادر
- صفحة الموديول في متجر تطبيقات أودوبتاريخ نوفمبر ٢٠٢٦
- مواصفة MCP: التفويض (Authorization)بتاريخ نوفمبر ٢٠٢٦
أسئلة تتكرر علينا
هل أحتاج جنتال عشان أستخدم الموديول؟
لا. أي عميل MCP يتصل فيه. جنتال يضيف هوية العميل الموثّقة، والتأكيد قبل أي تغيير، والرد على واتساب وموقعك. شوف جنتال لأودو.
أقدر أشغل OAuth ومفاتيح API مع بعض؟
إيه. الاثنين شغالين افتراضيًا، وتقدر تطفي أي واحد من Configuration › General. جنتال يستخدم OAuth لما يكون شغال.
وش يصير لو غيرت المستخدم أو شلته من المجموعة؟
كل التوكنات حقته تنلغي على طول، والعميل يرجع له 401 لين يدخل من جديد بمستخدم مسموح.
اقرأ كمان
- جنتال لأودوموديول مجاني يخلي أودو خادم MCP آمن لوكيل جنتال وأي عميل MCP ثاني.
- للمطورين (API)اربط وكيلك بتطبيقك ونظامك عبر REST وبث مباشر وWebhooks موقعة.
- التكاملاتمصادر المعرفة والتطبيقات والقنوات اللي يرتبط بها وكيلك اليوم، واللي جاية.
- ما هو وكيل الذكاء الاصطناعي؟شرح بسيط لوكيل الذكاء الاصطناعي، وفرقه عن الشات بوت وChatGPT، وكيف تقلل أخطاءه.
ابدأ اليوم، وخلّ وكيلك يرد عنك من الليلة.
أضف معلوماتك، واخترله شخصية، وانشره على موقعك. البداية مجانية.
- بدون بطاقة
- بدون برمجة
- بياناتك في السعودية