• בלוג
  • יומי
  • איך לחבר את השירות שלכם לסוכן חכם

איך לחבר את השירות שלכם לסוכן חכם

28/04/2026

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

הבעיה עם שרתי MCP היא שמאוד קשה לתאר למודל מה היכולות של השירות צד שלישי אליו ה MCP מחבר. בנוסף שרתי MCP הם ממש תוכנות ודורשים כניסה לקוד כדי לקרוא או לשנות אותם. את שני האתגרים האלה התעשייה מנסה לתקן בחודשים האחרונים בעזרת מנגנון שנקרא Skills. בואו נראה איך זה עובד באמצעות השוואה בין Skill ל MCP וכך נענה על השאלה "איך לחבר את השירות שלכם לסוכן חכם".

1. דוגמה: חיבור לדפדפן עם MCP

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

אני מתחיל עם שרת ה MCP והקוד שלו שזמין בריפו הזה:

https://github.com/microsoft/playwright/tree/main/packages/playwright-core/src/tools/mcp

נקודת הכניסה לשרת היא הקובץ program.ts עם השורה:

await mcpServer.start(factory, config.server);

הקובץ היותר מעניין הוא backend/tools.ts שמחזיק את רשימת הכלים:

export const browserTools: Tool<any>[] = [
  ...common,
  ...config,
  ...console,
  ...cookies,
  ...devtools,
  ...dialogs,
  ...evaluate,
  ...files,
  ...form,
  ...keyboard,
  ...mouse,
  ...navigate,
  ...network,
  ...pdf,
  ...route,
  ...runCode,
  ...screenshot,
  ...snapshot,
  ...storage,
  ...tabs,
  ...tracing,
  ...verify,
  ...video,
  ...wait,
  ...webstorage,
];

וכל כלי מוגדר על ידי הפונקציה defineTabTool לדוגמה:

const snapshot = defineTabTool({
  capability: 'core',
  schema: {
    name: 'browser_snapshot',
    title: 'Page snapshot',
    description: 'Capture accessibility snapshot of the current page, this is better than screenshot',
    inputSchema: z.object({
      target: z.string().optional().describe(elementTargetDescription),
      filename: z.string().optional().describe('Save snapshot to markdown file instead of returning it in the response.'),
      depth: z.number().optional().describe('Limit the depth of the snapshot tree'),
      boxes: z.boolean().optional().describe('Include each element\'s bounding box as [box=x,y,width,height] in the snapshot'),
    }),
    type: 'readOnly',
  },

  handle: async (tab, params, response) => {
    let resolved: { locator: playwright.Locator | undefined, resolved: string } = { locator: undefined, resolved: '' };
    if (params.target)
      resolved = await tab.targetLocator({ target: params.target });
    response.setIncludeFullSnapshot(params.filename, resolved.locator, params.depth, params.boxes);
  },
});

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

    {
      "name": "browser_snapshot",
      "description": "Capture accessibility snapshot of the current page, this is better than screenshot",
      "inputSchema": {
        "type": "object",
        "properties": {
          "filename": {
            "description": "Save snapshot to markdown file instead of returning it in the response.",
            "type": "string"
          },
          "depth": {
            "description": "Limit the depth of the snapshot tree",
            "type": "number"
          }
        },
        "$schema": "https://json-schema.org/draft/2020-12/schema",
        "additionalProperties": false
      },
      "annotations": {
        "title": "Page snapshot",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },

זה תיאור מאוד מפורט שמציג מה אפשר לעשות עם הכלי, ויש שיגידו יותר מדי מפורט. כשטענתי את שרת ה MCP הזה בתוך קופיילוט הוא הוסיף כ-3,500 טוקנים לכל בקשה (לא רק כלי ה snapshot, אלא ה MCP כולו).

מה זה אומר?

  1. בשביל להבין איך לדבר עם שירות צד שלישי המודל צריך לקרוא JSON מפורט שמציג את כל היכולות של אותו חיבור.

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

2. אז איך זה עובד עם Skill?

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

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

  1. סקיל בנוי ממספר קבצי טקסט והסוכן באופן יזום טוען את הקבצים שהוא צריך - זה אומר שאנחנו לא צריכים להעמיס את התיאור של כל אפשרויות החיבור בקונטקסט. כשהסוכן יזהה שהוא צריך מידע נוסף על אפשרות חיבור מסוימת הוא יטען את הקובץ המתאים.

  2. פורמט טקסטואלי הוא פחות בזבזני מ JSON.

בדוגמה של ה snapshot שראינו קודם החלק הרלוונטי מקובץ ה Skill הוא:

  Snapshots
  After each command, playwright-cli provides a snapshot of the current browser state.

  > playwright-cli goto https://example.com
  ### Page
  - Page URL: https://example.com/
  - Page Title: Example Domain
  ### Snapshot
  [Snapshot](.playwright-cli/page-2026-02-14T19-22-42-679Z.yml)
  You can also take a snapshot on demand using playwright-cli snapshot command. All the options below can be combined as needed.

  # default - save to a file with timestamp-based name
  playwright-cli snapshot

  # save to file, use when snapshot is a part of the workflow result
  playwright-cli snapshot --filename=after-click.yaml

  # snapshot an element instead of the whole page
  playwright-cli snapshot "#main"

  # limit snapshot depth for efficiency, take a partial snapshot afterwards
  playwright-cli snapshot --depth=4
  playwright-cli snapshot e34

  # include each element's bounding box as [box=x,y,width,height]
  playwright-cli snapshot --boxes

אפשר למצוא את קובץ הסקיל המלא בגיטהאב שלהם:

https://github.com/microsoft/playwright-cli/blob/main/skills/playwright-cli/SKILL.md

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

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

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