بوابة MCP
استخدم أي خادم MCP. نحن نؤمّن الحدود.
Model Context Protocol (MCP) هو المعيار الناشئ لاتصال الوكيل بالأدوات. يوفر Triggerfish بوابة MCP آمنة تتيح لك الاتصال بأي خادم متوافق مع MCP مع تطبيق ضوابط التصنيف وأذونات مستوى الأداة وتتبع التلوث وتسجيل التدقيق الكامل.
أنت تجلب خوادم MCP. Triggerfish يؤمّن كل طلب ورد يعبر الحدود.
كيف تعمل
تقع بوابة MCP بين وكيلك وأي خادم MCP. كل استدعاء أداة يمر عبر طبقة تطبيق السياسة قبل الوصول إلى الخادم الخارجي، وكل رد يُصنّف قبل دخوله سياق الوكيل.
توفر البوابة خمس وظائف أساسية:
- مصادقة وتصنيف الخادم -- يجب مراجعة وتصنيف خوادم MCP قبل الاستخدام
- تطبيق أذونات مستوى الأداة -- يمكن السماح أو تقييد أو حظر أدوات فردية
- تتبع تلوث الطلب/الرد -- تلوث الجلسة يتصاعد بناءً على تصنيف الخادم
- التحقق من المخطط -- جميع الطلبات والردود تُتحقق مقابل المخططات المُعلنة
- تسجيل التدقيق -- كل استدعاء أداة وقرار وتغيير تلوث يُسجّل
حالات خادم MCP
جميع خوادم MCP تبدأ كـ UNTRUSTED. يجب تصنيفها صراحةً قبل أن يتمكن الوكيل من استدعائها.
| الحالة | الوصف | هل يمكن للوكيل الاستدعاء؟ |
|---|---|---|
UNTRUSTED | الافتراضي للخوادم الجديدة. في انتظار المراجعة. | لا |
CLASSIFIED | تمت المراجعة وتعيين مستوى تصنيف مع أذونات لكل أداة. | نعم (ضمن السياسة) |
BLOCKED | محظور صراحةً من قبل المسؤول. | لا |
أمان لا يمكن استدعاء خادم MCP بحالة UNTRUSTED من قبل الوكيل
تحت أي ظرف. لا يمكن لـ LLM طلب أو إقناع أو خداع النظام لاستخدام خادم غير مصنّف. التصنيف بوابة على مستوى الكود، وليس قرار LLM. :::
التكوين
تُكوّن خوادم MCP في triggerfish.yaml كخريطة مفهرسة بمعرّف الخادم. كل خادم يستخدم إما عملية فرعية محلية (نقل stdio) أو نقطة نهاية بعيدة (نقل SSE).
الخوادم المحلية (Stdio)
تُطلق الخوادم المحلية كعمليات فرعية. يتواصل Triggerfish معها عبر stdin/stdout.
yaml
mcp_servers:
github:
command: npx
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "keychain:github-pat"
classification: CONFIDENTIAL
filesystem:
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/home/you/docs"]
classification: INTERNAL
weather:
command: npx
args: ["-y", "@mcp/server-weather"]
classification: PUBLICالخوادم البعيدة (SSE)
الخوادم البعيدة تعمل في مكان آخر ويتم الوصول إليها عبر HTTP Server-Sent Events.
yaml
mcp_servers:
remote_api:
url: "https://mcp.example.com/sse"
classification: CONFIDENTIALمفاتيح التكوين
| المفتاح | النوع | مطلوب | الوصف |
|---|---|---|---|
command | string | نعم (stdio) | الملف التنفيذي (مثل npx، deno، node) |
args | string[] | لا | الوسائط الممررة للأمر |
env | map | لا | متغيرات البيئة للعملية الفرعية |
url | string | نعم (SSE) | نقطة نهاية HTTP للخوادم البعيدة |
classification | string | نعم | مستوى حساسية البيانات: PUBLIC، INTERNAL، CONFIDENTIAL، أو RESTRICTED |
enabled | boolean | لا | الافتراضي: true. عيّن إلى false للتخطي بدون إزالة التكوين. |
كل خادم يجب أن يحتوي على command (محلي) أو url (بعيد). الخوادم التي لا تحتوي على أي منهما يتم تخطيها.
الاتصال الكسول
تتصل خوادم MCP في الخلفية بعد بدء التشغيل. لا تحتاج الانتظار حتى تكون جميع الخوادم جاهزة قبل استخدام وكيلك.
- تعيد الخوادم المحاولة بتراجع أسي: 2 ثانية ← 4 ثوانٍ ← 8 ثوانٍ ← 30 ثانية كحد أقصى
- الخوادم الجديدة تصبح متاحة للوكيل عند اتصالها -- لا حاجة لإعادة تشغيل الجلسة
- إذا فشل الخادم في الاتصال بعد جميع المحاولات، يدخل حالة
failedويمكن إعادة المحاولة عند إعادة تشغيل الخادم التالية
تعرض واجهات CLI وTidepool حالة اتصال MCP في الوقت الفعلي. انظر قناة CLI للتفاصيل.
تعطيل خادم
لتعطيل خادم MCP مؤقتاً بدون إزالة تكوينه:
yaml
mcp_servers:
github:
command: npx
args: ["-y", "@modelcontextprotocol/server-github"]
classification: CONFIDENTIAL
enabled: false # يُتخطى أثناء بدء التشغيلمتغيرات البيئة والأسرار
قيم env المسبوقة بـ keychain: تُحل من سلسلة مفاتيح نظام التشغيل عند بدء التشغيل:
yaml
env:
API_KEY: "keychain:my-secret-name" # تُحل من سلسلة مفاتيح نظام التشغيل
PLAIN_VAR: "literal-value" # تُمرر كما هيفقط PATH يُورث من بيئة المضيف (حتى تُحل npx وnode وdeno وغيرها بشكل صحيح). لا تتسرب متغيرات بيئة مضيف أخرى إلى عمليات خادم MCP الفرعية.
خزّن الأسرار بـ triggerfish config set-secret <name> <value>. ثم
أشر إليها كـ keychain:<name> في تكوين env لخادم MCP. :::
تسمية الأدوات
أدوات خوادم MCP تُسمى بمساحة أسماء كـ mcp_<serverId>_<toolName> لتجنب التعارض مع الأدوات المدمجة. مثلاً، إذا كشف خادم باسم github أداة تُسمى list_repos، يراها الوكيل كـ mcp_github_list_repos.
التصنيف والرفض الافتراضي
إذا حذفت classification، يُسجّل الخادم كـ UNTRUSTED وتُرفض جميع استدعاءات الأدوات من البوابة. يجب اختيار مستوى تصنيف صراحةً. انظر دليل التصنيف للمساعدة في اختيار المستوى المناسب.
تدفق استدعاء الأداة
عندما يطلب الوكيل استدعاء أداة MCP، تنفذ البوابة تسلسل فحوصات حتمية قبل تحويل الطلب.
1. فحوصات ما قبل التنفيذ
جميع الفحوصات حتمية -- لا استدعاءات LLM، لا عشوائية.
| الفحص | نتيجة الفشل |
|---|---|
حالة الخادم CLASSIFIED؟ | حظر: "الخادم غير معتمد" |
| الأداة مسموح بها لهذا الخادم؟ | حظر: "الأداة غير مسموحة" |
| المستخدم لديه الأذونات المطلوبة؟ | حظر: "الإذن مرفوض" |
| تلوث الجلسة متوافق مع تصنيف الخادم؟ | حظر: "سينتهك عدم الكتابة لأسفل" |
| التحقق من المخطط نجح؟ | حظر: "معلمات غير صالحة" |
إذا كان تلوث الجلسة أعلى من تصنيف الخادم، يُحظر الاستدعاء
لمنع الكتابة لأسفل. جلسة ملوثة بمستوى CONFIDENTIAL لا يمكنها إرسال بيانات إلى خادم MCP بمستوى PUBLIC. :::
2. التنفيذ
إذا نجحت جميع فحوصات ما قبل التنفيذ، تُحوّل البوابة الطلب إلى خادم MCP.
3. معالجة الرد
عندما يُعيد خادم MCP رداً:
- التحقق من الرد مقابل المخطط المُعلن
- تصنيف بيانات الرد بمستوى تصنيف الخادم
- تحديث تلوث الجلسة:
taint = max(current_taint, server_classification) - إنشاء سجل نسب يتتبع أصل البيانات
4. التدقيق
كل استدعاء أداة يُسجّل مع: هوية الخادم، اسم الأداة، هوية المستخدم، قرار السياسة، تغيير التلوث، والطابع الزمني.
قواعد تلوث الرد
ردود خادم MCP ترث مستوى تصنيف الخادم. تلوث الجلسة يمكن أن يتصاعد فقط.
| تصنيف الخادم | تلوث الرد | التأثير على الجلسة |
|---|---|---|
PUBLIC | PUBLIC | لا تغيير في التلوث |
INTERNAL | INTERNAL | التلوث يتصاعد إلى INTERNAL على الأقل |
CONFIDENTIAL | CONFIDENTIAL | التلوث يتصاعد إلى CONFIDENTIAL على الأقل |
RESTRICTED | RESTRICTED | التلوث يتصاعد إلى RESTRICTED |
بمجرد تلوث الجلسة بمستوى معين، تبقى عند ذلك المستوى أو أعلى لبقية الجلسة. إعادة ضبط كاملة للجلسة (التي تمسح سجل المحادثة) مطلوبة لتقليل التلوث.
تمرير مصادقة المستخدم
لخوادم MCP التي تدعم المصادقة على مستوى المستخدم، تُمرر البوابة بيانات اعتماد المستخدم المُفوّضة بدلاً من بيانات اعتماد النظام.
عندما تُكوّن أداة بـ requires_user_auth: true:
- تتحقق البوابة مما إذا كان المستخدم قد وصل هذا الخادم MCP
- تسترجع بيانات اعتماد المستخدم المُفوّضة من مخزن بيانات الاعتماد الآمن
- تضيف مصادقة المستخدم إلى رؤوس طلب MCP
- يطبق خادم MCP أذونات مستوى المستخدم
النتيجة: يرى خادم MCP هوية المستخدم، وليس هوية النظام. وراثة الأذونات تعمل عبر حدود MCP -- يمكن للوكيل فقط الوصول إلى ما يمكن للمستخدم الوصول إليه.
تمرير مصادقة المستخدم هو النمط المفضل لأي خادم MCP يدير
التحكم في الوصول. يعني أن الوكيل يرث أذونات المستخدم بدلاً من وصول نظام شامل. :::
التحقق من المخطط
تتحقق البوابة من جميع طلبات وردود MCP مقابل المخططات المُعلنة قبل التحويل:
typescript
// التحقق من الطلب (مبسط)
function validateMcpRequest(
serverConfig: McpServerConfig,
toolName: string,
params: Record<string, unknown>,
): Result<void, McpError> {
const toolSchema = serverConfig.getToolSchema(toolName);
if (!toolSchema) {
return err(new McpError("Unknown tool"));
}
// التحقق من المعلمات مقابل مخطط JSON
if (!validateJsonSchema(params, toolSchema.inputSchema)) {
return err(new McpError("Invalid parameters"));
}
// التحقق من أنماط الحقن في معلمات النصوص
for (const [, value] of Object.entries(params)) {
if (typeof value === "string" && containsInjectionPattern(value)) {
return err(new McpError("Potential injection detected"));
}
}
return ok(undefined);
}التحقق من المخطط يلتقط الطلبات المشوهة قبل وصولها إلى الخادم الخارجي ويُعلّم أنماط الحقن المحتملة في معلمات النصوص.
ضوابط المؤسسات
نشر المؤسسات لديه ضوابط إضافية لإدارة خادم MCP:
- سجل خوادم يُديره المسؤول -- فقط خوادم MCP المعتمدة من المسؤول يمكن تصنيفها
- أذونات أدوات لكل قسم -- فرق مختلفة يمكنها الحصول على وصول أدوات مختلف
- تسجيل الامتثال -- جميع تفاعلات MCP متاحة في لوحات الامتثال
- تحديد المعدل -- حدود معدل لكل خادم ولكل أداة
- مراقبة صحة الخادم -- تتتبع البوابة توفر الخادم وأوقات الاستجابة
