خادم MCP

خادم MCP

استخدم FourA من أي عميل Model Context Protocol مثل (Claude Desktop وClaude Code وCursor وWindsurf وVS Code) في صورة أربع أدوات أصلية وستة موجهات لسير العمل (workflow prompts). دون الحاجة إلى كتابة كود تكامل، ودون عميل HTTP مخصص.

مفتوح المصدر على GitHub، ومتوفر على npm باسم @fouradata/mcp. الإصدار الحالي: 0.7.3.

البدء السريع: عبر stdio المحلي (موصى به لـ Claude Desktop)

احصل على مفتاح من foura.ai/dashboard#api-keys (بنقرة واحدة، يُعرض مرة واحدة فقط عند الإنشاء، بتنسيق pk_live_...). أضف هذا إلى ملف تهيئة عميل MCP الخاص بك:

{
  "mcpServers": {
    "foura": {
      "command": "npx",
      "args": ["-y", "@fouradata/mcp"],
      "env": { "FOURA_API_KEY": "pk_live_..." }
    }
  }
}

تنبيه هام حول Claude Desktop: أغلق Claude Desktop بالكامل (Cmd+Q على macOS) قبل تعديل ملف التكوين. إذا كان التطبيق لا يزال قيد التشغيل، فسيقوم بالكتابة فوق تعديلاتك باستبدالها بالتكوين المحفوظ في الذاكرة عند الخروج.

يقوم الأمر npx بتنزيل @fouradata/mcp عند أول تشغيل ويشغله كعملية فرعية لعميل MCP الخاص بك. لا حاجة لتثبيت عام.

العميل مسار ملف التكوين
Claude Desktop (macOS) ~/Library/Application Support/Claude/claude_desktop_config.json
Claude Desktop (Windows) %APPDATA%\Claude\claude_desktop_config.json
Claude Code claude mcp add foura -- npx -y @fouradata/mcp (اضبط FOURA_API_KEY في متغيرات البيئة أولا)
Cursor ~/.cursor/mcp.json
Windsurf ~/.codeium/windsurf/mcp_config.json
VS Code (ملحق MCP) .vscode/mcp.json

أعد تشغيل العميل. ستظهر الأدوات (foura_auto، foura_single، foura_proxy، foura_browser) وستة موجهات في قائمة الأدوات الخاصة بك.

البدء السريع: المستضاف (Streamable HTTP)

بالنسبة للعملاء الذين يدعمون نقل Streamable HTTP (مثل Cursor وWindsurf وVS Code وClaude Code مع --transport http)، قم بتوجيههم إلى endpoint المستضاف بدلا من تشغيل عملية فرعية محلية:

{
  "mcpServers": {
    "foura": {
      "url": "https://mcp.foura.ai/mcp",
      "headers": {
        "Authorization": "Bearer pk_live_..."
      }
    }
  }
}

بالنسبة لتطبيق Claude Desktop، استخدم تكوين stdio الموضح أعلاه أو قم بربط الـ endpoint المستضاف عبر mcp-remote:

{
  "mcpServers": {
    "foura": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.foura.ai/mcp", "--header", "Authorization: Bearer pk_live_..."]
    }
  }
}

مرجع Hosted endpoint

الخاصية القيمة
URL https://mcp.foura.ai/mcp
النقل Streamable HTTP (POST /mcp، استجابات SSE)
المصادقة Authorization: Bearer pk_live_... لكل request
MCP-Protocol-Version وفقا لـ @modelcontextprotocol/sdk (حاليا 2025-11-25، 2025-06-18، 2025-03-26، 2024-11-05، 2024-10-07)
طلب تحدي 401 WWW-Authenticate: Bearer realm="foura-mcp"

لا يحتوي طلب تحدي 401 على معلمة RFC 9728 resource_metadata عن قصد. إن الإعلان عنها يدفع العميل المتوافق مع OAuth إلى بدء تدفق لا يطبقه هذا الخادم. أرسل مفتاح pk_live_ الخاص بك كرمز Bearer token وسيختفي الخطأ 401.

الخادم المستضاف عديم الحالة (stateless). يرسل كل request مفتاحه الخاص، والذي يمرره الخادم إلى FourA API باسم X-API-Key. مفتاح واحد يتيح الوصول إلى جميع الأدوات الأربع.

