מדריך MCP בעברית

פרק 13

בניית שרת קטן

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

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

#בחירת סביבת פיתוח וספריות (SDKs)

פרוטוקול MCP נתמך רשמית בשתי שפות מרכזיות:

  • Python (באמצעות FastMCP או ספריית ה-SDK הרשמית): הבחירה המהירה והנוחה ביותר לשרתים קטנים, ניתוח נתונים ואינטגרציות AI.
  • TypeScript / Node.js (באמצעות @modelcontextprotocol/sdk): הבחירה המועדפת למערכות מבוססות ווב, שרתי צוות ומיקרו-שירותים.

#אפשרות 1: בניית שרת ב-Python באמצעות FastMCP

חבילת fastmcp מספקת ממשק נקי ומודרני המבוסס על Decorators ו-Type Hints:

pip install fastmcp

יצירת קובץ השרת server.py:

from fastmcp import FastMCP

# יצירת מופע השרת עם שם מזהה
mcp = FastMCP("CompanyInternalTools")

@mcp.tool()
def get_user_subscription(user_email: str) -> str:
    """
    Fetch the subscription tier and billing status for a customer by their email address.
    Use when the user asks about account status, plan limits, or billing details.
    """
    # כאן מבצעים קריאה לבסיס הנתונים או ל-API הפנימי
    if not user_email or "@" not in user_email:
        return "Error: Invalid email address provided."
    
    # דוגמת נתונים המוחזרים למודל
    return f"Customer {user_email}: Plan = Enterprise, Status = Active, Seats = 25"

if __name__ == "__main__":
    mcp.run()

#אפשרות 2: בניית שרת ב-TypeScript / Node.js עם ה-SDK הרשמי

ה-SDK הרשמי של TypeScript מאפשר להגדיר סכמות קלט קשיחות באמצעות ספריית zod:

npm init -y
npm install @modelcontextprotocol/sdk zod

יצירת קובץ השרת server.js:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

// יצירת שרת MCP חדש
const server = new McpServer({
  name: "internal-analytics",
  version: "1.0.0",
});

// הגדרת כלי חדש עם סכמת קלט מדויקת
server.tool(
  "query_active_users",
  "Retrieve the count of active users within a specified date range and platform.",
  {
    days: z.number().int().min(1).max(90).describe("Number of past days to analyze (1-90)"),
    platform: z.enum(["web", "ios", "android", "all"]).describe("Target client platform"),
  },
  async ({ days, platform }) => {
    // לוגיקת שליפת הנתונים
    const simulatedCount = days * 1420;
    return {
      content: [
        {
          type: "text",
          text: `Active users on platform '${platform}' over the last ${days} days: ${simulatedCount}`,
        },
      ],
    };
  }
);

// חיבור לתעבורת stdio
const transport = new StdioServerTransport();
await server.connect(transport);

#עקרונות תכנון שחובה ליישם בכל כלי

  1. שם יציב וברור (name): השתמשו באותיות קטנות ובקווים תחתונים (למשל fetch_customer_orders). הימנעו מתווים מיוחדים או רווחים.
  2. תיאור מילולי מקיף (description): הסבירו בדיוק מתי המודל צריך לבחור בכלי זה ומה טיב המידע שיוחזר.
  3. הגדרת סכמת קלט קשיחה (inputSchema): הגדירו טיפוסים, ערכי ברירת מחדל ושדות חובה. סכמה לקויה גורמת למודל להמציא ארגומנטים (Hallucination).
  4. טיפול בשגיאות בתוך התשובה: אל תגרמו לתהליך השרת לקרוס בעת שגיאה עסקית (כמו משתמש שלא נמצא). החזירו הודעת שגיאה מסודרת במערך ה-content כדי שהמודל יוכל להסביר למשתמש מה קרה.
  5. הגנה על סודות ופרטיות: לעולם אל תחזירו מפתחות API, סיסמאות או מידע אישי לא מוצפן בפלט של כלי. פלט הכלי נשמר בהיסטוריית הסשן ומועבר למודל.

#בדיקת השרת עם ה-Inspector הרשמי

לפני שאתם מחברים את השרת לסוכן מלא (Claude Code או Grok CLI), תוכלו לבדוק את הכלים והתגובות שלו בסביבה גרפית מבודדת באמצעות MCP Inspector:

# בדיקת שרת Node.js
npx @modelcontextprotocol/inspector node server.js

# בדיקת שרת Python
npx @modelcontextprotocol/inspector python server.py

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