יום 15 - שימוש בכלים משרתי MCP
נסיים את החלק על שימוש בכלים בסקירה קצרה של שרתי MCP וחיבור הסוכנים שלנו אליהם.
1. מהם שרתי MCP
ראינו שאנחנו מגדירים כלים לסוכן באמצעות העברת מערך כלים, וכלי הוא בעצם פונקציה:
agent = Agent(
name="Assistant",
tools=[read_shells_file],
instructions="Answer questions about the file /etc/shells",
)
מה קורה אם אנחנו רוצים לשתף כלים עם אחרים או לקחת כלים שאחרים משתפים? בתוכנית פייתון רגילה הייתי אומר שבשביל לשתף "כלי", כלומר פונקציה, נצטרך להגדיר חבילת פייתון, להעלות לרשת ומישהו אחר יתקין את החבילה וישתמש ב import כדי להגיע לפונקציה.
הבעיה עם סוכנים היא שלא כולם כותבים את הסוכנים שלהם בפייתון - יש ספריות סוכנים בטייפסקריפט, ברובי, ב Java, באליקסיר ובעצם בכל שפה שאתם יכולים לחשוב עליה מישהו כבר כתב ספריית סוכנים. לכן אם ה"כלי" שאני רוצה לשתף יהיה פונקציית פייתון הרבה אנשים לא יוכלו להשתמש בו.
פרוטוקול MCP הוא פרוטוקול לשיתוף "כלים" בין ספריות סוכנים שמאפשר התאמה של הכלים לכל השפות. הפרוטוקול מגדיר:
איך נראה "שרת", שזה בעצם אוסף של כלים.
איך ניגשים לאותו שרת - דרך הפעלה משורת הפקודה או דרך הרשת.
איך מבררים מהשרת איזה כלים יש בו.
איך מבררים איזה פרמטר כל כלי צריך.
ספריית OpenAI Agents SDK יודעת להתחבר לשרתי MCP ולתת לסוכן גישה לכלים שמאוחסנים על שרתים אלה.
2. איך לחבר סוכן לשרת MCP
ניקח לדוגמה שרת MCP בשם fetch שמשתף כלי אחד - הכלי נקרא fetch והוא מקבל URL ומושך את תוכנו מהאינטרנט כדי שהסוכן יוכל להשתמש במידע. השרת נמצא בכתובת:
https://remote.mcpservers.org/fetch/mcp
וכל אחד יכול להתחבר אליו. נניח שיש לי סוכן שצריך להביא מידע מהאינטרנט למשל מ ynet, כלומר אולי אני רוצה להריץ את הפרומפט הבא:
result = await Runner.run(agent, "Summarize the top stories from ynet today. URL is: https://www.ynet.co.il/news/category/184")
לסוכן כזה אני יכול להעביר Tool שמביא דף מהאינטרנט שאני כותב, למשל באמצעות requests, או להשתמש בכלי fetch מתוך שרת ה MCP הציבורי שראינו קודם. מאחר ואנחנו כבר יודעים לכתוב Tool בעצמנו בואו נראה את הקוד שמתחבר לשרת ה MCP הציבורי - ומסתבר שהוא לא מסובך:
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServer, MCPServerStreamableHttp
from agents.model_settings import ModelSettings
async def run(mcp_server: MCPServer):
agent = Agent(
name="Assistant",
instructions="Use the tools to answer the questions.",
mcp_servers=[mcp_server],
model_settings=ModelSettings(tool_choice="required"),
)
result = await Runner.run(agent, "Summarize the top stories from ynet today. URL is: https://www.ynet.co.il/news/category/184")
print(result.to_input_list())
print(result.final_output)
async def main():
async with MCPServerStreamableHttp(
name="Streamable HTTP Python Server",
params={
"url": "https://remote.mcpservers.org/fetch/mcp",
},
) as server:
await run(server)
if __name__ == "__main__":
asyncio.run(main())
פונקציית main יוצרת את החיבור לשרת ה mcp ומעבירה אותו לפונקציה run. הפונקציה run מעבירה את השרת לסוכן ושולחת את השאילתה. התוצאה היא רשימת הכותרות מ ynet שהסוכן מוריד מהאינטרנט.
3. עכשיו אתם
בעמוד הזה:
https://github.com/modelcontextprotocol/servers
תוכלו למצוא המון שרתי MCP מעניינים עבור הסוכנים שלכם. מצאו שרת שמעניין אתכם וכתבו תוכנית פייתון שממחישה איך הסוכן מתחבר לאוסף הכלים בשרת ה MCP שבחרתם.