Ofer Shapira

איך בודקים שחיבור MCP לסוכן עובד עד הקריאה הראשונה?

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

בקצרה

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

מגדירים מה החיבור אמור להחזיר

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

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

בודקים תחבורה בלי להסיק מהדפדפן

שרת MCP יכול לעבוד מעל תחבורה שאינה עמוד HTML. פתיחת הכתובת בדפדפן והופעת מסך ריק אינן בדיקת פרוטוקול. גם תשובת health תקינה בודקת רק את מה שהשרת הגדיר לאותו נתיב.

בדקו את סוג התחבורה שהלקוח והשרת תומכים בו, את הכתובת המדויקת ואת דרישות ההזדהות. התאימו את ההגדרה לתיעוד של הלקוח. שגיאת הרשאה או Origin היא ממצא שצריך להבין, לא סיבה להסיר הגנות כדי שהמסך ייראה ירוק.

משלימים את שלב האתחול

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

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

מגלים כלי ומבינים את החוזה שלו

בקשת tools/list מחזירה את הכלים שהשרת חושף. קראו את השם, התיאור וסכמת הקלט. שאלו אם הכלי רק קורא מידע או משנה מצב חיצוני. התאימו את בדיקת הקריאה הראשונה לכלי שההשפעה שלו מובנת ומותרת.

סימון readOnlyHint הוא רמז שימושי, אבל במפרט כתוב שאין לסמוך על annotations ממקור שאינו מהימן. סימון כזה אינו מעניק גישה לחשבון ואינו מחליף בדיקה של השרת. שרת חדש שמצהיר על עצמו כבטוח עדיין דורש אימות מקור והיקף.

מריצים קריאה אחת ומשווים למקור

בחרו קלט קטן שמותר לשלוח. בדקו שהתגובה מכילה את הפריט הנכון, ולא רק JSON תקין. אם יש מקור ציבורי, השוו מזהה, תוכן ושפה. אם התוצאה מסומנת stale, דווחו זאת לצד הנתון. תשובה מה-cache יכולה להיות תקינה לפי החוזה, אך אינה בהכרח מצב חיצוני עדכני.

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

מוסרים מצב שאפשר להמשיך ממנו

דוח חיבור קצר יכול לכלול: לקוח וגרסה, כתובת ותחבורה, גרסה שהוסכמה, כלי שנבדק, קלט שאינו סודי, תוצאת הקריאה ומה עדיין לא אומת. הימנעו מהעתקת טוקנים, headers של הזדהות או שיחה מלאה לדוח.

כך אפשר לומר במדויק "החיבור החזיר את הפריט הזה". הרחבת היקף לכלים נוספים, כתיבה או מידע פרטי היא בדיקה נפרדת עם הרשאה נפרדת. קריאה ראשונה היא נקודת התחלה שאפשר לסמוך עליה, בלי להפוך אותה להבטחה על כל המשימות הבאות.

מקורות ופרטים נוספים

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

בחירת כלי קיים לפני בניית סוכן

שאלות נפוצות

האם health תקין מוכיח שהחיבור עובד?

הוא מוכיח רק את בדיקת ה-health שהשרת מימש. חיבור MCP דורש גם אתחול, גילוי כלי וקריאה שתואמת את החוזה.

האם כלי שמסומן read-only תמיד בטוח?

זה רמז התנהגותי, לא הרשאה או הוכחת אמינות. יש לבדוק מקור, היקף קלט והתנהגות בפועל.

מה צריך לשמור מדוח הקריאה הראשונה?

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