In Questo Articolo
1. Przegląd
mcp-powershell-http.ps1 to samodzielny serwer HTTP napisany w PowerShellu, zaprojektowany do bezpiecznego zdalnego wykonywania skryptów PowerShell. Działa jako „most” między klientem zewnętrznym (np. asystentem AI) a lokalnym środowiskiem PowerShell, używając do komunikacji protokołu JSON-RPC 2.0.
Kluczowe cechy:
- Bezpieczeństwo: Każdy skrypt jest wykonywany w całkowicie izolowanej instancji PowerShell (
runspace), co zapobiega wpływowi na główne środowisko serwera. - Elastyczna konfiguracja: Parametry serwera (port, host, limity czasowe) można konfigurować za pomocą argumentów wiersza poleceń i zewnętrznego pliku JSON.
- Stabilność: Kompleksowa obsługa błędów na wszystkich poziomach (HTTP, JSON, wykonanie skryptu) zapewnia niezawodne działanie serwera.
- Protokół MCP: Implementuje standardowy protokół MCP do interakcji, w tym metody
initialize,tools/listitools/call. - Kontrola zasobów: Wbudowane limity czasowe (timeouty) i ograniczenia rozmiaru danych wyjściowych zapobiegają nadużyciom zasobów.
2. Uruchamianie i konfiguracja
Wymagania:
- PowerShell 7.0 lub nowszy.
Parametry wiersza poleceń:
| Parametr | Typ | Opis | Domyślnie |
|---|---|---|---|
-Port | [int] | Port, na którym serwer będzie nasłuchiwał żądań HTTP. | 8090 |
-ServerHost | [string] | Host (adres IP lub nazwa domeny), do którego serwer ma być przypisany. | localhost |
-ConfigFile | [string] | Ścieżka do pliku konfiguracyjnego w formacie JSON. Parametry z tego pliku nadpisują wartości domyślne i argumenty wiersza poleceń. | $null |
Przykład użycia:
.\mcp-powershell-http.ps1 -Port 8090 -ServerHost 0.0.0.0 -ConfigFile "C:\config\settings.json"
Plik konfiguracyjny (settings.json):
Serwer może wczytywać swoją konfigurację z pliku JSON. Jest to zalecane podejście w środowiskach produkcyjnych.
Przykład settings.json z repozytorium:
{
"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. Architektura i funkcje
Skrypt jest logicznie podzielony na kilka regionów (#region), aby uprościć nawigację.
Region: Utility Functions (Funkcje pomocnicze)
Write-Log- Cel: Wyświetla sformatowane i pokolorowane komunikaty w konsoli ze znacznikiem czasu. Jest to główna funkcja do logowania.
- Parametry:
$Message[string](obowiązkowy): Treść komunikatu.$Level[string](opcjonalny): Poziom logowania (DEBUG,INFO,WARNING,ERROR). Wpływa na kolor wyświetlanego tekstu.
Test-MCPRequest- Cel: Sprawdza, czy przychodzące żądanie spełnia podstawowe wymagania protokołu JSON-RPC 2.0 (obecność pól
jsonrpc: "2.0"imethod). - Parametry:
$Request[hashtable](obowiązkowy): Żądanie zdeserializowane z formatu JSON.
- Zwraca:
$true, jeśli żądanie jest prawidłowe, w przeciwnym razie$false.
- Cel: Sprawdza, czy przychodzące żądanie spełnia podstawowe wymagania protokołu JSON-RPC 2.0 (obecność pól
New-MCPResponse- Cel: Funkcja fabrykująca (factory function) do tworzenia standardowych obiektów odpowiedzi JSON-RPC.
- Parametry:
$Id[object]: Identyfikator żądania.$Result[object]: Obiekt zawierający pomyślny wynik.$Error[hashtable]: Obiekt zawierający informacje o błędzie.
- Zwraca:
[hashtable]z kompletną strukturą odpowiedzi.
Test-ScriptSafety- Cel: Sprawdza skrypt pod kątem obecności potencjalnie niebezpiecznych poleceń wymienionych w zmiennej globalnej
$script:RestrictedCommands. - Uwaga: W dostarczonej wersji funkcja jest domyślnie wyłączona (
return $true). Do użytku produkcyjnego należy ją włączyć i skonfigurować. - Parametry:
$Script[string](obowiązkowy): Tekst skryptu PowerShell do sprawdzenia.
- Zwraca:
$true, jeśli skrypt jest bezpieczny, w przeciwnym razie$false.
- Cel: Sprawdza skrypt pod kątem obecności potencjalnie niebezpiecznych poleceń wymienionych w zmiennej globalnej
Region: Core Logic (Logika główna)
Invoke-PowerShellScript- Cel: Kluczowa funkcja odpowiedzialna za bezpieczne wykonanie skryptu PowerShell.
- Proces:
- Tworzy nową, całkowicie izolowaną instancję PowerShell (
[powershell]::Create()). - (Opcjonalnie) Ustawia katalog roboczy wewnątrz tej instancji.
- Dodaje do instancji tekst skryptu i jego parametry.
- Uruchamia wykonanie asynchronicznie z limitem czasu (timeout).
- Zbiera strumienie wyjścia (
Output), błędów (Error) i ostrzeżeń (Warning). - Ogranicza rozmiar danych wyjściowych (domyślnie 10 000 znaków), aby zapobiec przesyłaniu dużych ilości danych.
- Czyści zasoby (
Dispose()) po zakończeniu.
- Tworzy nową, całkowicie izolowaną instancję PowerShell (
- Parametry:
$Script[string](obowiązkowy): Kod do wykonania.$Parameters[hashtable]: Parametry do przekazania do skryptu.$TimeoutSeconds[int]: Maksymalny czas wykonania w sekundach.$WorkingDirectory[string]: Katalog roboczy dla skryptu.
- Zwraca:
[hashtable]z wynikami:success(bool),output(string),errors(array),warnings(array),executionTime(double).
Region: MCP Protocol Methods (Metody protokołu MCP)
Invoke-MCPMethod- Cel: Dyspozytor, który obsługuje wywołania metod protokołu MCP.
- Proces: Używa konstrukcji
switchna nazwie metody ($Method), aby wywołać odpowiednią logikę. - Obsługiwane metody:
"initialize": Zwraca informacje o serwerze."tools/list": Zwraca listę dostępnych narzędzi (w tym przypadku tylko"run-script")."tools/call": Obsługuje wywołanie narzędzia. Wyodrębnia parametry i wywołujeInvoke-PowerShellScriptw celu wykonania.
- Parametry:
$Method[string]: Nazwa wywoływanej metody.$Params[hashtable]: Parametry metody.$Id[object]: Identyfikator żądania.
- Zwraca:
[hashtable]reprezentującą kompletną odpowiedź MCP, gotową do wysłania.
Region: HTTP Server (Serwer HTTP)
Invoke-RequestHandler- Cel: Obsługuje pełny cykl życia pojedynczego żądania HTTP.
- Proces:
- Konfiguruje nagłówki CORS.
- Obsługuje żądania
OPTIONS(CORS preflight). - Sprawdza, czy metoda żądania to
POST. - Odczytuje i waliduje ciało żądania.
- Parsuje JSON i konwertuje go na tabelę skrótów (
hashtable). - Wywołuje
Test-MCPRequestw celu walidacji. - Przekazuje żądanie do
Invoke-MCPMethodw celu przetworzenia. - Serializuje odpowiedź z powrotem do formatu JSON i wysyła ją do klienta.
- Obsługuje wszystkie możliwe błędy na tej drodze.
- Parametry:
$Context[System.Net.HttpListenerContext]: Kontekst żądania HTTP z nasłuchiwacza .NET.
Start-MCPServer- Cel: Główna funkcja, która inicjalizuje i uruchamia nasłuchiwacz HTTP.
- Proces:
- Tworzy i konfiguruje obiekt
System.Net.HttpListener. - Uruchamia nasłuchiwacz za pomocą
listener.Start(). - Wchodzi w nieskończoną pętlę
while ($listener.IsListening), aby czekać na przychodzące połączenia. - Dla każdego połączenia wywołuje
Invoke-RequestHandler. - Prawidłowo zatrzymuje serwer po zakończeniu procesu.
- Tworzy i konfiguruje obiekt
4. Przebieg przetwarzania żądania
- Klient wysyła żądanie
POSTzContent-Type: application/jsonna adres URL serwera. Start-MCPServerakceptuje żądanie i przekazuje je doInvoke-RequestHandler.Invoke-RequestHandlerwaliduje nagłówki HTTP, metodę i parsuje ciało JSON.- Prawidłowe żądanie MCP jest przekazywane do
Invoke-MCPMethod. Invoke-MCPMethodokreśla, że wywołano metodętools/callz narzędziemrun-script.- Parametry (skrypt, limit czasu itp.) są przekazywane do
Invoke-PowerShellScript. Invoke-PowerShellScriptwykonuje skrypt w izolowanym środowisku.- Wynik wykonania jest zwracany w górę łańcucha wywołań, formatowany do standardowej odpowiedzi JSON-RPC i wysyłany z powrotem do klienta przez
Invoke-RequestHandler.
5. Rozszerzanie funkcjonalności
Aby dodać nowe „narzędzie” (oprócz run-script), deweloper musi:
- Dodać opis nowego narzędzia w bloku
"tools/list"w funkcjiInvoke-MCPMethod. - Dodać nową gałąź
casedla tego narzędzia w instrukcjiswitch ($toolName)wewnątrz bloku"tools/call"wInvoke-MCPMethod. - Zaimplementować logikę dla nowego narzędzia.