للحماية من هجمات DNS-rebinding (CVE-2025-66414)، يتحقق الخادم من ترويسة Host (يجب أن تكون mcp.foura.ai أو localhost) وترويسة Origin عند وجودها (القائمة المسموحة: mcp.foura.ai، claude.ai، app.cursor.sh، app.cursor.com). المتصلون من خادم إلى خادم (curl، وعملاء MCP في وضع جسر stdio) لا يرسلون Origin ويتم تمريرهم مباشرة.

الأدوات

جميع الأدوات الأربع مزودة بالوسمين readOnlyHint: true وopenWorldHint: true وفقا لمواصفة MCP 2025-06-18. العملاء الذين يوافقون تلقائيا على الأدوات الموثوقة للقراءة فقط يقومون باستدعائها دون نافذة تأكيد لكل request.

الأداة foura_auto هي الخيار الافتراضي الذكي: مرر لها URL وستعيد المحتوى، مع تحديد طريقة الجلب المناسبة لك. الأدوات الثلاث الأخرى هي العناصر الأساسية ذات المستوى الأدنى التي تنسقها هذه الأداة؛ استخدمها عندما تحتاج إلى تحكم دقيق ومباشر.

foura_auto

مرر لها URL عندما تريد من FourA اختيار طريقة الـ request. تقوم الأداة بمحاولات محددة عبر مسارات HTTP وproxy والمتصفح المتاحة. مرر validate مع الأهداف المحمية لضمان احتواء الـ response على محتوى يحدد الصفحة الحقيقية. إذا لم تحقق أي محاولة معايير التحقق، فستعيد الأداة خطأ بدلا من عرض صفحة تحدي على أنها نجاح.

تتضمن الـ response تفاصيل الاكتمال في meta، وبشكل افتراضي، session قابلة لإعادة الاستخدام مع proxy وcookies وuserAgent. لمتابعة عادية، استدعِ foura_single مع استخدام session.proxy كـ proxy، وسلسل ملفات الـ cookie كترويسة Cookie، وأرسل session.userAgent كترويسة User-Agent. لتصيير JavaScript، مرر قيم الجلسة إلى حقول foura_browser المطابقة.

foura_single

طلب HTTP واحد، واستجابة مقابلة. تطابق POST /api/single/ تطابقا مباشرا.

تُستخدم للصفحات الثابتة، وواجهات برمجة التطبيقات JSON APIs، وHTML المصير على الخادم.

اختيار المتصفح الذي تمثله

يقدم الـ request أحدث إصدار من Google Chrome افتراضيا. عندما يقبل الهدف متصفحا ويرفض آخر، اضبط browser (Chrome أو Edge أو Safari أو Firefox أو Tor)، أو os (Windows أو macOS أو Android أو iOS)، أو version، أو مرر معرّف profile دقيق:

{
  "method": "GET",
  "url": "https://example.com",
  "browser": "Firefox",
  "os": "Windows"
}

الإصدار الأحدث هو الذي يُعتمد عند تطابق عدة ملفات تعريف. أي تركيبة غير موجودة تُرجع خطأ يوضح الخيارات المتاحة، بحيث لا يتم إرسال أي request إطلاقاً كمتصفح لم تختره. يتطلب التحديد تفعيل unblocker، وهو مفعّل افتراضياً. يتم نشر الدليل على GET /api/profiles ولا يتطلب API key.

توجد الحقول الأربعة نفسها داخل كائن request التابع لـ foura_proxy.

foura_proxy

توجيه HTTP request واحد عبر proxies متناوبة مع إعادة المحاولة تلقائياً. استخدمه عندما يكون foura_single محظوراً أو عندما يتطلب الهدف دولة خروج محددة.

اضبط exitCountries على قائمة سماح صارمة لرموز البلدان المكونة من حرفين والمرئية للهدف، والمقدمة من المستخدم أو حسب متطلبات الهدف:

{
  "maxTries": 5,
  "exitCountries": ["CZ", "GB"],
  "request": {
    "method": "GET",
    "url": "https://example.com/pricing",
    "browser": "Chrome",
    "os": "Windows"
  }
}

تُقتطع المسافات الزائدة من القيم وتُحوّل إلى أحرف كبيرة وتُزال التكرارات. تُستبعد خوادم proxy ذات نقاط الخروج غير المعروفة، ولا يعود الـ request أبداً إلى بلد غير مطلوب. يعتمد الاختيار على أحدث بيانات وصفية متاحة للبلد كما تظهر للهدف، ويتم تحديثها عادةً في غضون عشر دقائق؛ وهو ليس بحثاً مباشراً عن الموقع الجغرافي أثناء الـ request. لا تستنتج بلد الخدمة من عنوان مضيف الـ proxy.

