The agent-native database workbench for the terminal. A DBA toolkit, an MCP server, and a vim-mode SQL editor — in one static binary.
Install · Quick start · Why narwhal · Docs
narwhal is a terminal database client built around two things every other client misses:
- DBA-grade tooling, not a toy REPL. Schema diff with dialect-aware DDL emit, append-only audit log, capability-gated plugin sandbox, streaming cancellable queries, ER diagrams, SSH tunnels, secret vault — the operational surface a real database day needs.
- First-class agent integration. A built-in MCP server exposes
your connections, schema, and query execution to Claude, Cursor,
Zed, and any MCP-aware client. No proxy, no adapter —
narwhal mcpand you're wired.
Six engines (Postgres, MySQL, SQLite, DuckDB, ClickHouse, SQL Server), three editor modes (vim / basic / emacs), one static binary.
curl -fsSL https://github.com/Nonanti/narwhal/releases/latest/download/install.sh | shOther channels — cargo install narwhaldb, Homebrew, AUR, Nix flake,
prebuilt tarballs — are listed in docs/install.md.
narwhal # launches the TUIInside:
:add— connection wizard, or:url postgres://user:pass@host/db:open <name>— connect; the sidebar fills with schemas and tables- F6 — run the buffer; results stream into the lower pane
- F1 — full keymap
Headless:
narwhal exec --conn prod 'SELECT count(*) FROM orders' --format jsonnarwhal embeds an MCP server over stdio. Run it once and your AI assistant can browse schema, sample data, and run queries against your saved connections — with the same read-only / per-connection guards the TUI uses.
narwhal mcp --read-onlyClaude Desktop (~/.config/Claude/claude_desktop_config.json):
Cursor, Zed, Continue, Aider, and custom clients work the same way.
Full setup: docs/mcp.md.
| Engine | Driver | TLS | Streaming | Cancel | DDL emit |
|---|---|---|---|---|---|
| PostgreSQL | tokio-postgres + rustls |
verify-full | ✅ | ✅ | ✅ |
| MySQL / MariaDB | mysql_async |
✅ | ✅ | ✅ | ✅ |
| SQLite | rusqlite (bundled) |
n/a | ✅ | — | ✅ |
| DuckDB | duckdb (bundled) |
n/a | ✅ | — | ✅ |
| ClickHouse | HTTP + rustls | ✅ | ✅ | ✅ | ✅ |
| SQL Server | tiberius + rustls |
✅ | buffered | — | ✅ |
- Six engines, one TUI. Switch with
:open, every driver speaks the sameConnectiontrait — same streaming, same cancellation, same schema introspection. - Three editor modes. vim (with motions, text objects, registers, marks, macros), basic (modeless), emacs — sharing one buffer.
- Full mouse. Click, drag-select, double / triple-click word and line, middle-click paste, right-click context menu.
- Schema tooling. ER diagrams in the terminal,
:schema-diffbetween two connections with dialect-aware DDL emit (Postgres ↔ MySQL ↔ MSSQL ↔ generic). - Plugins. Lua (trusted, fast) and WASM (sandboxed, capability-gated filesystem / network / clipboard) — the same surface used by the built-ins.
- Streaming, cancellable. Rows arrive incrementally;
Ctrl-Ccancels mid-run on every backend that supports it. - Secrets. Vault, 1Password, OS keyring,
~/.pgpass— no plaintext-on-disk fallback. - Audit log. Append-only JSONL with redaction rules, suitable as compliance evidence.
- Inline output. Charts, pivot tables, JSON viewer, row detail pane, exports to CSV / JSON / Markdown / Parquet.
- SSH tunnels. Single config block, no
~/.ssh/configplumbing required.
| Topic | File |
|---|---|
| Install (all methods) | docs/install.md |
| Configuration | docs/configuration.md |
| Editor modes | docs/editor-modes.md |
| Mouse | docs/mouse.md |
| MCP server | docs/mcp.md |
Headless exec |
docs/headless.md |
| Plugins (Lua + WASM) | docs/plugins.md |
| Connection vault | docs/vault.md |
| Audit log | docs/audit.md |
| Schema diff | docs/schema-diff.md |
| Architecture | docs/ARCHITECTURE.md |
| Building from source | docs/dev/build.md |
| Upgrading | docs/upgrading.md |
Issues and PRs welcome. See CONTRIBUTING.md.
Commit messages follow Conventional
Commits; the four CI checks
(fmt, clippy -D warnings, doc -D warnings, test) must pass.
Dual-licensed under MIT and Apache 2.0, at your option.

{ "mcpServers": { "narwhal": { "command": "narwhal", "args": ["mcp", "--read-only"] } } }