MCP server de Dbento
Commit 14 nov 2026Proporciona a un cliente de IA acceso de solo lectura a múltiples bases de datos SQL y NoSQL a través de un MCP server seguro.
También conocido como PhongGuy/dbento
- Stars
- 2
- Herramientas
- —
- Descargas, 30 días
- —
- Última versión
- —
- Último commit
- 14 nov 2026
- Licencia
- Apache-2.0
¿Qué es Dbento MCP?
Dbento es un MCP server. Proporciona a un cliente de IA acceso de solo lectura a múltiples bases de datos SQL y NoSQL a través de un MCP server seguro.
Resumen generado a partir del README del proyecto
Acerca del MCP server de Dbento
Dbento permite que un cliente de IA tenga acceso de solo lectura a diversos motores de bases de datos mediante su MCP server. Los desarrolladores pueden conectar una IA a un espacio de trabajo que contenga varios almacenes de datos, incluyendo motores SQL como PostgreSQL, MySQL, SQLite, SQL Server y DuckDB, así como opciones NoSQL como MongoDB, Redis, DynamoDB y SurrealDB. El servidor opera sobre stdio y utiliza diez herramientas específicas, incluyendo list_connections, list_tables, describe_table y query para facilitar la exploración de datos.
La seguridad es un enfoque central, ya que el servidor establece por defecto el acceso de solo lectura y requiere aprobación manual en la aplicación de escritorio para cualquier operación de escritura a través de la herramienta execute. Esta configuración garantiza que una IA no pueda realizar cambios no autorizados sin la intervención de un humano. El sistema gestiona las conexiones mediante un archivo dbento.toml y permite que la IA interactúe con consultas guardadas en archivos de texto plano. Esta arquitectura permite un entorno seguro y controlado donde una IA puede inspeccionar esquemas y ejecutar consultas mientras el usuario mantiene la autoridad final sobre cualquier modificación de datos.
Qué puedes hacer con él
- 1Realizar análisis de datos de solo lecturaSolicita a la IA que realice consultas complejas en bases de datos SQL o NoSQL para recuperar conjuntos de datos específicos.
- 2Previsualizar planes de ejecución de consultasPide a la IA que explique cómo se ejecutará una sentencia específica en Postgres o SQLite antes de ejecutarla.
- 3Ejecutar cambios de datos aprobadosInstruye a la IA para realizar una operación de escritura que deberás autorizar manualmente en la aplicación de escritorio.
Escrito a partir del README del proyecto. Cada caso de uso se verifica con una cita del mismo.
Configuración
DOCKER_HOST
| Nombre | Descripción | Tipo |
|---|---|---|
| DOCKER_HOST | — |
Verificaciones automáticas
Ejecutado 15 nov 2026Informe completo →Aún no verificado. Un servidor necesita una puntuación de 80, ningún hallazgo grave y suficientes datos para que podamos revisarlo. Cómo funcionan las verificaciones · Qué corregir para obtener más puntos
- Repositorio de origen vinculado y accesiblephongguy/dbento is public and reachablegithub.com/phongguy/dbento ↗Aprobado
- El paquete indica este repositorio como su origenNo verificado
- Procedencia de la compilación (atestación de Sigstore)No verificado
- Licencia de código abierto (OSI)Apache-2.0spdx.org/licenses/Apache-2.0.html ↗Aprobado
- Commit o lanzamiento en el último añoLast commit or release 2026-11-14github.com/phongguy/dbento ↗Aprobado
- OpenSSF ScorecardNo verificado
- El nombre del paquete no es similar a un paquete popularNo verificado
- No hay avisos críticos en el paquete ni en sus dependenciasNo verificado
- Sin instrucciones ocultas para el modelo0 tool descriptions and the README read; no override phrases, credential paths or hidden charactersAprobado
- Las herramientas destructivas están etiquetadasNo verificado
- El endpoint remoto responde al handshake de MCPNo verificado
README
Ver en GitHubDbento
A fast, native database client. Dbento is free and open source, written in Rust and drawn on the GPU: no Electron, no webview. It comes as a desktop app, a command line, and an MCP server that gives an AI client read-only access to your databases by default. It speaks SQL to Postgres, SQLite, MySQL, SQL Server and DuckDB, and each NoSQL store's own language to MongoDB, SurrealDB, Redis and DynamoDB. The name is db + bento: data in neat compartments.

