
dbprint
io.github.jakubroPublished by GitHub account jakubrov0.19.0Updated Nov 7, 2026
A database's schema, value lists and joins, from a snapshot in your repo - no database connection.
Overview
Serves a committed, offline snapshot of a database's schema, joins and column statistics so an assistant can answer data questions without a database…
- What you can do
- List tables and read one table's context: DDL, joins, column values, ranges and distributions
- Search columns and resolve a value or code against the measured value lists
- Read the print manifest and the drift diff from the last profiling run
- Read a reference guide explaining which fields to trust for what
- Expose every artifact of the print as a resource
- When to use it
- Use it when a repository already contains a dbprint print and you want a coding agent to write SQL or interpret columns offline, without warehouse credentials or repeated queries. It suits teams that profile once, commit the result, and let later sessions read it.
- Requirements
- A local process launched with uvx from the dbprint package with the mcp extra, plus Python 3.13 or newer. It needs a committed print directory, named explicitly with the project option, which may also be a git address. No database connection or credentials are needed at the client.
Installation
In SourceWeft
- Open dbprint in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
dbprint
[PyPI] [Docs] [License: Apache 2.0] [Status] [dbprint MCP server – quality and maintenance score on Glama]
Example · Quickstart · Using dbprint · Compared with other tools · The format
dbprint measures a database and writes each table's DDL, its joins and per-column statistics as plain text to commit beside the code, next to the notes on what the values mean that a person or an agent writes. A coding agent reads both offline, with no database connection.
Migrations and models record a database's shape, not what its values mean: that revenue_cents is gross and every report uses the net column, that status is spelled two ways, how often orders joins shipments one-to-many, that legacy_uid has been unused since a migration. An agent without a database connection cannot find these out. An agent with one re-runs the same queries in every session, at a cost in warehouse time, budget and tokens, and can still misread the result: a count does not say that a code is unused or that a column is gross.
What dbprint does, and what an agent adds:
- It measures the database once. Each table's DDL, its joins — declared, and inferred where the schema declares none — and per-column statistics: null shares, complete value lists with every spelling, ranges, distributions, value shapes and more. On PostgreSQL, MySQL, Snowflake, BigQuery, Databricks, Redshift, ClickHouse, duckdb or SQLite.
- An agent writes down what the numbers mean.
dbprint annotatehands an agent one table's measurements and the questions they leave open — what a code means, what a sentinel date stands for, which rows a report leaves out — and the agent answers them from the project's code and read-only queries, into files dbprint never overwrites.dbprint annotate --checkflags a note the data contradicts. - Every later session reads it offline. Through an MCP server, a packaged skill or
dbprint context, with no database connection and no credentials at the agent. Because it is text in git, a schema or data change shows up in review, anddbprint checkgates it in CI.
With dbprint, agents get more answers right, for less. In our tests across multiple codebases, coding agents reading an annotated print got 80% fewer answers wrong than without one, at 17% lower cost per correct answer, and 90% fewer on questions whose catch only the print stated.
Example
An excerpt of dbprint context --purpose query on a table from the reference print in this repo — the fragment an agent gets before it writes SQL:
Three things here no migration states: medium holds exactly these values and no others, sand tray is stored in two spellings, so a filter on one misses 25 rows, and control is not a medium at all. dbprint measured the first two; a person or an agent wrote the third once, and every later session reads it.
The same command runs with no database and no configuration, given only uv:
Quickstart
Requires Python 3.13+. Install with the driver extra for the database's engine:
Add [mcp], [docs] or [dbt] in the same install — uv tool install 'dbprint[postgres,mcp]', or 'dbprint[all]' for every extra — since a later install replaces the earlier one.
The Postgres adapter shells out to pg_dump for DDL, so the PostgreSQL client binaries must be on PATH.
Scaffold a project in the repository root:
That writes .dbprint.yaml (commit it), creates prints/, and writes a credentials template to ~/.dbprint/connections.yaml — outside the repo, so secrets never sit next to the config.
Put the connection details in the credentials file:
and tell .dbprint.yaml which adapter to use and which tables to read:
Credentials resolve from DBPRINT_<CONNECTION>_<KEY> environment variables first, then ~/.dbprint/connections.yaml, then a project-root .env. Every key of both files is in docs/CONFIG.md.
Profile it:
Commit the result beside the code. Then inspect it with no database in reach:
Then have an agent annotate a table — the brief carries the annotation skill's steps, so any agent CLI can follow it:
and connect an agent to the result.
Using dbprint
The full documentation is on the dbprint site.
What dbprint does to the database
- It reads. A role that can
SELECTthe profiled tables is enough; each engine's adapter page, linked from your first print, lists the exact grants. The one write is a temporary copy of a sampled table's drawn rows, gone when the session ends (on BigQuery, when its expiration passes), and only for a sampled table —read.tables.materializeturns it off. - It publishes real values. Value lists, ranges and percentiles are cell values, and they are committed to the repository. Nothing is withheld by default: redaction masks, drops or hashes them by column name, by detected sensitivity (
personal_name,national_id, ...) or by shape, keeping every count. A password or key written into the schema itself — a view body, a default, a comment — is masked inddl.sqlon every run, whatever the rules say. - It costs one profiling run, then whatever later runs re-read. A table is re-read when its print is older than its freshness threshold or its settings changed; sampling, row filters and catalog-only reads bound the cost on a warehouse — see choosing what to profile.
What a print looks like
Under the context an agent reads are plain YAML files. An excerpt of one table's statistics.yaml, some fields elided, from the same reference print:
values_coverage: 1.0 marks those ten values as the entire domain, not the top ten, so an eleventh value is ruled out without querying the database. (When a table is profiled from a sample rather than in full, coverage is measured over the rows that were actually read — see Scoped profiling below.)
inferred is what dbprint concluded rather than read: looks_like: country_code is a verdict, and sampled/matched are the evidence for it, so a shape confirmed by ten values never looks like one confirmed by ten thousand.
Alongside it, relationships.yaml carries the join graph:
Those two files are measured. Notes are written beside them, by a person or an agent, in the same directory and the same commit — statistics.annotations.yaml for a column:
and description.md for table-level narrative that no statistic can express.
dbprint never writes to either file, and both are read alongside the statistics — but on anything the statistics can answer, the statistics win; the narrative is authoritative only on what a number can't.
Print directory layout
reading.md is written fresh on every run: it teaches a consumer which fields to trust for what, so a print explains itself to an agent that has never seen the format.
dbprint never overwrites the four files a person or an agent writes — description.md and the three .annotations.yaml — and all four are folded into what agents read.
Commands
Full reference: docs/CLI.md.
Connecting an agent
In Claude Code, install the plugin, which carries the MCP server and both skills and serves the print of the directory Claude Code is opened in:
To serve a print kept elsewhere, set the plugin's project option to the directory holding .dbprint.yaml, that file itself, or a git address — in /plugin configure dbprint@dbprint, or from a shell:
Any other MCP client launches the server itself, so the client picks the working directory. Name the project explicitly:
The server reads the committed print and never connects to a database, so the client needs no credentials.
Giving a print to an agent covers the skills on their own, the server's tools and how an agent reads a reply.
Reading a remote project
--project also accepts a git address, so a print committed to another repository reads without a manual clone:
dbprint clones it and asks for no credentials of its own — the existing SSH agent or git credential helper covers a private repository. A remote project is read-only: every command that connects to a database — generate, diff, and the --online forms of check and config explain — refuses a remote locator; every other command works against it exactly as it does locally.
Configuration
.dbprint.yaml holds project config (committed); ~/.dbprint/connections.yaml holds credentials (never committed). Every key of both, with types, defaults and resolution order, is in docs/CONFIG.md. Internals are documented in docs/ARCHITECTURE.md.
Further features
- Semantic inference. Every column gets a classification (
categorical,numeric,temporal,foreign_key_candidate,json, ...). Text, categorical and foreign-key columns are matched against a closed set of shape patterns (uuid,email,phone,ip,country_code, ...), published with the sample size and match count behind the verdict. Columns that hold data that must not leave the database get asensitivityaxis (personal_name,postal_address,national_id,credential, ...). Columns effectively unique (cardinality ratio >= 0.9999) are markedcandidate_key, with acandidate_key_exceptionalongside whenever that threshold admits measured or estimated duplicates rather than true uniqueness. Foreign keys the schema never declares are inferred from naming and stampeddetection: inferred. Each of these is published as a guess, and a wrong one can be withdrawn in the annotations so agents stop seeing it. - Redaction. Withhold cell values with
mask,drop, orhash(salted), targeting columns by glob or by inferred sensitivity or by shape — so a rule written now also covers apersonal_namecolumn added later. Counts, cardinality and distributions survive intact; only literals are withheld. The salt lives with the credentials, never in the committed config. - Assertions. Write data-quality checks in YAML against any statistic, or as raw SQL. Statistic assertions are evaluated against the committed print by plain
dbprint check, with no database in reach; SQL assertions needdbprint check --online. Seedocs/ASSERTIONS.md. - CI exit codes.
0ok,1malformed print or unusable config,2stale,3drift,4connection failure,5partial run,6assertion failure,7total failure.diff,checkandcontextall speak--format json|yaml. - Scoped profiling. Per-table rules can sample (seeded from the table name, where the engine supports seeding), apply a row filter, or change what's measured — gated on table size, so one rule covers every fact table not yet named. A table read this way carries a
scopeblock and a per-columnrows_scanned, and every count in the file is denominated in the rows actually read, never silently in the whole table. - MCP server.
dbprint serveexposes the toolsget_table_context,list_tables,search_columns,resolve_value,get_manifest,get_diff,get_reference— plus every artifact as a resource. It reads the committed print only and never opens a database connection. Seedocs/MCP.md. - Markdown skills. For clients that take markdown rules or custom instructions, a drop-in skill file tells an agent what a committed print answers, which tool answers it, and what each number covers — no process to run. A second skill has an agent write the annotation files from the code that writes each table and read-only queries, checked with
dbprint annotate --check. Both sit atplugin/skills/and read without installing anything; the Claude Code plugin installs them with the server. - dbt lineage. Point a connection's
dbt_manifestat a compiled dbtmanifest.jsonandgeneraterecords each model column's source columns asderived_from, so a note written once on a source column reaches every model built from it (the[dbt]extra). Seedocs/CONFIG.md. - Token-budgeted context.
dbprint context arboretum.seedbank.accession --budget 4000fits the Markdown view into a token budget, dropping the lowest-priority sections first.
Compared with other tools
Closest neighbours
What dbprint is not
- Not a migration tool. It doesn't author, apply or version DDL changes. Use Alembic, Flyway, Liquibase, sqldef, Atlas.
- Not a schema-management or ORM layer. A print is generated from the database; it is never the source of truth the database is built from.
- Not a live query interface. Nothing in a print executes SQL for an agent.
- Not a data-quality platform. The assertion DSL is a CI gate over a print, not monitoring, alerting or lineage. Use Soda, Great Expectations, Elementary.
- Not a data catalog. No hosted service, no shared search index, no business glossary.
dbprint docsserves a local read-only view of a committed print, bound to loopback, with nothing to administer.
The format
A print is a portable, git-committed snapshot of a database's structure and column-level data distributions, consumable offline by humans, AI coding agents, and CI. The on-disk format — not the CLI — is the durable artifact here: specified, versioned independently of the tool, and designed for other producers to emit.
The format is specified in docs/format/v1/SPEC.md.
The JSON Schemas ship inside the installed package at src/dbprint/spec/v1/ — one for each generated artifact and each annotation file — and the conformance validator is a public API with no database, config or CLI required:
The reference print at docs/format/v1/examples/ is real dbprint output, not a hand-written illustration.
License
Copyright 2026 Jakub Roman. Distributed under the Apache License 2.0.
Source: README.md at commit 3bc4ddd
Tools
0Version history
7- v0.19.0LatestNov 7, 2026
- v0.18.0Nov 6, 2026
- v0.17.0Nov 5, 2026
- v0.16.0Oct 29, 2026
- v0.15.0Oct 26, 2026
- v0.14.0Oct 16, 2026
- v0.13.0Oct 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts