使用说明
MCP LMStudio Win11桌面控制器
一个完全模块化的MCP(模型上下文协议)服务器,使任何与OpenAI兼容的LLM都能完全控制Windows 11桌面。专为使用LM Studio等工具进行严格的本地/LAN操作而设计。处理两种发出本机信号的模型 <tool_call> XML标签 和 生成纯文本的模型,不需要任何配置来区分它们。
建筑一瞥
Local LLM (LM Studio) ──► MCP Server ──► Parser Router ──► Tool Registry ──► TSD Applier ──► Windows APIs
(e.g., Llama/GPT on LAN) (stdio/http/sse) (auto-detects (78 tools (retries, hooks,
with local models tag vs text) across 15 timeouts, rate
hybrid mode) modules) limits, elevation)
快速开始
# 1. Install dependencies
npm install
# 2. Build TypeScript → dist/, then start in stdio mode (default)
npm start
# Or start as an HTTP server on port 3000
npm run start:http
# Or start as an SSE server
npm run start:sse
# For active development (no build step — ts-node runs src/ directly)
npm run dev
测试工具
快速测试单个工具:
# List all available tools
node test_tools.js list
# Show tool schema and required arguments
node test_tools.js schema file.read
# Call a tool
node test_tools.js call system.info '{}'
node test_tools.js call file.list '{"path":"C:\\temp"}'
# Interactive mode
node test_tools.js interactive
LM Studio设置(本地LLM集成)
该项目专为严格的本地/LAN操作而设计,LM Studio作为MCP服务器后端。
1.安装LM Studio
- 下载并安装 LM工作室.
- 下载兼容的模型(例如GPT-2、Llama或任何与OpenAI兼容的模型)。
2.启动本地服务器
- 打开LM工作室。
- 加载您选择的模型。
- 在上启动本地服务器
http://localhost:11000(默认端口)。 - 确保服务器正在运行且可访问。
3.配置环境变量(可选)
代理工具默认为本地操作,但您可以覆盖:
# Set the local LM Studio endpoint (default: http://localhost:11000/v1)
set OPENAI_BASE_URL=http://localhost:11000/v1
# Set the model name (default: local-model)
set AGENT_MODEL=your-local-model-name
# API key is not required for local LM Studio (defaults to dummy)
4.测试代理
在LM Studio运行的情况下,测试自主查询:
node test_tools.js call agent.execute_query '{"query": "List the files in the current directory"}'
这 agent.execute_query 该工具利用您的本地LLM,使用可用的工具集自主规划和执行多步骤任务。
Qwen集成
代理还可以通过OAuth身份验证使用阿里云的Qwen模型。要启用Qwen:
- 运行安装脚本:
node setup_qwen.js
- 或者手动设置环境变量:
export USE_QWEN=true
export QWEN_MODEL=qwen3 # or other available models
export QWEN_BASE_URL=https://portal.qwen.ai/v1 # optional, uses default if not set
- 运行代理查询-它将在首次使用时自动处理OAuth登录:
node test_tools.js call agent.execute_query '{"query": "What is the capital of France?"}'
首次运行时,代理将:
- 打开浏览器https://chat.qwen.ai/
- 提示您输入设备代码
- 完成OAuth身份验证
- 将令牌安全地存储在
memories/目录 - 令牌过期时自动刷新令牌
可用的Qwen型号包括 qwen3, coder-model,以及 vision-model.
先决条件
- Node.js 20+
- Windows 11 (工具模块调用Win32 API和PowerShell cmdlet)
- PowerShell 5.1+ (随附Windows,无需安装)
对于可选的低延迟输入模拟路径,请安装本机插件:
npm install ffi-napi
如果跳过此步骤, input_handler 自动回退到基于PowerShell的实现。
配置
config/session.json
| 关键字 | 类型 | 默认值 | 描述 |
|---|---|---|---|
transportMode |
"stdio" |
"http" |
"sse" |
port |
编号 | 3000 |
HTTP/SSE模式的端口。 |
modelSupportsToolCallTags |
true |
false |
null |
elevationPreApproved |
布尔值 | false |
跳过白名单工具的UAC。 |
elevationWhitelist |
string[] | [] |
允许工具名称在没有提示的情况下提升运行。 |
logLevel |
字符串 | "info" |
Pino日志级别:跟踪、调试、信息、警告、错误、致命。 |
config/tsds/*.json --任务特定定义
每个文件都会在不接触代码的情况下调整一个工具的运行时行为:
{
"toolName": "file.delete",
"retryPolicy": {
"maxRetries": 2,
"backoff": "exponential",
"baseDelayMs": 500,
"retryableErrors": ["ACCESS_DENIED", "FILE_IN_USE"]
},
"timeoutMs": 10000,
"requiresElevation": false,
"preHook": "backup_target",
"postHook": "verify_deleted"
}
TSD字段:
| 字段 | 描述 |
|---|---|
retryPolicy |
可重试错误的重试次数和时间 |
timeoutMs |
每次尝试都要戴上硬壁时钟帽 |
requiresElevation |
如果 true,进程必须以管理员身份运行 |
preHook |
执行前运行的命名钩子(可以改变参数) |
postHook |
执行后运行的命名钩子(可以改变结果) |
fallbackTool |
如果所有重试都失败,请尝试使用其他工具 |
rateLimits |
每秒通话次数上限,带突发津贴 |
inputValidation |
在基础模式之上分层的更严格的JSON模式 |
路径沙盒
设置 FILE_MANAGER_SANDBOX 将环境变量转换为分号分隔的允许路径前缀列表。任何 file.* 在任何I/O运行之前,针对此列表之外路径的操作都会被拒绝:
set FILE_MANAGER_SANDBOX=C:\Users\MyUser;C:\Projects
工具参考
窗口管理器(window_manager)
| 工具 | 说明 |
|---|---|
window.list |
枚举可见窗口 |
window.focus |
将窗口置于前台 |
window.move |
按像素坐标重新定位 |
window.resize |
调整到给定尺寸 |
window.minimize |
最小化 |
window.maximize |
最大化 |
window.restore |
从最小值/最大值恢复 |
window.close |
发送关闭消息 |
window.snap |
捕捉到Windows 11布局插槽 |
文件管理器(file_manager)
| 工具 | 说明 |
|---|---|
file.read |
读取文件(文本或base64) |
file.write |
创建/覆盖文件 |
file.copy |
复制文件或目录 |
file.move |
移动/重命名 |
file.delete |
删除文件或目录 |
file.list |
列出带有可选glob过滤器的目录 |
file.search |
递归内容搜索(字符串或正则表达式) |
file.open |
使用默认应用程序打开 |
file.properties |
文件元数据 |
流程经理(process_manager)
| 工具 | 说明 |
|---|---|
process.list |
列出正在运行的进程 |
process.start |
后台启动 |
process.kill |
终止(优美或有力) |
process.wait |
等待退出 |
process.run |
启动+等待+捕获输出 |
输入处理程序(input_handler)
| 工具 | 说明 |
|---|---|
input.type |
键入文本 |
input.key |
使用可选修改器按键 |
input.mouse_click |
点击坐标 |
input.mouse_drag |
通过插值运动拖动 |
input.mouse_scroll |
滚动至指定位置 |
input.hotkey |
消防键盘快捷键(例如。 Ctrl+C) |
剪贴板管理器(clipboard_manager)
| 工具 | 说明 |
|---|---|
clipboard.get |
读取剪贴板(文本、图像、文件列表) |
clipboard.set |
写文本或图像 |
clipboard.clear |
清除剪贴板 |
显示管理器(display_manager)
| 工具 | 说明 |
|---|---|
display.list |
列出监视器 |
display.screenshot |
捕获屏幕(全屏、监视器或区域) |
display.set_resolution |
更改分辨率 |
display.set_dpi |
设置DPI缩放 |
display.set_brightness |
设置亮度(笔记本电脑) |
注册表管理器(registry_manager)
| 工具 | 说明 |
|---|---|
registry.read |
读取密钥或值 |
registry.write |
写入值(HKLM需要标高) |
registry.delete |
删除键或值 |
registry.list |
列出子键和值 |
registry.export |
导出到.reg文件 |
计划任务(scheduled_tasks)
| 工具 | 说明 |
|---|---|
task.list |
列出计划任务 |
task.create |
使用触发器+动作创建 |
task.delete |
按名称删除 |
task.enable |
启用 |
task.disable |
禁用 |
task.run_now |
立即触发 |
系统信息(system_info)
| 工具 | 说明 |
|---|---|
system.info |
操作系统、主机名、正常运行时间 |
system.cpu |
每个核心的CPU使用率 |
system.memory |
RAM使用率 |
system.disk |
每个驱动器的磁盘使用率 |
system.network |
适配器+连接 |
system.battery |
电池电量(笔记本电脑) |
system.services |
Windows服务 |
内置挂钩
| 钩子 | 阶段 | 它的作用 |
|---|---|---|
backup_target |
pre | 将目标文件/注册表项复制到 .backups/ |
screenshot_focus |
pre | 捕获屏幕截图并将其附加为 _screenshot 在args中 |
verify_deleted |
post | 如果目标仍然存在,则结果失败 |
verify_exists |
post | 如果目标不存在,则结果失败 |
log_action |
pre+post | 将JSON行附加到 audit.log |
poll_for_window |
post | 等待进程启动后出现新窗口 |
添加新工具(4个步骤)
- 创建
src/tools/my_tool.ts实施ToolModule接口 - 定义架构 --LLM看到的OpenAI函数定义
- 编写TSD —
config/tsds/my_tool.json具有重试/挂钩/超时策略 - 注册 --添加
import './my_tool';到src/tools/index.ts
无需更改核心代码。解析器、注册表和传输会自动获取它。
运输方式
| 模式 | 使用时… | 命令 |
|---|---|---|
stdio |
MCP客户端将您作为子进程生成(Claude Desktop,VS Code) | npm start |
http |
您需要用于自定义集成的独立API服务器 | npm run start:http |
sse |
结果很大(截图)或您需要流媒体状态更新 | npm run start:sse |
安全说明
- 立面是封闭的。 设置的工具
requiresElevation: true如果进程没有以管理员身份运行,则TSD中的请求将失败,除非会话预先批准了它们。 - 路径沙盒 防止在配置的目录之外进行文件操作。
- 速率限制 通过TSD对每个工具强制执行,以防止失控回路。
- 审核日志记录 通过
log_action钩子提供了每次调用的完整轨迹。 - 销毁前的备份。
file.delete和registry.write/registry.delete全部运行backup_target在触摸任何东西之前。
项目结构
mcp-win11-desktop/
├── src/
│ ├── core/
│ │ ├── server.ts # Entry point & boot orchestrator
│ │ ├── types.ts # All shared TypeScript types
│ │ ├── errors.ts # Typed error taxonomy
│ │ ├── logger.ts # Pino singleton + scoped loggers
│ │ ├── registry.ts # Tool registry (singleton)
│ │ ├── hooks.ts # Hook registry + built-in hooks
│ │ ├── parser/
│ │ │ ├── router.ts # Decides embedding vs text parser
│ │ │ ├── embedding_parser.ts # <tool_call> tag extraction
│ │ │ └── text_parser.ts # Plain-text strategy stack
│ │ └── tsd/
│ │ ├── loader.ts # Reads config/tsds/*.json
│ │ └── applier.ts # Wraps execute() with TSD policies
│ ├── tools/
│ │ ├── index.ts # Barrel — imports all tool modules
│ │ ├── window_manager.ts
│ │ ├── file_manager.ts
│ │ ├── process_manager.ts
│ │ ├── input_handler.ts
│ │ ├── clipboard_manager.ts
│ │ ├── display_manager.ts
│ │ ├── registry_manager.ts
│ │ ├── scheduled_tasks.ts
│ │ ├── system_info.ts
│ │ ├── internet_tools.ts
│ │ ├── ui_inspector.ts
│ │ ├── memory_manager.ts
│ │ ├── agent_orchestrator.ts
│ │ ├── virtual_desktop_manager.ts
│ │ └── shell_executor.ts
│ └── transports/
│ ├── http.ts # Express HTTP server
│ ├── sse.ts # Server-Sent Events
│ └── stdio.ts # JSON-RPC over stdin/stdout
├── config/
│ ├── session.json # Session defaults
│ └── tsds/ # Per-tool TSD configs (15 files)
├── package.json
├── tsconfig.json
└── README.md