פרק זה מדגים כיצד לבנות סוכן AI אמיתי שמשתלב עם APIs חיצוניים, מטפל בסוגי נתונים מגוונים, מנהל שגיאות ומאחד כלים מרובים — הכל בפורמט מוכן לפרודקשן. תראו:
- שילוב עם APIs חיצוניים שדורשים אימות
- טיפול בסוגי נתונים מגוונים ממספר נקודות קצה
- אסטרטגיות טיפול בשגיאות ורישום יציבות
- אורקסטרציה של כלים מרובים בשרת יחיד
בסוף, תרכשו ניסיון מעשי עם דפוסים ופרקטיקות מומלצות החיוניות ליישומים מתקדמים מבוססי AI ו-LLM.
בשיעור זה תלמדו כיצד לבנות שרת MCP ולקוח מתקדמים שמרחיבים את יכולות ה-LLM עם נתוני רשת בזמן אמת באמצעות SerpAPI. זוהי מיומנות קריטית לפיתוח סוכני AI דינמיים שיכולים לגשת למידע עדכני מהאינטרנט.
בסיום השיעור תוכלו:
- לשלב APIs חיצוניים (כמו SerpAPI) בצורה מאובטחת בשרת MCP
- לממש כלים מרובים לחיפוש באינטרנט, חדשות, מוצרים ושאלות ותשובות
- לפרסר ולעצב נתונים מובנים לצריכת LLM
- לטפל בשגיאות ולנהל מגבלות קצב API ביעילות
- לבנות ולבדוק לקוחות MCP אוטומטיים ואינטראקטיביים
חלק זה מציג את הארכיטקטורה והתכונות של שרת MCP לחיפוש באינטרנט. תראו כיצד FastMCP ו-SerpAPI משולבים יחד להרחבת יכולות ה-LLM עם נתוני רשת בזמן אמת.
מימוש זה כולל ארבעה כלים המדגימים את יכולת ה-MCP לטפל במשימות מגוונות המונעות על ידי API חיצוני בצורה מאובטחת ויעילה:
- general_search: לתוצאות חיפוש רחבות באינטרנט
- news_search: לכותרות חדשות עדכניות
- product_search: לנתוני מסחר אלקטרוני
- qna: לקטעי שאלות ותשובות
- דוגמאות קוד: כוללות קטעי קוד ספציפיים לשפה בפייתון (וקלים להרחבה לשפות נוספות) עם נקודות קוד להבהרה
# Example usage of the general_search tool
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("general_search", arguments={"query": "open source LLMs"})
print(result)לפני הרצת הלקוח, כדאי להבין מה השרת עושה. קובץ server.py מממש את שרת ה-MCP, חושף כלים לחיפוש באינטרנט, חדשות, מוצרים ושאלות ותשובות באמצעות שילוב עם SerpAPI. הוא מטפל בבקשות נכנסות, מנהל קריאות API, מפרש תגובות ומחזיר תוצאות מובנות ללקוח.
ניתן לעיין במימוש המלא ב-server.py.
הנה דוגמה קצרה לאופן שבו השרת מגדיר ומרשם כלי:
# server.py (excerpt)
from mcp.server import MCPServer, Tool
async def general_search(query: str):
# ...implementation...
server = MCPServer()
server.add_tool(Tool("general_search", general_search))
if __name__ == "__main__":
server.run()- שילוב API חיצוני: מדגים טיפול מאובטח במפתחות API ובבקשות חיצוניות
- פרסור נתונים מובנים: מראה כיצד להמיר תגובות API לפורמטים ידידותיים ל-LLM
- טיפול בשגיאות: טיפול יציב בשגיאות עם רישום מתאים
- לקוח אינטראקטיבי: כולל גם בדיקות אוטומטיות וגם מצב אינטראקטיבי לבדיקות
- ניהול הקשר: מנצל את MCP Context לרישום ומעקב אחר בקשות
לפני שתתחילו, ודאו שהסביבה שלכם מוגדרת כראוי על ידי ביצוע השלבים הבאים. זה יבטיח שכל התלויות מותקנות ומפתחות ה-API מוגדרים נכון לפיתוח ובדיקות חלקות.
- Python 3.8 ומעלה
- מפתח SerpAPI (הרשמו ב-SerpAPI - יש שכבת חינם)
כדי להתחיל, בצעו את השלבים הבאים להגדרת הסביבה:
- התקינו את התלויות באמצעות uv (מומלץ) או pip:
# Using uv (recommended)
uv pip install -r requirements.txt
# Using pip
pip install -r requirements.txt- צרו קובץ
.envבשורש הפרויקט עם מפתח SerpAPI שלכם:
SERPAPI_KEY=your_serpapi_key_here
שרת MCP לחיפוש באינטרנט הוא הרכיב המרכזי החושף כלים לחיפוש באינטרנט, חדשות, מוצרים ושאלות ותשובות באמצעות שילוב עם SerpAPI. הוא מטפל בבקשות נכנסות, מנהל קריאות API, מפרש תגובות ומחזיר תוצאות מובנות ללקוח.
ניתן לעיין במימוש המלא ב-server.py.
להפעלת שרת ה-MCP, השתמשו בפקודה הבאה:
python server.pyהשרת ירוץ כשרת MCP מבוסס stdio שאליו הלקוח יכול להתחבר ישירות.
הלקוח (client.py) תומך בשני מצבים לאינטראקציה עם שרת ה-MCP:
- מצב רגיל: מריץ בדיקות אוטומטיות שבודקות את כל הכלים ומוודאות את תגובותיהם. זה שימושי לבדיקות מהירות שהשרת והכלים פועלים כמצופה.
- מצב אינטראקטיבי: מפעיל ממשק מבוסס תפריט שבו ניתן לבחור ולהפעיל כלים ידנית, להזין שאילתות מותאמות ולראות תוצאות בזמן אמת. אידיאלי לחקירת יכולות השרת וניסויים עם קלטים שונים.
ניתן לעיין במימוש המלא ב-client.py.
להרצת הבדיקות האוטומטיות (השרת יופעל אוטומטית):
python client.pyאו להרצה במצב אינטראקטיבי:
python client.py --interactiveישנן דרכים שונות לבדוק ולהתממשק עם הכלים שהשרת מספק, בהתאם לצרכים ולזרימת העבודה שלכם.
ניתן גם לבנות סקריפטים מותאמים לבדיקה באמצעות MCP Python SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def test_custom_query():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
# Call tools with your custom parameters
result = await session.call_tool("general_search",
arguments={"query": "your custom query"})
# Process the resultבהקשר זה, "סקריפט בדיקה" הוא תוכנית פייתון מותאמת שאתם כותבים כדי לפעול כלקוח לשרת MCP. במקום להיות בדיקת יחידה פורמלית, סקריפט זה מאפשר להתחבר לשרת באופן תכנותי, לקרוא לכל אחד מהכלים עם פרמטרים שתבחרו, ולבדוק את התוצאות. גישה זו שימושית ל:
- פרוטוטייפינג וניסויים עם קריאות לכלים
- אימות תגובות השרת לקלטים שונים
- אוטומציה של קריאות חוזרות לכלים
- בניית זרימות עבודה או אינטגרציות משלכם מעל שרת ה-MCP
ניתן להשתמש בסקריפטים כדי לנסות שאילתות חדשות במהירות, לאבחן התנהגות כלים, או אפילו כנקודת התחלה לאוטומציה מתקדמת יותר. להלן דוגמה לשימוש ב-MCP Python SDK ליצירת סקריפט כזה:
ניתן להשתמש בכלים הבאים שמספק השרת לביצוע סוגי חיפושים ושאילתות שונים. כל כלי מתואר להלן עם הפרמטרים שלו ודוגמת שימוש.
חלק זה מספק פרטים על כל כלי זמין ופרמטריו.
מבצע חיפוש כללי באינטרנט ומחזיר תוצאות מעוצבות.
כיצד לקרוא לכלי זה:
ניתן לקרוא ל-general_search מתוך הסקריפט שלכם באמצעות MCP Python SDK, או אינטראקטיבית דרך Inspector או מצב הלקוח האינטראקטיבי. הנה דוגמת קוד עם ה-SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_general_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("general_search", arguments={"query": "latest AI trends"})
print(result)כחלופה, במצב אינטראקטיבי, בחרו general_search מהתפריט והזינו את השאילתה כשמתבקש.
פרמטרים:
query(מחרוזת): שאילתת החיפוש
דוגמת בקשה:
{
"query": "latest AI trends"
}מחפש מאמרי חדשות עדכניים הקשורים לשאילתה.
כיצד לקרוא לכלי זה:
ניתן לקרוא ל-news_search מתוך הסקריפט שלכם באמצעות MCP Python SDK, או אינטראקטיבית דרך Inspector או מצב הלקוח האינטראקטיבי. הנה דוגמת קוד עם ה-SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_news_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("news_search", arguments={"query": "AI policy updates"})
print(result)כחלופה, במצב אינטראקטיבי, בחרו news_search מהתפריט והזינו את השאילתה כשמתבקש.
פרמטרים:
query(מחרוזת): שאילתת החיפוש
דוגמת בקשה:
{
"query": "AI policy updates"
}מחפש מוצרים התואמים לשאילתה.
כיצד לקרוא לכלי זה:
ניתן לקרוא ל-product_search מתוך הסקריפט שלכם באמצעות MCP Python SDK, או אינטראקטיבית דרך Inspector או מצב הלקוח האינטראקטיבי. הנה דוגמת קוד עם ה-SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_product_search():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("product_search", arguments={"query": "best AI gadgets 2025"})
print(result)כחלופה, במצב אינטראקטיבי, בחרו product_search מהתפריט והזינו את השאילתה כשמתבקש.
פרמטרים:
query(מחרוזת): שאילתת חיפוש המוצר
דוגמת בקשה:
{
"query": "best AI gadgets 2025"
}מקבל תשובות ישירות לשאלות ממנועי חיפוש.
כיצד לקרוא לכלי זה:
ניתן לקרוא ל-qna מתוך הסקריפט שלכם באמצעות MCP Python SDK, או אינטראקטיבית דרך Inspector או מצב הלקוח האינטראקטיבי. הנה דוגמת קוד עם ה-SDK:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def run_qna():
server_params = StdioServerParameters(
command="python",
args=["server.py"],
)
async with stdio_client(server_params) as (reader, writer):
async with ClientSession(reader, writer) as session:
await session.initialize()
result = await session.call_tool("qna", arguments={"question": "what is artificial intelligence"})
print(result)כחלופה, במצב אינטראקטיבי, בחרו qna מהתפריט והזינו את השאלה כשמתבקש.
פרמטרים:
question(מחרוזת): השאלה למציאת תשובה
דוגמת בקשה:
{
"question": "what is artificial intelligence"
}חלק זה מספק קטעי קוד והפניות למימושי השרת והלקוח.
ראו את server.py ו-client.py לפרטי מימוש מלאים.
# Example snippet from server.py:
import os
import httpx
# ...existing code...לפני שתתחילו לבנות, הנה כמה מושגים מתקדמים חשובים שיופיעו לאורך הפרק. הבנתם תעזור לכם לעקוב, גם אם אתם חדשים בהם:
- אורקסטרציה של כלים מרובים: משמעות הדבר הפעלת מספר כלים שונים (כמו חיפוש באינטרנט, חדשות, מוצרים ושאלות ותשובות) בתוך שרת MCP יחיד. זה מאפשר לשרת שלכם לטפל במגוון משימות, לא רק באחת.
- ניהול מגבלות קצב API: APIs רבים (כמו SerpAPI) מגבילים כמה בקשות אפשר לבצע בפרק זמן מסוים. קוד טוב בודק מגבלות אלו ומטפל בהן בצורה חלקה, כדי שהאפליקציה לא תקרוס אם תגיע למגבלה.
- פרסור נתונים מובנים: תגובות API לעיתים מורכבות ומקוננות. המושג מתייחס להפיכת תגובות אלו לפורמטים נקיים וקלים לשימוש, ידידותיים ל-LLM או תוכניות אחרות.
- התאוששות משגיאות: לפעמים דברים משתבשים — אולי הרשת נופלת, או ה-API לא מחזיר את מה שציפיתם. התאוששות משגיאות פירושה שהקוד שלכם יכול להתמודד עם הבעיות האלו ולספק משוב שימושי, במקום לקרוס.
- אימות פרמטרים: זהו תהליך בדיקת כל הקלטים לכלים שלכם כדי לוודא שהם נכונים ובטוחים לשימוש. כולל הגדרת ערכי ברירת מחדל ווידוא סוגי הנתונים, מה שעוזר למנוע באגים ובלבול.
חלק זה יעזור לכם לאבחן ולפתור בעיות נפוצות שעשויות להתרחש בעבודה עם שרת MCP לחיפוש באינטרנט. אם תיתקלו בשגיאות או בהתנהגות לא צפויה, חלק פתרון הבעיות הזה מספק פתרונות לבעיות הנפוצות ביותר. עברו על הטיפים לפני שתפנו לעזרה נוספת — הם לרוב פותרים בעיות במהירות.
בעת עבודה עם שרת MCP לחיפוש באינטרנט, ייתכן שתיתקלו מדי פעם בבעיות — זה נורמלי בפיתוח עם APIs חיצוניים וכלים חדשים. חלק זה מספק פתרונות מעשיים לבעיות הנפוצות ביותר, כדי שתוכלו לחזור לעבודה במהירות. אם נתקלתם בשגיאה, התחילו כאן: הטיפים הבאים מתייחסים לבעיות שהמשתמשים נתקלים בהן לעיתים קרובות ויכולים לעזור לפתור את הבעיה ללא צורך בעזרה נוספת.
להלן כמה מהבעיות השכיחות ביותר, יחד עם הסברים ברורים ושלבים לפתרונן:
-
חסר SERPAPI_KEY בקובץ .env
- אם אתם רואים את השגיאה
SERPAPI_KEY environment variable not found, זה אומר שהאפליקציה שלכם לא מוצאת את מפתח ה-API הדרוש לגישה ל-SerpAPI. כדי לתקן זאת, צרו קובץ בשם.envבשורש הפרויקט (אם הוא לא קיים) והוסיפו שורה כמוSERPAPI_KEY=your_serpapi_key_here. החליפו אתyour_serpapi_key_hereבמפתח האמיתי שלכם מאתר SerpAPI.
- אם אתם רואים את השגיאה
-
שגיאות מודול לא נמצא
- שגיאות כמו
ModuleNotFoundError: No module named 'httpx'מצביעות על כך שחבילה דרושה בפייתון חסרה. זה קורה בדרך כלל אם לא התקנתם את כל התלויות. כדי לפתור זאת, הריצוpip install -r requirements.txtבטרמינל שלכם להתקנת כל מה שהפרויקט צריך.
- שגיאות כמו
-
בעיות חיבור
- אם אתם מקבלים שגיאה כמו
Error during client execution, זה לרוב אומר שהלקוח לא מצליח להתחבר לשרת, או שהשרת לא רץ כמצופה. בדקו ששני הלקוח והשרת הם בגרסאות תואמות, ושהקובץserver.pyקיים ורץ בתיקייה הנכונה. הפעלה מחדש של השרת והלקוח יכולה לעזור גם כן.
- אם אתם מקבלים שגיאה כמו
-
שגיאות SerpAPI
- אם מופיעה השגיאה
Search API returned error status: 401, זה אומר שמפתח ה-SerpAPI שלכם חסר, שגוי או פג תוקף. עברו ללוח הבקרה של SerpAPI, וודאו את המפתח שלכם, ועדכנו את קובץ.envבמידת הצורך. אם המפתח נכון ועדיין מופיעה השגיאה, בדקו אם שכבת החינם שלכם נגמרה.
- אם מופיעה השגיאה
ברירת המחדל, האפליקציה רושמת רק מידע חשוב. אם תרצו לראות פרטים נוספים על מה שקורה (למשל לאבחון בעיות מורכבות), תוכלו להפעיל את מצב DEBUG. זה יציג הרבה יותר מידע על כל שלב שהאפליקציה מבצעת.
דוגמה: פלט רגיל
2025-06-01 10:15:23,456 - __main__ - INFO - Calling general_search with params: {'query': 'open source LLMs'}
2025-06-01 10:15:24,123 - __main__ - INFO - Successfully called general_search
GENERAL_SEARCH RESULTS:
... (search results here) ...
דוגמה: פלט DEBUG
2025-06-01 10:15:23,456 - __main__ - INFO - Calling general_search with params: {'query': 'open source LLMs'}
2025-06-01 10:15:23,457 - httpx - DEBUG - HTTP Request: GET https://serpapi.com/search ...
2025-06-01 10:15:23,458 - httpx - DEBUG - HTTP Response: 200 OK ...
2025-06-01 10:15:24,123 - __main__ - INFO - Successfully called general_search
GENERAL_SEARCH RESULTS:
... (search results here) ...
שימו לב שמצב DEBUG כולל שורות נוספות על בקשות HTTP, תגובות ופרטים פנימיים אחרים. זה יכול להיות מאוד מועיל לפתרון בעיות.
כדי להפעיל את מצב DEBUG, הגדר את רמת הלוג ל-DEBUG בראש הקובץ client.py או server.py שלך:
# At the top of your client.py or server.py
import logging
logging.basicConfig(
level=logging.DEBUG, # Change from INFO to DEBUG
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)כתב ויתור:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית Co-op Translator. למרות שאנו שואפים לדיוק, יש לקחת בחשבון כי תרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. המסמך המקורי בשפת המקור שלו נחשב למקור הסמכותי. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אנושי. אנו לא נושאים באחריות לכל אי-הבנה או פרשנות שגויה הנובעת משימוש בתרגום זה.