PowerShell et MCP Server : pilotez l'IA depuis votre terminal
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.
| Composant | Rôle | Exemple |
|---|---|---|
| Client MCP | Consomme les outils | GitHub Copilot, Claude Desktop, AI Shell |
| Serveur MCP | Expose les outils | Votre script server.ps1 |
| Tool MCP | Fonction exécutable par l'IA | Get-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.