
# narwhal
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:
narwhal mcp
and 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 | sh
Other channels — cargo install narwhaldb, Homebrew, AUR, Nix flake,
prebuilt tarballs — are listed in docs/install.md.
narwhal # launches the TUI
Inside:
:add — connection wizard, or :url postgres://user:pass@host/db:open <name> — connect; the sidebar fills with schemas and tablesHeadless:
narwhal exec --conn prod 'SELECT count(*) FROM orders' --format json
narwhal 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-only
Claude Desktop (~/.config/Claude/claude_desktop_config.json):
{
"mcpServers": {
"narwhal": {
"command": "narwhal",
"args": ["mcp", "--read-only"]
}
}
}
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 | — | ✅ |
:open, every driver speaks the
same Connection trait — same streaming, same cancellation, same
schema introspection.:schema-diff
between two connections with dialect-aware DDL emit (Postgres ↔
MySQL ↔ MSSQL ↔ generic).Ctrl-C
cancels mid-run on every backend that supports it.~/.pgpass — no
plaintext-on-disk fallback.~/.ssh/config plumbing
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.
$ claude mcp add narwhal \
-- python -m otcore.mcp_server <graph>