A
andrebentorj/rosie-nl2sql
Self-hosted text-to-SQL that checks every answer
View on GitHub ↗Link checked 2026-11-12 · HTTP 200 · opens the vendor's own site
Official descriptionSelf-hosted text-to-SQL that checks every answer. MySQL, PostgreSQL, SQL Server. Documentation and site.
We have neither an install command nor a public remote endpoint from this repository, so we do not print a config. A made-up one is worse than none. How each client wires MCP up →
- Star count
- 0 ★ · andrebentorj/rosie-nl2sql · read from the GitHub search API · (checked 2026-11-13 20:00:50)
- Source
- read directly from its GitHub page · type: open-source project
- Harvest history
- first seen 2026-11-12 · last seen 2026-11-14 · seen 3× · listed by 1 sources
- Score
- score 103 · 1 sources · repo
FAQ (answers come from our records)
Who is it for?
We filed it under these tags: MCP 服务. The tags come from the entry itself, not a taxonomy we imposed.
Who maintains it?
repository
andrebentorj/rosie-nl2sql;first catalogued 2026-11-12;last seen 2026-11-14。There is no official certification or quality rating here — we record sources and dates only.Rosie
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
Ask your database in plain language. See what was checked, and what was not.
Rosie is a self-hosted text-to-SQL engine for MySQL, MariaDB, PostgreSQL and SQL Server. You point it at
a database, it learns the schema, and people (through an embeddable chat widget) or AI agents
(through MCP) ask questions in plain language. Rosie writes the SQL, checks it, runs it
read-only and answers.
What sets it apart is what happens after the SQL runs. The answer goes through a set of
deterministic checks for the ways a query can be wrong without any error, and the outcome is
shown next to the number: the Answer Certificate. When a check could not run, Rosie says
that too. The checks look at the structure of the calculation, not at whether the question
was understood; docs/CERTIFICATE.md says exactly what is covered.
Two real answers from the demo database. On the left, the number was re-derived by a second
route and matched. On the right, the question asks for a period that runs six months past
the last record, and Rosie says so instead of handing over a total that looks complete.
| Checked and confirmed | Flagged |
A query that runs and returns a plausible number is the failure that hurts, because nobody
looks twice. On the demo data, a join that repeats each invoice once per
line turns a revenue of 2,328.60 into 20,848.62 without any error; the certificate reports
both figures and marks the answer CONTRADICTED.
## What it does
| Answer Certificate | After the SQL runs: detects joins that inflate totals, filters on values that do not exist, periods the data only partly covers, filters that remove nothing, and queries that ignore a declared metric definition. For totals over joins it re-derives the number by a second route and reports CROSS_CHECKED or CONTRADICTED. Every answer carries an explicit verdict, including NOT_CHECKED with the reason. |
| Read-only by construction | SQL is parsed and validated before it runs: SELECT only, tables and columns from an allowlist, no system functions. The database user is checked at startup and Rosie refuses to answer if it can do more than SELECT. |
| Personal data stays put | Masked columns are never read, never returned and never sent to the model provider. |
| Per-tenant isolation | Row policies filter every query by the caller's verified identity (JWT). The filter is applied by the engine, not by the model, and cannot be talked around. |
| Approved queries | A query a person reviewed for a question is run unchanged when the question comes back, with only the values swapped, and the answer says who approved it. The checks cover the calculation; this covers the meaning. |
| Metrics with one definition | Declare "revenue" once, or import it from dbt or Cube. Answers that compute it differently are flagged. |
| Two ways in | A chat widget (one script tag, white-label) and an MCP server for Claude, Cursor and other AI clients. |
| Runs where your data is | Your server, your database, your model key. Works with any OpenAI-compatible endpoint, including a model you host. |
## Measured, on public data
Our own regression suite: 194 questions over the public Chinook sample database, the same
Rosie is a self-hosted text-to-SQL engine for MySQL, MariaDB, PostgreSQL and SQL Server. You point it at
a database, it learns the schema, and people (through an embeddable chat widget) or AI agents
(through MCP) ask questions in plain language. Rosie writes the SQL, checks it, runs it
read-only and answers.
What sets it apart is what happens after the SQL runs. The answer goes through a set of
deterministic checks for the ways a query can be wrong without any error, and the outcome is
shown next to the number: the Answer Certificate. When a check could not run, Rosie says
that too. The checks look at the structure of the calculation, not at whether the question
was understood; docs/CERTIFICATE.md says exactly what is covered.
Two real answers from the demo database. On the left, the number was re-derived by a second
route and matched. On the right, the question asks for a period that runs six months past
the last record, and Rosie says so instead of handing over a total that looks complete.
| Checked and confirmed | Flagged |
A query that runs and returns a plausible number is the failure that hurts, because nobody
looks twice. On the demo data, a join that repeats each invoice once per
line turns a revenue of 2,328.60 into 20,848.62 without any error; the certificate reports
both figures and marks the answer CONTRADICTED.
## What it does
| Answer Certificate | After the SQL runs: detects joins that inflate totals, filters on values that do not exist, periods the data only partly covers, filters that remove nothing, and queries that ignore a declared metric definition. For totals over joins it re-derives the number by a second route and reports CROSS_CHECKED or CONTRADICTED. Every answer carries an explicit verdict, including NOT_CHECKED with the reason. |
| Read-only by construction | SQL is parsed and validated before it runs: SELECT only, tables and columns from an allowlist, no system functions. The database user is checked at startup and Rosie refuses to answer if it can do more than SELECT. |
| Personal data stays put | Masked columns are never read, never returned and never sent to the model provider. |
| Per-tenant isolation | Row policies filter every query by the caller's verified identity (JWT). The filter is applied by the engine, not by the model, and cannot be talked around. |
| Approved queries | A query a person reviewed for a question is run unchanged when the question comes back, with only the values swapped, and the answer says who approved it. The checks cover the calculation; this covers the meaning. |
| Metrics with one definition | Declare "revenue" once, or import it from dbt or Cube. Answers that compute it differently are flagged. |
| Two ways in | A chat widget (one script tag, white-label) and an MCP server for Claude, Cursor and other AI clients. |
| Runs where your data is | Your server, your database, your model key. Works with any OpenAI-compatible endpoint, including a model you host. |
## Measured, on public data
Our own regression suite: 194 questions over the public Chinook sample database, the same
Listed badge (optional)
Copy this line into the README if you want the listing mark. Optional, and it does not affect being listed.
[](https://anclum.com/en/s/andrebentorj-rosie-nl2sql/)
- Source
- github · https://github.com/andrebentorj/rosie-nl2sql
- Browse by field
- MCP servers
- added
- today
More like this
Filed under
Every tag opens the full list for that filter. Counts are the live catalogue figures.