Why Dbento
- Native and fast. The desktop app is built on GPUI and rendered through the GPU. Results stream into a virtualized grid, so a large result scrolls as smoothly as a small one.
- Your workspace is a folder. Connections live in
dbento.tomland saved queries in plain text files, so a team can review them in git. No password is ever written to a file. - The database enforces safety. A read-only connection is opened read-only by the database itself, rather than by Dbento guessing from the SQL whether a statement writes.
- AI access with you in the loop. The MCP server is read-only by default. A write runs only after you approve that exact call in the desktop app, and the AI can never approve itself.
Supported databases
| Database | engine in dbento.toml |
Query language | Saved query files |
|---|---|---|---|
| PostgreSQL | postgres |
SQL | .sql |
| SQLite | sqlite |
SQL | .sql |
| MySQL and MariaDB | mysql (or mariadb) |
SQL | .sql |
| SQL Server | mssql (or sqlserver) |
T-SQL | .sql |
| DuckDB | duckdb |
SQL | .sql |
| MongoDB | mongodb (or mongo) |
a subset of mongosh: find, aggregate, insertOne, updateMany and more |
.js |
| SurrealDB | surrealdb (or surreal) |
SurrealQL, over WebSocket | .surql |
| Redis and Valkey | redis (or valkey) |
Redis commands, one per line | .redis |
| Amazon DynamoDB | dynamodb (or dynamo) |
PartiQL | .partiql |
DuckDB, MongoDB, SurrealDB, Redis and DynamoDB are default Cargo features (duckdb, mongodb, surrealdb, redis, dynamodb) of the core, the command line, the MCP server and the app. A build with --no-default-features leaves them out, and leaving out DuckDB skips its C++ compile. Other engines are tracked in the issue tracker.
Features
A result grid that keeps up
Results stream in as the database sends them, into a virtualized grid that fetches the next batch as you scroll. A row limit (1k, 10k, 100k or 1M rows, or none, with only a memory budget) stops collecting and marks the result truncated. Dbento never rewrites your SQL to add a LIMIT, and a type it does not know is shown, never turned into NULL. Copy cells as TSV, CSV, JSON, Markdown or INSERT statements, export loaded rows to CSV or JSON, and step through one row in the record view.
An editor that knows your schema
SQL highlighting, formatting, and completion of schemas, tables, columns and keywords from the connection's live catalog. Queries open in tabs, saved queries are plain .sql files, every run lands in a searchable history, and the command palette (Ctrl+P, Cmd+P on macOS) finds tables, saved queries and commands. A running query can be cancelled.

An explorer down to the indexes
The schema tree shows tables, views, materialized views and foreign tables, and under each one its columns, keys, indexes, checks and triggers, plus types and routines on Postgres. Open any object to read its definition, copy it, or open it in a query tab.

Documents, keys and items
The NoSQL stores share the same explorer, editor and grid, each in its own language.
- MongoDB: databases and collections, with fields inferred from a sample of documents, and indexes. Opening a collection runs its
find(). Columns come from the first documents, and fields that appear later land in a(more fields)column. - Redis and Valkey: each DB index with its key count, and the keys grouped into folders by
:. Keys are listed with aSCANwalk that shows each key's type and TTL, and the filter takes a pattern plustype:<kind>. Opening a string, hash, list, set, sorted set or stream shows its value in a paged grid, with its type, length and TTL. Command completion comes from the server'sCOMMAND DOCS. - DynamoDB: one schema per region, with tables, their key attributes, indexes, and attributes sampled from items. Opening a table or an index runs a PartiQL
SELECT, and attributes beyond the first items land in a(more attributes)column. - SurrealDB: the namespace's databases and their tables, read from
INFOand sampled rows, with fields, indexes and triggers. Opening a table runsSELECT * FROMit.
Editing you review before it lands
Edit cells, add rows and delete rows in a browsed Postgres or SQLite table. Changes are staged, then applied in one transaction with typed parameters, after a prompt that says how many rows they affect and asks you to commit or roll back. Rows without a primary key are found by ctid and xmin on Postgres and by rowid on SQLite, and a row someone else changed or deleted in the meantime is marked instead of overwritten.

