MCP 这个词最近在 AI 圈火得很快。很多人把它理解为“API 的另一种封装格式”,但我认为真正有意思的地方在于:把整个桌面工作台变成 MCP 工具,让 Agent 自己来调。Termexo 就是这样做的——它把日常桌面工作台上的 19 个高频能力统一暴露成 MCP 工具,你只需要配好一个入口,Agent 就能自动接进来,像调用普通函数一样去操作文件、终端、剪贴板、窗口、浏览器等本地资源。这篇文章主要聊聊我实际把 Termexo 跑起来、接入 Agent 的过程,也会分享这 19 个工具的构成逻辑、配置细节和踩过的坑。
1. 为什么需要把桌面工作台变成 MCP 工具
1.1 MCP 到底解决了什么问题
Model Context Protocol,简称 MCP,本质上是给 Agent 提供了一套“工具接入标准”。以前你做 Agent 应用,最难的不是模型逻辑,而是工具集成:要给文件操作写一个 tool,给终端命令写一个 tool,给网页抓取再写一个 tool,而且不同 Agent 框架的 tool 定义格式还不一样,换个框架就得重写一遍。这就像家里每个电器都配一个专用插座,出门要带一包转接头。
MCP 的思路很简单:不管底层能力是什么,统一按照同一个协议暴露成工具。客户端只需要实现一次协议,就能自动发现“这个服务能干什么”,以及“这个工具需要什么参数”。所以有了 MCP,Agent 接工具从“每个工具写适配代码”变成了“连接一个标准服务”。
Termexo 就是把“桌面工作台”打包成这样一个 MCP 服务。它不是一个具体业务功能,而是一组本地能力的集合:文件、终端、剪贴板、窗口、系统信息、浏览器标签页,甚至截图和 OCR。 你不需要再手动为每个能力写 tool schema,也不用在不同 Agent 框架里重复实现。直接启动 Termexo,MCP 客户端就能发现全部 19 个工具。
1.2 直接给 Agent 暴露“本地能力”的价值
我之前做过一个小助手,需要它帮我整理本地文件。当时最头疼的是文件操作没有通用接口。我在 Python 里写了一个 FileTool,在另一个 Node 项目里又写了一遍,后来换成别的 Agent 框架,还得再改一遍参数格式。这种重复劳动非常无聊。
用 Termexo 之后,情况完全变了。我把 Termexo 作为 MCP Server 启动,然后打开支持 MCP 的客户端,比如 Cherry Studio,工具列表里自动就出现了“文件读取”“目录列表”“全文搜索”“终端命令执行”这些能力。Agent 在对话里只要说“帮我找出桌面所有包含‘报销’二字的 Markdown 文件”,它就知道去调directory_search,然后返回结果。
这种模式的价值在于“自动接入”。Agent 不需要提前知道 Termexo 里有哪些工具,而是通过 MCP 协议动态获取工具列表和参数定义。这意味着后续你更新了 Termexo 版本,新工具会自动出现在客户端里,Agent 也能学会调用,不需要你去手动改任何业务代码。
1.3 Termexo 的核心定位
按我的理解,Termexo 是“本地优先”的 MCP 桥接层。它把桌面上的常用操作翻译成 MCP 工具调用,并且所有执行都发生在本地机器上,不依赖云端服务。这一点很重要,因为很多 Agent 场景涉及敏感文件、私有代码、个人笔记,走云端中转会让人心里没底。
它的连接方式支持两种:一种是标准输入输出(stdio),也就是客户端直接以子进程方式启动 Termexo;另一种是 HTTP/SSE 方式,可以跑在本地端口上,供远程或其他进程访问。我日常使用最多的是 stdio 方式,简单、稳定、不占多余端口。
另外,Termexo 默认是“白名单控制”的。配置里可以指定允许访问的目录、允许执行的命令列表,甚至可以把终端执行工具设为只读模式。这一点我后面会专门展开,因为安全边界直接决定了你敢不敢让 Agent 真的操作你的电脑。
2. 19 个工具的构成与选型逻辑
2.1 完整工具清单速览
Termexo 默认暴露 19 个工具。不同版本可能有细微差异,但这个清单基本覆盖了桌面工作台最常见的操作场景。我把它们整理成了表格,方便对照:
| 序号 | 工具名 | 能力说明 |
|---|---|---|
| 1 | 文件内容读取 | 读取指定文件的文本内容,自动识别常见编码 |
| 2 | 目录列表 | 列出目录下的文件和子目录,可过滤隐藏文件 |
| 3 | 全文搜索 | 按关键词递归搜索指定目录中的文件内容 |
| 4 | 文件写入 | 新建文件或覆盖已有文件,支持追加模式 |
| 5 | 剪贴板读取 | 获取当前系统剪贴板中的文本 |
| 6 | 剪贴板写入 | 将指定文本写入系统剪贴板 |
| 7 | 终端命令执行 | 在指定 shell 中执行一段命令,返回标准输出 |
| 8 | 环境变量读取 | 读取指定的环境变量值 |
| 9 | 系统信息查询 | 返回操作系统、CPU、内存、磁盘占用情况 |
| 10 | 进程列表 | 列出当前运行的进程,支持按名称筛选 |
| 11 | 窗口管理 | 列出当前桌面窗口,支持切换焦点、最小化 |
| 12 | 应用启动器 | 通过应用名称或路径启动已安装的软件 |
| 13 | 屏幕截图 | 截取全屏或指定区域,保存为图片并返回路径 |
| 14 | OCR 识别 | 对指定图片执行本地 OCR,返回识别文本 |
| 15 | 浏览器标签页控制 | 列出当前浏览器标签页的标题和 URL |
| 16 | 网络请求 | 发送 GET/POST 请求,返回响应文本 |
| 17 | 网址快速打开 | 在默认浏览器中打开指定网址 |
| 18 | 定时提醒 | 在本地创建一个定时提醒,到点弹通知 |
| 19 | 笔记草稿箱 | 在指定目录维护一个 Markdown 草稿文件 |
2.2 按能力分组来看选型思路
这 19 个工具不是随机堆出来的,按能力分组看会更清晰。
第一类是“文件与搜索”。包括文件读取、目录列表、全文搜索、文件写入。这几乎是任何 Agent 处理本地任务的地基。比如你让 Agent 整理笔记、查找配置、批量修改脚本,都需要先知道目录结构,再读写文件。
第二类是“系统与终端”。包括剪贴板读写、终端命令执行、环境变量读取、系统信息查询、进程列表。这类工具可以让 Agent 真正“操作电脑”,而不只是读写文件。比如排查端口占用、查看内存使用、执行一个构建命令,都能走 Termexo 完成。
第三类是“桌面自动化”。包括窗口管理、应用启动、屏幕截图、OCR 识别。这类工具让 Agent 能感知图形界面,甚至辅助做一些简单 GUI 操作。比如让 Agent 截个图,然后 OCR 识别上面的文字,再把结果整理给你。
第四类是“网络与效率”。包括浏览器标签页控制、网络请求、网址快速打开、定时提醒、笔记草稿箱。这些是我平时用得很高频的“轻量效率工具”,能够让 Agent 参与日常信息流转,比如快速打开文档页、定时提醒你喝水、维护一个草稿笔记。
2.3 为什么是 19 个而不是更多
你可能会问:为什么不能做得更全?比如加上 FTP、数据库、PDF 解析、Excel 读写?我的看法是,这个数量是“上下文窗口”和“可用性”之间的平衡。
MCP 客户端会把所有工具定义发送给语言模型,工具数量越多,Agent 在选择工具时就越容易出错。一个小模型面对 50 个工具时,很可能会在哪个工具负责哪个任务上犯迷糊。19 个工具刚好覆盖高频场景,又不至于让工具列表冗长到影响推理。而且很多“高级能力”完全可以基于终端命令和文件工具自己组合出来。比如要处理 Excel,你只需要让 Agent 调用终端命令执行 Python 脚本,不需要单独做一个 Excel 工具。
另外一个考虑是权限风险。工具越少,越容易审计。Termexo 默认没有把“删除文件”“修改注册表”“安装软件”这类危险操作做成独立工具,也是希望把它们留在终端命令工具里,再通过白名单做二次拦截。
3. 把 Termexo 接入 Agent 的完整实操
3.1 安装与首次启动
以我用的版本为例,Termexo 提供单个二进制文件,支持 macOS、Windows、Linux。下载后把它放到系统 PATH 目录下面,打开终端执行:
termexo --version如果能正常输出版本号,说明安装成功。接下来执行一次初始化:
termexo init初始化会生成一个配置文件,默认放在用户目录下。我建议在初始化之后,先打开配置文件看一眼工作目录和允许访问范围。默认工作目录通常是~,但为了安全,我会把它改成专门的沙箱目录,比如~/termexo-workspace。
然后可以启动标准模式验证一下:
termexo serve看到类似MCP server listening on stdio的日志,就说明服务正常。此时如果你用 curl 测 HTTP 模式,可能要看参数;但我更推荐直接用 MCP 客户端来测,因为协议握手更直观。
3.2 配置 MCP Server 的两种连接方式
在绝大多数支持 MCP 的客户端里,比如 Cherry Studio、Claude Desktop、或者你自己写的 Agent,你都需要新增一个 MCP Server 配置。以 JSON 配置为例,stdio 方式是这样写的:
{ "mcpServers": { "termexo": { "command": "termexo", "args": ["serve"], "env": {} } } }关键是command必须是 Termexo 可执行文件的路径,args里传入serve。客户端启动后会以子进程方式运行termexo serve,然后通过标准输入输出完成 MCP 初始化。
如果你不想让客户端直接拉起子进程,而是想让 Termexo 跑在一个固定端口上,可以使用 HTTP/SSE 模式:
termexo serve --transport http --port 9001然后在客户端配置里填写 SSE URL:
http://127.0.0.1:9001/mcp两种方式我都测过。本地单机使用,我推荐 stdio,因为不用管端口占用和跨域问题。如果你需要把 Termexo 放在一台服务器上,或者同时给多个 Agent 共享,那就用 HTTP 模式。
3.3 在 Cherry Studio 中自动接入
Cherry Studio 是我常用的 MCP 客户端之一。它的操作路径很直观:设置里找到 MCP 服务器,添加新的服务器。这里选“命令行模式”,命令填termexo,参数填serve,保存后点击连接。
连接成功后,客户端会主动向 Termexo 发起 MCP 握手请求。这个握手过程是自动的:客户端发送initialize请求,Termexo 返回协议版本和能力信息;客户端接着请求tools/list,Termexo 就会把所有 19 个工具的定义返回给客户端。你不需要手动导入任何东西,工具列表自动被识别出来。
之后新建一个对话,模型就能看到这些工具。我试过一句很随意的指令:
“读取~/termexo-workspace/notes/idea.md,然后把内容追加到今天的日记里。”
Agent 很快调用了文件读取工具,然后调用文件写入工具,完成了整个操作。整个过程没有写一行代码,关键是“自动接入”这个链路跑通了。
3.4 自定义工具与权限控制
Termexo 不只是能用默认工具,它的配置文件里还支持自定义脚本工具。你可以把一个本地脚本包装成 MCP 工具,这样 Agent 也能调用。比如我写过一个小脚本用于压缩图片,然后配置了一个image_compress工具,参数是图片路径和输出路径。
配置大致长这样:
custom_tools: - name: image_compress description: 压缩指定图片到指定路径 command: python3 args: ["scripts/compress.py", "{input_path}", "{output_path}"]这个能力很实用,因为它意味着你不必等 Termexo 官方更新功能,自己写的任何脚本都能变成 Agent 可调用的工具。
权限控制方面,Termexo 支持两类选项。一类是“目录白名单”,Agent 只能访问配置里允许的目录;另一类是“命令黑名单”,如果终端命令工具被启用,你可以把rm、shutdown、mkfs这些命令加进去,禁止执行。我更推荐直接给终端工具赋予只读模式,凡是涉及写操作的命令都返回错误,需要你手动确认后再放开。
提示:如果你第一次跑 Termexo,建议保持终端命令工具关闭。先只开文件和搜索工具,把链路跑通,再慢慢打开更多能力。
4. 常见问题与避坑实录
4.1 Agent 连不上 Termexo 怎么办
最常见的现象是:客户端日志显示连接失败,或者 MCP Server 迟迟不出现。排查顺序我一般是这样:首先确认termexo serve能不能单独运行;如果单独运行都报错,大概率是二进制不完整,重新下载对应平台版本即可。
然后检查客户端配置里的 command 路径。很多 MCP 客户端不会自动读取 shell 的 PATH 环境变量,所以如果你的termexo不是装在标准系统路径下,客户端可能找不到它。解决办法是把 command 写成完整绝对路径,比如/usr/local/bin/termexo。
还有一个容易忽略的问题:stdio 模式下,Termexo 的调试日志不要随便从标准输出打印。MCP 客户端是严格按照标准输入输出进行通信的,如果服务端混入了非协议内容,客户端解析就会失败。你用termexo serve --debug调试时输出到文件,不要输出到 stdout。
4.2 执行结果乱码或超时
Windows 上使用终端命令工具时,经常遇到中文乱码。我踩过几次坑之后发现,这通常是因为 PowerShell 的输出编码默认不是 UTF-8。在 Termexo 的终端工具配置里,可以设置脚本前置命令,比如:
chcp 65001 | Out-Null强制把控制台代码页切到 UTF-8,然后再执行具体命令。另外,Termexo 的工具调用一般有默认超时,如果遇到一个大文件搜索或 OCR 识别,可以在工具参数里手动调大 timeout 值。
但更稳妥的办法是把“大任务”拆成“小任务”。比如让 Agent 先列出目录,再按文件名筛选,最后才读内容。一次搜索全部文件内容,耗时和 token 消耗都很大,Agent 很容易中断。我习惯在提示词里明确写出“先缩小范围,再一步步执行”,效果会好很多。
4.3 怎么防止 Agent 乱操作
这是很多初学者最担心的问题:让 Agent 拥有终端和文件写入权限,它会不会乱删东西?我的建议是分层防护。
第一层,在 Termexo 配置里限制工作目录。设置一个专门的workspace目录,所有工具默认只能在这个目录内生效。不在白名单里的路径,Agent 即使想读也读不到。
第二层,打开权限确认模式。对于文件写入、终端命令这类敏感工具,可以要求客户端在调用时弹确认窗口。虽然这样会影响自动流的连贯性,但对重要操作很值得。
第三层,在 Agent 的系统提示词里加约束。我会写明“不要执行任何带有删除含义的终端命令”“所有写操作前先汇报方案”。模型通常能遵守,当然前提是 Termexo 本身也没把这些命令暴露成单纯工具。
另外,Termexo 会记录每次工具调用的输入输出日志。我建议定期看一眼,尤其是终端命令的执行记录,能帮你发现 Agent 是否做了计划外动作。
4.4 与 IDA MCP、Playwright MCP 等生态共存
MCP 社区最近出现了很多垂直工具。比如IDA MCP把逆向分析能力暴露给 Agent,还有x32dbg的 MCP 插件,可以让调试器被 AI 调用。再比如Playwright MCP,它把浏览器自动化能力变成工具,很火。Termexo 和它们不是竞争关系,更像是“本地桌面基础设施”和“垂直领域专用工具”之间的搭配。
你可以同时配置多个 MCP Server,客户端会把所有工具合并到一个列表里。实际测试下来,只要记住两个注意点:一个是工具命名冲突,比如 Playwright MCP 和 Termexo 都有“网络请求”工具时,尽量用不同的服务前缀来区分;另一个是权限边界,不同 MCP Server 的权限策略要在各自的配置里分别设好,不要只指望客户端一层防护。
还有 Altium Designer 的 AI 接口 MCP、禅道 MCP、百度地图 MCP 这类行业工具也在陆续出现。这说明 MCP 已经不只是给程序员的玩具,它开始成为各种软件连接 AI 的通用方式。如果你的软件还只提供 REST API,那像 Termexo 这种“通用桌面桥接层”反而更适合做日常杂活,垂直 MCP 则专注专家任务。
5. 进阶玩法与实操体会
5.1 让 Agent 在本地构建“工具链”
接入 Termexo 之后,最大的收益不是单个工具,而是 Agent 能自己编排任务。我举一个实际例子:我想把手机上的一个链接分享到电脑,并同时保存链接正文到笔记。在对话里输入一句话:
“把剪贴板里的链接打开,然后抓取页面主要内容,追加到我的草稿箱笔记里,最后生成一个二维码放在桌面上方便手机扫描。”
Agent 依次调用了剪贴板读取、网址快速打开、网络请求、笔记草稿箱、二维码生成这几个工具,完成了完整链路。整个过程我完全不需要手写脚本,只是描述了目标,它自己规划步骤。
这种“工具链”能力,依赖的就是 Termexo 提供了足够多、足够细粒度的桌面工具。如果只有一个大而全的 API,Agent 反而很难灵活组合。
5.2 用 Rust 写一个轻量 Agent 直接调 Termexo
如果你想更底层地掌控接入过程,可以直接用 Rust 写一个小程序,通过标准输入输出和 Termexo 通信。MCP 协议本质上是 JSON-RPC 2.0,所以核心逻辑并不复杂。
我这里提供一个最小思路。首先启动子进程:
use std::process::{Command, Stdio}; use std::io::{BufRead, BufReader, Write}; let mut child = Command::new("termexo") .arg("serve") .stdin(Stdio::piped()) .stdout(Stdio::piped()) .spawn() .expect("failed to start termexo"); let mut stdin = child.stdin.take().unwrap(); let stdout = BufReader::new(child.stdout.take().unwrap());然后向 stdin 发送 JSON-RPC 消息。比如初始化:
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"my-agent","version":"0.1.0"}}}接着发送:
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}返回里就是 19 个工具的 JSON 定义。之后就可以用tools/call来调用工具了:
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"file_read","arguments":{"path":"/tmp/test.md"}}}Rust 的好处是产出的二进制可以直接分发,不需要目标机器安装 Python 或 Node。对于想做一个跨桌面平台的小 Agent 工具的同学来说,这套方案很干净。
5.3 几点实操心得
第一,先小范围试跑。我刚开始只开放了文件读取和搜索,跑了三天,发现 Agent 确实能准确读写文件之后,才陆续开放了终端命令和窗口管理。不要第一天就把所有权限打开,否则出了问题不好排查。
第二,工具的命名和描述很重要。MCP 工具能不能被 Agent 正确选用,很大程度取决于 description 写得好不好。如果你自定义工具,尽量描述清楚“什么场景用”“参数是什么意思”。我见过很多人把工具描述写得含糊,结果 Agent 总选错工具,其实不是模型笨,是描述信息不足。
第三,日志是你最好的老师。Termexo 的工具调用日志记录了每次输入输出。我经常在跑完一个任务后翻日志,看它到底按什么顺序调用工具,这比直接看最终结果有意义得多。通过日志还能发现很多隐藏问题,比如某些工具的多余参数被反复调用、超时经常出现在某个特定目录下,这些都能帮你优化配置。
把桌面工作台变成 MCP 工具,这件事本身不复杂,复杂的是你愿意给 Agent 多少信任边界。Termexo 提供了一个可落地的框架,19 个工具是起点,权限配置和自定义脚本才是真正让它好用起来的关键。如果你也在折腾本地 Agent,不妨从最简单的文件读取工具开始,一步步把这个“桌面级工具集”变成你自己最顺手的助手。