{"id":3495,"date":"2025-09-26T16:34:18","date_gmt":"2025-09-26T14:34:18","guid":{"rendered":"https:\/\/davidka.net\/ru\/?p=3495"},"modified":"2025-09-26T20:07:36","modified_gmt":"2025-09-26T18:07:36","slug":"mcp-powershell-server-http","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/mcp-powershell-server-http\/","title":{"rendered":"Documentazione per Sviluppatori: MCP PowerShell HTTP Server. (mcp-powershell-server-http.py)"},"content":{"rendered":"\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"3495\" 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><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#rtoc-1\">1. Panoramica<\/a><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">2. Esecuzione e Configurazione<\/a><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#rtoc-3\">3. Architettura e Funzioni<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-4\">4. Flusso di Esecuzione di una Richiesta<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-5\">5. Estendere le Funzionalit\u00e0<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ol><\/div><h4 id=\"rtoc-1\"  class=\"wp-block-heading\">1. Panoramica<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><code class=\"\" data-line=\"\">mcp-powershell-http.ps1<\/code> \u00e8 un server HTTP autonomo scritto in PowerShell, progettato per eseguire script PowerShell in modo remoto e sicuro. Funziona come un &#8220;ponte&#8221; tra un client esterno (ad esempio, un assistente IA) e l&#8217;ambiente PowerShell locale, utilizzando il protocollo JSON-RPC 2.0 per la comunicazione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Caratteristiche Principali:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sicurezza:<\/strong> Ogni script viene eseguito in un&#8217;istanza PowerShell (<code class=\"\" data-line=\"\">runspace<\/code>) completamente isolata, impedendo qualsiasi impatto sull&#8217;ambiente principale del server.<\/li>\n\n\n\n<li><strong>Configurazione Flessibile:<\/strong> I parametri del server (porta, host, timeout) possono essere configurati tramite argomenti da riga di comando e un file JSON esterno.<\/li>\n\n\n\n<li><strong>Stabilit\u00e0:<\/strong> Una gestione completa degli errori a tutti i livelli (HTTP, JSON, esecuzione dello script) garantisce il funzionamento affidabile del server.<\/li>\n\n\n\n<li><strong>Protocollo MCP:<\/strong> Implementa il protocollo standard MCP per l&#8217;interazione, inclusi i metodi <code class=\"\" data-line=\"\">initialize<\/code>, <code class=\"\" data-line=\"\">tools\/list<\/code> e <code class=\"\" data-line=\"\">tools\/call<\/code>.<\/li>\n\n\n\n<li><strong>Controllo delle Risorse:<\/strong> Timeout integrati e limiti sulla dimensione dell&#8217;output prevengono l&#8217;abuso di risorse.<\/li>\n<\/ul>\n\n\n\n<h4 id=\"rtoc-2\"  class=\"wp-block-heading\">2. Esecuzione e Configurazione<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Requisiti:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>PowerShell 7.0 o superiore.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Parametri della Riga di Comando:<\/strong><\/p>\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\">Parametro<\/th><th class=\"has-text-align-left\" data-align=\"left\">Tipo<\/th><th class=\"has-text-align-left\" data-align=\"left\">Descrizione<\/th><th class=\"has-text-align-left\" data-align=\"left\">Predefinito<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">-Port<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">[int]<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">La porta su cui il server si metter\u00e0 in ascolto per le richieste HTTP.<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">8090<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">-ServerHost<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">[string]<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">L&#8217;host (indirizzo IP o nome di dominio) a cui associare il server.<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">localhost<\/code><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">-ConfigFile<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">[string]<\/code><\/td><td class=\"has-text-align-left\" data-align=\"left\">Il percorso di un file di configurazione in formato JSON. I parametri di questo file sovrascrivono i valori predefiniti e gli argomenti della riga di comando.<\/td><td class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">$null<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esempio di Utilizzo:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">.\\mcp-powershell-http.ps1 -Port 8090 -ServerHost 0.0.0.0 -ConfigFile &quot;C:\\config\\settings.json&quot;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>File di Configurazione (<code class=\"\" data-line=\"\">settings.json<\/code>):<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il server pu\u00f2 caricare la sua configurazione da un file JSON. Questo \u00e8 l&#8217;approccio consigliato per gli ambienti di produzione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Esempio di <code class=\"\" data-line=\"\">settings.json<\/code> dal repository:<\/em><\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">{\n  &quot;Port&quot;: 8090,\n  &quot;Host&quot;: &quot;localhost&quot;,\n  &quot;MaxConcurrentRequests&quot;: 10,\n  &quot;TimeoutSeconds&quot;: 300,\n  &quot;LogLevel&quot;: &quot;INFO&quot;,\n  &quot;AllowedPaths&quot;: &#091;\n    &quot;C:\\\\Scripts\\\\&quot;,\n    &quot;C:\\\\Users\\\\%USERNAME%\\\\Documents\\\\&quot;\n  ],\n  &quot;Security&quot;: {\n    &quot;EnableScriptValidation&quot;: false,\n    &quot;BlockDangerousCommands&quot;: false,\n    &quot;RestrictedCommands&quot;: &#091;\n      &quot;Remove-Item -Path C:\\\\Windows\\\\*&quot;,\n      &quot;Format-Volume&quot;\n    ]\n  }\n}<\/code><\/pre>\n\n\n\n<h4 id=\"rtoc-3\"  class=\"wp-block-heading\">3. Architettura e Funzioni<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Lo script \u00e8 logicamente suddiviso in diverse regioni (<code class=\"\" data-line=\"\">#region<\/code>) per semplificare la navigazione.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Regione: <code class=\"\" data-line=\"\">Utility Functions<\/code> (Funzioni di Utilit\u00e0)<\/strong><\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code class=\"\" data-line=\"\">Write-Log<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> Stampa messaggi formattati e colorati nella console con un timestamp. \u00c8 la funzione principale per il logging.<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Message<\/code> <code class=\"\" data-line=\"\">[string]<\/code> (obbligatorio): Il testo del messaggio.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$Level<\/code> <code class=\"\" data-line=\"\">[string]<\/code> (opzionale): Il livello di log (<code class=\"\" data-line=\"\">DEBUG<\/code>, <code class=\"\" data-line=\"\">INFO<\/code>, <code class=\"\" data-line=\"\">WARNING<\/code>, <code class=\"\" data-line=\"\">ERROR<\/code>). Influisce sul colore dell&#8217;output.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Test-MCPRequest<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> Verifica se la richiesta in arrivo soddisfa i requisiti di base del protocollo JSON-RPC 2.0 (presenza dei campi <code class=\"\" data-line=\"\">jsonrpc: &quot;2.0&quot;<\/code> e <code class=\"\" data-line=\"\">method<\/code>).<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Request<\/code> <code class=\"\" data-line=\"\">[hashtable]<\/code> (obbligatorio): La richiesta, deserializzata da JSON.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Restituisce:<\/strong> <code class=\"\" data-line=\"\">$true<\/code> se la richiesta \u00e8 valida, altrimenti <code class=\"\" data-line=\"\">$false<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">New-MCPResponse<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> Una funzione &#8220;factory&#8221; per creare oggetti di risposta JSON-RPC standardizzati.<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Id<\/code> <code class=\"\" data-line=\"\">[object]<\/code>: L&#8217;identificatore della richiesta.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$Result<\/code> <code class=\"\" data-line=\"\">[object]<\/code>: L&#8217;oggetto contenente un risultato di successo.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$Error<\/code> <code class=\"\" data-line=\"\">[hashtable]<\/code>: L&#8217;oggetto contenente le informazioni sull&#8217;errore.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Restituisce:<\/strong> Una <code class=\"\" data-line=\"\">[hashtable]<\/code> con la struttura completa della risposta.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Test-ScriptSafety<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> Controlla se lo script contiene comandi potenzialmente pericolosi elencati nella variabile globale <code class=\"\" data-line=\"\">$script:RestrictedCommands<\/code>.<\/li>\n\n\n\n<li><strong>Nota:<\/strong> Nella versione fornita, questa funzione \u00e8 disabilitata per impostazione predefinita (<code class=\"\" data-line=\"\">return $true<\/code>). Per l&#8217;uso in produzione, dovrebbe essere abilitata e configurata.<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Script<\/code> <code class=\"\" data-line=\"\">[string]<\/code> (obbligatorio): Il testo dello script PowerShell da controllare.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Restituisce:<\/strong> <code class=\"\" data-line=\"\">$true<\/code> se lo script \u00e8 sicuro, altrimenti <code class=\"\" data-line=\"\">$false<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Regione: <code class=\"\" data-line=\"\">Core Logic<\/code> (Logica Principale)<\/strong><\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code class=\"\" data-line=\"\">Invoke-PowerShellScript<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> La funzione principale responsabile dell&#8217;esecuzione sicura di uno script PowerShell.<\/li>\n\n\n\n<li><strong>Processo:<\/strong>\n<ol class=\"wp-block-list\">\n<li>Crea una nuova istanza PowerShell completamente isolata (<code class=\"\" data-line=\"\">[powershell]::Create()<\/code>).<\/li>\n\n\n\n<li>(Opzionale) Imposta la directory di lavoro all&#8217;interno di questa istanza.<\/li>\n\n\n\n<li>Aggiunge il testo dello script e i suoi parametri all&#8217;istanza.<\/li>\n\n\n\n<li>Esegue lo script in modo asincrono con un timeout.<\/li>\n\n\n\n<li>Raccoglie i flussi di output (<code class=\"\" data-line=\"\">Output<\/code>), errore (<code class=\"\" data-line=\"\">Error<\/code>) e avviso (<code class=\"\" data-line=\"\">Warning<\/code>).<\/li>\n\n\n\n<li>Limita la dimensione dell&#8217;output (predefinito 10.000 caratteri) per prevenire trasferimenti di dati di grandi dimensioni.<\/li>\n\n\n\n<li>Rilascia le risorse (<code class=\"\" data-line=\"\">Dispose()<\/code>) al termine.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Script<\/code> <code class=\"\" data-line=\"\">[string]<\/code> (obbligatorio): Il codice da eseguire.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$Parameters<\/code> <code class=\"\" data-line=\"\">[hashtable]<\/code>: Parametri da passare allo script.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$TimeoutSeconds<\/code> <code class=\"\" data-line=\"\">[int]<\/code>: Tempo massimo di esecuzione in secondi.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$WorkingDirectory<\/code> <code class=\"\" data-line=\"\">[string]<\/code>: La directory di lavoro per lo script.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Restituisce:<\/strong> Una <code class=\"\" data-line=\"\">[hashtable]<\/code> con i risultati: <code class=\"\" data-line=\"\">success<\/code> (bool), <code class=\"\" data-line=\"\">output<\/code> (string), <code class=\"\" data-line=\"\">errors<\/code> (array), <code class=\"\" data-line=\"\">warnings<\/code> (array), <code class=\"\" data-line=\"\">executionTime<\/code> (double).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Regione: <code class=\"\" data-line=\"\">MCP Protocol Methods<\/code> (Metodi del Protocollo MCP)<\/strong><\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code class=\"\" data-line=\"\">Invoke-MCPMethod<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> Un dispatcher che gestisce le chiamate ai metodi del protocollo MCP.<\/li>\n\n\n\n<li><strong>Processo:<\/strong> Utilizza un&#8217;istruzione <code class=\"\" data-line=\"\">switch<\/code> sul nome del metodo (<code class=\"\" data-line=\"\">$Method<\/code>) per invocare la logica appropriata.<\/li>\n\n\n\n<li><strong>Metodi Supportati:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">&quot;initialize&quot;<\/code>: Restituisce informazioni sul server.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">&quot;tools\/list&quot;<\/code>: Restituisce un elenco degli strumenti disponibili (in questo caso, solo <code class=\"\" data-line=\"\">&quot;run-script&quot;<\/code>).<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">&quot;tools\/call&quot;<\/code>: Gestisce l&#8217;invocazione di uno strumento. Estrae i parametri e chiama <code class=\"\" data-line=\"\">Invoke-PowerShellScript<\/code> per l&#8217;esecuzione.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Method<\/code> <code class=\"\" data-line=\"\">[string]<\/code>: Il nome del metodo da chiamare.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$Params<\/code> <code class=\"\" data-line=\"\">[hashtable]<\/code>: I parametri del metodo.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">$Id<\/code> <code class=\"\" data-line=\"\">[object]<\/code>: L&#8217;identificatore della richiesta.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Restituisce:<\/strong> Una <code class=\"\" data-line=\"\">[hashtable]<\/code> che rappresenta la risposta MCP completa, pronta per essere inviata.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h5 class=\"wp-block-heading\"><strong>Regione: <code class=\"\" data-line=\"\">HTTP Server<\/code><\/strong><\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><code class=\"\" data-line=\"\">Invoke-RequestHandler<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> Gestisce l&#8217;intero ciclo di vita di una singola richiesta HTTP.<\/li>\n\n\n\n<li><strong>Processo:<\/strong>\n<ol class=\"wp-block-list\">\n<li>Imposta gli header CORS.<\/li>\n\n\n\n<li>Gestisce le richieste <code class=\"\" data-line=\"\">OPTIONS<\/code> (CORS preflight).<\/li>\n\n\n\n<li>Verifica che il metodo della richiesta sia <code class=\"\" data-line=\"\">POST<\/code>.<\/li>\n\n\n\n<li>Legge e convalida il corpo della richiesta.<\/li>\n\n\n\n<li>Esegue il parsing del JSON e lo converte in una hashtable.<\/li>\n\n\n\n<li>Chiama <code class=\"\" data-line=\"\">Test-MCPRequest<\/code> per la validazione.<\/li>\n\n\n\n<li>Passa la richiesta a <code class=\"\" data-line=\"\">Invoke-MCPMethod<\/code> per l&#8217;elaborazione.<\/li>\n\n\n\n<li>Serializza la risposta in JSON e la invia al client.<\/li>\n\n\n\n<li>Gestisce tutti i possibili errori lungo questo percorso.<\/li>\n<\/ol>\n<\/li>\n\n\n\n<li><strong>Parametri:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">$Context<\/code> <code class=\"\" data-line=\"\">[System.Net.HttpListenerContext]<\/code>: Il contesto della richiesta HTTP dal listener .NET.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong><code class=\"\" data-line=\"\">Start-MCPServer<\/code><\/strong>\n<ul class=\"wp-block-list\">\n<li><strong>Scopo:<\/strong> La funzione principale che inizializza e avvia il listener HTTP.<\/li>\n\n\n\n<li><strong>Processo:<\/strong>\n<ol class=\"wp-block-list\">\n<li>Crea e configura un oggetto <code class=\"\" data-line=\"\">System.Net.HttpListener<\/code>.<\/li>\n\n\n\n<li>Avvia il listener con <code class=\"\" data-line=\"\">listener.Start()<\/code>.<\/li>\n\n\n\n<li>Entra in un ciclo infinito <code class=\"\" data-line=\"\">while ($listener.IsListening)<\/code> per attendere le connessioni in arrivo.<\/li>\n\n\n\n<li>Per ogni connessione, chiama <code class=\"\" data-line=\"\">Invoke-RequestHandler<\/code>.<\/li>\n\n\n\n<li>Arresta correttamente il server quando il processo viene terminato.<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 id=\"rtoc-4\"  class=\"wp-block-heading\">4. Flusso di Esecuzione di una Richiesta<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Un client invia una richiesta <code class=\"\" data-line=\"\">POST<\/code> con <code class=\"\" data-line=\"\">Content-Type: application\/json<\/code> all&#8217;URL del server.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">Start-MCPServer<\/code> accetta la richiesta e la passa a <code class=\"\" data-line=\"\">Invoke-RequestHandler<\/code>.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">Invoke-RequestHandler<\/code> convalida gli header HTTP, il metodo ed esegue il parsing del corpo JSON.<\/li>\n\n\n\n<li>La richiesta MCP valida viene passata a <code class=\"\" data-line=\"\">Invoke-MCPMethod<\/code>.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">Invoke-MCPMethod<\/code> determina che \u00e8 stato invocato il metodo <code class=\"\" data-line=\"\">tools\/call<\/code> con lo strumento <code class=\"\" data-line=\"\">run-script<\/code>.<\/li>\n\n\n\n<li>I parametri (script, timeout, ecc.) vengono passati a <code class=\"\" data-line=\"\">Invoke-PowerShellScript<\/code>.<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">Invoke-PowerShellScript<\/code> esegue lo script in un ambiente isolato.<\/li>\n\n\n\n<li>Il risultato dell&#8217;esecuzione viene restituito lungo la catena di chiamate, formattato in una risposta JSON-RPC standard e inviato al client da <code class=\"\" data-line=\"\">Invoke-RequestHandler<\/code>.<\/li>\n<\/ol>\n\n\n\n<h4 id=\"rtoc-5\"  class=\"wp-block-heading\">5. Estendere le Funzionalit\u00e0<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Per aggiungere un nuovo &#8220;strumento&#8221; (oltre a <code class=\"\" data-line=\"\">run-script<\/code>), uno sviluppatore deve:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aggiungere una descrizione del nuovo strumento nel blocco <code class=\"\" data-line=\"\">&quot;tools\/list&quot;<\/code> della funzione <code class=\"\" data-line=\"\">Invoke-MCPMethod<\/code>.<\/li>\n\n\n\n<li>Aggiungere un nuovo ramo <code class=\"\" data-line=\"\">case<\/code> per questo strumento nell&#8217;istruzione <code class=\"\" data-line=\"\">switch ($toolName)<\/code> all&#8217;interno del blocco <code class=\"\" data-line=\"\">&quot;tools\/call&quot;<\/code> di <code class=\"\" data-line=\"\">Invoke-MCPMethod<\/code>.<\/li>\n\n\n\n<li>Implementare la logica per il nuovo strumento.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>In Questo Articolo 1. Panoramica 2. Esecuzione e Configurazione 3. Architettura e Funzioni 4. Flusso di Esecuzione di una Richiesta 5. Estendere le Funzionalit\u00e0 1. Panoramica mcp-powershell-http.ps1 \u00e8 un server HTTP autonomo scritto in PowerShell, progettato per eseguire script PowerShell in modo remoto e sicuro. Funziona come un &#8220;ponte&#8221; tra un client esterno (ad esempio,&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],"class_list":["post-3495","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"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3495","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=3495"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3495\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=3495"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=3495"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=3495"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}