تُرجع الاستجابة الناجحة المحددة النطاق exitCountry ومُعرّف proxy القابل لإعادة الاستخدام. تحقق من أن exitCountry ينتمي إلى قائمة المسموح بها المطلوبة. إذا لم يتضمن التجمع الحالي أي تطابق، تُرجع الأداة code: "no_eligible_proxy" مع النطاق المُوحّد في details.exitCountries. احتفظ بذلك النطاق وأعد المحاولة لاحقاً. لا تغيّره أو توسعه إلا عندما يغيّر المستخدم المتطلبات صراحةً. يتم تضمين تحديد نطاق البلد بدءاً من خطة Startup وما فوقها. في الخطة التي لا تتضمن ذلك، يتم رفض الاستدعاء الذي يرسل exitCountries مع 403 وX-FourA-Limit: plan_limit_feature.

إذا كانت الصفحة المحددة تتطلب JavaScript لاحقاً، فمرر مُعرّف proxy المُرجع إلى foura_browser.proxy حتى يعيد المتصفح استخدام نقطة الخروج نفسها.

عيّن exitClass: "premium" لهدف لا يمكن للتجمع القياسي الوصول إليه بغض النظر عن عدد نقاط الخروج التي تمت تجربتها. إنه إذن وليس أمراً: لا يزال التجمع القياسي يسابق للحصول على الإجابة وعادة ما يفوز، والـ request الذي يجيب عليه قبل تجربة أي نقطة خروج premium لا يستهلك أي ترافيك premium. تحتسب محاولة premium الترافيك الذي نقلته حتى عند فشلها. تُبلغ الاستجابة بـ exitClass كـ premium أو standard، لتتمكن من معرفة الفئة التي خدمتك لكل request. وتكون standard أيضاً هي الإجابة بمجرد استنفاد ترافيك premium المضمن في خطتك، وتعتبر نتيجة طبيعية وليست خطأ. تمنع exitClass: "standard" الترقية تماماً. يتم رفض exitClass: "premium" في خطة بدون نقاط خروج premium مع code: "plan_limit_premium". راجع exitClass.

عندما تضطر عملية التدوير إلى الانتقال لعائلة متصفحات أخرى للحصول على إجابة، تحمل الاستجابة الناجحة profile مع العائلة التي استقرت عليها. أعد الإرسال بها، وإلا فإن الاستدعاء التالي يكرر الإصدار الذي فشل.

تحمل عملية التدوير الفاشلة attemptReport بجانب الخطأ: جملة summary واحدة، بالإضافة إلى إحصاءات تفصل بين نقاط الخروج التي لم تستجب أبداً (noResponse)، ونقاط الخروج التي رفضها فحص bot‏ (defense، مع المزودين في vendors)، والصفحات التي وصلت ورُفضت فقط بواسطة validate.data الخاص بك (contentRejected)، وstatusRejected، وother. تسرد profilesTried المتصفحات التي أرسلتها المهمة، بترتيب أول استخدام، حيث تعني default أن الـ request خرج تماماً كما كُتب. تعني القيمة المرتفعة لـ contentRejected أن FourA سلّمت صفحات حقيقية بينما قامت قاعدتك باستبعادها. راجع Why a Proxy Request Ran Out of Tries.

foura_browser

جلسة متصفح كاملة. يتم تشغيل JavaScript، وعرض الـ DOM، واسترجاع ملفات الـ cookie. تطابق POST /api/browser/.

تُستخدم لتطبيقات الصفحة الواحدة، أو المحتوى الذي يتم تحميله تدريجياً، أو الصفحات التي تحتوي على فحص يتطلب متصفحاً حقيقياً لاكتماله.

لمعرفة أشكال المدخلات، والقيم الافتراضية، وقواعد التحقق لكل أداة، ارجع إلى مرجع نقاط نهاية REST. تطابق مخططات الأدوات حقول REST API حقلا بحقل، بالإضافة إلى خيار offload_large الحصري لـ MCP (انظر أدناه).

عندما يُجري الهدف فحصا للبوتات

