PowerShell et MCP Server : pilotez l'IA depuis votre terminal

2026-03-14Équipe pwsh.frIntermédiaire~12 min de lecture

Le Model Context Protocol (MCP) est un standard ouvert qui permet à des IA comme GitHub Copilot ou Claude de brancher des outils externes — et donc vos scripts PowerShell. Microsoft a officiellement annoncé un serveur MCP natif pour PowerShell parmi ses investissements 2026. Cet article vous montre comment créer votre propre serveur MCP en PowerShell et le connecter à votre IA préférée.

Qu'est-ce que MCP ?

MCP (Model Context Protocol) définit une architecture en trois couches : le client (l'IA : Copilot, Claude, AI Shell…), le serveur MCP (votre script PowerShell) et les outils/ressources que vous exposez à l'IA. La communication se fait via JSON-RPC sur stdio ou SSE — pas de serveur web, pas d'infrastructure complexe.

ComposantRôleExemple
Client MCPConsomme les outilsGitHub Copilot, Claude Desktop, AI Shell
Serveur MCPExpose les outilsVotre script server.ps1
Tool MCPFonction exécutable par l'IAGet-TopProcesses, Get-CriticalServices

Pré-requis

Vous aurez besoin de PowerShell 7.5 minimum et d'un client MCP compatible. Vérifiez votre version avant de commencer :

# Vérifier la version installée
$PSVersionTable.PSVersion
# Doit afficher 7.5.x ou supérieur

# Installer le module MCP pour PowerShell
Install-PSResource -Name PowerShellMCP -Scope CurrentUser

Si Install-PSResource n'est pas disponible, utilisez Install-Module -Name PowerShellMCP -Scope CurrentUser -Force. Vous aurez également besoin d'un client : VS Code avec GitHub Copilot (mode Agent) ou Claude Desktop fonctionnent très bien.

Comprendre les « tools » MCP

Dans MCP, un tool est simplement une fonction que l'IA peut appeler. En PowerShell, c'est une fonction standard à laquelle vous associez une description lisible par l'IA — c'est cette description qui lui permet de choisir automatiquement le bon outil selon votre question.

# Cette fonction deviendra un outil MCP
function Get-TopProcesses {
    param(
        [int]$Count = 10
    )
    Get-Process |
        Sort-Object WorkingSet -Descending |
        Select-Object -First $Count Name, Id,
            @{ N = 'RAM_MB'; E = { [math]::Round($_.WorkingSet / 1MB, 1) } }
}

Créer le serveur MCP

Le module PowerShellMCP fournit des cmdlets pour enregistrer vos fonctions et démarrer le serveur. Voici la structure minimale d'un server.ps1 :

# server.ps1
Import-Module PowerShellMCP

# --- Définition des outils ---
function Get-TopProcesses {
    param([int]$Count = 10)
    Get-Process |
        Sort-Object WorkingSet -Descending |
        Select-Object -First $Count Name, Id,
            @{ N = 'RAM_MB'; E = { [math]::Round($_.WorkingSet / 1MB, 1) } }
}

function Get-CriticalServices {
    $services = @('wuauserv', 'spooler', 'W32Time', 'WinDefend')
    Get-Service -Name $services |
        Select-Object Name, Status, StartType
}

# --- Enregistrement des outils MCP ---
Register-MCPTool -Function Get-TopProcesses `
    -Description "Retourne les N processus les plus gourmands en RAM (défaut : 10)"

Register-MCPTool -Function Get-CriticalServices `
    -Description "Vérifie l'état des services Windows critiques (spooler, Defender, etc.)"

# --- Démarrage du serveur (écoute sur stdio) ---
Start-MCPServer

Connecter à GitHub Copilot (Agent Mode)

Dans VS Code, créez un fichier .vscode/mcp.json à la racine de votre workspace. Copilot détecte automatiquement ce fichier et propose d'activer le serveur :

{
  "servers": {
    "powershell-sysadmin": {
      "type": "stdio",
      "command": "pwsh",
      "args": ["-NoProfile", "-File", "./server.ps1"]
    }
  }
}

Une fois activé, dans Copilot Chat en mode Agent (@), vous pouvez taper : « Quels processus consomment le plus de RAM en ce moment ? » — Copilot appelle automatiquement Get-TopProcesses et affiche les résultats dans le chat, sans que vous n'ayez à taper une seule commande.

Connecter à Claude Desktop

Claude Desktop lit sa configuration depuis un fichier JSON. Sur Windows, modifiez %APPDATA%\Claude\claude_desktop_config.json :

{
  "mcpServers": {
    "powershell-sysadmin": {
      "command": "pwsh",
      "args": ["-NoProfile", "-File", "C:\\Scripts\\server.ps1"]
    }
  }
}

Redémarrez Claude Desktop pour qu'il charge le serveur. Une icône 🔧 apparaît dans l'interface pour confirmer que les outils sont disponibles.

Cas d'usage concrets pour sysadmins

L'intérêt de MCP ne se limite pas aux processus. Voici d'autres outils utiles à enregistrer dans votre serveur :

# Lister les mises à jour Windows en attente
function Get-PendingUpdates {
    $session = New-Object -ComObject Microsoft.Update.Session
    $searcher = $session.CreateUpdateSearcher()
    $result = $searcher.Search("IsInstalled=0 and IsHidden=0")
    $result.Updates | Select-Object Title, MsrcSeverity,
        @{ N = 'Taille_MB'; E = { [math]::Round($_.MaxDownloadSize / 1MB, 1) } }
}

# Rapport d'espace disque
function Get-DiskReport {
    Get-PSDrive -PSProvider FileSystem |
        Where-Object { $_.Used -gt 0 } |
        Select-Object Name,
            @{ N = 'Total_GB';  E = { [math]::Round(($_.Used + $_.Free) / 1GB, 1) } },
            @{ N = 'Libre_GB';  E = { [math]::Round($_.Free / 1GB, 1) } },
            @{ N = 'Utilisé_%'; E = { [math]::Round($_.Used / ($_.Used + $_.Free) * 100, 1) } }
}

Register-MCPTool -Function Get-PendingUpdates `
    -Description "Liste les mises à jour Windows disponibles non installées"

Register-MCPTool -Function Get-DiskReport `
    -Description "Retourne l'espace disque disponible sur tous les lecteurs locaux"

Sécurité — ce qu'il ne faut pas exposer

Exposer des cmdlets à une IA implique un risque : l'IA pourrait appeler un outil destructif (suppression, redémarrage…) sans que vous l'ayez demandé explicitement. Quelques règles simples :

# ✅ Exposez des fonctions en lecture seule
Register-MCPTool -Function Get-DiskReport -Description "..."

# ⚠️ Pour les actions modifiantes, ajoutez une confirmation manuelle
function Restart-ServiceWithConfirm {
    param([Parameter(Mandatory)][string]$Name)
    $service = Get-Service -Name $Name -ErrorAction Stop
    Write-Host "[MCP] Demande de redémarrage : $($service.DisplayName)" -ForegroundColor Yellow
    $ok = Read-Host "Confirmer ? (o/N)"
    if ($ok -eq 'o') {
        Restart-Service -Name $Name
        "Service $Name redémarré avec succès."
    } else {
        Write-Warning "Action annulée."
    }
}

# ❌ Ne jamais exposer directement Remove-Item, Stop-Computer, Format-Volume…

Journalisez systématiquement chaque appel MCP dans un fichier log horodaté : en cas d'action non souhaitée, vous disposerez d'une trace complète.

Ressources pour aller plus loin