בעיית הממשק: "עֲרַל שְׂפָתַיִם"
"וַיֹּאמֶר מֹשֶׁה לִפְנֵי ה' הֵן אֲנִי עֲרַל שְׂפָתַיִם וְאֵיךְ יִשְׁמַע אֵלַי פַּרְעֹה" (שמות ו:ל)
משה מציג בעיה טכנית מובהקת: יש לו את הלוגיקה, את הכוח, את כל התוכן - אבל חסר לו ממשק יעיל לתקשורת עם פרעה. הוא לא מבקש להשתפר בנאום, לא מחפש קורס public speaking, ולא רוצה להפוך לדובר מפולפל. הפתרון שה' מציע הוא ארכיטקטורי לחלוטין:
"רְאֵה נְתַתִּיךָ אֱלֹהִים לְפַרְעֹה וְאַהֲרֹן אָחִיךָ יִהְיֶה נְבִיאֶךָ" (שמות ז:א)
במילים אחרות: משה יישאר ה-backend, החוכמה, הלוגיקה. אהרון יהיה ה-CLI (Command Line Interface) - ממשק פשוט, ישיר, ויעיל. לא GUI מפואר עם אנימציות, לא REST API עם documentation עבה, ולא MCP (Model Context Protocol) עם שכבות abstraction. ממשק שורת פקודה נקי ופשוט.
למה CLI? שלוש סיבות טכניות
1. Token Efficiency - חיסכון דרמטי בעומס
כשאתה משתמש ב-MCP או REST API, אתה משלם מחיר כבד בתקשורת:
MCP Request:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_plague",
"arguments": {
"plague_type": "blood",
"target": "egypt",
"intensity": "maximum",
"duration": "7_days",
"exemptions": ["goshen"]
}
}
}
Token count: ~150 tokens (כולל metadata, structure, JSON overhead)
לעומת CLI:
plague --type blood --target egypt --intensity max --duration 7d --exempt goshen
Token count: ~20 tokens
חיסכון של 86% בתקשורת! זה לא טריוויאלי כשאתה מפעיל 10 מכות, כל אחת עם multiple iterations. המתמטיקה פשוטה:
$$\text{Total Overhead} = N_{commands} \times (T_{MCP} - T_{CLI})$$
עבור 10 מכות עם 3-5 איטרציות כל אחת:
$$\text{Saved Tokens} = 40 \times (150 - 20) = 5,200 \text{ tokens}$$
זה הבדל בין לשלם \$0.52 ל-\$0.06 ב-GPT-4 pricing. כשאתה מדבר על production scale - זה critical.
2. Cognitive Load Reduction - פחות לחשוב עליו
פרעה לא צריך להבין:
- אילו endpoints קיימים
- מה הסכמת ה-JSON
- איך לעשות error handling
- מה המבנה של ה-response
הוא רק רואה:
Aaron: "שַׁלַּח אֶת עַמִּי"
Pharaoh: "לֹא"
[Plague executes]
פשוט. ישיר. אין cognitive overhead של protocol negotiation, schema validation, או API versioning. אהרון הוא wrapper פשוט סביב הלוגיקה של משה.
תיאוריית העומס הקוגניטיבי מראה שכל שכבת abstraction מוסיפה עומס מנטלי. CLI מצמצם את זה למינימום.
3. Pre-trained Advantage - LLMs כבר מכירים CLI
הסיבה שכלים כמו Claude Code עובדים כל כך טוב היא שכל ה-training data כבר מכיל אינסוף דוגמאות של CLI usage:
# LLMs saw millions of examples like this:
git commit -m "Fix bug"
docker run -d -p 8080:80 nginx
kubectl apply -f deployment.yaml
לעומת MCP שהוא protocol חדש יחסית עם פחות דוגמאות training. ה-model כבר "יודע" אינטואיטיבית איך CLI עובד. זה נותן לך:
- פחות errors
- יותר deterministic behavior
- קל יותר לעשות fine-tuning
והחשוב ביותר: אתה פשוט מצרף את --help ל-context והמודל מיד מבין את כל הפקודות. לא צריך tool definitions, לא צריך JSON schemas - המדריך עצמו הוא ה-documentation. זה כמו לתת לאהרון scroll אחד ולומר לו "קרא וזה הכל".
CLI vs MCP: השוואה ארכיטקטורית
בואו נשווה את שתי הגישות בהקשר משה-אהרון:
אופציה 1: MCP Architecture (לא נבחרה)
God ←→ [MCP Server] ←→ Moses ←→ [MCP Client] ←→ Aaron ←→ Pharaoh
בעיות:
- Protocol overhead: כל message צריך wrapping ב-JSON-RPC
- State management: מי מחזיק state? God? Moses?
- Error handling: מה קורה אם ה-connection נפסק באמצע מכה?
- Version compatibility: מה אם פרעה לא תומך ב-MCP 2.0?
אופציה 2: CLI Architecture (נבחרה!)
God → Moses (backend logic) → Aaron (CLI interface) → Pharaoh
יתרונות:
- Zero protocol overhead: אהרון פשוט מעביר פקודות
- Stateless: כל פקודה עצמאית
- Simple error handling: "לֹא שָׁמַע אֲלֵהֶם" = return code 1
- Universal compatibility: כולם מבינים דיבור ישיר
התורה מתארת זאת בצורה מדויקת:
"אַתָּה תְדַבֵּר אֵת כָּל אֲשֶׁר אֲצַוֶּךָּ וְאַהֲרֹן אָחִיךָ יְדַבֵּר אֶל פַּרְעֹה" (שמות ז:ב)
זו בדיוק ארכיטקטורת CLI:
1. Input: משה מקבל את הפקודה מה'
2. Processing: משה מעבד את הלוגיקה
3. Output: אהרון מציג את התוצאה (CLI output)
DOMGuard: מקרה בוחן מעולם האמיתי
ב-ARC, בנינו את DOMGuard - כלי שמונע מ-LLMs לבצע DOM manipulations מסוכנות בזמן אינטראקציה עם דפדפנים. הבחירה הארכיטקטורית? CLI over MCP.
למה לא MCP?
יכולנו לבנות MCP server שמציע tools כמו:
{
"name": "modify_dom",
"parameters": {
"selector": "string",
"action": "string",
"value": "string"
}
}
אבל זה היה מייצר בעיות:
- Security overhead: כל tool call צריך validation מורכב
- Token waste: protocol overhead בכל פעולה
- Debugging nightmare: קשה לעקוב אחרי JSON-RPC flows
- Integration complexity: כל client צריך לממש את ה-protocol
הפתרון: CLI עם Safety Rails
במקום זה, DOMGuard עובד כך:
# המודל יוצר CLI commands
domguard check "document.querySelector('#sensitive').value"
domguard sanitize "userInput" --context xss
domguard validate "domOperation" --policy strict
# DOMGuard מריץ את זה ב-sandbox ומחזיר:
# ✓ Safe | ✗ Blocked | ⚠ Warning
היתרונות המעשיים:
- 100% Deterministic:
- CLI commands תמיד מתנהגים אותו דבר
- אין protocol negotiation שיכול להשתבש
-
Debugging = בדיוק רואים מה נשלח
-
Token Reduction של 95%+:
MCP call: ~200 tokens (full JSON structure) CLI call: ~10 tokens (simple command)
בסביבת production עם אלפי בדיקות ליום, זה הבדל בין \$500 ל-\$25 בחודש.
- Pre-trained Models Love It:
- Claude/GPT כבר ראו מיליוני shell scripts
- הם "מבינים" אינטואיטיבית פקודות bash
-
פחות הזיות, ביצוע אמין יותר
-
Simple Integration:
python # Client code (כל שפה): import subprocess result = subprocess.run(['domguard', 'check', operation])
לא צריך MCP client library, version matching, או protocol implementation. יש בינארי מוכן - פשוט מורידים ומריצים.
- Natural Language Interface:
```
# מתייגים את המדריך פעם אחת:
domguard --help
# והסוכן כבר יודע:
User: "בדוק אם הפעולה הזו בטוחה"
Agent: domguard check "document.querySelector('#input').value"
```
עם MCP היית צריך לכתוב tool definition מפורש לכל פונקציה. עם CLI - המדריך הוא ה-schema.
השוואת ארכיטקטורות - מקרה אמיתי
קיבלנו את התוצאות הבאות בבדיקות beta:
| Metric | MCP Approach | CLI Approach (DOMGuard) |
|---|---|---|
| Avg tokens/operation | 187 | 12 |
| Response time | 245ms | 89ms |
| Error rate | 3.2% | 0.8% |
| Integration time | 4 hours | 5 minutes |
| Documentation needed | Tool definitions + JSON schema | --help output |
| Debugging ease | Complex | Trivial |
המסקנה: CLI מנצח בכל המדדים המשמעותיים לייצור.
הלקח לארכיטקטים: KISS Principle
משה ואהרון לימדו אותנו משהו שאנחנו בתעשיית התוכנה לפעמים שוכחים: הממשק הטוב ביותר הוא זה שלא רואים.
אהרון לא היה מערכת מורכבת עם layers ו-protocols. הוא היה ממשק שקוף - מה שנכנס (מדברי משה) יוצא (לאוזני פרעה) ללא עיוות, overhead, או מורכבות מיותרת.
כשאתה בונה AI tools, שאל את עצמך:
1. האם אני צריך protocol? או שפשוט CLI יכול לעשות את העבודה?
2. האם ה-abstraction מוסיפה ערך? או רק cognitive load?
3. האם ה-LLM כבר מכיר את הפורמט? (CLI = כן, custom protocol = לא)
בעולם שבו כל token עולה כסף וכל millisecond חשוב, לפעמים הפשטות של משה-אהרון היא בדיוק מה שאנחנו צריכים.
הערת סיום: בפעם הבאה שמישהו מציע לך לבנות MCP server במקום CLI tool, תזכור את משה ואהרון. לפעמים הממשק הכי יעיל הוא הכי פשוט.
"אַתָּה תְדַבֵּר... וְאַהֲרֹן יְדַבֵּר" - לא יותר, לא פחות. בדיוק מה שצריך.
רוצים לראות את זה בפועל? DOMGuard זמין בקוד פתוח: github.com/Guard8-ai/DOMGuard
ARC
founder@gibraltarcloud.dev