
בתוך Durin: איך עובדת בקשת MCP נשלטת
עקוב אחר שיחת כלי סוכן אחת דרך Durin, מהבקשה המחוברת ובדיקות הגישה ועד לבדיקה, טיפול בתעודות והתוצאה המתועדת.
ההחלטה בקצרה
Durin מתייחסת לקריאת הכלי של סוכן כבקשה להעריך, ולא הוראה לביצוע. השער מאשר מי מתקשר, זמן הריצה של הארגון בודק מחדש את הגישה והמדיניות הנוכחית, מתווך נפרד מצרף את הרשאת הספק של האדם, וכל שינוי מתועד לפני ואחרי ניסיון. הסתמכו על הנתיב הזה עבור בקשות המנותבות דרך Durin, ושמרו על בקרות נפרדות לגישה ישירה, ספקי דגם והרשאות ספק.
צייר את הקו בקריאת הכלי
מהנדס מבקש מסוכן קידוד לפתוח כרטיס למבחן נכשל. ניסוח הכרטיס קל לדוגמנית. יצירתו פירושה לקרוא לכלי במערכת אמיתית, עם חשבון אמיתי, ולהשאיר שינוי שאנשים אחרים יראו. Durin מתייחסת לקריאה זו כאל בקשה למרחב העבודה להחליט עליה, ולא כהוראה לביצוע.
Durin יושב בין לקוחות סוכן לבין המערכות שסביבת העבודה חיברה. המודל והעבודה שסוכן עושה בסביבה שלו, כמו קריאת קבצים מקומיים, הפעלת בדיקות או עריכת קוד, נשארים עם הלקוח. Durin אינו מארח או מאמן דגמים. הוא שולט בקריאות הכלים שמגיעות אליו דרך נקודת קצה Durin, כגון חיפוש מסמכים, קריאת כרטיס, יצירת בעיה או שליחת הודעה.
כל אדם מתחבר דרך נקודת הקצה שלו. כתובת URL אישית מכסה כל חיבור שהם יכולים להשתמש בהם; כתובת URL לחיבור מצמצמת לקוח לאחד. כתובת האתר היא כתובת, לא סיסמה. הלקוח נכנס ל-Durin עם OAuth עבור כתובת זו, ואז Durin שואב את הכתובת הצפויה מהזהות המאומתת ומסרב לאי התאמה. הלקוח לעולם לא צריך את האסימון של הספק.
מאחורי נקודת הקצה, חיבור מייצג מערכת אחת מאושרת: שרת MCP המתארח של ספק או שרת MCP שהארגון שלך מפעיל. ארגז החול המובנה Durin הוא סוג שלישי. הוא עונה עם מסמכים וכרטיסים סינתטיים מתוך Durin ולעולם לא יוצר קשר עם ספק חיצוני. כולם יושבים מאחורי אותם המחאות.
לקוח הסוכן והדגם שלו נשארים מחוץ ל-Durin ושולחים שיחת כלים עם אסימון OAuth שהונפק עבור אותה נקודת קצה בדיוק. השער מאמת את האסימון ומוצא את הארגון. בקשה חתומה, תקפה למשך 30 שניות, מעבירה את השיחה אל זמן הריצה של הארגון, שבודקת מחדש את הגישה הנוכחית, מחילה מדיניות ובדיקה ומתעדת כוונה לפני השליחה. מתווך האישורים מקבל בקשה חתומה הקשורה לשיחה המדויקת, בודק שוב את ההחלטה ומצרף את אסימון הספק של האדם. שירות היציאה שולח אותו לשרת המרוחק MCP באמצעות HTTPS ציבורי, ללא הפניות מחדש או ניסיונות חוזרים. התוצאות חוזרות ללקוח; אסימוני ספק לא. גישת ספק ישירה לעולם אינה חוצה את Durin.
מצא כלים ללא הרחבת גישה
סוכן צריך לגלות כלים לפני שהוא יכול להתקשר אליהם. בקשת הכלים/רשימה הסטנדרטית מחזירה את כלי הספק שאדם יכול להשתמש בהם, עמוד אחר עמוד. עבור קטלוגים גדולים, Durin מוסיף שלושה כלי גילוי: durin_list_connections מוצא את החיבור המיועד, durin_list_tools מעיין בסיכומי הכלים המותרים עם שאילתת טקסט אופציונלית, ו-durin_describe_tools מחזיר את הסכמות שנבדקו עבור עד חמישה שמות מדויקים. רביעית, durin_call_tool, מפעילה כלי לפי שם עם הארגומנטים שלו ומפתח אימפוטנציה.
גילוי מעוצב על ידי גישה, אבל זה לא גישה. כלים שהמדיניות הנוכחית תחסום נשארים בחוץ. כלים הזקוקים לבדיקה, או שתוצאתם תלויה במשאב שקוראים לו, עדיין מופיעים, מכיוון שההחלטה תלויה בבקשה הספציפית. כאשר משהו אינו זמין, התגובה אומרת אם חסרים כניסה, הסכמה, סקירה או מדיניות, מבלי לחשוף את הגדרת הכלי החסום. כתובת URL של חיבור מגבילה גילוי וקריאות לחיבור שלו, ושום מסנן לא יכול להרחיב את ההיקף הזה.
כל שיחה נבדקת שוב כשהיא מגיעה, כי ייתכן שהחברות, המדיניות או החיבור השתנו מאז שליפת הרשימה. ההוראות של Durin ללקוחות אומרות זאת באופן ישיר: לעולם אל תמציא שמות של כלים, תשאל באיזה חיבור להשתמש כשכמה תואמים, וצפו שכל שיחה תיבדק שוב.
שיחה אחת, צעד אחר צעד
הנה מה שקורה כאשר הלקוח מתקשר לכלי הכרטיסים. כל שלב מתנהל בשירות עם עבודה צרה, וכל מסירה חתומה על השירות שמקבל אותה.
- השער מאמת את המתקשר. הוא מאמת את החתימה, המנפיק והקהל של אסימון הגישה OAuth, ואז שואל את ספק הזהות אם האסימון עדיין פעיל ולאיזה לקוח הוא הונפק. הוא עושה זאת בכל בקשה, ללא שמירה במטמון. השם שלקוח מדווח על עצמו, וכל תפקיד שנכתב לתוך האסימון, לא ממלאים תפקיד בביסוס הזהות.
- השער מוצא את הארגון מאותה זהות, לעולם לא מארגון שנקרא בכותרת או בגוף הבקשה. זמן הריצה של הארגון מאשר שהאדם חבר פעיל ומספק את תפקידו הנוכחי.
- השער מעביר את השיחה לזמן ריצה זה כבקשה פנימית חתומה. זה נותן שם לארגון, הסביבה, האדם, התפקיד, הלקוח והתפעול, והוא יפוג לאחר 30 שניות. זמן הריצה דוחה בקשה שהונפקה עבור ארגון, סביבה או פעולה אחרים.
- זמן הריצה בודק מחדש את הגישה הנוכחית מול הרשומות שלו, ולא האסימון: חברות וביטול, מצב החיבור והיקף הצוות, הרשאת הספק של האדם, הכלי הנבדק והמשאב אליו ממקדים השיחה. הארגומנטים חייבים להתאים לסכימה הנבדקת של הכלי ולעבור בדיקה. כל אחת מהבדיקות הללו נכשלה סגורה.
- זמן הריצה מחיל את הכללים של סביבת העבודה. כברירת מחדל, בקשה שעוברת את הבדיקות הללו מותרת, כולל שינוי. מנהלי מערכת יכולים לדרוש ממנהל אחר לסקור שינויים, לדחות שינויים או לדחות כל גישה. מדיניות צוות וכללים מותאמים אישית יכולים להחמיר החלטה, לעולם לא משוחררת יותר.
- עבור שיחה מותרת, זמן הריצה מתעד את כוונתה ומעביר את השיחה לברוקר האישורים, אשר בודק שוב את ההחלטה מול הרשומות הנוכחיות לפני שהוא יוצר קשר עם הספק.
- זמן הריצה מתעד את התוצאה ומחזיר את התוצאה ללקוח.
אימות והרשאה נשארים נפרדים לאורך כל הדרך. אסימון תקף קובע מי מתקשר; היא אינה מחליטה אם אותו אדם רשאי לבצע את השיחה הזו כעת. זמן הריצה מחליט שברגע השיחה, מתוך רשומות היא שולטת.
בתוך זמן הריצה, אובייקט מתאם אחד לכל ארגון וסביבה, Cloudflare Durable Object, מטפל בבקשות אלו אחת בכל פעם. החלטה, אישור, שינוי מדיניות וביטול אינם יכולים אפוא להשתלב. אם המדיניות משתנה תוך כדי הערכה של שיחה, השיחה נעצרת עם התנגשות ושום דבר לא מתועד כמותר.
הפעל כלים שנבדקו, לא מה שהשרת מציע היום
שרת MCP יכול לשנות את הכלים שלו בכל עת, כולל התיאורים וסכימות הקלט שלהם. כאשר מנהל מערכת סוקר כלי, Durin מתעד תקציר של ההגדרה שלו. הסקירה גם מחליטה אם הכלי קורא או משנה נתונים, באילו משאבים הוא עשוי לגעת והיכן משאבים אלו מופיעים בטיעונים שלו. Durin אינו מסתמך על הרמז של שרת עצמו לכך שכלי הוא לקריאה בלבד, וכלי שהתגלה לאחרונה נשאר לא פעיל עד שהוא נבדק.
אם גילוי מאוחר יותר מחזיר הגדרה אחרת, Durin יוצר גרסה חדשה שזקוקה לבדיקה, משעה את הפעילה ומבטל את האישורים הפתוחים שלה. אדם שההגדרה שהתגלתה שלו כבר לא תואמת את ההגדרה שנבדקה נדחתה. כלי שלא נבדק נדחה, ושמו אינו מוצע ללקוח ככלי הניתן להתקשרות.
כל כלי מופעל צריך גם מאמת עבור הטיעונים שלו. Durin יוצר אחד במהלך סקירה עבור סכימות פשוטות; כלי שהסכימה שלו מורכבת מדי בשביל שממתין לאימות חתום בנפרד לפני שניתן יהיה להפעיל אותו. בשיגור, המתווך לוקח את שם הכלי והסכימה במעלה הזרם מהרשומה הנבדקת ולא מבקשת הלקוח.
סקירה ממפה גם טיעונים למשאבים. מנהל מערכת נותן שמות של עד ארבעה שדות בקלט של הכלי, ו-Durin מצטרף לערכים שלהם למשאב שאליו מתייחסים הכללים, כגון בעלים ומאגר. שיחה שהמשאב שלה אינו ברשימת המותרים של הכלי נדחתה, וערך חסר אינו תואם.
האישורים מתחייבים לשיחה אחת מדויקת
כאשר הכללים דורשים בדיקה, השיחה מחזירה את האישור הנדרש ושום דבר לא נשלח במעלה הזרם. המאשר שמות של זרימת עבודה תואמת, או מנהל פעיל אחר, אף פעם לא המבקש, פותח את הבקשה באישורים או, אם מוגדר, ב-Slack. הם רואים את המבקש, החיבור, הכלי, המשאב, תקציר הארגומנטים, הגירסאות ותפוגה, ואז בוחרים אפשר פעם אחת, אפשר תמיד או דחה. בקשות מנותבות על ידי הצעה של זרימת עבודה אפשר פעם אחת או דחה.
האישור אינו מפעיל את הפעולה. המבקש שולח שוב את השיחה הזהה, עם אותו מפתח אימפוטנציה ואסמכתא לאישור, לפני שתוקף האישור יפוג 15 דקות לאחר הבקשה המקורית. זמן הריצה בודק את הגישה הנוכחית פעם נוספת, צורך את המענק, מתעד את ההחלטה ותובע ניסיון בודד. אם החברות בוטלה, המדיניות השתנתה או הטיעונים שונים, האישור הישן לא יכול לאשר את השיחה.
| חלק מהבקשה | למה זה קשור |
|---|---|
| מבקש וארגון | אדם אחר לא יכול להשתמש במענק. |
| חיבור ותעודה | המענק לא יכול לעבור לחשבון אחר. |
| גרסת הכלי, תקציר הגדרה ומיפוי | כלי שהשתנה זקוק לבדיקה חדשה. |
| תקציר ויכוחים ומשאב | כותרת או יעד אחר הם פעולה אחרת. |
| גרסאות סכימה ומדיניות | פרסום כללים חדשים מבטל אישורים פתוחים. |
| עידן הביטול של המבקש | אובדן והחזרה של גישה לא מחייה מענק ישן. |
| הוצאה להורג אחת, לפני התוקף | המענק נצרך בניסיון בודד. |
כאשר סוקר שומר החלטה
סקירת כל חזרה על שינוי שגרתי מכשירה אנשים ללחוץ על אישור מבלי לקרוא. אפשר תמיד כתובות בגבולות צרים. בעוד שזיכרון האישור פועל, שזו ברירת המחדל, הוא חוסך מענק קבוע שנמשך 30 יום, אלא אם כן הארגון בוחר חיים אחרים. בקשה מאוחרת יותר תוכל להמשיך ללא בדיקה חדשה אם היא מגיעה מאותו מבקש, עבור אותו חיבור, כלי ומשאב, כאשר כל גרסה קשורה ללא שינוי, והטיעונים שלה זהים או עומדים בסף ההתאמה של הארגון, 90 אחוז כברירת מחדל.
ההתאמה מחושבת משרטוט מלוח וחד-כיווני של הטיעונים, אף פעם לא הטיעונים עצמם, ואותן קלט תמיד מייצר את אותו ניקוד. כל מה שהמערכון לא יכול להראות כדומה מטופל כחדש. אפשר פעם אחת אף פעם לא מכסה בקשה מאוחרת יותר; זה מוצג רק למבקר הבא כתקדים.
מענק קבוע עדיין עובר כל בדיקת גישה נוכחית, והמתווך בודק אותו מחדש כמו כל אישור אחר. שינוי מדיניות, ביטול של המבקש או הבודק, כיבוי זיכרון או ביטול של מנהל מערכת מסיימים אותו מוקדם. מנהלי מערכת יכולים לראות כל החלטה שנשמרה, ובכל פעם שנעשה בה שימוש, תחת אישורים ← זיכרון.
הרחק את אסימוני הספק מהסוכן
עבור חיבורי ספק, Durin מתקשר לספק עם הרשאה משל המבקש. כל אדם נכנס לספק דרך Durin עבור כל חיבור שהוא משתמש בו, כך שהסכמת חבר לצוות לעולם לא מאריכה את הגישה של אף אחד אחר. האסימונים מאוחסנים מוצפנים עם AES-256-GCM. הארגון, הסביבה, החיבור והאדם קשורים לכל רשומה כנתונים מאומתים, כך שלא ניתן לפתוח רשומה כרשומה של מישהו אחר. במהלך סיבוב המפתחות, טבעת המפתחות יכולה להכיל עד חמישה מפתחות: החדש חותם רשומות חדשות, וכל מפתח רשום יכול לפתוח רשומות קיימות.
רק מתווך האישורים משתמש באסימונים האלה. זהו שירות נפרד שרק זמן הריצה של הארגון יכול להתקשר אליו, באמצעות בקשה חתומה הקשורה לגוף השיחה המדויק ותקפה למשך 30 שניות. לפני שהוא יוצר קשר עם הספק, המתווך קורא שוב את הרשומות הנוכחיות ומפעיל מחדש את החלטת המדיניות. לשם שינוי, זה דורש גם את הכוונה המוקלטת, עידן ביטול ללא שינוי ואותה גרסת אישור. לאחר מכן הוא מצרף את האסימון עצמו. אף נקודת קצה לא מחזירה אסימון לזמן הריצה, ללקוח או למודל.
שיחות לשרתי MCP המתארחים בספק ובהתאמה אישית יוצאות דרך שירות יציאה אחד. הוא מקבל רק בקשות HTTPS לשמות מארחים ציבוריים, מסרב להפניות מחדש, מגביל שיטות וכותרות ומגביל את גודל הבקשות והתגובות. כל שיחה מוצמדת לנקודת הקצה הנבדקת של החיבור ומבצעת כלים/שיחה בודדת, ללא ניסיונות חוזרים אוטומטיים.
שמירה על אסימונים מחוץ להקשר של המודל אינה הופכת את התוצאות ללא מזיקות. כל מה שכלי מותר יחזיר יכול להגיע ללקוח ולספק הדגם שלו. Durin מחזיקה כל תוצאה עד שהיא נבדקת מול הסכימה שנבדקה ונבדקה, אבל בדיקה זו מחפשת פורמטים סודיים נפוצים, כגון מפתחות פרטיים ואסימוני API חיים, ולא כל סוג של נתונים רגישים. שמור על טווחי ספקים צרים. אישור Durin לעולם לא מרחיב את מה שחשבון הספק עצמו עשוי לעשות.
בצע שינוי לכל היותר פעם אחת
הסוכנים מנסים שוב, ורשתות מורידות תגובות. כרטיס שנוצר פעמיים הוא מטרד; הודעה או תשלום שנשלחו פעמיים זה גרוע יותר. Durin בנוי כך שבקשה אחת מותרת מובילה לכל היותר לניסיון אחד.
- כל שיחה נושאת מפתח אימפוטנציה שנבחר על ידי הלקוח. משחק חוזר עם אותו מפתח מוערך תחילה שוב. אם הטיעונים, הכלי או האישור השתנו, הם נדחים כקונפליקט. אחרת הוא מחזיר כפילויות עם המצב הקודם ולא שולח כלום.
- לפני יצירת קשר עם הספק, זמן הריצה כותב את הביצוע וערך ביקורת בעסקה אחת. אם הכתיבה נכשלת, השיחה נפסקת. המתווך מסרב לכל שינוי חסר כוונה רשומה זו.
- תביעת משלוח יחידה, שנכתבה על ידי ההוצאה לפועל, שומרת על כל שינוי. מסירה שנייה של אותה בקשה לא יכולה לתבוע אותה שוב.
- רשומות Durin הושלמו רק כאשר הברוקר מחזיר תוצאה שעוברת בדיקה. שגיאת ספק, פסק זמן, אירוע סופי חסר או תוצאה שנכשלת בבדיקה מתועדת כלא ודאית.
שינוי מותר נושא מפתח אימפוטנציה שנבחר על ידי הלקוח. זמן הריצה כותב תחילה את הביצוע ואת רישום הביקורת בעסקה אחת; אם הכתיבה נכשלת, שום דבר לא נשלח. לאחר מכן הוא תובע את המשלוח פעם אחת, כך שמשלוח שני לא יכול לתבוע אותו שוב. המתווך קורא מחדש את הרשומות הנוכחיות ומתקשר לספק פעם אחת, ללא ניסיונות חוזרים אוטומטיים. התוצאה הרשומה הושלמה כאשר תוצאה חוזרת ועוברת בדיקה, או לא בטוחה לאחר שגיאה, פסק זמן או בדיקה נכשלת. חזרה על אותו מפתח מחזירה כפילות עבור בקשה ללא שינוי והתנגשות עבור בקשה ששונתה; אף אחד לא שולח כלום.
שינוי לא ודאי אף פעם לא ננסה שוב אוטומטית, כי ייתכן שהוא כבר קרה. נאמר ללקוח לבדוק את הרשומה לפני ניסיון חוזר, ומישהו צריך לבדוק את הספק ואת ראיות הביקורת לפני הגשת בקשה חדשה. אילוץ ניסיון נוסף עם מפתח אימפוטנציה חדש יכול לשכפל פעולה שכבר התרחשה. לקריאה, להתחיל מחדש בבקשה חדשה בדרך כלל לא מזיקה.
מה Durin מתעד, ומה נשאר בחוץ
Durin מתעדת את החלטת המדיניות ואת תוצאת הביצוע כרשומות נפרדות ביומן ביקורת להוספה בלבד. מפעילי מסד נתונים דוחים כל עדכון או מחיקה, ואף נתיב קוד לא משכתב ערך. רשומות מזהות את האדם, הלקוח, הקשר, הכלי, המשאב, ההחלטה והסיבה, עם תקציר של הטיעונים ולא הטיעונים עצמם. נתיב השיחה אינו מאחסן עומסי בקשות או תוצאות.
Durin לא רואה את השיחה בלקוח. לקוח המותקן עבורו יכול להגיש את ההודעות שהוא צפה בפועל דרך נקודת קצה נפרדת לכידה, המקושרת לביצועים שלו ומתויגים כמדווחים על ידי לקוח. Capture שומר על מטא נתונים רק אלא אם מנהל מערכת מפעיל את לכידה מודפסת. אם מנהל מערכת מפעיל מעריך תוכן חיצוני, הוא מקבל את הטיעונים או התוצאות שהוא בודק; זה יכול לעשות החלטה קפדנית יותר, לעולם לא רופפת יותר.
שלושה דברים נשארים מחוץ לנתיב הזה. בקשות המגיעות לספק מבלי לעבור דרך Durin זקוקות לפקדים משלהן, כגון הגבלות רשת או זהות. ספק הדגם שלך מקבל כל מה שהלקוח שולח לו, כולל תוצאות הכלים. וההרשאות של הספק עצמו נשארות סמכותיות: Durin יכול לצמצם את מה שסוכן עושה עם חיבור, לעולם לא להרחיב אותו.
כדי לראות את הנתיב בעצמך, בקש את ארגז החול Durin בסביבת עבודה וקרא אחד. לאחר מכן בקש ממנהל מערכת לדרוש בדיקה של שינויים, ליצור כרטיס ארגז חול ולעקוב אחריו מהאישור הנדרש ועד לתוצאה המתועדת שלו. ערכת ההערכה מפרטת את אותן בדיקות להשוואה לכל שער.