PoshMCP
Expor commandlets do PowerShell explicitamente na lista de permissões como uma ferramenta MCP
Documentação
Servidor MCP do PowerShell
Um servidor Model Context Protocol (MCP) que expõe cmdlets do PowerShell como ferramentas para assistentes de IA como Claude ou Github Copilot. Construído com segurança em mente por meio de listas de permissões explícitas de cmdlets permitidos.
Visão Geral
Este servidor MCP carrega dinamicamente cmdlets do PowerShell a partir de módulos e scripts, gerando automaticamente esquemas de ferramentas a partir da documentação dos cmdlets. Diferente do remoting tradicional do PowerShell, este servidor usa uma abordagem de lista de permissões — apenas cmdlets explicitamente configurados são expostos, tornando-o mais seguro para interações com IA.
Principais Recursos
- Configuração Declarativa: Defina as ferramentas disponíveis em um arquivo de configuração JSON simples
- Geração Automática de Esquemas: Usa reflexão do PowerShell para gerar esquemas de ferramentas MCP a partir da documentação de ajuda dos cmdlets
- Segurança por Lista de Permissões: Apenas cmdlets explicitamente listados são expostos como ferramentas
- Carregamento Dinâmico: Suporta tanto módulos do PowerShell (.psm1) quanto arquivos de script (.ps1)
- Conversão de Tipos: Lida automaticamente com conversões de tipos de parâmetros (DateTime, parâmetros switch, etc.)
Como Funciona
- Carregamento de Configuração: Lê
mcp-config.jsonpara determinar quais cmdlets expor - Importação de Módulos/Scripts: Carrega módulos do PowerShell especificados e faz dot-source de arquivos de script
- Geração de Esquemas: Usa
Get-CommandeGet-Helppara inspecionar cada cmdlet:- Extrai o resumo do cmdlet como descrição da ferramenta
- Mapeia tipos de parâmetros do PowerShell para tipos de esquema JSON
- Identifica parâmetros obrigatórios a partir de atributos
[Parameter(Mandatory)] - Gera nomes de parâmetros em camelCase para JSON (ex.:
StartDate→startDate)
- Invocação de Ferramentas: Quando uma ferramenta é chamada, despacha dinamicamente para o cmdlet correspondente com mapeamento de parâmetros
Instalação
Da Galeria do PowerShell (Recomendado)
Install-Module -Name PoshMCP -Scope CurrentUser
A partir do Código-Fonte
- Clone ou baixe este repositório para sua máquina local
- Certifique-se de que o PowerShell 7+ esteja instalado (
pwsh)
Configuração
Configuração do Servidor MCP
Adicione o seguinte ao seu arquivo de configuração MCP do VS Code (normalmente %APPDATA%\Code\User\mcp.json no Windows):
{
"servers": {
"posh-mcp": {
"type": "stdio",
"command": "pwsh",
"args": [
"-NoProfile",
"-NoLogo",
"-Command",
"Import-Module PoshMCP;",
"Start-PoshMcp -ConfigPath C:\\path\\to\\your\\mcp-config.json"
]
}
}
}
Configuração de Ferramentas
Edite mcp-config.json para definir quais cmdlets expor:
{
"serverInfo": {
"name": "posh-mcp",
"version": "1.0.0"
},
"modules": [
{
"name": "ModuleName",
"path": "./MyModule.psm1",
"cmdlets": [
"Get-MyData",
"Set-MyConfig"
]
}
],
"scripts": [
{
"path": "./my-tools.ps1",
"cmdlets": [
"Get-CustomInfo",
"Invoke-CustomTask"
]
}
]
}
Estrutura de Configuração:
-
serverInfo: Metadados sobre o servidor MCPname: Nome do servidor exibido para clientes MCPversion: Versão do servidor
-
modules: Módulos do PowerShell a importarname: Nome do módulo (informativo)path: Caminho relativo ou absoluto para o arquivo.psm1cmdlets: Matriz de nomes de cmdlets a expor como ferramentas
-
scripts: Arquivos de script do PowerShell para fazer dot-sourcepath: Caminho relativo ou absoluto para o arquivo.ps1cmdlets: Matriz de nomes de funções a expor como ferramentas
Criando Ferramentas Personalizadas
Exemplo: Criando um Script Personalizado
Crie um arquivo de script (ex.: my-tools.ps1):
function Get-SystemUptime {
<#
.SYNOPSIS
Returns the system uptime information.
.DESCRIPTION
Gets how long the system has been running since last boot.
.EXAMPLE
Get-SystemUptime
Returns uptime information.
.OUTPUTS
Hashtable with uptime details.
#>
[CmdletBinding()]
param()
$os = Get-CimInstance Win32_OperatingSystem
$uptime = (Get-Date) - $os.LastBootUpTime
return @{
LastBootTime = $os.LastBootUpTime.ToString("o")
UptimeDays = $uptime.Days
UptimeHours = $uptime.Hours
UptimeMinutes = $uptime.Minutes
}
}
Adicione ao mcp-config.json:
{
"scripts": [
{
"path": "./my-tools.ps1",
"cmdlets": [
"Get-SystemUptime"
]
}
]
}
A ferramenta será automaticamente exposta como getSystemUptime (camelCase) com esquema gerado a partir da ajuda baseada em comentários.
Boas Práticas de Documentação
Para melhores resultados, inclua ajuda completa baseada em comentários em seus cmdlets:
function Get-MyData {
<#
.SYNOPSIS
Brief one-line description (becomes tool description)
.PARAMETER Name
Detailed parameter description (appears in tool schema)
.PARAMETER StartDate
Start date for filtering results
.EXAMPLE
Get-MyData -Name "Test" -StartDate "2025-01-01"
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[string]$Name,
[Parameter(Mandatory = $false)]
[DateTime]$StartDate = (Get-Date).AddDays(-7)
)
# Your implementation
}
Considerações de Segurança
Por Que Isso É Mais Seguro
- Somente Lista de Permissões: Apenas cmdlets explicitamente listados em
mcp-config.jsonsão acessíveis - Sem Execução Dinâmica: O servidor não executa comandos arbitrários do PowerShell
- Validação de Parâmetros: Todos os parâmetros passam pela validação nativa do PowerShell
- Escopo Isolado: Cada cmdlet é executado em um contexto controlado