בטח, בשמחה. הנה קובץ תרגילים מובנה לשיעור 5.6, עם דגש על יישומים מעשיים ורלוונטיות לשוק הישראלי, בהתאם למבנה ולדרישות שצוינו.

<div dir="rtl" lang="he">

# תרגילים - שיעור 5.6: MCP (Model Context Protocol)

## מידע כללי
- **שיעור:** 5.6 - MCP - חיבור כלים ל-LLM, שרתי MCP, SDK
- **סוג השיעור:** מעשי (4 שעות)
- **הערה:** התרגילים מדורגים מפשוט למורכב. תרגילים 1-4 מיועדים לביצוע בזמן השיעור, תרגיל 5 הוא משימת בית.

---

## תרגיל 1: הכרות עם MCP ואימות הבנה (כיתתי - 20 דקות)
תרגיל זה נועד לוודא שהבנתם את מושגי היסוד של MCP ואת הארכיטקטורה שלו. ענו על השאלות הבאות במחברת או במסמך טקסט.

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

### שאלות:
1.  **הגדרת מושגים:** הסבירו במילים שלכם מה תפקידו של כל אחד מהרכיבים בארכיטקטורת MCP:
    *   **Host:**
    *   **Client:**
    *   **Server:**
2.  **תוכן ב-MCP:** מה ההבדל המהותי בין `Tool` ל-`Resource` ב-MCP? תנו דוגמה לכל אחד מהם בהקשר של חברת פינטק ישראלית.
3.  **MCP מול API:** תארו תרחיש עסקי בחברת Monday.com שבו שימוש ב-MCP יהיה עדיף על חשיפת API מסורתי למודל השפה. הסבירו מדוע. (רמז: חשבו על הרשאות, מורכבות, ואיך המודל "רואה" את הכלים).
4.  **שרטוט ארכיטקטורה:** שרטטו דיאגרמה פשוטה המתארת כיצד Claude Desktop (בתור Client) מתחבר לשרת MCP שבניתם (בתור Server), אשר מספק גישה (בתור Host) לכלי הבודק את שערי המניות העדכניים בבורסה בתל אביב.

---

## תרגיל 2: התקנת שרת MCP קיים - Filesystem (יחיד/זוגות - 25 דקות)
בואו נתנסה בהפעלת שרת MCP פשוט שמבוסס על קבצים במערכת ההפעלה. זה יעזור לנו להבין איך Client כמו Claude Desktop "מגלה" ומתקשר עם המשאבים שהשרת חושף.

### הנחיות:
1.  צרו תיקייה חדשה במחשב בשם `my_mcp_filesystem`.
2.  בתוך התיקייה, צרו שתי תתי-תיקיות: `tools` ו-`resources`.
3.  בתוך `resources`, צרו קובץ טקסט בשם `miluim_policy.md` והדביקו בו את הטקסט הבא:
    ```markdown
    # נוהל שירות מילואים פעיל - חברת "ישראטק"

    חברת "ישראטק" מכירה בחשיבות שירות המילואים ותומכת בעובדיה המשרתים.
    - עובד היוצא למילואים יקבל את מלוא שכרו מהחברה.
    - החברה תסייע בהשלמת פערים מקצועיים עם חזרתו של העובד.
    - ימי המילואים אינם נספרים כימי חופשה.
    ```
4.  התקינו את ספריית השרת באמצעות pip:
    ```bash
    pip install mcp-server-filesystem
    ```
5.  הריצו את השרת מהטרמינל, מתוך התיקייה `my_mcp_filesystem`:
    ```bash
    mcp-server-fs .
    ```
    הנקודה בסוף מסמנת שהשרת יפעל על התיקייה הנוכחית.
6.  פתחו את Claude Desktop, עברו להגדרות ה-Tools וחברו את השרת (הכתובת תופיע בטרמינל, לרוב `http://127.0.0.1:8000`).

### משימות חקירה:
1.  ודאו שה-Resource שנקרא `miluim_policy` מופיע ברשימת הכלים ב-Claude Desktop.
2.  שאלו את קלוד: "מהי מדיניות החברה לגבי מילואים?". ודאו שהוא משתמש במשאב שיצרתם כדי לענות.
3.  בתיקיית ה-`tools`, צרו קובץ פייתון ריק בשם `calculate_nis_bonus.py`. רעננו את החיבור ב-Claude Desktop. מה אתם רואים? האם הכלי ניתן להפעלה? הסבירו מדוע.