AI access through MCP
dbento mcp serves a workspace to an AI client over MCP on stdio, with ten tools: list_connections, list_databases, list_schemas, list_tables, describe_table, query, explain, list_saved_queries, read_saved_query and execute.
queryalways runs read-only, one statement in the connection's own language: SQL, a mongosh statement, SurrealQL, one Redis command, or PartiQL. Redis commands in the@dangerous,@blocking,@scriptingand@pubsubcategories are refused. It returns 100 rows by default and at most 1,000, about 64 KiB, under a statement timeout of 30 seconds by default.explainshows the plan of one statement on Postgres and SQLite in the same read-only session, so an AI can preview anUPDATEorDELETEwithout running it.ANALYZEis refused.list_saved_queriesandread_saved_queryread the saved query files (.sql,.js,.surql,.redis,.partiql) under the workspace'squeries/folder and nothing outside it, not even through a symlink.executewaits until you approve that exact call in the desktop app, once. When you deny a call you can type a reason, and the AI gets it back with the denial.
Query results are passed to the AI as untrusted data. The app's approvals panel shows the command to connect your AI client.

Safety the database enforces
- A
read_onlyconnection runs every statement inBEGIN READ ONLYon Postgres and opens SQLite and DuckDB read-only, so the database itself refuses a write. Aread_onlyDuckDB connection also has file access off, soread_csvand Parquet reads of local files do not work there. - On Postgres the server still lets a few things through: functions that open their own connections, such as
dblink_execwhere the dblink extension is installed, and admin functions whose effect is not transactional, such aspg_terminate_backend,pg_cancel_backendandpg_stat_reset. For a production database, use a role without the privileges the rest need; it can still cancel or terminate backends of its own role. - A MySQL or MariaDB
read_onlyconnection, and every MCP session on one, runs each statement inSTART TRANSACTION READ ONLY. The server still lets a few things through:SELECT ... INTO OUTFILEorDUMPFILE,SET GLOBALandSET PERSIST,FLUSH,GET_LOCK, and an existing stored procedure that commits and then writes. For a production database, use an account without the FILE, RELOAD, SYSTEM_VARIABLES_ADMIN or SUPER privileges and without EXECUTE on such procedures, ideally one granted only SELECT. - On SQL Server, give a
read_onlyconnection aread_only_user(a login that can only read) and the database enforces it. Without one the session is best effort: Dbento fences each batch in a transaction it rolls back and refuses the batches it can parse as writes, but a login with the rights can get past the fence with a hidden commit.list_connectionsstates the level of each connection to an AI client. - On MongoDB, Dbento reads the user's privileges when it connects. A user that can only read is enforced by the server; for any other user Dbento refuses every command it cannot show reads.
- On SurrealDB each statement runs in a transaction that is cancelled, and a VIEWER login is enforced by the server. At either level, stored logic reached from a
SELECTcan still advance sequences, callhttp::*functions or write files, and a root OWNER or anonymous login can runALTER SYSTEM. - On Redis and Valkey, Dbento checks the user's ACL against the server's command table when it connects. A user whose ACL refuses every write is enforced by the server; otherwise Dbento refuses writes and commands it cannot classify. The check runs once, so a later
ACL SETUSERcan widen the user. - DynamoDB has no read-only session. A read-only connection sends only
ListTables,DescribeTable,Scanand PartiQLSELECT, but only IAM stops someone with the same keys from writing, so give a production connection keys that can only read. - A connection tagged red is marked as production in the tab line and the status bar.
UPDATEorDELETEwithoutWHERE,DROP,TRUNCATE,updateManyordeleteManywith an empty filter, andFLUSHDBorFLUSHALLask before they run.- Write detection follows each engine:
pg_queryfor Postgres and DuckDB, so a write hidden in a CTE is still caught; SQLite's own read-only check; sqlparser for MySQL and SQL Server; an allowlist of read methods for MongoDB; and the server's command table for Redis. Outside a read-only session, a statement the parser cannot handle is never blocked for that reason alone.
Also
- Light and dark themes, or follow the system.
dbento import datagrip,dbento import dbeaveranddbento import beekeeperbring over connections and saved queries from DataGrip, DBeaver and Beekeeper Studio, and saved passwords go to the keychain.- Try it without a database server:
make demo(see Try the demo).
How it works
One core, thin shells
All of the logic lives in dbento-core, a library with no UI: the workspace format, the keychain, the database drivers behind one async interface, streamed results, and the safety checks. Three thin shells call only its public API:
| Crate | What it is |
|---|---|
dbento-cli |
The dbento command line, which also hosts the MCP server. |
dbento-mcp |
The MCP server itself, built on rmcp. |
dbento-app |
The dbento-app desktop app, built on GPUI. |
A workspace is a folder
A workspace is any folder with a dbento.toml in it. Connections live in that file, and saved queries in queries/<connection>/, as .sql files or the extension of the connection's language, so a query file knows which connection it runs on. Folders group connections and give them a color.
dbento = 1
[connections.app-dev]
engine = "postgres"
host = "localhost"
database = "app"
user = "app"
[connections.app-prod]
engine = "postgres"
host = "db.example.com"
database = "app"
user = "readonly"
read_only = true
color = "red"
[connections.local]
engine = "sqlite"
path = "data/app.db"
The NoSQL stores take their own keys:
[connections.docs]
engine = "mongodb"
uri = "mongodb://app@localhost:27017/app?authSource=admin"
[connections.cache]
engine = "redis"
host = "localhost"
database = "2"
secret = "none"
[connections.items]
engine = "dynamodb"
region = "eu-north-1"
access_key_id = "AKIAEXAMPLEKEYID"
consistent_read = true
[connections.graph]
engine = "surrealdb"
host = "localhost"
namespace = "app"
database = "main"
user = "reader"
auth_level = "database"
- MongoDB takes everything in
uri, options such asauthSourceandtls=trueincluded. A password inuriis refused; the secret is stored like any other. - Redis and Valkey take
host(default127.0.0.1),port(6379),user, anddatabaseas a DB index (0 when left out). - DynamoDB takes
region, elseAWS_REGIONorAWS_DEFAULT_REGION, and anendpointfor a local server; plainhttpis allowed only on this machine. Withaccess_key_idthe secret access key is the connection's secret; without it the credentials come fromAWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYandAWS_SESSION_TOKEN.consistent_read = truemakes reads strongly consistent. - SurrealDB takes
host,port(8000),namespace,database, and with auseranauth_levelofroot,namespaceordatabase. Without a user the session is anonymous. - SQL Server can take a
read_only_user, a user that can only read, for its read-only work (see Safety the database enforces).
A Postgres or SQL Server connection can also reach the other databases on its server. Set databases to a list of names, such as databases = ["billing", "audit"], or to "all", and each database becomes a child connection named <parent>/<database>, for example app-dev/billing. A child uses its parent's credentials and safety settings, and works anywhere a connection name does: dbento query, dbento run, dbento connections, and the MCP server, where list_databases lists a parent's databases.
Secrets stay out of files
No password is ever written to dbento.toml. A server connection's secret is stored in the OS keychain (the Secret Service on Linux, Keychain on macOS, Credential Manager on Windows), and only the secret, never the whole connection URL. When the keychain has no entry, Dbento reads the environment variable DBENTO_SECRET_<NAME>, the connection name in upper case with - as _ (so app-prod reads DBENTO_SECRET_APP_PROD). A connection can also name its own variable with secret = { env = "PGPASSWORD" }, or say it needs none with secret = "none".
Download
| System | Desktop app | Command line |
|---|---|---|
| Linux x86_64 | .deb · AppImage | tar.gz |
| Linux arm64 | .deb · AppImage | tar.gz |
| macOS Apple silicon | Dbento_aarch64.dmg | tar.gz |
| macOS Intel | Dbento_x86_64.dmg | tar.gz |
| Windows x64 | Installer (.exe) | zip |
No release has been published yet, so these links start working with the first one. Until then, build from source. The macOS and Windows packages have not yet been tested on those systems.
Releases will be listed on the releases page, with checksums. See Install notes for the first launch on macOS and Windows.
Install notes
A release holds these files, where <v> is the version. Each one also has a copy without the version in its name, which is what the download links above point to.
| Platform | Desktop app | Command line |
|---|---|---|
| Linux x86_64 | dbento-app_<v>_amd64.deb, dbento-app_<v>_x86_64.AppImage |
dbento-<v>-x86_64-unknown-linux-gnu.tar.gz |
| Linux arm64 | dbento-app_<v>_arm64.deb, dbento-app_<v>_aarch64.AppImage |
dbento-<v>-aarch64-unknown-linux-gnu.tar.gz |
| macOS Apple silicon | Dbento_<v>_aarch64.dmg |
dbento-<v>-aarch64-apple-darwin.tar.gz |
| macOS Intel | Dbento_<v>_x86_64.dmg |
dbento-<v>-x86_64-apple-darwin.tar.gz |
| Windows x64 | dbento-app_<v>_x64-setup.exe |
dbento-<v>-x86_64-pc-windows-msvc.zip |
Linux: the .deb installs both /usr/bin/dbento and /usr/bin/dbento-app. The AppImage cannot put dbento on your PATH, so AppImage users also take the CLI archive for their architecture.
macOS: the app is ad-hoc signed and not notarized, so Gatekeeper blocks the first open. Move Dbento.app to /Applications before the first launch, then clear the quarantine flag:
xattr -dr com.apple.quarantine /Applications/Dbento.app
Windows: the installer and dbento.exe are not code-signed, so SmartScreen warns about an unknown publisher; choose "More info", then "Run anyway".
Checksums: every package and archive carries THIRD-PARTY-NOTICES.html, the licenses of the crates it is built from. One SHA256SUMS file covers every file, the unversioned copies included; check your downloads with:
sha256sum -c --ignore-missing SHA256SUMS
Build from source
You need:
-
Rust 1.99 or newer (the workspace's
rust-version), from rustup. -
A C and C++ compiler and libclang, for the bundled
pg_queryparser and DuckDB. -
On Linux, the system libraries GPUI draws with. On Debian or Ubuntu:
sudo apt-get install pkg-config libfontconfig-dev libfreetype-dev libwayland-dev \ libx11-xcb-dev libxkbcommon-x11-dev libvulkan1 libegl1 libclang-dev
From a checkout, run:
make
This builds with 4 jobs (make JOBS=8 for more) and installs dbento (the command line) and dbento-app (the desktop app) with cargo install. On Linux it also adds a desktop entry and the icon under ~/.local/share. make PREFIX=/some/dir installs the binaries under /some/dir/bin instead, and make uninstall removes everything again. On macOS only the binaries are installed. On Windows, or to install without make, run the two installs by hand:
cargo install --locked --path crates/dbento-cli
cargo install --locked --path crates/dbento-app
To build without installing, cargo build --release puts both binaries in target/release.
Quick start
Try the demo
make demo
This opens the app on a small shop: customers, products, orders and 200,000 events in SQLite, with saved queries to open with Ctrl+O (Cmd+O on macOS) from the workspace's queries/ folder (top customers, a scroll through every event, an UPDATE without WHERE, a slow query to cancel, and a write that the read-only shop-prod connection refuses). No database server or keychain is needed. Each run copies examples/demo fresh to ~/.cache/dbento-demo/workspace and builds shop.sqlite from its seed.sql, and the app keeps its state in ~/.cache/dbento-demo/state, so nothing you do in the demo reaches the repo or your own app settings.
Your own workspace
Create a workspace in a new folder:
mkdir my-databases && cd my-databases
dbento init
This writes dbento.toml and an empty queries/ folder. Add a connection to dbento.toml, such as app-dev from the example above, then store its password in the keychain. dbento secret set prompts for it, or reads the first line of stdin, and never takes it from the command line:
dbento secret set app-dev
dbento connections
Run SQL on a connection, or run a saved query file. A file under queries/app-dev/ runs on app-dev; pass --conn for a file anywhere else:
dbento query app-dev "select * from users order by created_at desc"
dbento run queries/app-dev/recent-orders.sql
dbento run report.sql --conn app-dev --format csv > report.csv
On a MongoDB, SurrealDB, Redis or DynamoDB connection, dbento query takes that engine's language instead of SQL, and dbento run refuses a file whose extension belongs to another language.
Both commands take --format table|json|csv, --max-rows N, --read-only, --timeout 30s, and --yes to run an UPDATE or DELETE without WHERE, a DROP or a TRUNCATE without asking. Every command finds the nearest dbento.toml above the working directory, or takes --workspace <dir>.
The desktop app
Open the app on a workspace by passing its folder:
dbento-app ~/my-databases
Connect an AI client
Register dbento mcp as a stdio MCP server in your AI client. Most clients take a JSON entry like this one:
{
"mcpServers": {
"dbento": {
"command": "dbento",
"args": ["--workspace", "/home/you/my-databases", "mcp"]
}
}
}
--connection <name> (repeatable) exposes only the connections you name, and --timeout <secs> sets the statement timeout for every call (30 by default). Keep the desktop app open on the same workspace to approve or deny the writes the AI asks for.
Development
Make targets
| Target | What it does |
|---|---|
make check |
The merge gate: cargo fmt --check, clippy with warnings as errors, and the full test suite. |
make pilot-check |
Builds and runs the gpui-pilot tests in tools/dbento-pilot, which drive the real app, except the two wheel-scroll timing recordings. |
make pilot-timing |
The wheel-scroll timing recordings alone. They wait for a quiet machine and refuse to measure a loaded one; a pass stamps the committed tree it ran on. |
make timing-guard |
Fails when the grid, its scrolling or rendering, the wheel test or the gpui pins changed since BASE (default origin/master) and the current tree has no pilot-timing stamp. |
make script-test |
The bash suites under scripts/tests. |
make workflows-lint |
actionlint over .github/workflows. |
make icons-check, make notices-check, make windows-check |
The icon exports, the third-party notices, and a Windows type-check through mingw. |
make xwin-check, make xwin-build |
An msvc check and release-style build from Linux through cargo-xwin; xwin-build compiles shaders at runtime, so it is not for shipping. |
make package |
The Linux CLI archive, .deb and AppImage, verified, in target/dist/linux. |
make screenshots |
Regenerates the screenshots in assets/screenshots from the demo workspace under gpui-pilot. |
make demo |
Opens the app on the demo workspace. |
make pilot-check and make screenshots need the gpui-pilot server on your PATH, or GPUI_PILOT_BIN naming it. Install it with:
cargo install --locked --git https://github.com/PhongGuy/gpui-pilot --tag v0.3.2 gpui-pilot
A change to the results grid, its scrolling or rendering merges only once make timing-guard passes: run make pilot-timing on a quiet machine on the commit you merge. The paths it watches are listed in scripts/timing-guard.sh.
Preguntas sobre Dbento MCP
¿Es seguro el MCP server para mis datos?
Sí, el MCP server es de solo lectura por defecto. Cualquier operación de escritura requiere aprobación manual dentro de la aplicación de escritorio de Dbento, y la IA no puede aprobar sus propias llamadas.
¿Qué bases de datos son compatibles?
Dbento es compatible con Postgres, SQLite, MySQL, MariaDB, SQL Server, DuckDB, MongoDB, SurrealDB, Redis, Valkey y Amazon DynamoDB.
¿Cómo accede la IA a mis consultas?
La IA puede usar herramientas para listar conexiones, bases de datos, esquemas y tablas, así como para ejecutar consultas y leer archivos de consultas guardados en una carpeta de espacio de trabajo específica.