WorkBuddy 的 Windows Control MCP — 项目总结与积分消耗深度分析一句话总结成功将 Codex Computer Use 的 Windows 桌面控制能力移植到 WorkBuddy MCP 框架功能更全36 个工具 vs 原版约 30 个但积分消耗是同等操作的 40-50 倍。根因在于架构差异——Codex 是多模态模型原生看屏幕而 MCP 是文本模型通过 base64 图片读屏幕。从零开发 WorkBuddy Windows Control MCP36 个工具让 AI 操控任意桌面应用目录项目概况架构对比为什么积分消耗天差地别实测积分消耗数据优化方案使用建议1. 项目概况成果指标数值MCP 工具总数36 个测试通过率10/10 (100%)在线 MCP 验证36/36 工具全部可用代码量~1400 行 Python依赖mcp SDK, uiautomation, pywin32, PIL, easyocr, opencv, psutil工具分类类别数量代表性工具截屏与视觉8screenshot, observe_screen, extract_text (OCR), find_text, find_image鼠标4click, move_mouse, drag_mouse, scroll键盘4type_text, press_key, hotkey, type_unicode窗口管理7list_windows, focus/move/resize/minimize/maximize/close_windowUI Automation6get_ui_tree, find_element, click_element, set_element_value剪贴板2get/set_clipboard进程3run_program, list_processes, kill_process工具2wait, batch_actions文件位置~/.workbuddy/skills/windows-control/ ├── server.py # MCP 服务器1400 行 └── SKILL.md # WorkBuddy 技能文档 ~/.workbuddy/mcp.json # MCP 配置windows-control 条目超越 Codex 原版的增强OCR 双引擎pytesseract 优先 easyocr 后备无需系统安装 Tesseract图像搜索find_image用 OpenCV 模板匹配定位屏幕元素文字搜索find_text用 OCR 定位文字并返回坐标完整窗口管理移动/缩放/最小化/最大化/关闭进程管理启动/列出/终止进程批量操作batch_actions一次执行多个工具调用2. 架构对比为什么积分消耗天差地别2.1 Codex Computer Use 的工作方式用户指令 点击保存按钮 │ ▼ ┌─────────────────────────────────────────────┐ │ Codex 多模态 VLM (单次 API 调用) │ │ │ │ 1. 截取屏幕 → 像素直接进入视觉编码器 │ │ (像素数据不进入文本上下文0 token 开销) │ │ │ │ 2. VLM 视觉推理 │ │ 我看到桌面保存按钮在坐标 (x, y) │ │ │ │ 3. 执行工具调用computer(actionclick, x, y) │ │ │ │ 【单次调用总 token 消耗: ~5K】 │ └─────────────────────────────────────────────┘关键点Codex 的模型原生支持视觉输入。截图作为像素直接输入视觉编码器不经过文本 tokenizer。模型看到屏幕就像人眼看屏幕一样自然不产生 token 开销。2.2 WorkBuddy MCP 的工作方式用户指令 点击保存按钮 │ ▼ ┌──────────────────────────────────────────────────────┐ │ 回合 1: 截图 (screenshot) │ │ │ │ AI 发送: { tool: screenshot } │ │ 服务器返回: base64 PNG 图片 (~528KB → ~180K tokens) │ │ 【回合 1 token 消耗: ~200K (含系统上下文)】 │ │ │ ├──────────────────────────────────────────────────────┤ │ 回合 2: AI 分析截图 │ │ │ │ AI 思考: 我看到桌面上有一个保存按钮... │ │ AI 输出: ~1K tokens │ │ 【回合 2 token 消耗: ~30K (上下文膨胀)】 │ │ │ ├──────────────────────────────────────────────────────┤ │ 回合 3: 点击 (click) │ │ │ │ AI 发送: { tool: click, x: 500, y: 300 } │ │ 服务器返回: clicked at (500, 300) │ │ 【回合 3 token 消耗: ~15K】 │ │ │ ├──────────────────────────────────────────────────────┤ │ 回合 4: AI 确认 │ │ │ │ AI 输出: 已点击保存按钮 │ │ 【回合 4 token 消耗: ~10K】 │ └──────────────────────────────────────────────────────┘ 一次简单操作总消耗: ~255,000 tokens vs Codex CC: ~5,000 tokens ──────────────────────────────── 差距: 约 51 倍2.3 根因总结维度Codex Computer UseWorkBuddy MCP差距模型类型多模态 VLM原生视觉文本 LLM图片base64文本本质差异截图开销0 token像素直入视觉编码器~180K tokens528KB PNG → base64∞工具调用次数1 次截图推理操作合一3-5 次截图→分析→定位→操作→确认3-5x单次上下文固定视觉 token 为固定嵌入线性增长每轮累积历史上下文逐轮膨胀每次操作消耗~5K tokens~200-300K tokens40-60x一句话Codex 的模型看屏幕MCP 的模型读屏幕图片的文字表示。前者是视觉后者是翻译。3. 实测积分消耗数据3.1 单工具调用 token 估算基于测试数据 标准 tokenizer 估算1 token ≈ 4 字节 base64 或 4 字符文本工具返回数据大小估算 token积分消耗约screenshot528KB PNG → 704KB base64~180,000巨额screenshot(半分辨率 JPEG Q60)127KB → 169KB base64~43,000中等observe_screen完整 UI 树 JSON 截图~100,000巨额list_windows26 窗口详情 JSON~10,000小extract_text(OCR)全屏文字 (~3KB)~1,000极小list_processes(全量)104KB JSON~26,000中等get_ui_tree控件树 JSON (depth2)~5,000小get_clipboard/press_key/click1KB~200可忽略3.2 开发测试阶段的累计消耗在本次开发会话中我们执行了阶段操作估算 token开发阶段代码编写、MCP 握手测试~50K离线测试10 项 Python 测试脚本0本地执行在线 MCP 测试screenshot (595KB PNG)~190K在线 MCP 测试get_screen_size cursor windows clipboard~15K在线 MCP 测试observe_screen (UI树截图)~100K在线 MCP 测试list_processes (全量 104KB)~26K在线 MCP 测试get_ui_tree find_element get_window_text~15K在线 MCP 测试extract_text (OCR)~2K在线 MCP 测试set_clipboard focus_window~5K累计~400K tokens注意这只是 MCP 工具本身的 token 消耗。再加上每轮对话的系统上下文~15K/轮和历史累积实际消耗更高。4. 优化方案4.1 立即可行的优化降低 70-80% 消耗A. 截图压缩最大优化点当前take_screenshot()返回全分辨率 PNG528KB。改为def take_screenshot(regionNone, hwndNone, quality60, scale1.0): quality: JPEG quality 1-100; scale: 0.25-1.0 # ... grab image ... if scale 1.0: img img.resize((int(img.width*scale), int(img.height*scale))) buf io.BytesIO() img.save(buf, formatJPEG, qualityquality) return buf.getvalue()效果配置大小Token节省PNG 全分辨率当前528KB180K—JPEG Q80 全分辨率560KB191K-6%JPEG不适合截图JPEG Q50 全分辨率394KB134K26%JPEG Q60 半分辨率127KB43K76%JPEG Q40 1/4 分辨率~40KB~13K93%注JPEG 对截图大量文字UI 元素压缩率不如 PNG。半分辨率才是真正的大头节省。B. 限制返回数据量工具当前行为优化后list_windows返回所有窗口的完整信息加max_results10参数list_processes返回全部进程104KB加name_filter默认只返回匹配的否则截断observe_screen截图完整UI树加modelight跳过 UI 树只返回基本信息和低清缩略图get_ui_tree全控件树默认depth2, max_children20C. 截图缓存对同一轮对话中的重复截图做缓存时间戳 哈希避免相同画面重复传输。4.2 中长期优化降低 95% 消耗D. 本地视觉推理层最佳方案在 MCP 服务器端集成一个本地小模型做视觉推理用户指令 点击保存按钮 │ ▼ MCP 服务器: 截图 → 本地视觉模型分析 → 返回结构化结果 │ │ 桌面上有这些可点击元素 │ - 保存按钮: (500, 300), confidence0.95 │ - 取消按钮: (600, 300), confidence0.92 │ ▼ AI: 执行 click(500, 300) 【总 token: ~5K接近 Codex 水平】可选技术方案OmniParser微软专为 GUI Agent 设计的屏幕解析模型输出结构化 UI 元素UI-TARS字节GUI 操作专用 VLMFlorence-2微软轻量级视觉基础模型E. 工具合并将截图→分析→点击合并为一个smart_click(description)工具减少往返次数。5. 使用建议何时使用 Windows Control MCP场景推荐原因点击已知坐标的按钮✅ 可以只需 click(x,y)消耗极低输入文字、按快捷键✅ 可以type_text/press_key 几乎不消耗积分读写剪贴板✅ 可以纯文本操作零负担窗口管理最大化/最小化✅ 可以只需窗口句柄轻量需要看屏幕上有什么⚠️ 谨慎用半分辨率截图或 observe_screen(light)复杂的 GUI 自动化流程❌ 不推荐多次截图OCR 会很快耗尽积分对 Adobe/Office 操作❌ 用 FlueFlue 走脚本 API0 截图开销最佳实践截图优先用低分辨率在screenshot工具中指定quality50, scale0.5等实现压缩参数后能用 Flue 就用 Flue有脚本 API 的应用Adobe, Office, Blender用 Flue零积分消耗减少看屏幕的次数尽量凭窗口标题、UI 控件树定位而不是每次都截图批量操作用batch_actions合并多次操作为一次调用关闭不必要的工具如果只需要简单操作在 MCP 配置中 disable 不用的工具与 Flue 的分工FlueWindows Control适用应用13 个专业应用Adobe/Office/Blender等任意Windows 应用操作方式脚本 APIJSX/VBA/PythonGUI 模拟鼠标键盘UI树积分消耗零本地执行脚本高截图大量token精确度完美直接调用API依赖屏幕识别速度快较慢需要截图/OCR规则优先 Flue → 不支持时降级到 Windows Control → 控制截图频率。附录技术细节关键 Bug 修复记录问题修复ctypes.INT不存在→ctypes.c_intwin32gui.EnumWindows在线程池中返回空→ 改用 ctypesEnumWindowsWNDENUMPROC回调GetDC(0)64位溢出→ 声明user32.GetDC.argtypes [wintypes.HWND]等所有 Win32 函数签名COM 卸载导致 uiautomation 间歇失败→ 移除CoUninitialize()COM 保持在线程中存活Tesseract 未安装导致 OCR 不可用→ 添加 easyocr 后备引擎纯 Python自动下载模型测试环境OS: Windows 11屏幕: 2560×1440Python: 3.13.12 (managed venv)测试窗口: WorkBuddy, ChatGPT, VS Code, ChatCut, Edge, 豆包, 百度网盘, Affinity Designer
WorkBuddy 的 Windows Control MCP — 项目总结与积分消耗深度分析
发布时间:2026/7/14 15:00:29
WorkBuddy 的 Windows Control MCP — 项目总结与积分消耗深度分析一句话总结成功将 Codex Computer Use 的 Windows 桌面控制能力移植到 WorkBuddy MCP 框架功能更全36 个工具 vs 原版约 30 个但积分消耗是同等操作的 40-50 倍。根因在于架构差异——Codex 是多模态模型原生看屏幕而 MCP 是文本模型通过 base64 图片读屏幕。从零开发 WorkBuddy Windows Control MCP36 个工具让 AI 操控任意桌面应用目录项目概况架构对比为什么积分消耗天差地别实测积分消耗数据优化方案使用建议1. 项目概况成果指标数值MCP 工具总数36 个测试通过率10/10 (100%)在线 MCP 验证36/36 工具全部可用代码量~1400 行 Python依赖mcp SDK, uiautomation, pywin32, PIL, easyocr, opencv, psutil工具分类类别数量代表性工具截屏与视觉8screenshot, observe_screen, extract_text (OCR), find_text, find_image鼠标4click, move_mouse, drag_mouse, scroll键盘4type_text, press_key, hotkey, type_unicode窗口管理7list_windows, focus/move/resize/minimize/maximize/close_windowUI Automation6get_ui_tree, find_element, click_element, set_element_value剪贴板2get/set_clipboard进程3run_program, list_processes, kill_process工具2wait, batch_actions文件位置~/.workbuddy/skills/windows-control/ ├── server.py # MCP 服务器1400 行 └── SKILL.md # WorkBuddy 技能文档 ~/.workbuddy/mcp.json # MCP 配置windows-control 条目超越 Codex 原版的增强OCR 双引擎pytesseract 优先 easyocr 后备无需系统安装 Tesseract图像搜索find_image用 OpenCV 模板匹配定位屏幕元素文字搜索find_text用 OCR 定位文字并返回坐标完整窗口管理移动/缩放/最小化/最大化/关闭进程管理启动/列出/终止进程批量操作batch_actions一次执行多个工具调用2. 架构对比为什么积分消耗天差地别2.1 Codex Computer Use 的工作方式用户指令 点击保存按钮 │ ▼ ┌─────────────────────────────────────────────┐ │ Codex 多模态 VLM (单次 API 调用) │ │ │ │ 1. 截取屏幕 → 像素直接进入视觉编码器 │ │ (像素数据不进入文本上下文0 token 开销) │ │ │ │ 2. VLM 视觉推理 │ │ 我看到桌面保存按钮在坐标 (x, y) │ │ │ │ 3. 执行工具调用computer(actionclick, x, y) │ │ │ │ 【单次调用总 token 消耗: ~5K】 │ └─────────────────────────────────────────────┘关键点Codex 的模型原生支持视觉输入。截图作为像素直接输入视觉编码器不经过文本 tokenizer。模型看到屏幕就像人眼看屏幕一样自然不产生 token 开销。2.2 WorkBuddy MCP 的工作方式用户指令 点击保存按钮 │ ▼ ┌──────────────────────────────────────────────────────┐ │ 回合 1: 截图 (screenshot) │ │ │ │ AI 发送: { tool: screenshot } │ │ 服务器返回: base64 PNG 图片 (~528KB → ~180K tokens) │ │ 【回合 1 token 消耗: ~200K (含系统上下文)】 │ │ │ ├──────────────────────────────────────────────────────┤ │ 回合 2: AI 分析截图 │ │ │ │ AI 思考: 我看到桌面上有一个保存按钮... │ │ AI 输出: ~1K tokens │ │ 【回合 2 token 消耗: ~30K (上下文膨胀)】 │ │ │ ├──────────────────────────────────────────────────────┤ │ 回合 3: 点击 (click) │ │ │ │ AI 发送: { tool: click, x: 500, y: 300 } │ │ 服务器返回: clicked at (500, 300) │ │ 【回合 3 token 消耗: ~15K】 │ │ │ ├──────────────────────────────────────────────────────┤ │ 回合 4: AI 确认 │ │ │ │ AI 输出: 已点击保存按钮 │ │ 【回合 4 token 消耗: ~10K】 │ └──────────────────────────────────────────────────────┘ 一次简单操作总消耗: ~255,000 tokens vs Codex CC: ~5,000 tokens ──────────────────────────────── 差距: 约 51 倍2.3 根因总结维度Codex Computer UseWorkBuddy MCP差距模型类型多模态 VLM原生视觉文本 LLM图片base64文本本质差异截图开销0 token像素直入视觉编码器~180K tokens528KB PNG → base64∞工具调用次数1 次截图推理操作合一3-5 次截图→分析→定位→操作→确认3-5x单次上下文固定视觉 token 为固定嵌入线性增长每轮累积历史上下文逐轮膨胀每次操作消耗~5K tokens~200-300K tokens40-60x一句话Codex 的模型看屏幕MCP 的模型读屏幕图片的文字表示。前者是视觉后者是翻译。3. 实测积分消耗数据3.1 单工具调用 token 估算基于测试数据 标准 tokenizer 估算1 token ≈ 4 字节 base64 或 4 字符文本工具返回数据大小估算 token积分消耗约screenshot528KB PNG → 704KB base64~180,000巨额screenshot(半分辨率 JPEG Q60)127KB → 169KB base64~43,000中等observe_screen完整 UI 树 JSON 截图~100,000巨额list_windows26 窗口详情 JSON~10,000小extract_text(OCR)全屏文字 (~3KB)~1,000极小list_processes(全量)104KB JSON~26,000中等get_ui_tree控件树 JSON (depth2)~5,000小get_clipboard/press_key/click1KB~200可忽略3.2 开发测试阶段的累计消耗在本次开发会话中我们执行了阶段操作估算 token开发阶段代码编写、MCP 握手测试~50K离线测试10 项 Python 测试脚本0本地执行在线 MCP 测试screenshot (595KB PNG)~190K在线 MCP 测试get_screen_size cursor windows clipboard~15K在线 MCP 测试observe_screen (UI树截图)~100K在线 MCP 测试list_processes (全量 104KB)~26K在线 MCP 测试get_ui_tree find_element get_window_text~15K在线 MCP 测试extract_text (OCR)~2K在线 MCP 测试set_clipboard focus_window~5K累计~400K tokens注意这只是 MCP 工具本身的 token 消耗。再加上每轮对话的系统上下文~15K/轮和历史累积实际消耗更高。4. 优化方案4.1 立即可行的优化降低 70-80% 消耗A. 截图压缩最大优化点当前take_screenshot()返回全分辨率 PNG528KB。改为def take_screenshot(regionNone, hwndNone, quality60, scale1.0): quality: JPEG quality 1-100; scale: 0.25-1.0 # ... grab image ... if scale 1.0: img img.resize((int(img.width*scale), int(img.height*scale))) buf io.BytesIO() img.save(buf, formatJPEG, qualityquality) return buf.getvalue()效果配置大小Token节省PNG 全分辨率当前528KB180K—JPEG Q80 全分辨率560KB191K-6%JPEG不适合截图JPEG Q50 全分辨率394KB134K26%JPEG Q60 半分辨率127KB43K76%JPEG Q40 1/4 分辨率~40KB~13K93%注JPEG 对截图大量文字UI 元素压缩率不如 PNG。半分辨率才是真正的大头节省。B. 限制返回数据量工具当前行为优化后list_windows返回所有窗口的完整信息加max_results10参数list_processes返回全部进程104KB加name_filter默认只返回匹配的否则截断observe_screen截图完整UI树加modelight跳过 UI 树只返回基本信息和低清缩略图get_ui_tree全控件树默认depth2, max_children20C. 截图缓存对同一轮对话中的重复截图做缓存时间戳 哈希避免相同画面重复传输。4.2 中长期优化降低 95% 消耗D. 本地视觉推理层最佳方案在 MCP 服务器端集成一个本地小模型做视觉推理用户指令 点击保存按钮 │ ▼ MCP 服务器: 截图 → 本地视觉模型分析 → 返回结构化结果 │ │ 桌面上有这些可点击元素 │ - 保存按钮: (500, 300), confidence0.95 │ - 取消按钮: (600, 300), confidence0.92 │ ▼ AI: 执行 click(500, 300) 【总 token: ~5K接近 Codex 水平】可选技术方案OmniParser微软专为 GUI Agent 设计的屏幕解析模型输出结构化 UI 元素UI-TARS字节GUI 操作专用 VLMFlorence-2微软轻量级视觉基础模型E. 工具合并将截图→分析→点击合并为一个smart_click(description)工具减少往返次数。5. 使用建议何时使用 Windows Control MCP场景推荐原因点击已知坐标的按钮✅ 可以只需 click(x,y)消耗极低输入文字、按快捷键✅ 可以type_text/press_key 几乎不消耗积分读写剪贴板✅ 可以纯文本操作零负担窗口管理最大化/最小化✅ 可以只需窗口句柄轻量需要看屏幕上有什么⚠️ 谨慎用半分辨率截图或 observe_screen(light)复杂的 GUI 自动化流程❌ 不推荐多次截图OCR 会很快耗尽积分对 Adobe/Office 操作❌ 用 FlueFlue 走脚本 API0 截图开销最佳实践截图优先用低分辨率在screenshot工具中指定quality50, scale0.5等实现压缩参数后能用 Flue 就用 Flue有脚本 API 的应用Adobe, Office, Blender用 Flue零积分消耗减少看屏幕的次数尽量凭窗口标题、UI 控件树定位而不是每次都截图批量操作用batch_actions合并多次操作为一次调用关闭不必要的工具如果只需要简单操作在 MCP 配置中 disable 不用的工具与 Flue 的分工FlueWindows Control适用应用13 个专业应用Adobe/Office/Blender等任意Windows 应用操作方式脚本 APIJSX/VBA/PythonGUI 模拟鼠标键盘UI树积分消耗零本地执行脚本高截图大量token精确度完美直接调用API依赖屏幕识别速度快较慢需要截图/OCR规则优先 Flue → 不支持时降级到 Windows Control → 控制截图频率。附录技术细节关键 Bug 修复记录问题修复ctypes.INT不存在→ctypes.c_intwin32gui.EnumWindows在线程池中返回空→ 改用 ctypesEnumWindowsWNDENUMPROC回调GetDC(0)64位溢出→ 声明user32.GetDC.argtypes [wintypes.HWND]等所有 Win32 函数签名COM 卸载导致 uiautomation 间歇失败→ 移除CoUninitialize()COM 保持在线程中存活Tesseract 未安装导致 OCR 不可用→ 添加 easyocr 后备引擎纯 Python自动下载模型测试环境OS: Windows 11屏幕: 2560×1440Python: 3.13.12 (managed venv)测试窗口: WorkBuddy, ChatGPT, VS Code, ChatCut, Edge, 豆包, 百度网盘, Affinity Designer