Коллеги, собрал штуку, которой пользуюсь сам каждый день, и решил поделиться.
У меня несколько проектов на Windows-серверах. Стандартная история: services.msc, Event Viewer, Task Scheduler, порты, процессы. Каждый раз одно и то же: открываешь пять окон, ищешь ошибки, проверяешь зависимости, смотришь кто занял порт. Рутина, которая съедает время.
У меня уже стоит Claude Desktop с MCP, я через него работаю с GitHub и базами. Подумал: а почему бы не дать ему доступ к Windows? Написал MCP-сервер, который делает всю эту рутину за меня. Получилось 42 инструмента в 8 модулях. TypeScript, MIT, опубликован на npm.
В статье покажу, что внутри, как устроено и зачем каждый модуль. Буду рад фидбеку: что добавить, что лишнее, где можно сделать лучше. Если найдёте баги или захотите дополнить, PR приветствуются.
Установка
Одна команда:
npx windows-admin-mcp
Конфиг Claude Desktop (%APPDATA%\Claude\claude_desktop_config.json):
{ "mcpServers": { "windows-admin": { "command": "npx", "args": ["-y", "windows-admin-mcp"] } } }
Для Cursor, Windsurf, Claude Code аналогично. Требования: Windows 10/11 или Server 2016+, Node.js 18+, PowerShell 5.1+, права админа.
Можно установить и с GitHub напрямую:
git clone https://github.com/devladpopov/windows-admin-mcp.git cd windows-admin-mcp npm install && npm run build
Модули
Services (6 инструментов)
Стандартный набор: services_list, services_get, services_start, services_stop, services_restart, services_set_startup. Обертка над Get-Service / Set-Service с JSON-выводом.
Интереснее diagnose_service из модуля Diagnostics. Это цепочка из 4-5 проверок за один вызов:
Статус и конфигурация службы (
Get-Service+Win32_Service)Проверка порта, если указан (
Get-NetTCPConnection)Последние ошибки из Event Log по имени службы
Состояние всех зависимостей
Гипотеза на основе собранных данных
Пример вывода:
Служба: Spooler (Print Spooler) Статус: Stopped Тип запуска: Automatic Аккаунт: LocalSystem Порт 9100: занят процессом hp_print_service.exe (PID 4521) Зависимости: RPCSS: Running HTTP: Stopped <-- проблема Последние ошибки (3 за час): Event 7031: Service terminated unexpectedly Гипотеза: зависимость HTTP остановлена, Spooler не может запуститься. Рекомендация: запустить HTTP, затем Spooler.
На ручную диагностику того же самого уходит 5-7 минут и три разных консоли. Здесь это одна команда.
Event Viewer (5 инструментов)
events_query: запрос событий с фильтрацией по логу, уровню, источнику, времени, ключевым словамevents_logs_list: список доступных логов с количеством записейevents_sources_list: источники для конкретного логаevents_explain: встроенная база из 23 Event ID (7031, 7034, 7036, 1000, 41 и др.) с причинами и решениямиevents_summary: сводка за период, группировка по уровню
Под капотом используется Get-WinEvent с XPath-фильтрами. Даты нормализуются, XML парсится, на выходе структурированный JSON.
events_explain работает без интернета. База зашита в код:
{ id: 7031, source: "Service Control Manager", description: "Service terminated unexpectedly, recovery triggered", commonCauses: [ "Unhandled exception in service", "Memory leak / OOM", "Dependency service unavailable", "Corrupted binary" ], suggestedFixes: [ "Check Application log for Event 1000", "Review recovery settings in services.msc", "Update or reinstall the service", "Check memory with Performance Monitor" ] }
Task Scheduler (8 инструментов)
Полный CRUD: scheduler_list, scheduler_get, scheduler_create, scheduler_delete, scheduler_enable, scheduler_disable, scheduler_run, scheduler_history.
scheduler_history достает историю запусков конкретной задачи из лога Microsoft-Windows-TaskScheduler/Operational. Полезно для дебага: видно, когда задача запускалась, с каким результатом завершилась, сколько длилась.
Processes (4 инструмента)
processes_list: список с сортировкой по CPU/Memory/Nameprocesses_get: детали (CPU, память, путь к бинарю, потоки, handles)processes_kill: завершение по имени или PIDprocesses_ports: какой процесс слушает на каком TCP-порту
processes_ports под капотом делает Get-NetTCPConnection | Join с Get-Process. Банально, но когда нужно узнать кто занял 8080, удобнее чем netstat -ano | findstr.
Network (4 инструмента)
network_ping, network_check_port, network_dns, network_connections. Стандартная сетевая диагностика через Test-Connection, Test-NetConnection, Resolve-DnsName.
Observability (5 инструментов)
Этот модуль уже не просто обертка.
events_watch: поллинг с watermark. При первом вызове возвращает текущие Critical/Error события и запоминает метку времени. При повторном вызове показывает только новые. Полезно для мониторинга: AI может периодически дергать этот инструмент и сообщать о новых ошибках.
error_trends: анализ трендов. Группирует ошибки за N часов по часам, считает средний рейт для первой и второй половины периода, определяет тренд:
System log: 47 ошибок за 24ч Тренд: GROWING (рейт вырос с 1.2 до 2.8/час) Пик: 14:00-15:00 (8 ошибок) Топ источники: Service Control Manager (23), DCOM (12) Топ Event ID: 7036 (18), 10016 (9), 7031 (5)
Логика определения тренда: если средний рейт второй половины больше первой в 1.5+ раз, то GROWING. Меньше в 2+ раза, SHRINKING. Иначе STABLE.
system_changes: показывает что изменилось за N часов. Парсит Event ID 7045 (новая служба установлена), 7036 (смена состояния службы) и ищет свежие задачи в планировщике.
services_watch: ищет службы с StartType=Automatic, которые сейчас остановлены. Помогает быстро найти то, что должно работать, но не работает.
service_restarts: частота перезапусков и крашей. Парсит Event ID 7036/7031/7034, группирует по именам служб, считает рестарты и краши отдельно.
Safety (6 инструментов)
Деструктивные операции (kill, stop, restart, delete, bulk-операции) защищены confirmation flow:
Инструмент возвращает превью действия и
confirmationId(UUID)Пользователь видит, что именно произойдет
Действие выполняется только после вызова
confirm_action(confirmationId)Таймаут 5 минут, после чего
confirmationIdпротухает
Критические процессы в блок-листе по умолчанию:
lsass, csrss, svchost, winlogon, smss, services, wininit, TrustedInstaller
Даже с подтверждением их нельзя убить через MCP. Блок-лист настраивается через конфиг.
Bulk-операции ограничены: по умолчанию максимум 20 за один вызов. Защита от случайного services_bulk(action: "stop", filter: "*").
Audit
Каждый вызов инструмента логируется в JSONL:
{ "timestamp": "2026-05-17T14:23:01.456Z", "tool": "services_stop", "params": {"name": "Spooler"}, "result": "success", "durationMs": 1240 }
Лог можно запросить через audit_query с фильтрацией по инструменту и результату.
MCP Resources
Три ресурса, которые AI-клиент может читать автоматически:
system://info: ОС, CPU, RAM, uptime, hostname, часовой поясsystem://health: загрузка CPU/RAM/дисков, остановленные auto-start службы, свежие ошибки, общий статусsystem://services: количество служб по статусу и типу запуска
Resources работают как пассивный контекст: клиент читает их при старте и понимает, с какой системой работает, без дополнительных запросов.
Конфигурация
Файл config.json рядом с пакетом или через переменную WINDOWS_ADMIN_MCP_CONFIG:
{ "modules": { "services": true, "events": true, "scheduler": true, "processes": true, "network": true, "diagnostics": true, "safety": true, "observability": true }, "safety": { "requireConfirmation": true, "confirmationTimeoutMs": 300000, "blocklist": ["lsass", "csrss", "svchost", "winlogon", "smss"], "allowlist": [] }, "limits": { "maxProcessesToKill": 5, "maxEventsToReturn": 500, "maxBulkOperations": 20 }, "audit": { "enabled": true, "path": "./windows-admin-mcp-audit.jsonl", "maxSizeMB": 50 } }
Ненужные модули можно отключить. Для автоматизации в доверенной среде можно снять requireConfirmation. Блок-лист расширяется, allowlist работает как исключение из блок-листа.
Архитектура
Claude Desktop / Cursor / Claude Code | | JSON-RPC (stdin/stdout) | windows-admin-mcp (Node.js) | |-- config.ts (загрузка конфига, блок-лист) |-- safety.ts (confirmation flow) |-- audit.ts (JSONL-логирование) |-- resources.ts (MCP resources) |-- modules/ | |-- services/ | |-- events/ | |-- scheduler/ | |-- processes/ | |-- network/ | |-- diagnostics/ | |-- observability/ | |-- safety/ |-- data/ |-- event-ids.ts (база Event ID)
Каждый модуль регистрирует свои инструменты через server.tool() из @modelcontextprotocol/sdk. Внутри вызывает PowerShell через child_process.exec, парсит JSON-вывод. Все строковые параметры экранируются для предотвращения инъекций.
Производительность
PowerShell-вызовы занимают основное время. Типичные замеры:
services_list: ~200-400мсevents_query(100 событий): ~500-800мсdiagnose_service(цепочка из 5 шагов): ~1.5-3сsystem_health: ~2-4с
Для интерактивного использования через AI-ассистента вполне приемлемо. Для real-time мониторинга нет, но это и не цель.
Что хочу добавить
Проект на GitHub и npm под MIT.
Ближайшие планы:
Расширить базу Event ID (сейчас 23, хочу хотя бы 100 самых частых)
TUI для Event Viewer (терминальная альтернатива GUI)
TUI для Task Scheduler
Интеграция с Ollama для офлайн-анализа логов
Если администрируете Windows и пользуетесь MCP, попробуйте. Буду рад issues, PR и просто обратной связи в комментариях: что не хватает, что лишнее, где криво. Дополню и доработаю.
npx windows-admin-mcp