تُرجع foura_single و foura_proxy القيمة defense عندما يُجري الهدف فحصا للبوتات أثناء الوصول إلى محتوى الاستجابة (body). تعني defense.solved: true أنه تم اجتياز الفحص وأن data هي الصفحة الحقيقية؛ بينما تعني false أن المحتوى قد يكون صفحة تحدٍ (challenge page). أعد المحاولة باستخدام متصفح أو نظام تشغيل أو إصدار مختلف، أو انتقل إلى foura_proxy أو foura_browser، بدلا من التعامل مع صفحة التحدي كأنها المحتوى المطلوب.

استجابات محددة النوع (Typed responses)

تتضمن كل استجابة أداة كلا من content (ملخص نصي مقروء للبشر) و structuredContent (كائن JSON محدد النوع ومتحقق منه وفقا لـ outputSchema الخاص بالأداة). تمتلك كل أداة هيكلا فريدا خاصا بها:

  • foura_auto: بنية فردية { status, headers, data } بالإضافة إلى meta ({ rung, solved, attempts, credits }، موجودة دائما، حيث تكون rung واحدة من cache، probe، proxy، browser، warmup، fail) وافتراضيا session ({ proxy, cookies, userAgent }) لإعادة التشغيل عبر الأدوات الأقل مستوى. لا تتضمن total_time.
  • foura_single: { status, headers, data, total_time, ... } (تكون الرؤوس مصفوفة، بمعدل عنصر واحد لكل قفزة إعادة توجيه)
  • foura_proxy: مطابقة للبنية الفردية بالإضافة إلى { proxy, total }؛ وتتضمن الاستجابة الناجحة المقيدة بالنطاق أيضا exitCountry، ويتضمن الطلب الذي حدد فئة exitClass، ويتضمن التدوير الذي غير عائلة المتصفح profile، وتتضمن حالة الفشل attemptReport
  • foura_browser: هيكل متميز { status, headers: object, body, cookies, userAgent } (ملاحظة: قد يكون body سلسلة نصية أو كائنا بناء على نوع المحتوى)

تُبلغ كل أداة أيضا عن تكلفة الاستدعاء وكيفية تتبعه، استنادا إلى رؤوس استجابة API:

  • credits: الرصيد المستهلك في هذا الاستدعاء. يظهر في حالات الفشل أيضا، لأن العمل قد تم تنفيذه بالفعل. تتم محاسبتك فقط على الاستدعاء الناجح، لذلك يوضح الفشل رصيده هنا دون أن يكلفك شيئا.
  • request_id: معرف FourA الخاص بالاستدعاء. يرجى تضمينه في طلبات الدعم.
  • exitClass: القيمة premium عندما تخدم نقطة خروج مدفوعة الاستدعاء. في foura_single و foura_browser يحدث هذا عندما يعيد proxy استخدام نقطة خروج عثرت عليها foura_proxy.

تكون كل قيمة غير موجودة إذا لم يُرجع API شيئا، بحيث يستمر العميل المكتوب لإصدار أقدم في العمل دون تغيير. تم توثيق نفس القيم في رؤوس الاستجابة.

يمكن للعملاء الذين يدعمون structuredContent تمرير الكائن محدد النوع مباشرة إلى LLM بدلا من مطالبته بتحليل JSON من النص.

رؤوس استجابة متعددة القيم

الرؤوس التي تظهر عدة مرات (Set-Cookie، Link، WWW-Authenticate) تُرجع كمصفوفات:

{
  "headers": [
    {
      "result": { "version": "HTTP/2", "code": 200, "reason": "" },
      "content-type": "text/html",
      "set-cookie": ["a=1; Path=/", "b=2; Path=/"]
    }
  ]
}

هذا مهم للمواقع التي تعين ملفات تعريف الارتباط الخاصة بالجلسات والتتبع والموافقة في استجابة واحدة (معظم مواقع التجارة الإلكترونية).

الاستجابات الكبيرة: offload_large (الافتراضي: inline)

افتراضيًا (منذ الإصدار v0.2.0)، يتم إرجاع نصوص الاستجابة الكاملة كـ inline داخل structuredContent بغض النظر عن الحجم. يعمل هذا في كل عميل MCP مباشرة دون إعداد إضافي.

إذا كان عميلك يدعم MCP resources/read وكنت ترغب في توفير الرموز (token) في الصفحات الكبيرة، فمرر offload_large: true مع كل استدعاء أداة. بعد ذلك، تتم كتابة الاستجابات التي يبلغ حجمها 50 كيلوبايت أو أكثر على القرص، وإرجاعها كـ resource_link، ويجلب عميلك النص فقط عندما يحتاج إليه فعليًا. على الخادم المستضاف، تنتهي صلاحية الحمولات المخزنة مؤقتًا بعد ساعة واحدة. أما على نسختك الخاصة، فلا يوجد ما يحذف الحمولات المخزنة: احذف الملفات الأقدم من ساعة من دليل الحمولات بنفسك.