---

## תרגיל 3: בניית שרת FastMCP בסיסי (יחיד - 30 דקות)
עכשיו ניצור שרת MCP אמיתי עם כלי פונקציונלי באמצעות ספריית `FastMCP`. ניצור כלי רלוונטי לשוק הישראלי: בדיקת תקינות של מספר ח.פ (חברה פרטית) / ע.מ (עוסק מורשה).

### הנחיות:
1.  הקימו סביבה וירטואלית והתקינו את הספריות הדרושות:
    ```bash
    pip install "fastmcp[server]" uvicorn
    ```
2.  צרו קובץ פייתון חדש, לדוגמה `israeli_tools_server.py`.
3.  העתיקו את קוד ההתחלה הבא לקובץ שלכם.

### קוד התחלה:
```python
from fastmcp import McpServer
from fastapi import HTTPException

app = McpServer(
    title="שרת כלים ישראליים",
    description="שרת המספק כלים שימושיים לשוק הישראלי."
)

@app.tool()
def validate_israeli_business_id(business_id: str) -> dict:
    """
    Validates an Israeli business ID (H.P. or O.M.).
    It checks if the ID has 9 digits and if the check digit is correct.
    :param business_id: The 9-digit Israeli business ID string.
    :return: A dictionary with 'valid' (boolean) and a 'message'.
    """
    # --- השלימו את הלוגיקה כאן ---
    # 1. ודאו שהקלט הוא מחרוזת של 9 ספרות. אם לא, החזירו הודעת שגיאה.
    # 2. המירו את המחרוזת לספרות.
    # 3. יישמו את אלגוריתם "ספרת ביקורת" (חפשו בגוגל "אלגוריתם ספרת ביקורת תעודת זהות").
    #    האלגוריתם זהה עבור ח.פ.
    # 4. החזירו מילון עם התוצאה. למשל: {'valid': True, 'message': 'Business ID is valid.'}
    pass # מחקו שורה זו

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
```

### משימות:
1.  השלימו את הלוגיקה של הפונקציה `validate_israeli_business_id`.
2.  הריצו את השרת וחברו אותו ל-Claude Desktop.
3.  בדקו את פעולת הכלי עם קלוד. נסו לשאול:
    *   "האם מספר הח.פ. 515545532 הוא תקין?" (אמור להיות תקין)
    *   "בדוק בבקשה את העוסק מורשה 123456789" (אמור להיות לא תקין)
    *   "512345678, תקין?"

### רמז:
אלגוריתם ספרת ביקורת: הכפילו כל ספרה (למעט ספרת הביקורת) במשקל שלה (1,2,1,2...). סכמו את התוצאות (אם תוצאת הכפל דו-ספרתית, סכמו את שתי הספרות). הסכום הכולל צריך להתחלק ב-10 ללא שארית.

---

## תרגיל 4: הרחבת שרת ה-MCP (יחיד/זוגות - 25 דקות)
נרחיב את השרת שבנינו בתרגיל 3 עם יכולת נוספת. בחרו **אחת** משתי המשימות הבאות.

### הנחיות:
הוסיפו את הקוד החדש לקובץ `israeli_tools_server.py` מהתרגיל הקודם.

### משימה א': הוספת כלי חדש
הוסיפו כלי חדש בשם `get_interest_rate_boi` שמחזיר את ריבית בנק ישראל העדכנית. מכיוון שאין לנו גישה קלה ל-API בזמן אמת, נחזיר ערך קבוע, אך נדאג שה-docstring יהיה ברור למודל.

```python
@app.tool()
def get_interest_rate_boi() -> dict:
    """
    Gets the current official interest rate from the Bank of Israel.
    :return: A dictionary with the rate and the last update date.
    """
    # In a real scenario, this would make an API call.
    # For this exercise, we return a mocked, hard-coded value.
    return {
        "rate_percent": 4.5,
        "last_update": "2026-05-10",
        "source": "Bank of Israel (Mock Data)"
    }
```

