内容
# sysinternals-mcp
一个 [MCP](https://modelcontextprotocol.io/) 服务器,封装了微软 Sysinternals 工具套件,以便 AI 编程助手可以通过自然语言提示驱动 Windows 进程内省、 二进制分类和 ACL 审计。基于 FastMCP,Python 3.11+,Windows-first。
该服务器 **不包含任何 Sysinternals 二进制文件**。您需要从 <https://learn.microsoft.com/en-us/sysinternals/> 自行下载 Sysinternals 套件,并将服务器指向您的安装目录。
## 功能
| 组 | 工具 |
| ------------ | ------------------------------------------------------------------------------------------------------------------ |
| 设置 | `check_sysinternals_setup` |
| 初始化 | `bootstrap_sysinternals`, `accept_sysinternals_eula` |
|句柄 | `handle_list`, `parse_handle_output` |
| 二进制文件 | `sigcheck`, `parse_sigcheck_output` |
| 进程 | `pslist`, `parse_pslist_output`, `psinfo`, `parse_psinfo_output`, `listdlls`, `parse_listdlls_output` |
| ACL | `accesschk`, `parse_accesschk_output` |
| 网络 | `tcpvcon`, `parse_tcpvcon_output` |
| 自动启动 | `autoruns`, `parse_autoruns_output` |
| CPU 信息 | `coreinfo`, `parse_coreinfo_output` |
| 崩溃转储 | `procdump`, `parse_procdump_output` |
| 字符串 | `strings`, `parse_strings_output` |
| ProcMon | `list_procmon_recipes`, `get_procmon_recipe`, `get_procmon_capture_commands`, `get_capture_instructions`, `analyze_pml` |
每个实时执行工具都需要一个 `target` 参数:
- `target="local"` — 服务器在本地机器上以子进程运行 Sysinternals 二进制文件,并返回解析后的 markdown。
- `target="remote"` — 服务器返回一个 *[LabLink](https://github.com/nijosmsft/LabLink)-first dispatch* 块:一个围栏 ```powershell``` 命令、推荐的传输顺序(LabLink → PSRemoting → 手动粘贴)和一个 JSON 边车,LLM 可以直接将其交给任何具有远程执行工具的 MCP。您在远程目标上运行命令,然后将捕获的 stdout 管道回匹配的 `parse_<tool>_output` 工具。`sysinternals-mcp` 中没有任何内容与特定的远程执行 MCP 耦合 — 请参见下面的 [远程工作流](#远程工作流)。
## 安装(Windows)
### 1. 获取 Sysinternals 套件
最快的路径是新的 **bootstrap** 工具 — 请参见下面的 [Bootstrap 安装](#bootstrap-安装)。如果您更喜欢手动安装,请从 <https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite> 下载 `SysinternalsSuite.zip` 并解压。服务器探测的默认位置是 `C:\Sysinternals`,但您可以将其放在任何地方 — 请参见 [配置](#配置)。
### 2. 预先接受 EULA
每个 Sysinternals 二进制文件在第一次运行时都会提示接受 EULA。 如果没有接受,二进制文件不会向 stdout 写入任何内容,MCP 工具也无法解析输出。安装后,运行 `check_sysinternals_setup` 一次 — 对于任何具有 `EULA accepted? = no` 的工具,该工具将返回您需要运行的确切 `reg add` 命令,以便在当前用户帐户下预先接受。重新运行 `check_sysinternals_setup` 以确认。
或者,调用 `accept_sysinternals_eula(scope="user")` 一次,MCP 将返回每个已知工具的完整 reg-add 脚本。或者,运行每个工具一次,并带有 `-accepteula`(服务器无论如何都会在每次调用时传递该标志;预先接受的唯一目的是使注册表探测报告一个干净的状态)。
### 3. 安装 MCP 服务器
```powershell
# 如果您尚未安装,请安装 uv。
winget install astral-sh.uv
# 从源代码克隆并运行。
git clone https://github.com/nijosmsft/sysinternals-mcp C:\git\sysinternals-mcp
cd C:\git\sysinternals-mcp
uv sync
```
### 4. 将其连接到您的 MCP 客户端
```json
{
"mcpServers": {
"sysinternals": {
"type": "stdio",
"command": "uv",
"args": ["run", "--directory", "C:\\git\\sysinternals-mcp",
"python", "-m", "sysinternals_mcp.server"],
"env": {
"SYSINTERNALS_MCP_DIR": "C:\\Sysinternals"
}
}
}
}
```
顶级键对于 Claude Code / Claude Desktop / Cursor / Copilot CLI 来说是 `mcpServers`,对于 VS Code GitHub Copilot 来说是 `servers`。
## Bootstrap 安装
`bootstrap_sysinternals` 工具允许 LLM 在不离开聊天的情况下引导用户安装套件。
```text
bootstrap_sysinternals(target="local",
install_method="zip", # 或 "winget" 或 "live"
install_dir="C:\\Sysinternals")
```
第一次调用返回一个 **CONSENT REQUIRED** 块,要求用户接受 Sysinternals EULA — 预计 LLM 会逐字逐句地将其读给用户听。在用户回答后,LLM 重新调用该工具,并带有 `accept_eula=True` 以接收实际的安装脚本。
三种安装方法:
- **zip** — 对 `SysinternalsSuite.zip` 使用 `Invoke-WebRequest`(自动选择 ARM64 版本,取决于 `$env:PROCESSOR_ARCHITECTURE`),解压到 `install_dir`。
- **winget** — `winget install --id Microsoft.Sysinternals`(在 Windows Server Core 上不可用)。
- **live** — 每个二进制文件的 `Invoke-WebRequest` 从 `https://live.sysinternals.com/<binary>`。适用于仅允许 HTTPS GET 的受限网络。
通过在启动前在服务器上设置 `SYSINTERNALS_MCP_ACCEPT_EULA=1`,可以跳过整个会话的提示。
## 配置
| 环境变量 | 目的 |
| -------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `SYSINTERNALS_MCP_DIR` | 包含 Sysinternals 二进制文件的目录。首先搜索;如果未设置,则回退到 PATH 和默认路径。 |
| `SYSINTERNALS_MCP_ACCEPT_EULA` | 设置为 `1` 以在服务器启动时预先接受 EULA — `bootstrap_sysinternals` 跳过同意块。 |
当 `SYSINTERNALS_MCP_DIR` 未设置时,服务器探测(按顺序):
1. `PATH` 中每个工具的名称,通过 `where.exe`。
2. `C:\Sysinternals\`
3. `C:\Tools\Sysinternals\`
4. `%ProgramFiles%\Sysinternals\`
探测在进程启动时缓存。如果您在服务器运行时移动安装,请重启服务器。
## 远程工作流
[LabLink](https://github.com/nijosmsft/LabLink) 是一个轻量级的、基于 Go 的 MCP 服务器,用于对 Windows 实验室机器执行远程命令。`sysinternals-mcp` 是传输无关的,但 **优先使用 LabLink**:每个 `target="remote"` 工具都会发出带有 LabLink 优先的推荐调度顺序,以及一个 JSON 边车,LLM 可以直接将其交给 LabLink 的 `lablink.execute_command`。模式如下:
1. 调用具有 `target="remote"` 的实时工具以获取调度块(markdown + JSON 边车)。
2. 通过您选择的传输方式在远程机器上运行命令 — LabLink、PowerShell 远程处理、手动粘贴。
3. 将 stdout 管道回匹配的 `parse_<tool>_output` 工具(JSON 边车中的 `parse_with` 字段告诉 LLM 使用哪个)。
示例传输 — 选择适合您环境的传输方式:
- **LabLink(推荐)**
```text
lablink.execute_command(node="<name>",
command="C:\\Sysinternals\\handle.exe -accepteula -p chrome",
shell="powershell",
timeout=120)
```
- **PowerShell 远程处理**
```powershell
Invoke-Command -ComputerName <host> -ScriptBlock {
C:\Sysinternals\handle.exe -accepteula -p chrome
} | Set-Content C:\local\out.txt
```
- **手动 / RDP / scp**
复制粘贴命令,捕获输出,粘贴回来。
ProcMon 工作流程遵循相同的形状:
`get_capture_instructions(target="remote", ...)` 返回一个完整的运行手册,其中包括启动/等待/停止命令,以及用于拉取生成的 `.pml` 的三个示例传输。
## ProcMon 配方
三个捆绑的过滤器配方:
- `file_io_only` — 目标进程(或进程)的文件系统活动
- `network_only` — TCP/UDP 发送 + 接收
- `process_lifecycle` — 进程/线程创建 + 退出
每个配方都是一个小的文本描述符。描述符规则被转换为 ProcMon `/Filter` CLI 参数,并直接拼接成捕获命令行。
## 本地开发
```powershell
# 运行服务器(stdio — 在 EOF 时退出,Ctrl+C 以交互方式停止)。
uv run python -m sysinternals_mcp.server
# 测试 — 合成夹具,不需要 Sysinternals 二进制文件,速度快。
uv run --group dev pytest tests/ -v
```
## 许可证
MIT。参见 [LICENSE](LICENSE)。
Sysinternals 二进制文件本身受 Sysinternals 许可约束 — 它们 **不** 被该项目重新分发。