Skip to content

שער MCP

השתמשו בכל שרת MCP. אנחנו מאבטחים את הגבול.

Model Context Protocol (MCP) הוא הסטנדרט המתפתח לתקשורת סוכן-לכלי. Triggerfish מספק שער MCP מאובטח המאפשר לכם להתחבר לכל שרת תואם MCP תוך אכיפת בקרות סיווג, הרשאות ברמת כלי, מעקב זיהום ותיעוד ביקורת מלא.

אתם מביאים את שרתי ה-MCP. Triggerfish מאבטח כל בקשה ותגובה שחוצים את הגבול.

כיצד זה עובד

שער ה-MCP יושב בין הסוכן לכל שרת MCP. כל קריאת כלי עוברת דרך שכבת אכיפת המדיניות לפני שהיא מגיעה לשרת החיצוני, וכל תגובה מסווגת לפני שהיא נכנסת להקשר הסוכן.

זרימת שער MCP: סוכן → שער MCP → שכבת מדיניות → שרת MCP, עם נתיב סירוב ל-BLOCKED

השער מספק חמש פונקציות ליבה:

  1. אימות וסיווג שרתים -- שרתי MCP חייבים להיבדק ולהיות מסווגים לפני שימוש
  2. אכיפת הרשאות ברמת כלי -- ניתן לאפשר, להגביל או לחסום כלים בודדים
  3. מעקב זיהום בקשה/תגובה -- זיהום הסשן מתעלה בהתבסס על סיווג השרת
  4. אימות סכמה -- כל הבקשות והתגובות מאומתות מול סכמות מוצהרות
  5. תיעוד ביקורת -- כל קריאת כלי, החלטה ושינוי זיהום נרשמים

מצבי שרת MCP

כל שרתי ה-MCP מוגדרים כברירת מחדל כ-UNTRUSTED. הם חייבים להיות מסווגים באופן מפורש לפני שהסוכן יכול להפעיל אותם.

מצבתיאורהסוכן יכול להפעיל?
UNTRUSTEDברירת מחדל לשרתים חדשים. ממתין לסקירה.לא
CLASSIFIEDנבדק והוקצתה רמת סיווג עם הרשאות לכל כלי.כן (בתוך מדיניות)
BLOCKEDנאסר באופן מפורש על ידי מנהל.לא
מכונת מצבים של שרת MCP: UNTRUSTED → CLASSIFIED או BLOCKED

אבטחה שרת MCP UNTRUSTED אינו ניתן להפעלה על ידי הסוכן

בשום נסיבות. ה-LLM אינו יכול לבקש, לשכנע או להטעות את המערכת לשימוש בשרת לא מסווג. סיווג הוא שער ברמת הקוד, לא החלטת LLM. :::

תצורה

שרתי MCP מוגדרים ב-triggerfish.yaml כמפה ממופתחת לפי מזהה שרת. כל שרת משתמש בתת-תהליך מקומי (transport stdio) או בנקודת קצה מרוחקת (transport 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

מפתחות תצורה

מפתחסוגנדרשתיאור
commandstringכן (stdio)קובץ בינארי להפעלה (למשל, npx, deno, node)
argsstring[]לאארגומנטים המועברים לפקודה
envmapלאמשתני סביבה לתת-התהליך
urlstringכן (SSE)נקודת קצה HTTP לשרתים מרוחקים
classificationstringכןרמת רגישות נתונים: PUBLIC, INTERNAL, CONFIDENTIAL, או RESTRICTED
enabledbooleanלאברירת מחדל: true. הגדירו ל-false לדילוג ללא הסרת תצורה.

לכל שרת חייב להיות command (מקומי) או url (מרוחק). שרתים ללא אף אחד מהם מדולגים.

חיבור עצל

שרתי MCP מתחברים ברקע לאחר האתחול. אין צורך לחכות שכל השרתים יהיו מוכנים לפני שימוש בסוכן.

  • שרתים מנסים שוב עם backoff מעריכי: 2 שנ' → 4 שנ' → 8 שנ' → 30 שנ' מקסימום
  • שרתים חדשים הופכים זמינים לסוכן ככל שהם מתחברים -- אין צורך בהפעלת סשן מחדש
  • אם שרת נכשל בחיבור לאחר כל הניסיונות, הוא נכנס למצב failed וניתן לנסות שוב בהפעלה הבאה של ה-daemon

ממשקי ה-CLI ו-Tidepool מציגים סטטוס חיבור MCP בזמן אמת. ראו ערוץ CLI לפרטים.

השבתת שרת

להשבתה זמנית של שרת MCP ללא הסרת התצורה:

yaml
mcp_servers:
  github:
    command: npx
    args: ["-y", "@modelcontextprotocol/server-github"]
    classification: CONFIDENTIAL
    enabled: false # מדולג באתחול

משתני סביבה וסודות

ערכי env עם קידומת keychain: מותרים מה-OS keychain באתחול:

yaml
env:
  API_KEY: "keychain:my-secret-name" # מותר מ-OS keychain
  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 יורשות את רמת הסיווג של השרת. זיהום הסשן יכול רק לעלות.

סיווג שרתזיהום תגובההשפעה על סשן
PUBLICPUBLICללא שינוי זיהום
INTERNALINTERNALזיהום עולה לפחות ל-INTERNAL
CONFIDENTIALCONFIDENTIALזיהום עולה לפחות ל-CONFIDENTIAL
RESTRICTEDRESTRICTEDזיהום עולה ל-RESTRICTED

ברגע שסשן מזוהם ברמה מסוימת, הוא נשאר ברמה זו או גבוהה יותר לשארית הסשן. נדרש איפוס סשן מלא (המנקה את היסטוריית השיחה) להפחתת זיהום.

העברת אימות משתמש

לשרתי MCP התומכים באימות ברמת משתמש, השער מעביר את אישורי המשתמש המואצלים במקום אישורי מערכת.

כאשר כלי מוגדר עם requires_user_auth: true:

  1. השער בודק אם המשתמש חיבר שרת MCP זה
  2. מאחזר את אישור המשתמש המואצל ממאגר האישורים המאובטח
  3. מוסיף אימות משתמש לכותרות בקשת ה-MCP
  4. שרת ה-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 זמינות בלוחות מחוונים לתאימות
  • הגבלת קצב -- הגבלות קצב לכל שרת ולכל כלי
  • ניטור תקינות שרת -- השער עוקב אחר זמינות שרת וזמני תגובה