关于 Veto — SQL Safety & Cost Oracle
Veto 是远程 MCP 服务,可在 AI 编码 Agent 执行 PostgreSQL 语句前,以确定性方式检查安全性、正确性和估算成本。它返回可审计的 ok、warn 或 block 结果,不连接生产数据库,也不使用 LLM 生成判定。
主要功能
- 01确定性 SQL 安全判定
- 02破坏性操作与正确性规则检查
- 03通过 EXPLAIN 分析临时 Postgres 成本
- 04用于审计和 CI 的稳定发现 ID
- 05可选的声明式组织策略
适用场景
- 01执行前拦截 Agent 编写的 SQL
- 02检查迁移中的破坏性变更
- 03依据判定结果分支运行 CI 检查
MCP 相关
通过远程 Streamable HTTP MCP 端点提供 analyze_sql,以及 Pro 版的自定义策略设置和读取工具。分析 SQL 时不会连接调用方的生产数据库。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://vetosql.com/mcpclaude mcp add --transport http com-vetosql-veto https://vetosql.com/mcp{"mcpServers":{"com-vetosql-veto":{"type":"http","url":"https://vetosql.com/mcp"}}}在 Cursor 中打开{"servers":{"com-vetosql-veto":{"type":"http","url":"https://vetosql.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"com-vetosql-veto":{"type":"http","url":"https://vetosql.com/mcp"}}}{"mcpServers":{"com-vetosql-veto":{"serverUrl":"https://vetosql.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
3| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| sql | string | 是 | 要分析的 SQL(一个或多个语句)。 |
| schema | string | 否 | 可选的 CREATE TABLE/INDEX DDL。提供后会在临时 Postgres 上启用基于 EXPLAIN 的成本分析(例如大型表上的顺序扫描);省略则仅进行静态安全分析。 |
| dialect | string | 否 | |
| rowCountHints | object | 否 | 可选的表名到预估行数的映射,用于得出更贴近实际的成本估算。 |
详细介绍
Veto — SQL 安全与成本预检器(MCP)
Veto 是一个确定性的 MCP 服务,可在 AI 编码 Agent 执行 Postgres SQL 之前,对其安全性、正确性和成本进行审查。 它会为每条语句返回
ok/warn/block判定——核心逻辑不使用大模型,也绝不会连接到你的数据库。
网站: https://vetosql.com · MCP 端点: https://vetosql.com/mcp(远程,streamable-http)
AI 编码 Agent(Claude Code、Cursor 等)会编写并执行 SQL。有时它们会写出没有 WHERE 的 DELETE FROM payments,或在迁移期间执行 DROP TABLE。增加提示词并不能修复概率性系统的问题——确定性关卡可以。Veto 就是这样的关卡:给定同一条语句,它每次都会返回相同判定,并提供稳定的发现项 ID,便于你审计并在 CI 中设置关卡。
它能检测什么
| 判定 | 含义 | 包含的情况 |
|---|---|---|
block | 破坏性操作/数据丢失 | 未限定范围的 DELETE/UPDATE、TRUNCATE、删除含数据的对象——包括隐藏在 CTE 中的破坏性语句 |
warn | 有风险但可恢复 | 锁开销大的架构变更、开销高的扫描、会悄无声息地返回错误行的正确性陷阱(= NULL、NOT IN (subquery)、被筛选成内连接的 LEFT JOIN),以及 SELECT * 等常见反模式 |
ok | 可以安全执行 | 常规、可逆的迁移 |
每条发现项都带有稳定的点分隔 ID(例如 destructive.delete_without_where),方便你的流水线据此分支处理。确切的规则集由服务端管理,并会随时间演进。
为什么采用确定性设计
- 可复现 — 相同输入,相同判定。可测试,因此值得信赖。
- 可审计 — 触发的是命名规则,而不是“模型觉得它有风险”。
- 不会漂移 — 再巧妙的提示词也无法让它撤销
block判定;状态不佳时也不会表现变差。 - 绝不接触你的数据库 — 成本通过真实的
EXPLAIN测量,在一次性临时 Postgres 中执行,并且始终在事务中回滚。它绝不会连接到你的生产数据库。
工具
analyze_sql
为 Postgres SQL/迁移返回确定性的安全性与成本判定。
| 输入 | 类型 | 说明 |
|---|---|---|
sql | string | 要分析的 SQL/迁移——一条或多条语句(必填) |
schema | string? | 可选的 CREATE TABLE/INDEX DDL——启用基于临时 Postgres 上 EXPLAIN 的成本分析 |
rowCountHints | object? | 可选的映射:表名 → 估算行数,用于获得更贴近实际的成本估算 |
返回 { verdict, findings[], plan?, meta },其中 verdict ∈ ok | warn | block。
set_policies (Pro)
将自定义组织策略存储到与你的 Pro 密钥关联的位置;随后 analyze_sql 会在内置规则之上执行这些策略。策略是声明式数据——经过验证,绝不会执行(最多 50 条,并会替换先前存储的策略集)。
每条策略包括:table(精确名称或 glob,例如 payments、audit_*、*)、operations(select/insert/update/delete/truncate/drop/alter 中任意项)、action(block/warn),以及可选的 message。
{
"policies": [
{ "table": "payments", "operations": ["delete", "truncate"], "action": "block",
"message": "Never delete from payments — use the refund flow." }
]
}
发送完整策略集会对其进行更新;发送空数组会将其清除。
get_policies (Pro)
返回当前为你的密钥存储的自定义组织策略集——也就是 analyze_sql 在内置规则之上执行的同一组规则。此操作为只读;如果未设置任何策略,则返回空列表。
设置
Veto 是一个远程 MCP 服务——无需安装,也无需源代码。将客户端指向该端点即可。
Claude Code — .mcp.json
{
"mcpServers": {
"veto": {
"type": "http",
"url": "https://vetosql.com/mcp"
}
}
}
Cursor — ~/.cursor/mcp.json
{
"mcpServers": {
"veto": {
"url": "https://vetosql.com/mcp"
}
}
}
免费层无需密钥(60 req/min)。**Pro:**将你的 VETO-… 密钥添加为 bearer token(保留单词 Bearer 和其后的空格):
"headers": { "Authorization": "Bearer VETO-…" }
定价
| 套餐 | 价格 | 限制 | 额外权益 |
|---|---|---|---|
| Free | €0 | 60 req/min | 完整的确定性判定——涵盖所有破坏性操作、锁、正确性与成本规则 |
| Pro | €9.90 / mo | 1200 req/min | 自定义组织策略(set_policies)、维护者支持 |
在 vetosql.com 订阅。
常见问题
Veto 支持哪些数据库? PostgreSQL。可与任何 Postgres 托管服务(Supabase、Neon、RDS、可自托管)和任何迁移工具配合使用,因为 Veto 分析的是 SQL 文本,不会连接到你的数据库。
安全吗?它能查看或修改我的数据吗? 不能。Veto 从不连接到你的生产数据库。成本分析会在单独的临时 Postgres 中通过一个始终回滚的事务运行,不会读取或写入任何数据。
Veto 与 Squawk 或 sqlfluff 这类代码检查工具有何不同?
它们是 CI/风格工具。Veto 是 AI Agent 通过 MCP 调用的实时运行时关卡,会针对即将执行的确切语句返回 ok/warn/block 判定,还会提供成本估算和自定义组织策略。
为什么不直接给 Agent 一个只读或受限的数据库角色?
角色的粒度较粗,也容易配置错误,而且无法发现代价高昂的顺序扫描,或在允许写入的角色下执行的全表 UPDATE。无论你使用什么角色,Veto 都会额外提供语句级判定。
它会使用大模型吗?
不会。核心是确定性静态分析和 EXPLAIN。调用它的 Agent 会解读结构化判定;判定本身绝不会由模型生成。
链接
- 网站: vetosql.com
- 博客: AI Agent 清空了生产数据库。解决办法不是改进提示词。
- MCP 端点:
https://vetosql.com/mcp - 官方 MCP 注册表:
com.vetosql/veto - Glama: glama.ai/mcp/connectors/com.vetosql/veto
由 Metawear 构建。托管服务运行于 vetosql.com;此仓库是 Veto 服务的公开文档和 MCP 注册表清单。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。