A deterministic safety & cost gate that vets every SQL statement your AI agent writes — before it runs.
{
"verdict": "block",
"findings": [{
"id": "destructive.delete_without_where",
"severity": "block",
"recommendation": "Add a WHERE clause, or confirm a full-table delete is intended."
}]
}
Veto sits between your agent and your database as a deterministic gate.
Your agent calls analyze_sql over /mcp before executing anything.
Deterministic rules + a cost estimate on a throwaway scratch Postgres. Your production DB is never touched.
A structured ok / warn / block verdict with finding ids — before the query runs.
Traffic-light semantics your agent — and your CI — can branch on.
SELECT … LIMIT 100
Safe to run. Ships without friction.
ALTER TABLE orders …
Heavy-lock risk or a large sequential scan. You decide.
DELETE FROM users
Destructive without a guard. Stopped before it runs.
Same input, same verdict — every time. Deterministic findings with stable ids you can gate CI on.
Connect via MCP →{
"verdict": "block",
"findings": [{
"id": "destructive.drop",
"severity": "block",
"recommendation": "Confirm the object is unused; consider renaming first as a safer rollback path."
}]
}
No magic. The core is deliberately not AI — that's the point.
Same statement, same verdict — every time. No model drift, fully reproducible.
Rules + query planning, not a prompt. No tokens, no latency, no hallucinated approvals.
Cost estimates run on a scratch Postgres via BEGIN … ROLLBACK. Production is never connected.
Stable finding ids and golden cases in CI — a contract you can trust over time.
No. Veto never connects to your production database. Cost and plan estimates run on a throwaway scratch Postgres inside a transaction that's always rolled back.
No. The verdict is produced by deterministic rules and query-plan analysis — not a model. Same input always yields the same verdict.
Connect via MCP at /mcp and expose the analyze_sql tool. Your agent asks for a verdict before it runs any statement.
Destructive statements (unscoped DELETE/UPDATE, DDL drops), and cost risks (large sequential scans, missing indexes). Scope is intentionally narrow and reliable rather than broad and fuzzy.
Add Veto to your MCP client — point it at the endpoint and expose analyze_sql.
{
"mcpServers": {
"veto": { "url": "https://vetosql.com/mcp" }
}
}
shipped with a seatbelt