一个能读你数据库的代理,可以回答那些你本来得打开 SQL 编辑器才查得了的问题。“周二注册量为什么掉了?”“哪些订单在 pending 状态卡了超过一小时?”“events 表里到底有些什么?”有了查询能力,模型几秒钟就能回答;没有的话它只能猜。有用的部分不是 SQL——Claude Code 和 Cursor 都能把 SQL 写好——而是给代理一个执行一次读取的途径,却不用把你的凭据交给它。这次交接才是全部的摩擦所在,也正是本文要为这两个工具走一遍的流程。
我们另外写过为什么把数据库连接字符串粘贴给代理是你无法撤销的一步(英文)——这个凭据是持有即访问的(bearer),它既能读,也能写、能删,而一旦它经过了模型的上下文,你就没法把它“收回”了。想看安全模型就去读那篇;这里我们把它当作已成定论,直接把配置做完。简短版是:凭据由客户端持有,代理得到的是一个范围受限、默认只读的请求权。
你需要什么
- Termalin——桌面应用,Free 版就够用。它是一款内置 MCP 服务器的 SSH 与数据库客户端;你的代理要对话的就是这个本地服务器。
- 在 Termalin 的 Data 客户端里至少保存一个数据库连接——Postgres、MySQL、SQLite、SQL Server、ClickHouse、MongoDB、Redis 等等。第一次就挑个无关紧要的:一个分析用的副本库、一个预发布数据库,或者一份拷贝。
- 与应用在同一台机器上的 Claude Code 或 Cursor。数据库工具驱动的是正在运行的桌面应用,所以代理和应用共用一台机器。
先说清一个预期:对于 Claude Code 和 Cursor,数据库访问走的是本地 stdio MCP 服务器,所以代理需要和你已解锁的桌面应用在同一台机器上。(也有一条托管路径——托管 MCP 服务器,termal.in/mcp 配合 claude.ai、ChatGPT、Claude Code 和 Cursor 的登录,或 termal.in/api/v1/mcp 配合一个 API 密钥,可以在不运行桌面应用的情况下无密码查询某台已接入服务器上的数据库,依靠的是服务器自己本地的数据库信任关系。而对于保存在桌面应用 Data 客户端里的那些连接,本地服务器才是你要的。)
第一步——打开代理的数据访问
这个默认是关的,而且是刻意为之。打开设置 → “代理访问 (MCP)”,启用 “Let agents query your databases”(让代理查询你的数据库)。副标题把姿态讲得很清楚:默认关闭,并且除非某个连接授予了完全访问权,否则始终保持只读。 在你把它打开之前,每个数据库工具都会返回 database access for agents is off — enable it in Settings → Agent,到此为止。
在继续之前,有两个默认设置值得你记在心里:
- **这是在运行中的应用之上的第二次主动授权。**打开代理对服务器的访问,并不会打开数据库访问——这是它自己的开关。在你做出决定之前,什么都不会被暴露。
- 对代理来说每个连接都是只读的。即便总开关开着,每条查询在执行前也会被检查一遍。只有当你把那个特定连接的代理策略提升到完全访问时,一次写操作才会被放行——这是逐连接的选择,不是全局的。现在就让它保持只读。
凭据本身从不移动:连接的主机、端口和密码都留在应用的保险库里,代理能做的只是请求正在运行的应用去执行一次查询、再把结果行交回来。配置文件里没有连接字符串可供代理——或者一次提示注入(prompt injection)——去读取。
第二步——注册本地 MCP 服务器
Claude Code——一条命令:
claude mcp add termalin -- <path>/termalin-mcp
把 <path> 换成 termalin-mcp 二进制文件所在的位置(应用可以帮你指出来)。重启 Claude Code,它就会识别到这些工具。
Cursor——Cursor 从一个 JSON 文件里读取 MCP 服务器:项目根目录下的 .cursor/mcp.json 只对该项目生效,~/.cursor/mcp.json 则让这个服务器在所有地方都可用。对于一个本地 stdio 服务器,条目就是一条命令加上它的参数:
{
"mcpServers": {
"termalin": {
"command": "<path>/termalin-mcp",
"args": []
}
}
}
用全局文件是明智之选——数据库访问并不是某个仓库自己的事。重启 Cursor(或在它的设置里重新加载 MCP 列表),确认服务器显示为正在运行。这和 Cursor SSH 教程以及 Claude Code 教程(英文)用的是同一套注册方式——同一个服务器,现在它在 SSH 工具之外又带上了数据库工具。
第三步——这些工具,和一个真实的首个任务
服务器注册好、开关打开之后,代理会看到四个数据库工具:
data_list # your saved connections: id, name, engine, and whether the agent may write
data_tables # tables / collections / measurements for a connection, with row counts
data_schema # one table's columns: name, type, nullable, primary key
data_query # run a query in the connection's own language; default cap 200 rows
它们对应的正是你手动探索一个数据库的步骤:列出连了什么、看有哪些表、描述某张表、执行查询。data_query 说的是连接本身所说的语言——关系型引擎和 ClickHouse 用 SQL,Neo4j 用 Cypher,Redis 用一条 Redis 命令,MongoDB 用一个 collection {filter}——并返回行,上限可以在每次调用时抬高(maxRows),默认是 200,这样代理就不会一不小心把上百万行拉进它的上下文里。
现在给它一个你真的会问的问题,而不是一条演示查询:
仪表盘显示周二注册量掉了。用分析数据库查清到底发生了什么。
看着代理按顺序把这些工具用起来:
data_list——它找到你的analytics连接,看到引擎是 Postgres,并注意到它对代理是只读的。data_tables——它列出这些表,发现了signups和signup_events,并读取行数,以判断哪张值得查。- 对
signups执行data_schema——它了解到有哪些列(created_at、source、status……),于是知道了该怎么按天、按来源切分。 data_query——它运行类似SELECT date_trunc('day', created_at) AS day, source, count(*) FROM signups WHERE created_at >= now() - interval '10 days' GROUP BY 1, 2 ORDER BY 1的查询,再把结果行读回来。
这些行讲出了故事——也许某个 source 在周二归零了(一个失效的推荐链接),也许总量没变但 status = 'failed' 激增了(某个服务商故障)。无论哪种,代理都是基于真实的表结构、而不是靠猜来构造查询的,而且它手里从来没有超出“发起请求的能力”之外的任何东西。如果某个结果在 200 行的上限处被截断,它会说明这一点,并收窄查询,而不是硬要更多。
边界在哪里
简短说,因为那篇安全文章(英文)已经讲得很全——但你所依赖的那些默认设置是:
- **默认只读。**在 SQL 系的引擎上,只有读类动词能通过——
SELECT、SHOW、DESCRIBE、EXPLAIN、WITH、PRAGMA。在 Redis 上,只有读命令;在 MongoDB 上,带$out/$merge的聚合会被挡掉;在 Neo4j 上,CREATE/MERGE/DELETE/SET/DROP都会被挡掉。一个被绕晕或被劫持的模型,拿到的是一次读取,而不是一次DROP。 - **按连接,而非全局。**你的分析副本库和你的生产主库是两个各自独立的决定;把其中一个提升到完全写入权限,动不到另一个。
- 一个开关就能关掉,而且凭据由应用持有——从来没有任何东西被共享出去,所以关掉它不会留下任何副本,也没有密码需要轮换。
对任何敏感的东西,两件事都做:把 Data 连接指向一个只读副本或一个最小权限的数据库角色,同时让代理保持只读。客户端这道闸拦住失误;数据库的授权设定上限。
针对各工具的说明
- Cursor 默认在每次工具调用前都会询问。头几次会话就让它开着——你能在每条
data_query运行前先看到它,读一读代理提出的 SQL。自动批准是一种一次只放开一个工具的便利:data_list和data_schema可以先放过,data_query则是最该最久地保持手动的那个。 - Claude Code 会把每次工具调用连同参数一起就地显示出来,所以查询文本在执行前就已经在对话记录里了。你读的是代理的 SQL,而不是去信任一份对它的摘要——而且每次调用都会归到代理名下,所以凌晨两点,你能分清“是它读的”和“是我读的”。
Termalin 在其中的位置
大多数“把你的代理连到数据库”的指南,都止步于把一个连接字符串粘进配置文件——而这悄悄给了代理和你的应用一样的写和删的权力。Termalin 的 Data 客户端把这件事反了过来:应用是托管方,代理拿到的是四个范围受限、通过正在运行的窗口来驱动的工具,而整个能力在你另行决定之前都是只读的,一个开关就能关。这和我们应用在面向代理的 SSH 访问(英文)以及 MCP 服务器究竟是什么上的,是同一个托管思路——数据库不过是那个“一次糟糕的写操作以行数来计量”的版本。从一个连接开始,让它保持只读,并在考虑放开任何东西之前,先问一个真实的问题。
Termalin 是一款免费、跨平台的 SSH 与数据库客户端,内置 MCP 服务器,并提供逐连接的代理策略——立即下载,或了解它如何安全地处理凭据。