下面讲如何通过一个 MCP 服务器,让 Cursor 的 AI 代理经由 SSH 连上你的服务器,而私钥永远不会落进代理的环境里。先说你为什么要费这个劲。Cursor 的代理在仓库里如鱼得水。可一旦任务离开仓库——查清服务为什么起不来、跑一次迁移、在真正那台机器上改 nginx 配置——它就需要 SSH。而不舒服的地方在于:Cursor 的代理是在你的机器上执行终端命令的,所以如果你的密钥就解锁着躺在 ~/.ssh 里或一个运行中的 ssh-agent 里,它根本不需要你“给”它什么——ssh prod 本来就能用。你已经默认授予了完整的服务器访问权,而你从没做过这个决定。
有一种更好的安排:代理来请求,而由你控制的某个东西来完成认证。我们写过为什么粘贴密钥这条路是你无法撤销的一步(英文),也写过 MCP 服务器究竟是什么;本文是面向 Cursor 的实操版。二十分钟,一台 VPS,密钥始终进不了代理够得着的范围。
你需要什么
- Termalin——桌面应用,Free 版就够用。它是一款内置 MCP 服务器的 SSH 客户端;Cursor 要对话的就是这个服务器。
- 同一台机器上的 Cursor。
- 在 Termalin 里保存一台主机——第一次就挑个无关紧要的。预发布环境、一台练手 VPS,或者那台只跑着你 RSS 阅读器的机器。
第一步——打开代理访问
代理访问默认是关闭的。在 Termalin 里打开**设置 → “代理访问 (MCP)”**并启用它,然后勾选代理可以访问的主机。在 Cursor 眼里,这个列表之外的东西根本不存在——新增一台主机是你在应用里做的决定,而不是代理能靠花言巧语挤进来的东西。
幕后会发生两件事。Termalin 为 MCP 服务器写一份主机清单,其中只有仅限代理的认证条目——没有任何密码或密钥落进那个文件。而认证始终留在应用的密钥托管方那里:你把密钥解锁一次,Termalin 代替代理去签名。没有密钥文件可供代理读取,所以它也就没有什么可泄露的——这同时也堵上了上面那个 ~/.ssh 后门,因为那些值得保护的主机,再也不需要你磁盘上有一把松散的密钥了。
既然在设置里,顺手给每台主机设好代理策略:完全访问、命令允许列表,或禁止。对任何你在意的东西来说,命令允许列表都是正确的起点。
第二步——在 mcp.json 里注册服务器
Cursor 从一个 JSON 文件里读取 MCP 服务器——项目根目录下的 .cursor/mcp.json 只对该项目生效,~/.cursor/mcp.json 则让这个服务器在所有地方都可用。对于像 Termalin 这样的本地(stdio)服务器,条目就是一条命令加上它的参数:
{
"mcpServers": {
"termalin": {
"command": "<path>/termalin-mcp",
"args": []
}
}
}
整个集成就这么多。这里用全局文件是明智之选——服务器访问并不是某个仓库自己的事。重启 Cursor(或在它的设置里重新加载 MCP 列表),确认服务器显示为正在运行,这些工具就会出现在代理面前:hosts_list、ssh_exec、持久会话(session_open、session_exec)、SFTP 读写。
有一条 Cursor 特有的注意事项值得记住:默认情况下,Cursor 在执行一次工具调用前会先询问。头几次会话就让它开着。自动批准是一种便利,你应当一次只放开一个工具,而且是在你看过代理怎么用每一个之后——就跟你逐步扩大主机列表的方式一样。
第三步——给它一件真正的杂活
别用一条演示命令开场;从一件你真的会做的任务开始:
staging-1 上的健康检查从昨天那次部署之后就一直在抖。查清原因并修好它。
看着代理干活:它调用 hosts_list,看到 staging-1,开一个会话,然后开始顺藤摸瓜——服务状态、最后一百行日志、配置与正在运行的内容之间的差异。它提出一个修复方案,应用它,再验证健康检查变绿。
让这一切用起来安心的,是其中没有任何一步是看不见的。代理开的每一个会话都会在 Termalin 里显示为一个实时终端标签页,而**监控网格(英文)**把所有打开的会话并排展示,由代理驱动的那些格子会高亮。你不是在事后读一份摘要——你是在命令运行时看着它们一条条落下,而且随时都能介入。
边界在哪里
在你把它指向任何你在意的东西之前,有几个值得了解的默认设置:
- **你的密钥从不接触代理的环境。**托管方来签名,代理来请求。撤销访问只是设置里的一个开关,而不是在你整个机群上轮换一遍密钥。
- 代理能触及的范围就是你在第一步里设的那份允许列表,而每台主机的命令策略限定了它在那上面能跑什么。
- 向你的**会话里打字是另一回事。**默认情况下代理开它自己的会话;在你已经打开的某个会话里动手,是另一个单独的同意开关——它绝不会悄悄搭便车。
- **录制会标记代理的活动。**会话录制只捕获输出——绝不记录你的按键——而且每条代理命令都会在审计日志里被标记为代理的,连同它来自的设备和 IP。凌晨两点,你能分清“是它做的”和“是我做的”。
身边没有桌面应用?用托管端点
如果代理跑在没有你桌面应用的地方——CI、一个云沙箱——就用托管 MCP 服务器来代替应用。交互式场景下,按 URL 把 https://termal.in/mcp 添加到 Cursor,并在 Termalin 的页面上登录一次(OAuth,不用粘贴任何密钥);无人值守的运行则在 Termalin 网页控制台里创建一个 API 密钥,让客户端指向托管 MCP 端点。Cursor 的 mcp.json 也支持按 URL 添加远程服务器:
{
"mcpServers": {
"termalin": {
"url": "https://termal.in/api/v1/mcp",
"headers": { "Authorization": "Bearer tk_live_…" }
}
}
}
(如果你的 Cursor 版本还不支持在远程服务器上使用认证头,那就继续用本地 stdio 服务器——反正它本来就是更好的默认选择。)托管端点只能访问你通过隧道代理接入的服务器,而且每次运行都用一张短期证书来认证——还是同样的托管方思路,任何地方都没有常驻凭据。这些密钥被限定到特定的服务器,按你选的时间表到期,一撤销就立即失效。详情见 MCP 文档。
让它长久奏效的习惯
把第一周当成在带一个打字飞快的新同事。让监控网格一直开着。给它派有明确“完成状态”的杂活——“让健康检查通过”、“把证书续上”——然后看它是怎么做到的。保持 Cursor 的逐次调用确认开着,直到代理在那些无聊的工具上赢得了自动批准的资格,再一台不起眼的机器、一台地扩大主机允许列表。
这种不对称才是重点:代理拿到了真实的触及范围,而你守住了那件无法被夺走的东西。(在用的是 Claude Code?同样的配置,一条命令(英文)。)
Termalin 的 Free 版就是完整的桌面应用,每个新账户都从 14 天 Pro 试用开始——立即下载,从 Cursor SSH 页面开始,或先读读 MCP 文档。