בעת חיבור סוכן AI לכלים חיצוניים ול-APIs, יש שתי גישות עיקריות: להשתמש ב-Model Context Protocol (MCP) כשכבת הפשטה, או לקרוא ל-API ישירות דרך HTTP. שתי הגישות עובדות. הן מציעות פשרות שונות מבחינת גמישות, מורכבות, ביצועים וניידות.
הפוסט הזה משווה בין שתי הגישות בעזרת דוגמאות קוד קונקרטיות, ניתוח השהיה ומסגרת החלטה לבחירה ביניהן.
שתי הגישות
אינטגרציית HTTP ישירה
אפליקציית ה-AI (או ה-backend שלה) קוראת ל-APIs חיצוניים ישירות באמצעות בקשות HTTP סטנדרטיות. המפתח כותב קוד שבונה בקשות, מטפל באימות, מנתח תגובות ומחזיר את התוצאות ל-LLM.
┌──────┐ ┌────────┐ ┌─────────────┐
│ User │────▶│ AI App │──── HTTP request ─────▶│ Weather API │
└──────┘ │ │◀─── JSON response ─────│ │
│ │ └─────────────┘
│ │── result as context ──▶ LLM
│ │◀── formatted answer ───
└───┬────┘
│
▼
User gets answer
אינטגרציית MCP
אפליקציית ה-AI מתחברת לשרת MCP שעוטף את ה-API החיצוני. האפליקציה משתמשת בפרוטוקול MCP כדי לגלות כלים זמינים, לקרוא להם לפי שם ולקבל תוצאות. שרת ה-MCP מטפל בקריאות ה-HTTP בפועל אל ה-API החיצוני.
┌──────┐ ┌───────────────────┐ ┌────────────┐ ┌──────────┐
│ User │────▶│ AI App/MCP Client │── JSON-RPC ─▶│ MCP Server │────▶│ HTTP API │
└──────┘ │ │◀─ JSON-RPC ──│ │◀────│ │
│ │ └────────────┘ └──────────┘
│ │── result as context ──▶ LLM
│ │◀── formatted answer ───
└─────────┬─────────┘
│
▼
User gets answer
ההבדל המרכזי: ב-HTTP ישיר, אפליקציית ה-AI מחזיקה את קוד האינטגרציה עם ה-API. ב-MCP, שרת ה-MCP מחזיק אותו, ואפליקציית ה-AI רק קוראת לכלים לפי שם.
אפשר לקבל את צד ה-MCP בתרשים הזה בלי לבנות את השרת: Quickchat AI מארחת שרת MCP מסוג streamable-HTTP לכל AI Agent, והפיכת הסוכן שלכם לשרת MCP מסתכמת בהדבקת URL אחד באפליקציית ה-AI.
השוואת קוד
נשווה בין שתי הגישות באמצעות דוגמה מעשית: שליפת מאגרי GitHub של משתמש.
אינטגרציית HTTP ישירה
import httpx
async def get_user_repos(username: str, token: str) -> list[dict]:
"""שליפת מאגרים עבור משתמש GitHub."""
async with httpx.AsyncClient() as client:
response = await client.get(
f"https://api.github.com/users/{username}/repos",
headers={
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.github.v3+json",
"X-GitHub-Api-Version": "2022-11-28"
},
params={"sort": "updated", "per_page": 10}
)
response.raise_for_status()
repos = response.json()
return [
{
"name": r["name"],
"description": r["description"],
"stars": r["stargazers_count"],
"language": r["language"],
"url": r["html_url"]
}
for r in repos
]
כדי לשלב זאת עם LLM, צריך גם:
- הגדרת כלי בפורמט שה-LLM מצפה לו (סכמת OpenAI function calling, סכמת Claude tool use וכו’)
- קוד שמנתח את קריאת הכלי של ה-LLM, מפעיל את
get_user_reposומחדיר את התוצאה חזרה לשיחה - טיפול בשגיאות עבור כשלי HTTP, מגבלות קצב ותפוגת אימות
שרת MCP
from mcp.server.fastmcp import FastMCP
import httpx
mcp = FastMCP("github-server")
GITHUB_TOKEN = os.environ["GITHUB_TOKEN"]
@mcp.tool()
async def get_user_repos(username: str) -> str:
"""שליפת 10 המאגרים שעודכנו לאחרונה עבור משתמש GitHub.
Args:
username: שם משתמש GitHub לחיפוש
"""
async with httpx.AsyncClient() as client:
response = await client.get(
f"https://api.github.com/users/{username}/repos",
headers={
"Authorization": f"Bearer {GITHUB_TOKEN}",
"Accept": "application/vnd.github.v3+json",
"X-GitHub-Api-Version": "2022-11-28"
},
params={"sort": "updated", "per_page": 10}
)
response.raise_for_status()
repos = response.json()
lines = []
for r in repos:
stars = r["stargazers_count"]
lang = r["language"] or "unknown"
lines.append(f"- {r['name']} ({lang}, {stars} stars): {r['description'] or 'No description'}")
return "\n".join(lines)
if __name__ == "__main__":
mcp.run(transport="stdio")
גרסת ה-MCP מקפלת את קריאת ה-API, האימות ועיצוב התגובה בתוך השרת. כל לקוח שתומך ב-MCP יכול להשתמש בכלי הזה בלי לדעת דבר על ה-GitHub API.
מה משתנה עבור אפליקציית ה-AI
| היבט | HTTP ישיר | MCP |
|---|---|---|
| הגדרת כלי | נכתבת בפורמט המקורי של ה-LLM (סכמת OpenAI וכו’) | נוצרת אוטומטית משרת ה-MCP |
| אימות | מנוהל על ידי אפליקציית ה-AI | מנוהל על ידי שרת ה-MCP |
| ניתוח תגובה | אפליקציית ה-AI מחלצת ומעצבת נתונים | שרת ה-MCP מחזיר תוצאה מעוצבת מראש |
| טיפול בשגיאות | אפליקציית ה-AI מטפלת בשגיאות HTTP | שרת ה-MCP מטפל בשגיאות ומחזיר הודעות שגיאה מובנות |
| הוספת כלי חדש | כתיבת קוד חדש באפליקציית ה-AI | התחברות לשרת MCP חדש (או הוספת כלי לשרת קיים) |
| החלפת LLM | כתיבה מחדש של הגדרות הכלים לפורמט ה-LLM החדש | אין צורך בשינויים |
השוואת ביצועים
MCP מוסיף שכבה בין אפליקציית ה-AI לבין ה-API החיצוני. לשכבה הזאת יש עלות.
השהיה
עבור stdio transport (שרתי MCP מקומיים), התקורה מינימלית: יצירת תהליך בעת ההפעלה (חד-פעמית, בדרך כלל מתחת ל-100ms) ותקשורת בין תהליכים לכל הודעה (פחות מאלפית שנייה במערכות מודרניות). בפועל, קריאת ה-API החיצוני היא הגורם הדומיננטי בהשהיה הכוללת.
עבור שרתי MCP מרוחקים (Streamable HTTP או SSE), נוספת הלוך-חזור HTTP אחד בין הלקוח לשרת ה-MCP, בנוסף להלוך-חזור HTTP של שרת ה-MCP אל ה-API החיצוני. אם שרת ה-MCP וה-API החיצוני נמצאים באותו אזור, התקורה הזו קטנה (מילישניות בודדות). אם הם באזורים שונים, היא מצטברת. עם זאת, שכבת התעבורה היא לעיתים רחוקות מה שהמשתמש מרגיש: בזמן בניית סוכן מרכז עזרה על שרת ה-MCP המתארח של Notion, 248 קריאות כלי ארכו בממוצע 2.7 שניות כל אחת, כמעט כולן בגלל חיפוש ב-Notion ורינדור דפים, ולא בגלל הקפיצה שבאמצע.
| תצורה | השהיה נוספת משוערת |
|---|---|
| שרת MCP מקומי (stdio) | < 1ms לכל קריאת כלי |
| שרת MCP מרוחק (באותו אזור כמו ה-API) | 1-5ms לכל קריאת כלי |
| שרת MCP מרוחק (באזור שונה מה-API) | 10-50ms לכל קריאת כלי |
ברוב מקרי השימוש של סוכני AI, שבהם הסקת ה-LLM אורכת 500ms-5s, תקורת ה-MCP זניחה.
ניהול חיבורים
HTTP ישיר: האפליקציה שלכם מנהלת חיבורים לכל API חיצוני. המשמעות היא טיפול במאגרי חיבורים, לוגיקת ניסיונות חוזרים והגבלת קצב לכל API.
MCP: האפליקציה שלכם מנהלת חיבור אחד לכל שרת MCP. השרת מנהל את החיבור ל-API החיצוני. אם יש לכם 10 כלים שמפוזרים על פני 3 שרתי MCP, אתם מנהלים 3 חיבורים במקום 10.
מתי להשתמש ב-MCP
אינטגרציות מרובות של כלים
אם אפליקציית ה-AI שלכם צריכה להתחבר ל-5+ שירותים חיצוניים, MCP מפחית את עומס האינטגרציה. במקום לכתוב ולתחזק לקוחות API מותאמים לכל שירות, מתחברים לשרתי MCP (רבים מהם זמינים כפרויקטים בקוד פתוח).
ניידות בין פלטפורמות AI
אם אתם בונים שרתי MCP עבור הכלים שלכם, השרתים האלה עובדים עם כל לקוח MCP: Claude Desktop, Cursor, Windsurf, אפליקציות מותאמות ופלטפורמות כמו Quickchat AI. עם HTTP ישיר, הייתם צריכים לממש מחדש הגדרות כלי עבור הפורמט של כל פלטפורמה.
גילוי כלים דינמי
MCP תומך בגילוי כלים בזמן ריצה דרך tools/list. אפליקציית AI יכולה להתחבר לשרת וללמוד אילו כלים זמינים ללא כל הגדרה קשיחה מראש. זה שימושי בתרחישים שבהם כלים משתנים לעיתים קרובות או ניתנים להגדרה על ידי המשתמש.
הפרדת תחומי אחריות
אם צוותים שונים אחראים לכלים שונים, MCP מספק גבול נקי. הצוות שאחראי לאינטגרציה עם Salesforce בונה ומתחזק את שרת ה-MCP של Salesforce. צוות אפליקציית ה-AI מתחבר אליו בלי צורך להבין את ה-API של Salesforce. עדכונים ל-API של Salesforce מטופלים בשרת ה-MCP בלי לגעת באפליקציית ה-AI.
מתי להשתמש ב-HTTP ישיר
אינטגרציה אחת או שתיים
אם סוכן ה-AI שלכם צריך לקרוא רק ל-API אחד (למשל, חיפוש במסד נתונים), התקורה של הפעלת שרת MCP מיותרת. קריאת HTTP ישירה פשוטה יותר וכוללת פחות חלקים נעים.
גם אין צורך לכתוב את הבקשה ידנית. בונה API Action באנגלית פשוטה קורא REST API מתועד, מייצר את המתודה, ה-URL, הפרמטרים והתיאור, ואז מאפשר לבדוק את התגובה האמיתית לפני ההפעלה.
שליטה מרבית בבקשות
שרתי MCP מסתירים את פרטי ה-HTTP. אם דרושה לכם שליטה מדויקת בבניית הבקשה (headers ספציפיים, פרמטרי query, חתימת בקשות או אימות לא סטנדרטי), HTTP ישיר נותן לכם את השליטה הזו בלי להיאבק בשכבת הפשטה.
פעולות רגישות להשהיה
אם כל מילישנייה חשובה (למשל, סוכני קול בזמן אמת שבהם קריאות כלי חייבות להסתיים בתוך תקציבי זמן קשיחים), הסרת שכבת ה-MCP מבטלת קפיצה אחת.
קריאות HTTP שאינן AI
אם קריאת ה-HTTP לא מופעלת על ידי סוכן AI (למשל, משימת cron ב-backend שמסנכרנת נתונים), MCP לא רלוונטי. MCP תוכנן במיוחד לתקשורת בין AI לכלים. שירותי backend רגילים צריכים להשתמש בלקוחות HTTP רגילים.
גישה היברידית
מערכות production רבות משתמשות בשניהם. הדפוס:
- MCP עבור אינטגרציות כלים שסוכן ה-AI קורא להן במהלך שיחות (חיפושי CRM, יצירת tickets, שאילתות Knowledge Base)
- HTTP ישיר עבור פעולות backend פנימיות, webhooks ותקשורת מערכת-למערכת
כך Quickchat AI פועלת פנימית. הפלטפורמה תומכת גם ב-HTTP Request Actions (קריאות API ישירות עם templating של פרמטרים) וגם ב-Remote MCP Actions (חיבורים לשרתי MCP חיצוניים). אתם בוחרים את הגישה המתאימה לכל אינטגרציה:
| סוג אינטגרציה | גישה מומלצת |
|---|---|
| קריאת API פשוטה עם פרמטרים ידועים | HTTP Request Action |
| אינטגרציה מורכבת עם כמה כלים קשורים | Remote MCP Action |
| שירות צד שלישי עם שרת MCP קיים | Remote MCP Action |
| API פנימי עם אימות מותאם אישית | HTTP Request Action |
| כלי שניתן להגדרה על ידי המשתמש | Remote MCP Action |
להשוואה מפורטת של אופן הפעולה בפועל, כולל ההבדלים בין GPT Actions של OpenAI לבין MCP, ראו GPT Actions לעומת MCP.
מסגרת החלטה
השתמשו בתרשים הזרימה הזה כדי לבחור:
- האם סוכן ה-AI קורא לכלי? אם לא (זו פעולת backend), השתמשו ב-HTTP ישיר.
- לכמה כלים חיצוניים אתם צריכים להתחבר? אם 1-2, HTTP ישיר פשוט יותר. אם 3+, שקלו MCP.
- האם קיים שרת MCP מוכן מראש לשירות? אם כן, השימוש בו חוסך זמן פיתוח.
- האם האינטגרציה צריכה לעבוד בכמה פלטפורמות AI? אם כן, MCP מספק ניידות.
- האם ההשהיה קריטית (תקציב של פחות מ-100ms לקריאות כלי)? אם כן, מדדו את תקורת ה-MCP והחליטו בהתאם.
- האם צוותים שונים אחראים לאינטגרציות שונות? אם כן, מודל שרת-לכל-אינטגרציה של MCP מסייע בגבולות בעלות.
בפועל, אם אתם בונים סוכן AI שצריך לעבוד עם שירותים חיצוניים, MCP הופך יותר ויותר לברירת המחדל. האקוסיסטם של שרתים מוכנים מראש גדול מספיק כך שלעיתים קרובות אפשר להתחיל בלי לכתוב כלל קוד שרת.
קריאה נוספת
- חברו את ה-AI Agent שלכם לשרת MCP מרוחק: מתן כלים חיים לסוכן שלכם, צעד אחר צעד
- איך Model Context Protocol עובד. הסבר על MCP: מבוא ל-MCP
- GPT Actions לעומת MCP: השוואה עם הגישה של OpenAI
- מפרט MCP: מפרט הפרוטוקול הרשמי
- HubSpot AI Actions: דוגמה לפעולות AI מבוססות HTTP בפועל
- תקרית OpenAI Hugging Face, מה באמת קרה: מעבר על התקרית צעד אחר צעד, ומה המשמעות האמיתית של hacking