{"id":3477,"date":"2025-09-26T14:49:09","date_gmt":"2025-09-26T12:49:09","guid":{"rendered":"https:\/\/davidka.net\/ru\/?p=3477"},"modified":"2025-09-26T20:07:45","modified_gmt":"2025-09-26T18:07:45","slug":"mcp-powershell-server-how-to-use","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/mcp-powershell-server-how-to-use\/","title":{"rendered":"Guida dettagliata all&#8217;uso di MCP PowerShell Server. (how-to-use.md)"},"content":{"rendered":"\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"3477\" data-theme=\"Neve - Davidka\">\n\t\t\t<div id=\"rtoc-mokuji-title\" class=\"rtoc_btn_none rtoc_left\">\n\t\t\t\n\t\t\t<span>In Questo Articolo<\/span>\n\t\t\t<\/div><ol class=\"rtoc-mokuji decimal_ol level-1\"><li class=\"rtoc-item\"><a href=\"#rtoc-1\">Installazione e configurazione<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">Prerequisiti<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-3\">Configurazione iniziale<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-4\">Scelta della modalit\u00e0 operativa: HTTP vs. STDIO<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-5\">Quando usare la modalit\u00e0 HTTP?<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-6\">Quando usare la modalit\u00e0 STDIO?<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">Modalit\u00e0 STDIO<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-8\">Avvio del server STDIO<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-9\">Caratteristiche della modalit\u00e0 STDIO<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-10\">Test della modalit\u00e0 STDIO<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-11\">Modalit\u00e0 HTTP<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-12\">Avvio del server HTTP<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-13\">Endpoint dell&#8217;API HTTP<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-14\">Test della modalit\u00e0 HTTP<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-15\">Integrazione con Gemini CLI<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-16\">Configurazione automatica<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-17\">Configurazione manuale<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-18\">Esempi di utilizzo<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-19\">Comandi PowerShell di base<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-20\">Lavorare con i file<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-21\">Script con parametri<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-22\">Monitoraggio del sistema<\/a><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#rtoc-23\">tools\/list<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-24\">Codici di errore<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-25\">Livelli di logging<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-26\">Conclusione<\/a><\/li><\/ol><\/div><h2 id=\"rtoc-1\"  class=\"wp-block-heading\">Installazione e configurazione<\/h2>\n\n\n\n<h3 id=\"rtoc-2\"  class=\"wp-block-heading\">Prerequisiti<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>PowerShell 7.0+<\/strong> <code class=\"\" data-line=\"\"># Verifica della versione di PowerShell $PSVersionTable.PSVersion # Installazione di PowerShell 7 (se necessario) # Scarica da https:\/\/github.com\/PowerShell\/PowerShell<\/code><\/li>\n\n\n\n<li><strong>Diritti di accesso<\/strong>\n<ul class=\"wp-block-list\">\n<li>Per le porte < 1024 sono necessari i diritti di amministratore.<\/li>\n\n\n\n<li>Permessi per l&#8217;esecuzione di script PowerShell.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Impostazione della policy di esecuzione<\/strong> <code class=\"\" data-line=\"\"># Verifica della policy corrente Get-ExecutionPolicy # Impostazione della policy per consentire l&#039;esecuzione di script Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser<\/code><\/li>\n<\/ol>\n\n\n\n<h3 id=\"rtoc-3\"  class=\"wp-block-heading\">Configurazione iniziale<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Navigazione nella directory dei server<\/strong> <code class=\"\" data-line=\"\"># Spostarsi nella directory principale del modulo cd C:\\powershell\\modules\\mcp-powershell-server # Spostarsi nella directory dei server cd src\\servers<\/code><\/li>\n\n\n\n<li><strong>Verifica dei file<\/strong><br><code class=\"\" data-line=\"\">powershell # Assicurarsi che tutti i file necessari siano presenti Get-ChildItem *.ps1 | Select-Object Name<\/code><\/li>\n<\/ol>\n\n\n\n<h2 id=\"rtoc-4\"  class=\"wp-block-heading\">Scelta della modalit\u00e0 operativa: HTTP vs. STDIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di addentrarci nei dettagli, \u00e8 importante capire quale delle due modalit\u00e0 operative del server \u00e8 adatta a te. La scelta dipende da <strong>come e da dove<\/strong> intendi inviare i comandi.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Modalit\u00e0 HTTP (<code class=\"\" data-line=\"\">mcp-powershell-http.ps1<\/code>)<\/strong>: Funziona come un <strong>servizio web<\/strong>. Accetta comandi tramite la rete (HTTP) e pu\u00f2 essere accessibile da altri computer o da applicazioni web. \u00c8 un metodo versatile per le integrazioni di rete.<\/li>\n\n\n\n<li><strong>Modalit\u00e0 STDIO (<code class=\"\" data-line=\"\">mcp-powershell-stdio.ps1<\/code>)<\/strong>: Funziona come un&#8217;<strong>applicazione da console<\/strong>, gestita da un altro processo. Riceve i comandi tramite il flusso di input standard (Standard Input) e restituisce il risultato tramite il flusso di output standard (Standard Output). Questo metodo \u00e8 ideale per l&#8217;integrazione locale, ad esempio con <code class=\"\" data-line=\"\">gemini-cli<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-5\"  class=\"wp-block-heading\">Quando usare la modalit\u00e0 HTTP?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Scegli HTTP se hai bisogno di <strong>accessibilit\u00e0 di rete<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gestione remota:<\/strong> L&#8217;applicazione client (ad es. uno script Python) si trova su un <strong>computer diverso<\/strong>.<\/li>\n\n\n\n<li><strong>Integrazione web:<\/strong> Vuoi chiamare PowerShell da un pannello web, inviando richieste con JavaScript.<\/li>\n\n\n\n<li><strong>Architettura a microservizi:<\/strong> Diversi servizi nella tua rete devono scambiarsi comandi.<\/li>\n\n\n\n<li><strong>Test semplici:<\/strong> Vuoi inviare comandi usando strumenti come <code class=\"\" data-line=\"\">curl<\/code> o Postman.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Scenario chiave:<\/strong> Il client e il server si trovano in rete e comunicano tramite protocolli web standard.<\/p>\n<\/blockquote>\n\n\n\n<h3 id=\"rtoc-6\"  class=\"wp-block-heading\">Quando usare la modalit\u00e0 STDIO?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Scegli STDIO per un&#8217;<strong>integrazione locale e pi\u00f9 sicura<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Integrazione con Gemini CLI:<\/strong> Questo \u00e8 lo scenario <strong>principale<\/strong> e pi\u00f9 comune. <code class=\"\" data-line=\"\">gemini-cli<\/code> avvia <code class=\"\" data-line=\"\">mcp-powershell-stdio.ps1<\/code> come processo figlio e comunica direttamente con esso.<\/li>\n\n\n\n<li><strong>Script wrapper locali:<\/strong> La tua applicazione in un altro linguaggio (ad es. Node.js) avvia il server PowerShell come processo figlio e lo gestisce.<\/li>\n\n\n\n<li><strong>Sicurezza migliorata:<\/strong> Questa modalit\u00e0 non apre porte di rete, eliminando un&#8217;intera classe di minacce di rete.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Scenario chiave:<\/strong> Il client e il server sono in esecuzione sulla <strong>stessa macchina<\/strong>, e il client gestisce il ciclo di vita del server.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Ora che hai deciso la modalit\u00e0, procedi alla sezione corrispondente qui sotto per istruzioni dettagliate sull&#8217;avvio e l&#8217;utilizzo.<\/p>\n\n\n\n<h2 id=\"rtoc-7\"  class=\"wp-block-heading\">Modalit\u00e0 STDIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La modalit\u00e0 STDIO \u00e8 pensata per l&#8217;integrazione con client MCP, come <code class=\"\" data-line=\"\">gemini-cli<\/code>.<\/p>\n\n\n\n<h3 id=\"rtoc-8\"  class=\"wp-block-heading\">Avvio del server STDIO<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Avvio diretto del server (dalla cartella src\/servers)\n.\\mcp-powershell-stdio.ps1\n\n# O dalla directory principale del progetto\n.\\src\\servers\\mcp-powershell-stdio.ps1<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-9\"  class=\"wp-block-heading\">Caratteristiche della modalit\u00e0 STDIO<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Protocollo<\/strong>: JSON-RPC tramite i flussi di input\/output standard.<\/li>\n\n\n\n<li><strong>Logging<\/strong>: Nel file <code class=\"\" data-line=\"\">%TEMP%\\mcp-powershell-server.log<\/code>.<\/li>\n\n\n\n<li><strong>Codifica<\/strong>: UTF-8 per il corretto funzionamento con caratteri di varie lingue.<\/li>\n\n\n\n<li><strong>Compatibilit\u00e0<\/strong>: Funziona con qualsiasi client MCP.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"rtoc-10\"  class=\"wp-block-heading\">Test della modalit\u00e0 STDIO<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Avvio del server di test per la verifica (dalla cartella src\/servers)\n.\\test-mcp.ps1\n\n# O dalla directory principale del progetto\n.\\src\\servers\\test-mcp.ps1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio di test manuale:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;id&quot;:1,&quot;method&quot;:&quot;initialize&quot;,&quot;params&quot;:{&quot;protocolVersion&quot;:&quot;2024-11-05&quot;}}\n{&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;id&quot;:2,&quot;method&quot;:&quot;tools\/list&quot;}\n{&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;id&quot;:3,&quot;method&quot;:&quot;tools\/call&quot;,&quot;params&quot;:{&quot;name&quot;:&quot;run-script&quot;,&quot;arguments&quot;:{&quot;script&quot;:&quot;Get-Date&quot;}}}<\/code><\/pre>\n\n\n\n<h2 id=\"rtoc-11\"  class=\"wp-block-heading\">Modalit\u00e0 HTTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La modalit\u00e0 HTTP \u00e8 pensata per le integrazioni web e le API REST.<\/p>\n\n\n\n<h3 id=\"rtoc-12\"  class=\"wp-block-heading\">Avvio del server HTTP<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Avvio base (localhost:8090) dalla cartella src\/servers\n.\\mcp-powershell-http.ps1\n\n# Avvio su una porta diversa\n.\\mcp-powershell-http.ps1 -Port 9090\n\n# Avvio su tutte le interfacce di rete\n.\\mcp-powershell-http.ps1 -ServerHost &quot;0.0.0.0&quot; -Port 8080\n\n# Avvio con un file di configurazione\n.\\mcp-powershell-http.ps1 -ConfigFile &quot;config.json&quot;\n\n# O dalla directory principale del progetto\n.\\src\\servers\\mcp-powershell-http.ps1 -Port 8090<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-13\"  class=\"wp-block-heading\">Endpoint dell&#8217;API HTTP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tutte le richieste vengono inviate come POST all&#8217;URL principale del server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>URL<\/strong>: <code class=\"\" data-line=\"\">http:\/\/localhost:8090\/<\/code><br><strong>Metodo<\/strong>: <code class=\"\" data-line=\"\">POST<\/code><br><strong>Content-Type<\/strong>: <code class=\"\" data-line=\"\">application\/json<\/code><\/p>\n\n\n\n<h3 id=\"rtoc-14\"  class=\"wp-block-heading\">Test della modalit\u00e0 HTTP<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Test con Invoke-RestMethod\n$body = @{\n    jsonrpc = &quot;2.0&quot;\n    id = 1\n    method = &quot;tools\/list&quot;\n} | ConvertTo-Json\n\nInvoke-RestMethod -Uri &quot;http:\/\/localhost:8090\/&quot; -Method POST -Body $body -ContentType &quot;application\/json&quot;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Test con curl\ncurl -X POST http:\/\/localhost:8090\/ \\\n  -H &quot;Content-Type: application\/json&quot; \\\n  -d &#039;{&quot;jsonrpc&quot;:&quot;2.0&quot;,&quot;id&quot;:1,&quot;method&quot;:&quot;tools\/list&quot;}&#039;<\/code><\/pre>\n\n\n\n<h2 id=\"rtoc-15\"  class=\"wp-block-heading\">Integrazione con Gemini CLI<\/h2>\n\n\n\n<h3 id=\"rtoc-16\"  class=\"wp-block-heading\">Configurazione automatica<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Avvio con configurazione automatica di Gemini CLI\n.\\start-mcp-with-gemini.ps1 -ApiKey &quot;la-tua-chiave-api-gemini&quot;\n\n# Con parametri aggiuntivi\n.\\start-mcp-with-gemini.ps1 -ApiKey &quot;la-tua-chiave&quot; -ServerPort 9090 -Wait 15<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-17\"  class=\"wp-block-heading\">Configurazione manuale<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Creazione della configurazione MCP<\/strong> <code class=\"\" data-line=\"\"># Creazione della directory di configurazione $configDir = &quot;$env:USERPROFILE\\.config\\gemini&quot; New-Item -Path $configDir -ItemType Directory -Force # Creazione del file di configurazione MCP $config = @{ mcpServers = @{ powershell = @{ command = &quot;pwsh&quot; args = @(&quot;-File&quot;, &quot;C:\\percorso\\a\\mcp-powershell-stdio.ps1&quot;) env = @{} } } } | ConvertTo-Json -Depth 5 $config | Set-Content &quot;$configDir\\mcp_servers.json&quot; -Encoding UTF8<\/code><ol start=\"2\"><li><strong>Utilizzo con gemini-cli<\/strong><\/li><\/ol><code class=\"\" data-line=\"\"># Modalit\u00e0 interattiva gemini --mcp-config &quot;percorso\/a\/mcp_servers.json&quot; -i # Richiesta singola gemini --mcp-config &quot;percorso\/a\/mcp_servers.json&quot; -m gemini-2.5-pro -p &quot;Esegui il comando Get-Process | Select-Object -First 5&quot;<\/code><\/li>\n<\/ol>\n\n\n\n<h2 id=\"rtoc-18\"  class=\"wp-block-heading\">Esempi di utilizzo<\/h2>\n\n\n\n<h3 id=\"rtoc-19\"  class=\"wp-block-heading\">Comandi PowerShell di base<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 1,\n  &quot;method&quot;: &quot;tools\/call&quot;,\n  &quot;params&quot;: {\n    &quot;name&quot;: &quot;run-script&quot;,\n    &quot;arguments&quot;: {\n      &quot;script&quot;: &quot;Get-ComputerInfo | Select-Object WindowsProductName, TotalPhysicalMemory&quot;\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-20\"  class=\"wp-block-heading\">Lavorare con i file<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 2,\n  &quot;method&quot;: &quot;tools\/call&quot;,\n  &quot;params&quot;: {\n    &quot;name&quot;: &quot;run-script&quot;,\n    &quot;arguments&quot;: {\n      &quot;script&quot;: &quot;Get-ChildItem C:\\\\ -Directory | Select-Object Name, CreationTime | Format-Table&quot;,\n      &quot;workingDirectory&quot;: &quot;C:\\\\&quot;,\n      &quot;timeoutSeconds&quot;: 30\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-21\"  class=\"wp-block-heading\">Script con parametri<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 3,\n  &quot;method&quot;: &quot;tools\/call&quot;,\n  &quot;params&quot;: {\n    &quot;name&quot;: &quot;run-script&quot;,\n    &quot;arguments&quot;: {\n      &quot;script&quot;: &quot;param($ProcessName) Get-Process -Name $ProcessName -ErrorAction SilentlyContinue&quot;,\n      &quot;parameters&quot;: {\n        &quot;ProcessName&quot;: &quot;notepad&quot;\n      }\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-22\"  class=\"wp-block-heading\">Monitoraggio del sistema<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 4,\n  &quot;method&quot;: &quot;tools\/call&quot;,\n  &quot;params&quot;: {\n    &quot;name&quot;: &quot;run-script&quot;,\n    &quot;arguments&quot;: {\n      &quot;script&quot;: &quot;$cpu = Get-Counter &#039;\\\\Processor(_Total)\\\\% Processor Time&#039; | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue; $memory = Get-Counter &#039;\\\\Memory\\\\Available MBytes&#039; | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue; Write-Output \\&quot;CPU: $(&#091;math]::Round($cpu, 2))%, Available Memory: $memory MB\\&quot;&quot;\n    }\n  }\n}```\n\n## Configurazione\n\n### File config.json<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">json<br>{<br>&#8220;Port&#8221;: 8090,<br>&#8220;Host&#8221;: &#8220;localhost&#8221;,<br>&#8220;MaxConcurrentRequests&#8221;: 10,<br>&#8220;TimeoutSeconds&#8221;: 300,<br>&#8220;LogLevel&#8221;: &#8220;INFO&#8221;,<br>&#8220;AllowedPaths&#8221;: [<br>&#8220;C:\\Scripts\\&#8221;,<br>&#8220;C:\\Tools\\&#8221;,<br>&#8220;C:\\Temp\\&#8221;<br>],<br>&#8220;Security&#8221;: {<br>&#8220;EnableScriptValidation&#8221;: true,<br>&#8220;BlockDangerousCommands&#8221;: true,<br>&#8220;RestrictedCommands&#8221;: [<br>&#8220;Remove-Item&#8221;,<br>&#8220;Format-Volume&#8221;,<br>&#8220;Stop-Computer&#8221;,<br>&#8220;Restart-Computer&#8221;,<br>&#8220;New-ItemProperty -Path &#8216;HKLM:<em>&#8216;&#8221;, &#8220;Remove-ItemProperty -Path &#8216;HKLM:<\/em>&#8216;&#8221;<br>],<br>&#8220;AllowedModules&#8221;: [<br>&#8220;Microsoft.PowerShell.*&#8221;,<br>&#8220;PackageManagement&#8221;,<br>&#8220;PowerShellGet&#8221;<br>]<br>},<br>&#8220;Logging&#8221;: {<br>&#8220;LogFile&#8221;: &#8220;%TEMP%\\mcp-powershell-server.log&#8221;,<br>&#8220;MaxLogSize&#8221;: &#8220;10MB&#8221;,<br>&#8220;LogRotation&#8221;: true<br>}<br>}<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">### Variabili d&#039;ambiente<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">powershell<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Configurazione tramite variabili d&#8217;ambiente<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">$env:MCP_PS_PORT = &#8220;8090&#8221;<br>$env:MCP_PS_HOST = &#8220;localhost&#8221;<br>$env:MCP_PS_TIMEOUT = &#8220;300&#8221;<br>$env:MCP_PS_LOG_LEVEL = &#8220;INFO&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">## Sicurezza\n\n### Raccomandazioni di sicurezza\n\n1.  **Restrizione dei comandi**\n    ```json\n    &quot;RestrictedCommands&quot;: &#091;\n      &quot;Remove-Item&quot;,\n      &quot;Format-Volume&quot;,\n      &quot;Stop-Computer&quot;,\n      &quot;Restart-Computer&quot;,\n      &quot;Invoke-Expression&quot;,\n      &quot;iex&quot;,\n      &quot;&amp; *&quot;\n    ]\n    ```\n2.  **Restrizione dei percorsi**\n    ```json\n    &quot;AllowedPaths&quot;: &#091;\n      &quot;C:\\\\Scripts\\\\&quot;,\n      &quot;C:\\\\Tools\\\\&quot;,\n      &quot;C:\\\\Temp\\\\&quot;\n    ]\n    ```\n3.  **Restrizioni di rete**\n    ```powershell\n    # Limitare l&#039;accesso solo al localhost\n    .\\start-mcp-server.ps1 -ServerHost &quot;127.0.0.1&quot;\n    ```\n4.  **Timeout**\n    ```json\n    &quot;TimeoutSeconds&quot;: 60  \/\/ Limitare il tempo di esecuzione\n    ```\n\n### Auditing e monitoraggio<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">powershell<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Monitoraggio dei log in tempo reale<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Get-Content &#8220;$env:TEMP\\mcp-powershell-server.log&#8221; -Wait -Tail 10<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Analisi dei comandi eseguiti<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Select-String -Path &#8220;$env:TEMP\\mcp-powershell-server.log&#8221; -Pattern &#8220;Esecuzione dello script PowerShell&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">## Estensione delle funzionalit\u00e0\n\n### Aggiunta di nuovi strumenti MCP\n\n1.  **Struttura dello strumento**\n    ```powershell\n    # Nella funzione Invoke-MCPMethod, aggiungi un nuovo case\n    &quot;my-custom-tool&quot; {\n        # Validazione dei parametri\n        if (-not $arguments.ContainsKey(&quot;required_param&quot;)) {\n            return New-MCPResponse -Id $Id -Error @{\n                code = -32602\n                message = &quot;Parametro obbligatorio &#039;required_param&#039; mancante&quot;\n            }\n        }\n\n        # Logica di esecuzione\n        $result = Invoke-MyCustomFunction -Param $arguments.required_param\n\n        # Restituzione del risultato\n        return New-MCPResponse -Id $Id -Result @{\n            content = @(\n                @{\n                    type = &quot;text&quot;\n                    text = &quot;Risultato: $result&quot;\n                }\n            )\n        }\n    }\n    ```\n2.  **Registrazione in tools\/list**\n    ```powershell\n    # Aggiungi la descrizione dello strumento al metodo tools\/list\n    @{\n        name = &quot;my-custom-tool&quot;\n        description = &quot;Descrizione del mio strumento personalizzato&quot;\n        inputSchema = @{\n            type = &quot;object&quot;\n            properties = @{\n                required_param = @{\n                    type = &quot;string&quot;\n                    description = &quot;Parametro obbligatorio&quot;\n                }\n            }\n            required = @(&quot;required_param&quot;)\n        }\n    }\n    ```\n\n### Esempio di strumento personalizzato<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">powershell<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Aggiunta di uno strumento per lavorare con il registro di sistema<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;registry-query&#8221; {<br>if (-not $arguments.ContainsKey(&#8220;path&#8221;)) {<br>return New-MCPResponse -Id $Id -Error @{<br>code = -32602<br>message = &#8220;Parametro obbligatorio &#8216;path&#8217; mancante&#8221;<br>}<br>}<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">try {\n    $regPath = $arguments.path\n    $regKey = Get-ItemProperty -Path $regPath -ErrorAction Stop\n    $result = $regKey | Format-List | Out-String\n\n    return New-MCPResponse -Id $Id -Result @{\n        content = @(\n            @{\n                type = &quot;text&quot;\n                text = &quot;Valori del registro in ${regPath}:`n$result&quot;\n            }\n        )\n    }\n}\ncatch {\n    return New-MCPResponse -Id $Id -Error @{\n        code = -32603\n        message = &quot;Query sul registro fallita: $($_.Exception.Message)&quot;\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">## Risoluzione dei problemi\n\n### Comandi di diagnostica<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">powershell<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Verifica della versione di PowerShell<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">$PSVersionTable.PSVersion<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Verifica della disponibilit\u00e0 della porta<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Test-NetConnection -ComputerName localhost -Port 8090<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Verifica dei log<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Get-Content &#8220;$env:TEMP\\mcp-powershell-server.log&#8221; -Tail 50<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Verifica dei processi PowerShell<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Get-Process -Name pwsh*<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">### Problemi comuni\n\n1.  **&quot;La porta \u00e8 gi\u00e0 in uso&quot;**\n    ```powershell\n    # Trovare il processo che utilizza la porta\n    Get-NetTCPConnection -LocalPort 8090 | Get-Process\n\n    # O usare una porta diversa\n    .\\start-mcp-server.ps1 -Port 9090\n    ```\n2.  **&quot;Accesso negato&quot;**\n    ```powershell\n    # Eseguire con diritti di amministratore per le porte &lt; 1024\n    Start-Process pwsh -Verb RunAs -ArgumentList &quot;-File&quot;, &quot;start-mcp-server.ps1&quot;\n    ```\n3.  **&quot;Problemi di codifica&quot;**\n    ```powershell\n    # Verifica della codifica della console\n    &#091;Console]::OutputEncoding\n    &#091;Console]::InputEncoding\n\n    # Impostazione forzata a UTF-8\n    &#091;Console]::OutputEncoding = &#091;System.Text.Encoding]::UTF8\n    &#091;Console]::InputEncoding = &#091;System.Text.Encoding]::UTF8\n    ```\n4.  **&quot;Lo script non viene eseguito&quot;**\n    ```powershell\n    # Verifica della policy di esecuzione\n    Get-ExecutionPolicy -List\n\n    # Permesso temporaneo\n    powershell.exe -ExecutionPolicy Bypass -File &quot;script.ps1&quot;\n    ```\n\n### Debugging<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">powershell<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Abilitazione del logging dettagliato<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">$DebugPreference = &#8220;Continue&#8221;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Tracciamento dell&#8217;esecuzione degli script<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Set-PSDebug -Trace 1<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Disattivazione del tracciamento<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Set-PSDebug -Off<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">## Riferimento API\n\n### Metodi MCP\n\n#### initialize\n\nInizializza il server MCP.\n\n**Richiesta (Request):**<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">json<br>{<br>&#8220;jsonrpc&#8221;: &#8220;2.0&#8221;,<br>&#8220;id&#8221;: 1,<br>&#8220;method&#8221;: &#8220;initialize&#8221;,<br>&#8220;params&#8221;: {<br>&#8220;protocolVersion&#8221;: &#8220;2024-11-05&#8221;<br>}<br>}&#8220;`<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Risposta (Response):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 1,\n  &quot;result&quot;: {\n    &quot;protocolVersion&quot;: &quot;2024-11-05&quot;,\n    &quot;capabilities&quot;: {\n      &quot;tools&quot;: {\n        &quot;listChanged&quot;: true\n      }\n    },\n    &quot;serverInfo&quot;: {\n      &quot;name&quot;: &quot;PowerShell Script Runner&quot;,\n      &quot;version&quot;: &quot;1.0.0&quot;,\n      &quot;description&quot;: &quot;Esegue script PowerShell tramite MCP&quot;\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<h4 id=\"rtoc-23\"  class=\"wp-block-heading\">tools\/list<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Ottiene l&#8217;elenco degli strumenti disponibili.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Richiesta (Request):<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;jsonrpc&quot;: &quot;2.0&quot;,\n  &quot;id&quot;: 2,\n  &quot;method&quot;: &quot;tools\/list&quot;\n}```\n\n**Risposta (Response):**<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">json<br>{<br>&#8220;jsonrpc&#8221;: &#8220;2.0&#8221;,<br>&#8220;id&#8221;: 2,<br>&#8220;result&#8221;: {<br>&#8220;tools&#8221;: [<br>{<br>&#8220;name&#8221;: &#8220;run-script&#8221;,<br>&#8220;description&#8221;: &#8220;Esegue uno script PowerShell con i parametri specificati&#8221;,<br>&#8220;inputSchema&#8221;: {<br>&#8220;type&#8221;: &#8220;object&#8221;,<br>&#8220;properties&#8221;: {<br>&#8220;script&#8221;: {<br>&#8220;type&#8221;: &#8220;string&#8221;,<br>&#8220;description&#8221;: &#8220;Codice PowerShell da eseguire&#8221;<br>},<br>&#8220;parameters&#8221;: {<br>&#8220;type&#8221;: &#8220;object&#8221;,<br>&#8220;description&#8221;: &#8220;Parametri per lo script (opzionale)&#8221;<br>},<br>&#8220;workingDirectory&#8221;: {<br>&#8220;type&#8221;: &#8220;string&#8221;,<br>&#8220;description&#8221;: &#8220;Directory di lavoro per l&#8217;esecuzione&#8221;<br>},<br>&#8220;timeoutSeconds&#8221;: {<br>&#8220;type&#8221;: &#8220;integer&#8221;,<br>&#8220;description&#8221;: &#8220;Timeout di esecuzione in secondi&#8221;,<br>&#8220;default&#8221;: 300,<br>&#8220;minimum&#8221;: 1,<br>&#8220;maximum&#8221;: 3600<br>}<br>},<br>&#8220;required&#8221;: [&#8220;script&#8221;]<br>}<br>}<br>]<br>}<br>}<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#### tools\/call\n\nEsegue uno strumento.\n\n**Richiesta (Request):**<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">json<br>{<br>&#8220;jsonrpc&#8221;: &#8220;2.0&#8221;,<br>&#8220;id&#8221;: 3,<br>&#8220;method&#8221;: &#8220;tools\/call&#8221;,<br>&#8220;params&#8221;: {<br>&#8220;name&#8221;: &#8220;run-script&#8221;,<br>&#8220;arguments&#8221;: {<br>&#8220;script&#8221;: &#8220;Get-Date&#8221;,<br>&#8220;timeoutSeconds&#8221;: 30<br>}<br>}<br>}<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">**Risposta (Response):**<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">json<br>{<br>&#8220;jsonrpc&#8221;: &#8220;2.0&#8221;,<br>&#8220;id&#8221;: 3,<br>&#8220;result&#8221;: {<br>&#8220;content&#8221;: [<br>{<br>&#8220;type&#8221;: &#8220;text&#8221;,<br>&#8220;text&#8221;: &#8220;Output del comando:\\n<code class=\"\" data-line=\"\">\\nMarted\u00ec 25 settembre 2025 14:30:45\\n<\/code>&#8220;<br>}<br>],<br>&#8220;isError&#8221;: false,<br>&#8220;_meta&#8221;: {<br>&#8220;executionTime&#8221;: &#8220;2025-09-25 14:30:45&#8221;,<br>&#8220;success&#8221;: true,<br>&#8220;errorCount&#8221;: 0,<br>&#8220;warningCount&#8221;: 0<br>}<br>}<br>}<br>&#8220;`<\/p>\n\n\n\n<h3 id=\"rtoc-24\"  class=\"wp-block-heading\">Codici di errore<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Codice<\/th><th class=\"has-text-align-left\" data-align=\"left\">Descrizione<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">-32700<\/td><td class=\"has-text-align-left\" data-align=\"left\">Parse error &#8211; Errore di parsing JSON<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">-32600<\/td><td class=\"has-text-align-left\" data-align=\"left\">Invalid Request &#8211; Richiesta non valida<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">-32601<\/td><td class=\"has-text-align-left\" data-align=\"left\">Method not found &#8211; Metodo non trovato<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">-32602<\/td><td class=\"has-text-align-left\" data-align=\"left\">Invalid params &#8211; Parametri non validi<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">-32603<\/td><td class=\"has-text-align-left\" data-align=\"left\">Internal error &#8211; Errore interno del server<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 id=\"rtoc-25\"  class=\"wp-block-heading\">Livelli di logging<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Livello<\/th><th class=\"has-text-align-left\" data-align=\"left\">Descrizione<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\">DEBUG<\/td><td class=\"has-text-align-left\" data-align=\"left\">Informazioni di debug dettagliate<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">INFO<\/td><td class=\"has-text-align-left\" data-align=\"left\">Informazioni generali sul funzionamento<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">WARNING<\/td><td class=\"has-text-align-left\" data-align=\"left\">Avvisi su potenziali problemi<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">ERROR<\/td><td class=\"has-text-align-left\" data-align=\"left\">Errori che richiedono attenzione<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 id=\"rtoc-26\"  class=\"wp-block-heading\">Conclusione<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MCP PowerShell Server offre un modo potente e sicuro per integrare PowerShell con assistenti AI e altre applicazioni tramite il protocollo standardizzato MCP. Segui le raccomandazioni di sicurezza e utilizza il logging for monitorare il funzionamento del server.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Questo Articolo Installazione e configurazione Prerequisiti Configurazione iniziale Scelta della modalit\u00e0 operativa: HTTP vs. STDIO Quando usare la modalit\u00e0 HTTP? Quando usare la modalit\u00e0 STDIO? Modalit\u00e0 STDIO Avvio del server STDIO Caratteristiche della modalit\u00e0 STDIO Test della modalit\u00e0 STDIO Modalit\u00e0 HTTP Avvio del server HTTP Endpoint dell&#8217;API HTTP Test della modalit\u00e0 HTTP Integrazione con&hellip;&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[937],"tags":[944,108,938,939,765],"class_list":["post-3477","post","type-post","status-publish","format-standard","hentry","category-mcp-powershell-server","tag-tag-client-server","tag-tag-mcp","tag-tag-mcp-server","tag-tag-powershell-script-execution","tag-ms-powershell"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/comments?post=3477"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3477\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=3477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=3477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=3477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}