Local-first cross-source SQL workbench

Build with DuckQuery
Files and live DBs in one SQL

Put local files and live databases in the same SQL

Drop CSV / Excel and they become tables; connect MySQL / PostgreSQL and JOIN. Visual DuckDB — no scripting setup required.

Local-first · data stays on your machine · AI uses the model endpoint you configure

One statement can reach these sources

CSVExcelParquetJSONMySQLPostgreSQLSQLiteDuckDBMCP

Core capabilities

File-to-table, cross-source JOIN, ask-data and charts, MCP automation — in one local-first workbench.

Cross-source query

JOIN local CSV / Excel with MySQL / PostgreSQL in one SQL. Remote DBs via ATTACH.

  • FilesCSV · Excel · Parquet · JSON
  • DatabasesMySQL · PostgreSQL · SQLite · DuckDB
  • HowATTACH · semi-join pushdown

Data agent

Ask in plain language. It probes read-only, then answers with reusable SQL. Drafts never auto-run.

  • ExecutionRead-only · capped · stoppable
  • ScopeLocal tables + connected schemas
  • BoundMust bind a real executed SELECT

MCP automation

Let Claude Code / Cursor drive your local backend: query, ingest, export.

  • Tools24
  • Modesread-only / normal / full
  • Installuvx duckquery-mcp

When to use it

Ad-hoc joins, reconciliation, visual DuckDB — without a warehouse or hand-written scripts.

01

Visual DuckDB, without hand-written scripts

DuckDB’s local analytics in a workbench — drop files into tables, JOIN / pivot, chart results. No Python or CLI scaffolding first.

02

Reconciliation / ad-hoc analysis

Someone drops an Excel file that must match orders in the database — you don’t want to load a warehouse for one check.

03

Cross-source exploration

Local Parquet / SQLite needs a quick JOIN with remote MySQL — without juggling half a dozen clients.

04

While coding with AI

Let Cursor / Claude query data already connected on your machine, instead of pasting CSV into chat.

The online demo is DuckDB-Wasm in the browser only (no AI, no DB connections, no Excel). Use desktop or Docker for the full product.

See it in 30 seconds

01

Bring data in

Drop Excel / CSV as tables, or connect MySQL / PostgreSQL / SQLite / DuckDB files.

Ingest
Bring data in
02

Ask, or write SQL

Ask in plain language, or let AI draft SQL for you to review before running.

Ask or write SQL
Ask, or write SQL
03

Explore and take it with you

Switch the same result between grid and charts, drill down, export for others.

Results and export
Explore and take it with you

Local files and remote databases, one query

Imported files become DuckDB tables; MySQL / PostgreSQL and more join via ATTACH in the same SQL.

cross-source · duckdbATTACH + JOIN
SELECT o.order_id, o.amount, u.city
FROM orders_csv AS o
JOIN mysql.users AS u
  ON o.user_id = u.id
WHERE o.paid_at >= DATE '2026-01-01';

Why DuckQuery

The middle ground: ad-hoc, cross-source, local control — not a replacement for your daily DB client or company BI.

KindExamplesLocal files + DB in one query
Database GUIDBeaver, TablePlusUsually import into a table first
BI platformMetabase, SupersetConfigure a source; ad-hoc work often needs a warehouse + ETL
DuckQueryDrop a file → table; ATTACH a DB → queryable

Get started

Three forms. Pick what fits your environment.

Desktop

macOS (Apple Silicon / Intel) and Windows x64. Download from GitHub Releases.

Open Releases

Online demo

Try SQL in the browser. DuckDB-Wasm only: no AI, no DB connections, no Excel.

Open demo

Docker

Self-host frontend and backend. Data lives in ./data on the host. See configuration docs for image mirrors.

Configuration

Docker in three lines

git clone https://github.com/Chenkeliang/duckdb-query.git
cd duckdb-query
./quick-start.sh

Web UI: http://localhost:48000

Trust boundaries

Where data stays, what AI can see, and who runs the query.

  • Data stays on your instance; AI traffic goes only to the model endpoint you configure — no relay servers of ours, no telemetry.
  • AI-drafted SQL never auto-runs — it lands in the editor for you to confirm.
  • The data agent may only run read-only, row-capped, cancellable probe SELECTs; numeric answers must bind to a statement actually executed in that turn.

MCP

Start desktop or Docker first, then wire Claude Code / Cursor.

uvx duckquery-mcp
# or
claude mcp add duckquery -- uvx duckquery-mcp

Modes: read-only / normal (default) / full. Full setup in the MCP docs.

MCP documentation