In Questo Articolo
1. סקירה כללית
mcp-powershell-http.ps1 הוא שרת HTTP עצמאי הכתוב ב-PowerShell, שנועד להרצת סקריפטים של PowerShell באופן מאובטח ומרחוק. הוא מתפקד כ"גשר" בין לקוח חיצוני (למשל, עוזר AI) לבין סביבת PowerShell מקומית, תוך שימוש בפרוטוקול JSON-RPC 2.0 לתקשורת.
תכונות עיקריות:
- אבטחה: כל סקריפט רץ בתוך מופע PowerShell מבודד לחלוטין (
runspace), מה שמונע השפעה על סביבת השרת הראשית. - תצורה גמישה: ניתן להגדיר את פרמטרי השרת (פורט, מארח, פסקי זמן) באמצעות ארגומנטים של שורת הפקודה וקובץ JSON חיצוני.
- יציבות: טיפול מקיף בשגיאות בכל הרמות (HTTP, JSON, הרצת סקריפטים) מבטיח פעולה אמינה של השרת.
- פרוטוקול MCP: מממש את פרוטוקול MCP הסטנדרטי לאינטראקציה, כולל המתודות
initialize,tools/listו-tools/call. - בקרת משאבים: פסקי זמן (timeouts) מובנים ומגבלות על גודל הפלט מונעים שימוש לרעה במשאבים.
2. הרצה והגדרה
דרישות:
- PowerShell 7.0 ומעלה.
פרמטרים של שורת הפקודה:
| פרמטר | סוג | תיאור | ברירת מחדל |
|---|---|---|---|
-Port | [int] | הפורט שבו השרת יאזין לבקשות HTTP. | 8090 |
-ServerHost | [string] | המארח (כתובת IP או שם דומיין) אליו השרת יקושר. | localhost |
-ConfigFile | [string] | נתיב לקובץ תצורה בפורמט JSON. פרמטרים מקובץ זה ידלגו על ערכי ברירת המחדל ועל ארגומנטים משורת הפקודה. | $null |
דוגמת שימוש:
.\mcp-powershell-http.ps1 -Port 8090 -ServerHost 0.0.0.0 -ConfigFile "C:\config\settings.json"
קובץ תצורה (settings.json):
השרת יכול לטעון את התצורה שלו מקובץ JSON. זוהי הגישה המומלצת לסביבות ייצור (production).
דוגמה לקובץ settings.json מתוך המאגר:
{
"Port": 8090,
"Host": "localhost",
"MaxConcurrentRequests": 10,
"TimeoutSeconds": 300,
"LogLevel": "INFO",
"AllowedPaths": [
"C:\\Scripts\\",
"C:\\Users\\%USERNAME%\\Documents\\"
],
"Security": {
"EnableScriptValidation": false,
"BlockDangerousCommands": false,
"RestrictedCommands": [
"Remove-Item -Path C:\\Windows\\*",
"Format-Volume"
]
}
}
3. ארכיטקטורה ופונקציות
הסקריפט מחולק לוגית למספר אזורים (#region) כדי לפשט את הניווט.
אזור: Utility Functions (פונקציות עזר)
Write-Log- מטרה: מדפיסה הודעות מעוצבות וצבעוניות לקונסולה עם חותמת זמן. זוהי הפונקציה הראשית לרישום לוגים.
- פרמטרים:
$Message[string](חובה): טקסט ההודעה.$Level[string](אופציונלי): רמת הרישום (DEBUG,INFO,WARNING,ERROR). משפיעה על צבע הפלט.
Test-MCPRequest- מטרה: בודקת אם בקשה נכנסת עומדת בדרישות הבסיסיות של פרוטוקול JSON-RPC 2.0 (נוכחות השדות
jsonrpc: "2.0"ו-method). - פרמטרים:
$Request[hashtable](חובה): הבקשה, לאחר שהומרה מ-JSON.
- ערך מוחזר:
$trueאם הבקשה תקינה, אחרת$false.
- מטרה: בודקת אם בקשה נכנסת עומדת בדרישות הבסיסיות של פרוטוקול JSON-RPC 2.0 (נוכחות השדות
New-MCPResponse- מטרה: פונקציית ייצור (factory function) ליצירת אובייקטי תגובה סטנדרטיים של JSON-RPC.
- פרמטרים:
$Id[object]: מזהה הבקשה.$Result[object]: האובייקט המכיל תוצאה מוצלחת.$Error[hashtable]: האובייקט המכיל מידע על שגיאה.
- ערך מוחזר:
[hashtable]עם מבנה התגובה המלא.
Test-ScriptSafety- מטרה: בודקת את הסקריפט לנוכחות פקודות שעלולות להיות מסוכנות, המפורטות במשתנה הגלובלי
$script:RestrictedCommands. - הערה: בגרסה שסופקה, פונקציה זו מושבתת כברירת מחדל (
return $true). לשימוש בסביבת ייצור, יש להפעיל ולהגדיר אותה. - פרמטרים:
$Script[string](חובה): טקסט סקריפט ה-PowerShell לבדיקה.
- ערך מוחזר:
$trueאם הסקריפט בטוח, אחרת$false.
- מטרה: בודקת את הסקריפט לנוכחות פקודות שעלולות להיות מסוכנות, המפורטות במשתנה הגלובלי
אזור: Core Logic (לוגיקת הליבה)
Invoke-PowerShellScript- מטרה: פונקציית הליבה האחראית להרצה בטוחה של סקריפט PowerShell.
- תהליך:
- יוצרת מופע PowerShell חדש ומבודד לחלוטין (
[powershell]::Create()). - (אופציונלי) מגדירה את ספריית העבודה בתוך מופע זה.
- מוסיפה למופע את טקסט הסקריפט והפרמטרים שלו.
- מריצה את הסקריפט באופן אסינכרוני עם פסק זמן (timeout).
- אוספת את זרמי הפלט (
Output), השגיאות (Error) והאזהרות (Warning). - מגבילה את גודל הפלט (ברירת מחדל: 10,000 תווים) כדי למנוע העברת נתונים גדולה.
- מנקה את המשאבים (
Dispose()) בסיום.
- יוצרת מופע PowerShell חדש ומבודד לחלוטין (
- פרמטרים:
$Script[string](חובה): הקוד להרצה.$Parameters[hashtable]: פרמטרים להעברה לסקריפט.$TimeoutSeconds[int]: זמן ריצה מקסימלי בשניות.$WorkingDirectory[string]: ספריית העבודה עבור הסקריפט.
- ערך מוחזר:
[hashtable]עם התוצאות:success(bool),output(string),errors(array),warnings(array),executionTime(double).
אזור: MCP Protocol Methods (מתודות פרוטוקול MCP)
Invoke-MCPMethod- מטרה: דיספצ'ר (dispatcher) המטפל בקריאות למתודות של פרוטוקול MCP.
- תהליך: משתמש במבנה
switchעל שם המתודה ($Method) כדי להפעיל את הלוגיקה המתאימה. - מתודות נתמכות:
"initialize": מחזירה מידע על השרת."tools/list": מחזירה רשימה של כלים זמינים (במקרה זה, רק"run-script")."tools/call": מטפלת בקריאה לכלי. שולפת את הפרמטרים וקוראת ל-Invoke-PowerShellScriptלביצוע.
- פרמטרים:
$Method[string]: שם המתודה שיש להפעיל.$Params[hashtable]: הפרמטרים של המתודה.$Id[object]: מזהה הבקשה.
- ערך מוחזר:
[hashtable]המייצג תגובת MCP מלאה ומוכנה לשליחה.
אזור: HTTP Server (שרת HTTP)
Invoke-RequestHandler- מטרה: מטפלת במחזור החיים המלא של בקשת HTTP בודדת.
- תהליך:
- מגדירה כותרות CORS.
- מטפלת בבקשות
OPTIONS(CORS preflight). - מוודאת שמתודת הבקשה היא
POST. - קוראת ומאמתת את גוף הבקשה.
- מנתחת (parse) את ה-JSON וממירה אותו לטבלת גיבוב.
- קוראת ל-
Test-MCPRequestלאימות. - מעבירה את הבקשה ל-
Invoke-MCPMethodלעיבוד. - ממירה את התגובה בחזרה ל-JSON ושולחת אותה ללקוח.
- מטפלת בכל השגיאות האפשריות לאורך הדרך.
- פרמטרים:
$Context[System.Net.HttpListenerContext]: הקשר בקשת ה-HTTP ממאזין ה-.NET.
Start-MCPServer- מטרה: הפונקציה הראשית המאתחלת ומפעילה את מאזין ה-HTTP.
- תהליך:
- יוצרת ומגדירה אובייקט
System.Net.HttpListener. - מפעילה את המאזין עם
listener.Start(). - נכנסת ללולאה אינסופית
while ($listener.IsListening)כדי להמתין לחיבורים נכנסים. - עבור כל חיבור, קוראת ל-
Invoke-RequestHandler. - עוצרת את השרת בצורה תקינה בסיום התהליך.
- יוצרת ומגדירה אובייקט
4. זרימת ביצוע הבקשה
- לקוח שולח בקשת
POSTעםContent-Type: application/jsonלכתובת ה-URL של השרת. Start-MCPServerמקבל את הבקשה ומעביר אותה ל-Invoke-RequestHandler.Invoke-RequestHandlerמאמת את כותרות ה-HTTP, המתודה, ומנתח את גוף ה-JSON.- בקשת ה-MCP התקינה מועברת ל-
Invoke-MCPMethod. Invoke-MCPMethodמזהה שהופעלה המתודהtools/callעם הכליrun-script.- הפרמטרים (סקריפט, פסק זמן וכו') מועברים ל-
Invoke-PowerShellScript. Invoke-PowerShellScriptמריץ את הסקריפט בסביבה מבודדת.- תוצאת הביצוע מוחזרת במעלה שרשרת הקריאות, מעוצבת לתגובת JSON-RPC סטנדרטית, ונשלחת חזרה ללקוח על ידי
Invoke-RequestHandler.
5. הרחבת פונקציונליות
כדי להוסיף "כלי" חדש (בנוסף ל-run-script), מפתח צריך:
- להוסיף תיאור של הכלי החדש לבלוק
"tools/list"בפונקציהInvoke-MCPMethod. - להוסיף ענף
caseחדש עבור כלי זה במבנה ה-switch ($toolName)בתוך בלוק ה-"tools/call"ב-Invoke-MCPMethod. - לממש את הלוגיקה עבור הכלי החדש.