ربط أودو بـ 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) عشان تثبت الموديول وتسوي المستخدمين.

ثبّت الموديول

  1. نزّل الموديول

    من متجر تطبيقات أودو لنسخة أودو حقك، أو انسخ الفرع اللي يطابق نسختك (مثل ⁦git clone -b 19.0⁩) في مجلد الإضافات.

  2. حدّث قائمة التطبيقات

    فعّل وضع المطور، وبعدين من Apps اضغط Update Apps List.

  3. ثبّت «⁦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.

nginx
# 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⁩»

كل طلب يشتغل باسم مستخدم أودو، فهذا المستخدم هو حد اللي يقدر الوكيل يوصله.

  1. مستخدم داخلي جديد

    من ⁦Settings › Users⁩ سوّ مستخدم اسمه «⁦Gental Agent⁩» بإيميل خاص فيه.

  2. أقل المجموعات اللازمة

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

  3. ضيفه لمجموعة «⁦Gental MCP: Connect⁩»

    بدونها ما يقدر يتصل ولا يوافق على أي عميل. تقدر تغير المجموعات المسموحة من ⁦Configuration › Access⁩.

اختار وش ينفتح للوكيل

  • المجالات الجاهزة

    من ⁦Configuration › Curated tools⁩ فعّل جهات الاتصال أو المبيعات أو الفوترة أو CRM أو المخزون أو نقاط البيع، وطفّ أي أداة لحالها. المجال اللي تطبيقه مو مثبت يطلع مقفل مع السبب.

  • الموديلات والدوال

    من ⁦Configuration › Models & methods⁩ أضف أي موديل، وحدد القراءة والإنشاء والتعديل والحذف، والدوال العامة المسموحة ونوع كل وحدة.

  • الحقول المخفية

    أخفِ أي حقل ما تبي الوكيل يشوفه. كلمات المرور والتوكنات والحقول الثنائية مخفية دايمًا.

  • نطاق إضافي

    أضف نطاق أودو فوق قواعد السجلات، مثل ⁦[('company_id', '=', 1)]⁩ عشان شركة وحدة بس.

اربط عميل MCP

  1. جنتال

    من التطبيقات (Connectors) اختار «خادم MCP مخصص»، والصق رابط أودو مع ⁦/mcp⁩، وادخل بمستخدم Gental Agent ووافق. ولأدوات «طلباتي» و«فواتيري» حق العميل، الصق سر الهوية اللي يعرضه جنتال مرة وحدة في ⁦Configuration › General⁩.

  2. Claude

    أضف موصل مخصص (custom connector) بنفس الرابط، وادخل بمستخدم أودو ووافق.

  3. ChatGPT

    أضف موصل (من وضع المطور) بنفس الرابط، وادخل بمستخدم أودو ووافق.

  4. سكربتاتك

    من ⁦Clients › New API key⁩ اختار المستخدم ومدة الصلاحية. المفتاح يطلع مرة وحدة، وترسله في ترويسة ⁦Authorization: Bearer⁩.

أول طلب من سكربت

طلب initialize بمفتاح API، والرد JSON فيه اسم السيرفر ونسخة البروتوكول:

curl
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

  1. اشتراك جديد

    من ⁦Configuration › Webhooks⁩: اسم، ورابط https، والأحداث (فاتورة انترحلت أو انسددت، طلب انشأ أو تأكد أو انلغى، توصيل تم، عميل محتمل جديد أو تغيرت مرحلته، جهة اتصال جديدة، أو أي سجل في موديل مفتوح)، والمستخدم اللي تنقرى البيانات باسمه.

  2. انسخ السر

    كل اشتراك له سر خاص يبدأ بـ ⁦gmwh_⁩. احفظه عندك، وتقدر تغيره من Rotate.

  3. جرّب

    اضغط Send test، وتابع كل إرسال في ⁦Logs › Outbox › Webhooks⁩. الإرسال الفاشل ينعاد لين ثماني محاولات خلال يوم تقريبًا.

تحقق من توقيع الـ webhook

كل إرسال فيه X-Gental-Event وX-Gental-Delivery وX-Gental-Timestamp وX-Gental-Signature. التوقيع HMAC-SHA256 بالسر على ⁦timestamp + "." + الجسم الخام⁩، بصيغة hex. قارن بوقت ثابت، وارفض أي توقيت أقدم من خمس دقايق.

Node.js
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);
}
Python
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 يتصل فيه. جنتال يضيف هوية العميل الموثّقة، والتأكيد قبل أي تغيير، والرد على واتساب وموقعك. شوف جنتال لأودو.

أقدر أشغل OAuth ومفاتيح API مع بعض؟

إيه. الاثنين شغالين افتراضيًا، وتقدر تطفي أي واحد من ⁦Configuration › General⁩. جنتال يستخدم OAuth لما يكون شغال.

وش يصير لو غيرت المستخدم أو شلته من المجموعة؟

كل التوكنات حقته تنلغي على طول، والعميل يرجع له 401 لين يدخل من جديد بمستخدم مسموح.

ابدأ اليوم، وخلّ وكيلك يرد عنك من الليلة.

أضف معلوماتك، واخترله شخصية، وانشره على موقعك. البداية مجانية.

  • بدون بطاقة
  • بدون برمجة
  • بياناتك في السعودية