{
  "method": "GET",
  "url": "https://en.wikipedia.org/wiki/Web_scraping",
  "offload_large": true
}
العميل offload_large: true
Claude Desktop ليس بعد، اترك القيمة الافتراضية false
Claude Code، وCursor، وWindsurf مدعوم
ملحق MCP لـ VS Code مدعوم

معزول حسب المستأجر: يحصل كل مفتاح API على مساحة الاسم الخاصة به (sha256(apiKey)[:16]). المفتاح الذي قام بتخزين الحمولة هو الوحيد الذي يمكنه قراءتها مرة أخرى. تُرجع عمليات القراءة عبر المستأجرين Payload not found دون تسريب لوجود البيانات.

Built-in Prompts

تظهر ستة قوالب لسير العمل ضمن /prompts في أي عميل MCP. يأخذ كل منها وسيطات مُسماة ويُرجع رسالة مستخدم ذات قالب تُنسق أداة واحدة أو أكثر.

Prompt الوسيطات الوظيفة
smart_fetch url، اختياري must_contain، extract جلب تلقائي (يختار الطريقة، ويعالج حماية البوت)، ثم إرجاع المحتوى أو استخراجه
scrape_product_page url جلب عبر المتصفح، ثم استخراج عنوان المنتج، والسعر، والصورة، والمخزون، وSKU بتنسيق JSON
extract_article url طلب فردي مع الرجوع التلقائي إلى proxy، ثم تجريد عناصر التنقل/الإعلانات وإرجاع JSON نظيف للمقال
monitor_pricing url، اختياري target_price جلب عبر proxy، واستخراج السعر الحالي، ومقارنته بالسعر المستهدف
check_endpoint_health url، اختياري expected_text طلب فردي مع تحقق صارم، وإرجاع إمكانية الوصول والتوقيت
bulk_fetch_urls urls (مفصولة بفواصل) طلبات فردية متوازية، مع رجوع تلقائي إلى proxy لكل URL، وإرجاع البيانات الوصفية فقط

تستهلك الـ Prompts صفر tokens في وضع الخمول. تدخل الـ Prompts التي تم استدعاؤها فقط في سياق LLM.

النص الكامل بالإضافة إلى قوالب الـ Prompts اليدوية البديلة: MCP Recipes.

Error envelope

يحمل كل خطأ (isError: true) غلاف structuredContent. الحد الأدنى من الحقول في كل خطأ:

{
  "service": "auto | single | proxy | browser",
  "code": "rate_limited",
  "error": "Rate limit exceeded"
}

عند حدوث أخطاء upstream مع كود حالة HTTP، يكون status موجودا أيضا. وفي أخطاء rate-limit وسعة الاستيعاب، يضيف غلاف upstream كلا من retryAfter وcurrent.{concurrency, rpm} وlimits.{maxConcurrency, maxRpm}. راجع أخطاء API للاطلاع على بنية REST الأساسية.

قيم code الثابتة:

