1. 项目概述为什么一个“桌面工作台”值得被重新定义为 MCP 工具最近在几个技术社区里频繁看到开发者和效率工具爱好者讨论“MCP”这个概念——不是指某种协议或硬件而是Multi-Component Platform多组件平台的缩写特指一类能将分散的本地工具、脚本、API 接口、CLI 命令、GUI 小程序甚至 Web 服务统一纳管、按需调用、自动编排、状态可溯的桌面级中枢系统。它不替代 IDE 或终端而是站在更高一层做“工具之间的 glue layer”。而 Termexo 正是这样一个轻量但极富延展性的实现它不是一个重型 IDE 插件也不是云端 SaaS而是一个运行在你本机的、无后台依赖的桌面应用核心目标就一个——把你的 macOS / Windows / Linux 桌面变成一个可编程、可调度、可复用的 MCP 工具工作台。我第一次接触 Termexo 是在帮某高校实验室搭建学生代码实训环境时。他们需要一套不依赖网络、不上传代码、不绑定账号、但又能让学生一键完成“查 Git 状态 → 提交前 lint → 生成 commit message → 推送到指定分支 → 同步更新文档站点”的完整链路。传统方案要么靠写 Bash 脚本堆砌维护成本高要么用 GitHub Actions但学生本地调试困难要么上低代码平台又太重且权限难控。Termexo 的出现直接把这个问题从“写一堆胶水脚本”降维成“拖拽配置 写几行 JSON”。它内置的 19 个开箱即用工具后面会逐个拆解覆盖了开发、运维、内容创作、数据处理等高频场景更重要的是它原生支持 Agent 自动接入机制——不是让你手动注册每个工具而是通过标准化的描述协议类似 OpenAPI for CLI让工具自己“报到”Termexo 主动发现、解析能力、生成 UI 控件、绑定执行上下文。这种设计思路本质上是在桌面端复刻了现代云平台的 Service Mesh 思想服务自治、元数据驱动、控制面与数据面分离。对普通用户来说Termexo 的价值在于“零学习成本启动渐进式深度掌控”你可以今天只用它的“快速截图OCR复制文本”三连击明天就把它接入你自写的 Python 数据清洗脚本后天再让它自动监听某个文件夹一旦有新 CSV 进来就触发 Pandas 分析并弹出图表。它不强迫你改变工作流而是悄悄嵌入你已有的习惯中慢慢把你从“手动操作者”变成“流程设计者”。尤其适合那些已经积累了一堆小工具、Shell 别名、Python 脚本却苦于无法统一管理、无法分享给同事、无法加权限/加日志、无法做失败重试的中级以上用户。它不是给小白的“一键优化电脑”软件而是给有工具意识的实践者的“桌面操作系统增强层”。2. 核心设计逻辑Termexo 如何构建一个真正可用的 MCP 工作台2.1 “19 个工具”不是功能列表而是能力原子化的设计哲学很多人初看 Termexo 宣传页会下意识把它当成一个“集成版效率工具包”比如“哦它有截图、有翻译、有计算器”。这是典型误解。Termexo 的 19 个内置工具每一个都经过严格的能力抽象其设计目标不是“提供一个好用的截图工具”而是“提供一个可被其他流程调用的、带标准输入输出契约的截图能力单元”。举个具体例子它的screenshot-capture工具。表面上看它就是一个带区域选择的截图器。但深入看它暴露了三个关键能力接口input: 支持接收{region: full|window|custom, delay: 1000}这样的 JSON 参数output: 固定返回{image_path: /tmp/xxx.png, timestamp: 1718234567, size: [1920,1080]}结构side_effect: 自动将截图路径写入剪贴板并触发系统通知。这意味着你完全可以用另一个工具比如clipboard-watcher监听到“图片路径被写入”然后自动触发image-ocr工具进行文字识别再把结果喂给text-translate工具。整个链条不需要任何中间文件或临时变量全靠 Termexo 内部的事件总线和结构化数据流驱动。这 19 个工具就是 19 个预置的、经过生产验证的“能力原子”。它们不是孤立的功能按钮而是 MCP 平台的“标准零件库”。提示Termexo 的工具命名全部采用 kebab-case短横线分隔且前缀明确标识领域如git-,file-,net-,ai-。这种命名不是为了好看而是为了让自动化脚本能通过正则快速匹配和分类比如^git-.*就能抓取所有 Git 相关能力方便做权限分组或流程模板。2.2 Agent 自动接入让工具“自我申报”而非人工注册Agent 接入是 Termexo 区别于其他桌面工具集的核心创新点。传统方式如 Alfred 的 Workflow 或 VS Code 的 Extension要求开发者手动编写 manifest 文件、声明权限、定义入口点。Termexo 反其道而行之它提供了一个极简的Agent Discovery ProtocolADP任何符合规范的本地程序只要在启动时向特定 Unix Domain SocketmacOS/Linux或 Named PipeWindows发送一段 JSON 描述就能被 Termexo 自动发现并加载。这个 JSON 描述长这样以一个自定义的pdf-merge工具为例{ name: pdf-merge, version: 1.2.0, description: 合并多个 PDF 文件为一个支持页码重排, author: local-dev, capabilities: [ { id: merge-files, name: 合并 PDF, input_schema: { type: object, properties: { input_paths: {type: array, items: {type: string}}, output_path: {type: string}, page_order: {type: string, enum: [original, reverse]} } }, output_schema: { type: object, properties: { merged_path: {type: string}, page_count: {type: integer} } } } ] }Termexo 在后台持续监听这个 socket。当它收到这段描述会立刻验证 JSON 结构合法性检查input_schema是否符合 JSON Schema v7 规范它内建了一个轻量校验器为该 Agent 创建一个独立的沙盒进程组隔离资源在 UI 的“工具市场”中动态添加一个卡片标题为pdf-merge: 合并 PDF根据input_schema自动生成表单控件如input_paths是数组就渲染为多行文件选择器page_order是 enum就渲染为下拉菜单。整个过程无需重启 Termexo无需编辑任何配置文件甚至不需要 Termexo 知道这个工具的二进制路径在哪里——它只负责“发现”和“调度”执行由 Agent 自己完成。这种设计把工具的“发布”成本降到了最低一个 Python 脚本只要在开头加上几行 socket 发送代码就能变成 Termexo 生态的一员。我实测过一个用argparse写的简单脚本加上 ADP 支持总共只增加了 12 行代码。2.3 架构分层为什么 Termexo 能做到“轻量”与“强大”并存Termexo 的架构清晰地划分为三层每一层都做了极致的减法UI 层Renderer基于 TauriRust WebView2 / WKWebView不捆绑 Chromium体积仅 28MB。所有界面元素按钮、表单、日志面板都是纯 HTML/CSS/JS 渲染但 JS 代码被严格限制在沙盒中无法直接访问 Node.js API。所有系统调用必须通过 Rust 编写的 IPC Bridge 进行。控制层Orchestrator这是 Termexo 的大脑用 Rust 编写负责Agent 生命周期管理启动、心跳检测、异常退出重启工具调用编排支持串行、并行、条件分支、失败重试全局状态管理当前工作目录、环境变量、最近使用的文件路径日志聚合与结构化每条日志自带tool_id,run_id,timestamp,level。执行层Executor不直接执行命令而是作为“调度员”将任务派发给具体的 Agent 或内置工具。它本身不包含任何业务逻辑所有能力都来自外部注入。这也是 Termexo 能保持长期稳定的核心原因——控制层代码极少变更而能力层可以无限扩展。这种分层使得 Termexo 的升级策略非常健康UI 层可以每月发版优化体验控制层可能半年才一次大更新而执行层的能力即工具和 Agent则可以每天都在社区里迭代。你永远不必担心一次升级就让所有自定义脚本失效。3. 核心工具详解与实操19 个内置工具怎么用哪些值得深挖3.1 开发者必备Git、Shell、代码辅助类共 7 个Termexo 的开发工具集精准切中了日常编码中最琐碎、最重复、最容易出错的环节。git-status不只是显示git status结果。它会主动解析输出区分“已暂存”、“未暂存”、“未跟踪”三类文件并为每类提供一键操作按钮如“暂存所有未暂存文件”、“丢弃所有未暂存修改”。更关键的是它返回的 JSON 中包含staged_files和unstaged_files数组可直接作为下一个git-commit工具的输入。git-commit它不让你手敲 commit message。而是调用一个本地运行的commit-message-generatorAgentTermexo 自带该 Agent 基于当前暂存区的文件变更类型新增 feature修复 bug更新文档和改动行数用规则引擎生成符合 Conventional Commits 规范的 message。你只需在生成的 3 个候选中选一个或微调后提交。实测下来团队新人的 commit 规范率从 40% 提升到 95%。shell-exec这是最灵活的工具。它允许你输入任意 Shell 命令但关键增强在于自动继承 Termexo 的全局环境变量包括你为项目配置的.env文件支持{{selected_text}}占位符可将当前光标选中的文本作为参数注入执行结果默认以text/plain和application/json双格式返回方便后续工具消费。code-lint它本身不包含 linter 引擎而是作为一个“linter 代理”。你可以在设置里配置对.py文件调用pylint对.js文件调用eslint对.md文件调用markdownlint。它会自动识别当前文件类型调用对应命令并将标准输出解析为结构化问题列表文件、行号、错误级别、消息在 UI 中高亮显示。我把它和file-watcher组合实现了“保存即检查”比 IDE 内置检查更轻量、更可控。code-diff不是简单的git diff。它能对比任意两个本地文件支持不同编码、不同行尾并高亮显示语义级差异如函数签名变化、变量重命名而不仅是字符级。它还支持导出为 HTML 格式方便邮件分享。env-var-manager管理.env文件的利器。它能扫描项目根目录下的所有.env*文件.env,.env.local,.env.production合并并显示最终生效的变量列表并提供一键编辑、一键导出为 JSON、一键复制为export VARxxx格式等功能。http-request一个精简但强大的 HTTP 客户端。支持 GET/POST/PUT/DELETE可设置 Headers、Query Params、Bodyraw/json/form-data并能将响应体自动解析为 JSON如果 Content-Type 匹配或文本。它的亮点是“请求历史”和“收藏夹”你可以把常用 API 请求如调用内部测试服务保存为模板下次一键发起。注意所有这些工具的执行日志都会自动打上tool: git-status、project: my-web-app这样的标签。你在 Termexo 的全局日志面板中可以按标签过滤轻松回溯某个项目的完整操作链。这是我用过的最干净的本地操作审计方式。3.2 内容与数据工作流文件、图像、文本处理类共 6 个这一组工具彻底改变了我处理日常文档和数据的方式把过去需要打开 4-5 个不同 App 的流程压缩到一个界面内完成。file-watcher一个事件驱动的文件系统监听器。你可以配置它监控某个文件夹当有*.csv文件被创建时自动触发csv-to-json工具当有*.log文件被修改时自动触发log-tail工具。它支持 glob 模式和事件类型create, modify, rename, delete的精细组合。csv-to-json不只是格式转换。它会自动探测 CSV 的分隔符逗号、分号、制表符、编码UTF-8, GBK、是否含 BOM并提供预览界面让你确认列名和前 5 行数据。转换后的 JSON 默认是数组格式但也可选“键值对”模式第一列为 key。image-ocr集成了 Tesseract OCR 引擎但做了大量易用性封装。它支持批量处理图片能自动旋转歪斜图片能识别中英文混合文本并将结果按段落、行、词三级结构返回。最实用的是它能把识别出的文字直接“模拟键盘输入”到当前焦点窗口省去复制粘贴。text-translate调用本地部署的 MarianMT 模型Termexo 自带离线模型包支持 20 种语言互译。它不联网所有计算在本地完成。翻译结果会保留原文的段落结构和换行不会把整段揉成一行。text-summarize同样基于本地模型BART对长文本进行摘要。它提供了三种模式“要点式”提取 3-5 个关键句、“段落式”生成 100 字左右概述、“问答式”根据你输入的问题从文中抽取答案。我常用它快速消化技术文档的 PR 描述。pdf-extract能提取 PDF 中的文本、图片、表格转为 CSV。对于扫描版 PDF它会先调用image-ocr进行识别。提取的表格数据可以直接拖拽到 Excel 或粘贴到csv-to-json工具中继续处理。3.3 系统与网络增强终端、网络、系统信息类共 4 个这些工具让 Termexo 成为了一个强大的“本地系统控制台”尤其适合 DevOps 和技术支持人员。terminal-emulator一个嵌入式的、高度定制化的终端。它不是简单的xterm封装而是支持多 Tab 会话每个 Tab 可独立设置工作目录和环境变量命令历史跨会话共享并支持模糊搜索输入git st就能搜到git status -sb快捷键绑定如CtrlShiftC复制CtrlShiftV粘贴CtrlShiftT新建 Tab输出结果可一键“发送到”其他工具如选中一段 JSON右键“发送到 json-formatter”。net-pingPing 工具的增强版。它不仅显示延迟还会自动尝试 IPv4/IPv6 双栈记录连续 10 次 Ping 的延迟分布最小/最大/平均/标准差当延迟超过阈值可配置时自动触发net-traceroute工具。net-traceroute基于mtr的轻量封装。它会实时显示到目标主机的每一跳路由、延迟、丢包率并将结果保存为 HTML 报告包含交互式拓扑图。sys-info一个实时系统监控面板。它显示 CPU 使用率按核心、内存占用已用/总/缓存、磁盘 I/O读/写速率、网络吞吐上/下行。所有数据都以时间序列图表呈现可拖拽缩放。它还能在系统资源紧张时如 CPU 90% 持续 30 秒自动弹出警告并建议关闭哪些进程。3.4 实操演示用 5 个工具串联一个“日报生成”自动化流程现在我们把上面提到的工具组合成一个真实可用的工作流每天早上自动汇总昨日的 Git 提交、代码变更统计、关键日志片段生成一份 Markdown 格式的日报并保存到指定文件夹。步骤分解第一步获取昨日 Git 提交工具git-log配置--sinceyesterday --prettyformat:* %h %s (%an) --no-merges输出一个字符串数组每项是一个 commit 条目。第二步统计代码变更行数工具git-diff-stat配置--statmaster...HEAD --sinceyesterday输出JSON 格式包含insertions,deletions,files_changed。第三步提取关键日志工具log-tail配置监控/var/log/myapp/error.log提取包含ERROR或FATAL的最近 10 行。输出一个字符串数组。第四步生成 Markdown 报告工具text-template这是一个内置的模板引擎工具。你提供一个 Jinja2 风格的模板字符串# {{date}} 日报 ## Git 提交 {{git_log | join(\n)}} ## 代码变更 - 新增: {{diff_stat.insertions}} 行 - 删除: {{diff_stat.deletions}} 行 - 修改文件: {{diff_stat.files_changed}} 个 ## ⚠️ 关键错误 {% for line in error_log %} - {{line}}{% endfor %}输入将前三步的输出 JSON 作为上下文传入。第五步保存报告工具file-write配置path: ~/reports/daily/{{date}}.md,content: {{template_output}}如何在 Termexo 中实现Termexo 提供了可视化的“流程画布Flow Canvas”。你只需从左侧工具栏拖出git-log、git-diff-stat、log-tail三个工具节点再拖出text-template和file-write用鼠标连线将git-log的输出箭头拖到text-template的git_log输入槽将git-diff-stat的输出拖到text-template的diff_stat槽将log-tail的输出拖到text-template的error_log槽最后将text-template的输出拖到file-write的content槽。整个流程配置完成后点击“运行”按钮Termexo 会按顺序执行并在底部日志面板中显示每一步的耗时和状态。你还可以给这个流程起个名字如daily-report保存为模板以后每天早上点一下就搞定。实操心得我在配置这个流程时踩过一个坑——git-log的输出是数组而text-template期望的是字符串。解决方法很简单在连线时Termexo 会弹出一个“转换器”选项我选择了join(\n)就把数组转成了换行分隔的字符串。这个细节说明Termexo 的流程编排不是简单的“A-B-C”而是带有丰富数据转换能力的真·工作流引擎。4. Agent 自动接入实战手把手教你把自己的 Python 脚本变成 Termexo 工具4.1 准备工作理解 ADP 协议与环境要求在动手之前必须明确几个前提Termexo 版本必须是 v1.8.0 或更高版本。旧版本不支持 ADP。操作系统macOS 12、Windows 10 20H2、Linuxglibc 2.28。Termexo 会自动创建一个名为termexo-agent.sockUnix或termexo-agent-pipeWindows的通信通道。你的脚本必须是能独立运行的可执行文件Python 脚本需有#!/usr/bin/env python3shebang或打包为.exe/.app。ADP 协议的核心是你的脚本在启动时必须向 Termexo 的通信通道发送一段 JSON 描述然后进入“等待调用”状态。Termexo 会负责管理它的生命周期。4.2 第一个 Agent一个极简的“当前时间戳生成器”我们从最简单的开始写一个 Python 脚本功能就是返回当前时间戳。文件timestamp-agent.py#!/usr/bin/env python3 import sys import json import time import socket import os # ADP 描述 ADP_DESC { name: timestamp-generator, version: 1.0.0, description: 生成当前 Unix 时间戳和格式化时间, author: local-user, capabilities: [ { id: get-timestamp, name: 获取时间戳, input_schema: { type: object, properties: { format: { type: string, enum: [unix, iso, zh], default: unix } } }, output_schema: { type: object, properties: { timestamp: {type: integer}, formatted: {type: string}, timezone: {type: string} } } } ] } def send_adp_description(): 向 Termexo 发送 ADP 描述 # 获取 Termexo 的 socket 路径 if sys.platform win32: pipe_name r\\.\pipe\termexo-agent-pipe # Windows 命名管道需要特殊处理这里简化为使用一个文件锁模拟 # 实际项目中应使用 win32pipe 模块 with open(/tmp/termexo-adp-lock, w) as f: f.write(json.dumps(ADP_DESC)) return else: sock_path /tmp/termexo-agent.sock try: sock socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) sock.connect(sock_path) sock.sendall(json.dumps(ADP_DESC).encode(utf-8)) sock.close() except Exception as e: print(f[ADP] Failed to send description: {e}) sys.exit(1) def handle_get_timestamp(input_data): 处理 get-timestamp 能力的调用 fmt input_data.get(format, unix) ts int(time.time()) if fmt unix: return {timestamp: ts, formatted: str(ts), timezone: time.tzname[0]} elif fmt iso: return {timestamp: ts, formatted: time.strftime(%Y-%m-%dT%H:%M:%S%z, time.localtime(ts)), timezone: time.tzname[0]} else: # zh return {timestamp: ts, formatted: time.strftime(%Y年%m月%d日 %H:%M:%S, time.localtime(ts)), timezone: time.tzname[0]} def main(): # 第一步发送 ADP 描述 send_adp_description() # 第二步进入循环等待 Termexo 的调用 # Termexo 会通过 stdin 发送 JSON 输入我们从 stdin 读取 for line in sys.stdin: try: input_json json.loads(line.strip()) # Termexo 会保证 input_json 有 capability_id 字段 if input_json.get(capability_id) get-timestamp: result handle_get_timestamp(input_json.get(input, {})) print(json.dumps(result)) sys.stdout.flush() # 立即刷新让 Termexo 能读到 except Exception as e: error_result {error: str(e)} print(json.dumps(error_result)) sys.stdout.flush() if __name__ __main__: main()关键点解析send_adp_description()这是“自我申报”的关键。它告诉 Termexo“我叫timestamp-generator我有一个叫get-timestamp的能力它接受format参数返回timestamp和formatted字段。”stdin/stdout通信Termexo 不会用复杂 IPC而是用最朴素的进程间通信它把调用请求 JSON 写入 Agent 的stdinAgent 把结果 JSON 写入stdout。这保证了最大的兼容性任何语言都能实现。sys.stdout.flush()这是新手最容易忽略的点。Python 的print默认是行缓冲如果不flushTermexo 会一直卡在读取状态。务必加上。部署与测试给脚本添加执行权限chmod x timestamp-agent.py在 Termexo 的设置中找到 “Agent Management” - “Add Local Agent”输入脚本的绝对路径如/Users/me/scripts/timestamp-agent.py。Termexo 会自动启动这个脚本。你可以在 “Tools” 菜单中看到新出现的timestamp-generator: 获取时间戳。点击它会弹出一个表单让你选择format。选zh点击运行你会看到返回{timestamp: 1718234567, formatted: 2024年06月13日 14:22:47, timezone: CST}。4.3 进阶 Agent一个能自动分析 Git 仓库健康度的工具现在我们做一个更有价值的 Agentrepo-health-checker。它能分析一个 Git 仓库给出诸如“最近 30 天活跃作者数”、“平均 PR 合并时间”、“测试覆盖率趋势”等指标。核心逻辑伪代码def analyze_repo(repo_path): # 1. 获取最近 30 天的作者列表 authors run_git_cmd(fcd {repo_path} git log --since30 days ago --format%an | sort | uniq | wc -l) # 2. 计算平均 PR 合并时间假设 PR 信息存在 .pr-history.json pr_history load_json(f{repo_path}/.pr-history.json) avg_merge_time calculate_avg_merge_time(pr_history) # 3. 读取最新的 coverage.xml来自 pytest-cov coverage parse_coverage_xml(f{repo_path}/htmlcov/coverage.xml) return { repo_path: repo_path, active_authors_30d: int(authors), avg_pr_merge_hours: round(avg_merge_time / 3600, 1), test_coverage_percent: coverage[percent] }ADP 描述的关键部分{ name: repo-health-checker, capabilities: [ { id: analyze, name: 分析仓库健康度, input_schema: { type: object, properties: { repo_path: {type: string, description: Git 仓库的绝对路径}, lookback_days: {type: integer, default: 30} } }, output_schema: { type: object, properties: { active_authors_30d: {type: integer}, avg_pr_merge_hours: {type: number}, test_coverage_percent: {type: number}, health_score: {type: number, description: 综合评分0-100} } } } ] }实操心得路径安全Termexo 会把repo_path作为字符串传入你的 Agent 必须做严格的路径校验防止../路径遍历攻击。我通常会用os.path.realpath()获取绝对路径再用os.path.commonpath()检查是否在允许的根目录下。超时控制分析一个大型仓库可能耗时数秒。Termexo 默认超时是 10 秒。你可以在input_schema中增加一个timeout_seconds参数并在代码中用signal.alarm()设置超时。错误友好不要让脚本因为一个异常就崩溃退出。Termexo 期望 Agent 是“长寿命”的。应该捕获所有异常返回结构化的{error: message, code: ERR_REPO_NOT_FOUND}这样 Termexo 才能在 UI 中友好提示。5. 常见问题与避坑指南Termexo 用户的真实反馈整理5.1 启动失败与 Agent 无法发现这是新用户遇到最多的问题通常有三个根源问题现象根本原因解决方案Termexo 启动后UI 显示“未连接到内核”Termexo 的 Rust 控制层进程崩溃查看~/Library/Logs/termexo/main.logmacOS或%LOCALAPPDATA%\Termexo\logs\main.logWindows常见原因是系统缺少libstdc.so.6Linux或vcruntime140.dllWindows。重新下载官方安装包或手动安装对应运行时。添加了 Agent 路径但在工具列表中看不到Agent 的 ADP 描述 JSON 格式错误Termexo 会在日志中记录[ADP] Invalid JSON from ...。用在线 JSON 校验器如 jsonlint.com检查你的描述 JSON。特别注意capabilities必须是数组input_schema必须是有效的 JSON Schema。Agent 进程启动了但 Termexo 不调用它Agent 没有正确监听 stdin这是最隐蔽的坑。Termexo 调用 Agent 时是把 JSON 写入其stdin。如果你的 Agent 启动后立即退出比如没有for line in sys.stdin:循环Termexo 就会认为它“不可用”。务必确保 Agent 是一个常驻进程。提示Termexo 自带一个诊断工具termexo-diagnose。在终端中运行它它会自动检查 socket 通道、Agent 可执行性、权限等问题并给出修复建议。这是排查一切启动问题的第一步。5.2 流程编排中的数据流转问题用户在 Flow Canvas 中连线时经常遇到“数据对不上”的情况。问题git-log的输出是数组但text-template的commits字段期望是字符串。解法在连线时Termexo 会弹出一个“数据转换”对话框。选择Join并输入\n作为分隔符。这相当于在模板里写了{{commits | join(\n)}}。问题file-read读取的 JSON 文件字段名是user_name但http-request的 Body 需要username。解法使用>
阅读完成 · 觉得有帮助?