**בדיקה:** חברו מחדש ל-Claude ושאלו: "מהי ריבית בנק ישראל כרגע?".

### משימה ב': הוספת Resource
הוסיפו לשרת `Resource` המכיל מידע טקסטואלי על כללי הרגולציה לפתיחת עסק בישראל.

```python
REGULATIONS_INFO = """
# תקציר רגולציה לפתיחת עסק בישראל

1.  **רישום ברשויות:** יש להירשם במע"מ, מס הכנסה וביטוח לאומי.
2.  **צורת התאגדות:** ניתן לבחור בין עוסק פטור, עוסק מורשה או חברה בע"מ.
3.  **רישיון עסק:** עסקים מסוימים (כמו מסעדות) דורשים רישיון עסק מהרשות המקומית.
"""

@app.resource()
def israeli_business_regulations() -> str:
    """Provides a summary of regulations for opening a new business in Israel."""
    return REGULATIONS_INFO
```

**בדיקה:** חברו מחדש ל-Claude ושאלו: "מה אני צריך לדעת כדי לפתוח עסק בישראל?".

---

## תרגיל 5: משימת בית - שרת MCP לצורך עסקי ישראלי (בית - 60 דקות)
בתרגיל זה תתכננו ותבנו מאפס שרת MCP שלם עבור תרחיש עסקי.

### התרחיש:
אתם מפתחים בצוות ה-AI של חברת **Wix**. המשימה שלכם היא לבנות שרת MCP עבור ה-AI Assistant הפנימי, שמסייע לאנשי תמיכה טכנית לפתור בעיות של לקוחות במהירות. השרת יספק כלים לביצוע פעולות נפוצות על אתרי לקוחות.

### דרישות:
1.  **תכנון (10 דקות):** לפני כתיבת הקוד, ענו על השאלה הבאה בקובץ טקסט נפרד: מדוע במקרה זה עדיף לבנות שרת MCP עם כלים מוגדרים היטב, במקום לתת למודל גישה ישירה ל-API הפנימי של Wix המכיל מאות endpoints? (חשבו על ביטחון, פשטות, שליטה, ו"עומס קוגניטיבי" על המודל).

2.  **מימוש (50 דקות):**
    *   צרו קובץ פייתון חדש `wix_support_server.py`.
    *   בנו שרת `FastMCP` המממש **לפחות שלושה** כלים מהרשימה הבאה.
    *   **חשוב:** הכלים צריכים להחזיר מידע מדומה (mock data). אינכם צריכים להתחבר למערכות אמיתיות.
    *   **רשימת כלים לבחירה:**
        *   `get_site_details(site_id: str)`: מקבל מזהה אתר ומחזיר פרטים כמו שם האתר, תאריך יצירה, והאם הוא מחובר לדומיין פרימיום.
        *   `check_domain_status(domain_name: str)`: מקבל שם דומיין ומחזיר אם הוא פנוי, תפוס על ידי לקוח Wix, או תפוס חיצונית.
        *   `list_installed_apps(site_id: str)`: מחזיר רשימה של אפליקציות (למשל, Wix Stores, Wix Bookings) המותקנות באתר מסוים.
        *   `publish_site(site_id: str)`: "מפרסם" אתר ומחזיר הודעת הצלחה.
        *   `add_user_to_role(site_id: str, user_email: str, role: str)`: מוסיף משתמש כ"אדמין" או "עורך" לאתר ומחזיר אישור.

### הנחיות הגשה:
הגישו שני קבצים:
1.  `wix_support_server.py` - קוד השרת המלא.
2.  `design_choice.txt` - התשובה לשאלת התכנון.

**הגישו עד השיעור הבא.**

---

## קריטריונים להערכה
| קריטריון | ציון |
|---|---|
| תרגיל 3: מימוש נכון של לוגיקת הכלי | 20% |
| תרגיל 4: הרחבה פונקציונלית של השרת (כלי או משאב) | 20% |
| תרגיל 5: מימוש שרת מלא עם לפחות 3 כלים פונקציונליים (mock) | 30% |
| תרגיל 5: תשובה מנומקת ומעמיקה לשאלת התכנון | 15% |
| איכות הקוד: קריאות, docstrings ברורים, שימוש נכון ב-type hints | 15% |
| **סה"כ** | **100%** |

</div>