Embedded analytics
Connect DuckDB to Excel, Sheets and AI
Embedded analytics database for OLAP workloads — local files, network shares, or in-memory. Query Streams also uses DuckDB under the File Set family to pin folder schemas.
One connection, every surface
Where your DuckDB data can go
Connect DuckDB once and the same read-only connection feeds all of these — no second setup, no second copy of the data. 9 of 11 have a step-by-step guide.
DuckDB to Excel
Microsoft Excel · Excel add-in
Pull live DuckDB results straight into a worksheet and refresh them on demand — desktop Excel, Excel Online, Microsoft 365.
Read the guideDuckDB to Google Sheets
Sheets add-on
Run a saved DuckDB query from the sidebar and drop the rows into the sheet. Shared collaborators can refresh it themselves.
Read the guideDuckDB MCP server
Claude, Cursor and MCP clients
Give an AI assistant read-only access to DuckDB with the schema it needs to write correct SQL — no credentials in the chat.
Read the guideDuckDB REST API
HTTP endpoint
Publish a DuckDB query as an authenticated JSON endpoint any application can call, with an OpenAPI 3.1 spec and ready-made Postman, Insomnia and Hoppscotch collections. No database port is opened.
Read the guideDuckDB to Airtable
Automation platform
Sync DuckDB rows into an Airtable base on a schedule, or fetch them inside an Airtable automation script.
Read the guideDuckDB to Baserow
Automation platform
Feed a Baserow table from DuckDB over the REST endpoint — self-hosted or Baserow cloud.
Read the guideDuckDB to SeaTable
Automation platform
Keep a SeaTable base current with DuckDB data without exporting a file or exposing the database.
Read the guideDuckDB to Smartsheet
Automation platform
Push DuckDB results into a Smartsheet grid so plans and reports read from the source system, not last week's export.
Read the guideDuckDB to Anvil
Anvil Works · App platform
Back an Anvil Python app with DuckDB through the REST endpoint instead of embedding database credentials in the app.
Read the guideDuckDB to Power BI
Power Query M
Paste the generated Power Query M into the Power BI Advanced Editor and the report reads live DuckDB results over HTTPS — no ODBC driver, no database port opened.
How Power BI works no DuckDB walkthrough written yetDuckDB alerts and reports
Slack · Discord · Email · Webhook
Put a DuckDB query on a schedule and have the rows delivered to Slack, Discord, email or a signed webhook — or hold the message until a row count, threshold or percentage change crosses the line you set.
How alerts and reports work no DuckDB walkthrough written yetHow it works
5 steps, no inbound firewall change
Install the Network Agent on the machine holding the file. There is no DuckDB server to stand up and no port to open — the engine ships inside the agent.
Point it at a .duckdb, .db or .ddb file, on local disk or a share the machine can reach.
The agent reads the tables and views in the file and records the column types, so the Query Builder and Nova know the shape before you write anything.
Write DuckDB SQL, or describe what you want and let Nova write it. Nothing is translated on the way through.
Read the saved query from Microsoft Excel, Google Sheets, Power BI, MCP or REST — and join it to your other connections if you need to.
Feature deep-dive
What DuckDB gives you
An analytics engine that happens to be a file
DuckDB is columnar and vectorised, which is a technical way of saying it aggregates millions of rows on a laptop without complaint. That makes it a strange and useful thing to put behind a spreadsheet.
- No server, no service, no port. The file is the database, and the engine runs inside the agent that reads it.
- The aggregation happens in DuckDB, on the machine holding the file. What crosses the network is the result — usually a few hundred rows out of a few hundred million.
- It is the natural end of a data pipeline: someone builds a .duckdb from Parquet or CSV, and this is how the rest of the company reads it without a warehouse being involved.
- Views and tables are both listed, so a file whose useful surface is a set of curated views is queryable as that, not as its raw tables.
Your DuckDB SQL, passed through untouched
There is no translation layer on the agent. The statement you save is the statement DuckDB receives, so the dialect's good parts are available rather than approximated.
- GROUP BY ALL and ORDER BY ALL, which remove most of the tedium from an analytical query.
- SELECT * EXCLUDE (col) and SELECT * REPLACE (...), for when you want everything except the one column nobody needs.
- QUALIFY, so a window function can be filtered without wrapping the whole thing in a subquery.
- Full window functions, CTEs and list comprehensions — DuckDB's dialect, not a portable subset of it.
-- DuckDB SQL, reaching the engine exactly as written
SELECT * EXCLUDE (internal_id)
FROM (
SELECT region, product, sum(amount) AS revenue, internal_id,
row_number() OVER (PARTITION BY region ORDER BY sum(amount) DESC) AS rk
FROM sales
GROUP BY ALL
)
QUALIFY rk <= 3
ORDER BY region, revenue DESC
Nested columns arrive as JSON
DuckDB has a richer type system than a spreadsheet cell does, so it is worth knowing what lands where before you build a report on it.
- STRUCT, LIST, MAP and UNION columns come back as JSON text — readable, parseable, and not silently truncated to something wrong.
- BLOB columns are base64 encoded rather than dropped.
- Dates, timestamps, timestamps with time zone and DECIMAL arrive as themselves, so numbers stay numbers and rounding stays yours.
- Anything the driver genuinely cannot represent is labelled as such in the cell instead of arriving as a blank you would have to notice.
Shared by every database connector
True of every database connector
- Outbound only — the agent opens one encrypted connection out to Query Streams. No inbound port to forward, no VPN, no IP allowlist, nothing about your database exposed to the internet.
- Credentials stay put — the database username and password live on the machine you installed the agent on. Query Streams never receives them and cannot reach your database on its own.
- Read-only, enforced — one statement at a time, SELECT and friends only. A write is rejected on your own machine before it is ever sent to the server, rather than relying on a permission somebody remembered to set.
- Deploy as many agents as you like — one per site, region or cloud. Every data source they can see arrives in a single dropdown, so nobody has to know which agent hosts what.
What you get once a query is saved
- Share the capability, not the SQL — a colleague or an outside partner can run your query and change its filters without ever seeing the statement behind it.
- Filters from either direction — declare them yourself as @variables, or let the connector spot the literal values already sitting in your WHERE clause and offer those as dropdowns.
- Read it from anywhere — Microsoft Excel, Google Sheets, Power BI, the REST API, AI assistants over MCP, the Query Builder and Nova all read the same saved query.
- Run several at once — five saved queries into five worksheet tabs, streamed concurrently, however large the results.
- Join it to anything else you have connected — another database, a business API, or a folder of files, in one read-only statement.
Cross-source SQL
Join DuckDB to the rest of your data
One statement can span DuckDB and your other connections at once. Each source runs only the part it can, streams the result back, and the join happens centrally — the sources never talk to each other and nothing is copied anywhere.
3 connections · 3 agents
One statement
-- nothing copied, nothing merged, nothing scheduled
SELECT c.region, COUNT(*) AS orders, SUM(i.amount_due) AS invoiced
FROM analytics.main.orders1 f
JOIN pg_crm.public.customers2 c ON c.id = f.customer_id
JOIN billing.stripe.invoices3 i ON i.customer = c.stripe_id
GROUP BY c.region
ORDER BY invoiced DESC;
The three parts are connection, schema and table — and the connection name is whatever you called it. Illustrative columns; your tables will be your tables. Read-only applies to every piece: SELECT, WITH and EXPLAIN only, with a ceiling on how much any one source may hand over for a single query. How federated queries work
Connection details
What DuckDB needs
- What you point at
- One .duckdb, .db or .ddb file on the machine the agent runs on
- Path
- A local path, or a UNC share the machine can reach — local disk is faster
- Engine
- DuckDB 1.4.4, embedded in the agent. Nothing to install, start or keep running
- Ports
- None. There is no DuckDB server to reach, so there is nothing to open
- Objects
- Tables and views in the file
- SQL dialect
- DuckDB SQL, handed to the engine exactly as you wrote it — no translation layer
- Read-only
- Checked before the statement runs — SELECT, WITH and friends only
- Nested types
- STRUCT, LIST, MAP and UNION come back as JSON text; BLOB as base64
- Schema
- DuckDB's default schema is main, which is what a federated reference carries
DuckDB tends to arrive at the end of a pipeline rather than the start of one. Somebody builds a file out of Parquet exports or a pile of CSVs, gets it into the shape the question actually needs, and then discovers that the people who need the answer live in Microsoft Excel. The usual next step is to stand up a warehouse for something that already fits on a disk. This connector is the other option: leave the file where it is and let the spreadsheet read it.
The type mapping is the part worth planning around. A STRUCT or a LIST is real DuckDB data with no spreadsheet equivalent, so it comes across as JSON text — which is honest and parseable, but it is not a number you can sum. If a nested column is going to be the point of a report, unnest it in the query rather than in the destination, where DuckDB can do it properly and cheaply.
For a cross-source query, DuckDB's default schema is main, so a connection you called analytics reading a warehouse file is written analytics.main.sales. That is where this gets interesting — an analytical file full of history, joined in one statement to the operational database and the billing API that are still moving.
Vendor documentation: duckdb.org
FAQ
Questions about DuckDB
Which tools can read DuckDB data through Query Streams?
All of them, from one connection: Excel, Google Sheets, MCP, REST API, Airtable, Baserow, SeaTable, Smartsheet, Anvil, Power BI, scheduled alerts and reports. Connect the database once and every surface reads the same read-only connection — there is no per-tool setup and no second copy of the data.
Do I have to open a firewall port to my DuckDB database?
No. The Query Streams Network Agent runs inside your network and opens a single outbound encrypted connection. Nothing listens for inbound traffic, no VPN is required, and the database keeps its existing firewall rules.
Can Query Streams change data in DuckDB?
No. The agent enforces read-only at the point of execution — one statement at a time, SELECT and friends only. Credentials stay on the agent and are never sent to Query Streams.
What does Query Streams need to connect to DuckDB?
A reachable host, a role and its password — the agent carries the driver, so nothing is installed on the database. What you point at: One .duckdb, .db or .ddb file on the machine the agent runs on. Path: A local path, or a UNC share the machine can reach — local disk is faster. Engine: DuckDB 1.4.4, embedded in the agent. Nothing to install, start or keep running. Ports: None. There is no DuckDB server to reach, so there is nothing to open.
Can I join DuckDB to another database in the same query?
Yes — that is a federated query. One statement can reference DuckDB and your other connections at once, written as connection.schema.table. Each source runs only the part it can and streams the result back; the join happens centrally, so the sources never connect to each other and nothing is copied or scheduled. Read-only applies to every piece — SELECT, WITH and EXPLAIN only — and there is a ceiling on how much any one source may hand over for a single query. Federated queries are a plan feature; the federated queries page carries the current source and size limits.
Put DuckDB where the work happens
Install the agent, point it at your database, and pick a destination.
Read-only Outbound only Credentials stay on the agent

