خادم 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، وتتضمن حالة الفشلattemptReportfoura_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.