בניית MCP Server
— לחבר את הכלים שלך ל-AI
MCP הפך ל"USB-C של ה-AI" — פרוטוקול אחד שמחבר כל מודל לכל כלי. במדריך הזה לא נסתפק בהסבר מושגי: נבנה שרת MCP משלך צעד-אחר-צעד — tools, resources, prompts, ה-transport הנכון, חיבור ל-Claude ולסוכנים, ומלכודות האבטחה שחייבים להכיר.
מה זה MCP Server ולמה לבנות אחד
Model Context Protocol (MCP) הוא פרוטוקול פתוח שמגדיר איך מודל שפה (או סוכן) מדבר עם מקורות חיצוניים — בסיסי נתונים, APIs, קבצים, מערכות פנימיות. במקום לכתוב אינטגרציה ייעודית לכל מודל, אתה כותב שרת MCP אחד, וכל לקוח שתומך ב-MCP (Claude Desktop, IDEs, סוכנים) יכול להשתמש בו מיד.
מתי כדאי לבנות שרת משלך? כשיש לך יכולת פנימית שתרצה לחשוף ל-AI — לדוגמה גישה ל-CRM של החברה, שאילתות על מסד נתונים, או הפעלת workflow ב-n8n. השרת עוטף את היכולת בממשק סטנדרטי, וה-AI מקבל אליה גישה בטוחה ומבוקרת.
ב-MCP יש שני צדדים: ה-host/client (Claude Desktop, סוכן) שמנהל את השיחה, וה-server (מה שתבנה) שחושף יכולות. תקשורת ביניהם היא JSON-RPC. אתה בונה את ה-server; הלקוח כבר קיים.
שלושת ה-primitives: Tools, Resources, Prompts
שרת MCP חושף שלושה סוגי יכולות. חשוב להבין את ההבחנה — היא קובעת איך המודל משתמש בכל אחת:
Transport — stdio מול HTTP
איך הלקוח והשרת מדברים פיזית? יש שתי אפשרויות עיקריות, וזו החלטה ארכיטקטונית חשובה:
| Transport | איפה רץ | הכי טוב ל |
|---|---|---|
| stdio | מקומי, על אותה מכונה | כלים אישיים, Claude Desktop |
| Streamable HTTP | שרת מרוחק | שירות מרובה-משתמשים, ענן |
stdio — השרת רץ כתהליך מקומי והתקשורת דרך stdin/stdout. הכי פשוט להתחיל, מושלם לכלי אישי שרץ לצד Claude Desktop. Streamable HTTP — השרת רץ מרחוק ונגיש דרך HTTP; מתאים כשצריך לשרת כמה משתמשים או לפרוס בענן. התחל ב-stdio, עבור ל-HTTP כשצריך scale.
בונים שרת ראשון — עם ה-SDK הרשמי
הדרך הקלה ביותר היא ה-SDK הרשמי. ב-Python, FastMCP מאפשר להגדיר tool עם דקורטור בודד — ה-schema נגזר אוטומטית מ-type hints וה-docstring:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather-server")
@mcp.tool()
def get_weather(city: str) -> str:
"""מחזיר את מזג האוויר הנוכחי בעיר נתונה."""
# כאן הלוגיקה האמיתית — קריאה ל-API אמיתי
return f"בעיר {city}: 24°C, בהיר"
if __name__ == "__main__":
mcp.run() # ברירת מחדל: transport של stdio
זהו — יש לך שרת MCP עובד עם tool אחד. שלושה עקרונות שהופכים tool לטוב:
- תיאור ברור — ה-docstring הוא מה שהמודל קורא כדי להחליט מתי להשתמש. כתוב אותו כאילו אתה מסביר לעמית, לא למכונה.
- Schema מדויק — type hints מגדירים בדיוק אילו פרמטרים מותרים. ככל שהוא הדוק יותר, פחות שגיאות.
- פלט תמציתי — כל מה שה-tool מחזיר נכנס להקשר של המודל ועולה טוקנים. החזר את מה שצריך, לא dump שלם.
לפני שמחברים ללקוח, בדוק את השרת עם MCP Inspector — כלי רשמי שמריץ את השרת ומאפשר לקרוא ל-tools ידנית ולראות את התשובות. חוסך שעות דיבוג מול Claude.
חיבור ל-Claude ולסוכנים
אחרי שהשרת עובד, מחברים אותו ללקוח. Claude Desktop קורא קובץ הגדרות JSON שבו רושמים את פקודת ההרצה של השרת — הלקוח מריץ אותו אוטומטית ומגלה את ה-tools. סוכנים (LangGraph, Claude Agent SDK ואחרים) יכולים להתחבר ל-MCP servers כמקור כלים, כך שאותו שרת משרת גם צ'אט אנושי וגם אוטומציה.
זה בדיוק הכוח של MCP: כתבת את השרת פעם אחת, ועכשיו הוא זמין ל-Claude Desktop, ל-IDE, ולכל סוכן שתבנה — בלי לשכפל קוד. ה-framework של הסוכן רק צריך לדעת לדבר MCP.
אבטחה ומלכודות נפוצות
שרת MCP חושף יכולות אמיתיות ל-AI — ולכן הוא גם משטח תקיפה. אלה הדברים שאסור לפספס:
- הרשאות מינימום — תן לשרת רק את הגישה שהוא באמת צריך. שרת שקורא ממסד לא צריך הרשאת מחיקה.
- ולידציה של קלט — ה-schema עוזר, אבל אל תסמוך עליו לבד. סנן פרמטרים לפני שאתה מריץ שאילתה או פקודת מערכת (הזרקת SQL/פקודות היא סכנה אמיתית).
- הזרקת פרומפט דרך תוכן — אם tool מחזיר תוכן חיצוני (דף אינטרנט, מייל), הוא עלול להכיל הוראות זדוניות שמנסות "לפקד" על המודל. ראה מדריך הזרקת פרומפט.
- אישור לפעולות רגישות — פעולות שמשנות מצב (שליחה, מחיקה, תשלום) צריכות אישור אנושי, לא ריצה אוטומטית. ראה אבטחת סוכנים.
- סודות מחוץ לקוד — מפתחות API ב-environment variables, לא בקובץ השרת. השרת רץ מקומית אצל המשתמש — אל תטמיע בו סודות.
מפתה לחשוף עשרות tools "ליתר ביטחון". אבל כל tool צורך טוקנים בהקשר ומבלבל את המודל בבחירה. שרת עם 5 tools ממוקדים עדיף על שרת עם 30. חשוף את מה שבאמת נחוץ.