الكود HTTP المعنى هل إعادة المحاولة آمنة؟
ssrf_blocked غير متاح الهدف هو عنوان خاص أو محجوز (RFC 5735، 6598، عناوين IPv6 المحجوزة)، أو أن URL ليس http(s)، أو تعذر حل اسم المضيف الخاص به لا، تحقق من URL. يمكن إعادة محاولة البحث الذي فشل مؤقتا
upstream_non_json يختلف أرجع upstream جسم استجابة مشوها ربما، تحقق من المشكلة
output_validation_failed غير متاح رفض outputSchema الخاص بخادم MCP استجابة upstream، أو تعذر على الأداة إكمال الطلب بالكامل (لم يتم تكوين API key، أو تعذر الوصول إلى API) ربما: تحقق من الإعداد، ثم أبلغ عن المشكلة
bad_request 400 بنية الإدخال مرفوضة لا، صحح المدخلات
auth_failed 401 المفتاح مفقود أو غير صالح أو معطل لا، صحح المفتاح
forbidden 403 استجاب الهدف بالكود 403 ورفضه validate الخاص بك (فحص الموقع، قيود جغرافية) لا، أو قم بالتبديل إلى foura_proxy
not_found 404 الهدف أو endpoint مفقود لا
rate_limited 429 تم الوصول إلى الحد الأقصى لـ RPM نعم، انتظر retryAfter
at_capacity 503 تم الوصول إلى حد التزامن الأقصى نعم، انتظر retryAfter
service_disabled 503 الخدمة متوقفة للصيانة. الأداة غير المضمنة في خطتك تعود بالكود plan_limit_feature تواصل مع الدعم
service_unavailable 503 خطأ 503 عام نعم، تراجع تدريجي قصير
upstream_error 500+ أو 0 استجاب الهدف بخطأ في الخادم، أو في حالة foura_proxy، لم يستجب foura_browser وfoura_auto مطلقا نعم، تراجع أسي
upstream_client_error 4xx أخطاء 4xx أخرى عادة لا
upstream_unknown غير ذلك تم تشغيل request لكن لم ينتج عنه رد مقبول: في foura_single لم يستجب الهدف مطلقا (انتهاء المهلة، رفض الاتصال)، وفي أي أداة رفض validate الخاص بك استجابة 2xx أو 3xx. اقرأ status وerror تحقق من المشكلة
no_eligible_proxy غير متاح لا يوجد proxy يطابق نطاق exitCountries الصارم أعد المحاولة لاحقا؛ لا تغير النطاق إلا بشكل صريح
plan_limit_* 403 أو 429 أحد حدود خطتك رفض الطلب: plan_limit_ متبوعا بـ feature، أو premium، أو concurrency، أو rate، أو browser_daily، أو credits، أو bandwidth. راجع أخطاء خادم MCP انتظر retryAfter عند توفره؛ وإلا فلن تنجح المحاولة حتى تتم إعادة تعيين الحد أو تغيير الخطة

يمكن لوكلاء LLM قراءة code مباشرة لمنطق إعادة المحاولة دون الحاجة إلى تحليل النصوص البرمجية. دليل المصادقة: المصادقة.

الحدود

  • Inline body افتراضيا. مع offload_large: true، يتم تخزين الاستجابات التي بحجم >= 50 KB على القرص + resource_link (لكل مستأجر، TTL لمدة ساعة واحدة).
  • يتم رفض الأهداف الخاصة (RFC 5735 وRFC 6598 ونطاقات IPv6 المحجوزة) على طبقة MCP. يتم توجيه المضيفين العموميين فقط.
  • حد أقصى لحجم جسم الطلب يبلغ 256 KB لطلبات /mcp الواردة (حمولات MCP الفعلية أقل من 4 KB).
  • يتم فرض معدلات الاستخدام rate limits بواسطة FourA API لكل خدمة. راجع Rate Limits.

Self-Hosting

شفرة الخادم المصدرية الكاملة متاحة للعامة على GitHub تحت @fouradata/mcp. انسخ المستودع، ونفّذ npm install، ثم npm run build، وشغّل node dist/http.js لتشغيل نسختك الخاصة. يعمل بدون حالة stateless داخل حاوية واحدة خلف أي موزع أحمال load balancer.

بيئة قابلة للتكوين:

Variable Default Purpose
PORT 3076 منفذ استماع HTTP
FOURA_API_BASE https://api.foura.ai/api عنوان URL الأساسي لـ FourA REST الصاعد
FOURA_MCP_PAYLOADS_DIR مجلد foura-mcp-payloads في دليل النظام المؤقت (يحدد ملف Docker Compose المرفق /data/payloads) مكان تخزين الاستجابات >= 50 KB مؤقتا على القرص (مع offload_large: true)
FOURA_MCP_ALLOWED_HOSTS mcp.foura.ai,localhost,127.0.0.1,[::1] قائمة أسماء المضيفين المسموح بها لرأس Host (للحماية من DNS-rebinding)
FOURA_MCP_ALLOWED_ORIGINS https://mcp.foura.ai,https://claude.ai,https://app.cursor.sh,https://app.cursor.com قائمة مصادر Origin المسموح بها لمتصلين المتصفح

تعمل الحاوية الرسمية كمستخدم uid 1001 (غير جذري non-root). يجب أن يكون ربط المضيف /data/payloads قابلا للكتابة بواسطة هذا الـ uid.

توسع أفقيا خلف أي موزع أحمال load balancer. يقدم العملاء مفتاحهم مع كل طلب، لذلك لا توجد جلسات مثبتة sticky sessions.

آخر تحديث: 27 سبتمبر 2026