Business users answer their own questions from dashboards and metrics your data team defines as YAML and reviews in pull requests. It runs against your own warehouse, and agents query the same definitions over MCP.
# commerce/revenue.yaml
title: Revenue overview
filters:
- {name: dates, type: daterange}
- {name: region, type: select}
- {name: channel, type: select}
tiles:
- metric: revenue
compare: previous_period
# added from + Explore
- title: Orders by weekday
query: orders_by_weekday
chart: bar
Pin a request onto the tile it belongs to and send it to your coding agent. Claude Code, Codex, or your own headless entrypoint, running locally as you. The dashboard updates while you keep chatting.
Dashboards, metrics, agents, even the theme. An agent can draft any of them
and none of it can quietly change what revenue means, because the edit
arrives as a pull request. sqldash lint runs in CI and your coworker approves it.
Passwords and tokens come from environment variables, or from a named profile each teammate keeps on their own machine, the way AWS profiles work. The YAML you commit holds a reference, never a secret.
One flat mapping per source, with the same keys for every engine. Snowflake, BigQuery, Databricks, Redshift, Athena, Postgres, MySQL, SQL Server, Trino, ClickHouse, DuckDB, and SQLite all configure the same way, and anything else connects with a URL.
source:
type: snowflake
account: acme-prod
warehouse: WH
database: ANALYTICS
schema: PUBLIC
username: ${env:SNOWFLAKE_USER}
authentication: externalbrowser
source:
type: bigquery
project: acme-analytics
schema: warehouse
source:
type: databricks
host: dbc-1234.cloud.databricks.com
http_path: /sql/1.0/warehouses/abc123
catalog: main
schema: analytics
token: ${env:DATABRICKS_TOKEN}
source:
type: postgres
host: db.internal
port: 5432
database: analytics
schema: public
username: ${env:PGUSER}
password: ${env:PGPASSWORD}
# every .csv and .parquet next to the dashboard,
# as a view named after the file. Nothing to connect.
source: {type: duckdb, attach_files: true}
# whatever SQLAlchemy can reach, Oracle included
source:
url: oracle+oracledb://analyst:${env:ORACLE_PASSWORD}@db.internal:1521/?service_name=ANALYTICS
sqldash serve runs on your laptop. No cluster to run, no build step, and no account to create.
Credentials come from ${env:VAR} or a per-user profile file, so your warehouse stays the permission model.
sqldash snapshot renders static pages anyone can open, with no credentials in the serving path.
An agent's instructions, data tools, and evals live in agents.yaml,
next to the metrics it reads. Register the repos it should see and
sqldash mcp serves those and nothing else.
Import the LookML and Snowflake semantic views you already have. Export your sqldash metrics back to LookML, a semantic view, or a Cortex Agent at any time, so trying sqldash never locks you in.
Start with the DuckDB demo, no credentials needed. When you're ready,
sqldash setup connects your warehouse
using a local credential profile.
Prefer not to install it? uvx sqldash init --demo and uvx sqldash serve run it from uv’s cache, and uv fetches Python 3.11 or newer if you need it.
To let your coding agent in, add it once. In Codex run codex mcp add sqldash -- uvx sqldash mcp ., in Claude Code claude mcp add sqldash -- uvx sqldash mcp ., and see MCP for other clients.