Atlas is a YAML-defined semantic layer for analytics β authored by humans, consumed by AI agents.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Atlas is the AI data analyst you can run anywhere. It answers plain-English questions across your SQL warehouses and REST APIs β grounded in a semantic layer you author, a Knowledge Base of your own docs, and the query patterns it learns as your team approves them.
Documentation Β· Live Demo Β· The Semantic Layer Β· MCP Guide Β· Issues
Ask two tools what revenue was last quarter and you can get two different numbers. Atlas reads your definitions first.
Three context surfaces, each with a different job β and a boundary between them that Atlas enforces rather than trusts:
| What it is | Its job | |
|---|---|---|
| Semantic layer | YAML on disk β entities, dimensions, measures, joins, glossary terms, pinned metrics | The sole authoritative surface. The table whitelist, pinned metric SQL, and glossary gating are enforced, not suggested |
| Knowledge Base | Your own docs β mirrored through ten vendor connectors (Notion, Confluence, GitBook, Zendesk, Salesforce, Intercom, Front, Help Scout, Freshdesk) or uploaded directly | Descriptive only. Runbooks, definitions, policies. Never queried as data, never extends the whitelist, never gates the agent (ADR-0028) |
| Learned patterns | The query shapes Atlas keeps as your team approves them | The canonical joins for your domain β earned from real use rather than authored up front |
That descriptive-vs-authoritative split is the point: a runbook can inform an answer, but only the semantic layer can authorize the SQL behind it.
Every YAML field exists because an LLM needs it to write correct SQL: sample_values ground the agent in real data, glossary.status: ambiguous forces clarifying questions, metrics.objective picks MAX vs MIN, query_patterns teach the canonical join shapes for your domain.
The same grounded agent, reachable however your team already works:
Built with Hono, Vercel AI SDK, and bun. Supports Anthropic, OpenAI, Bedrock, Ollama, and Vercel AI Gateway. Works with PostgreSQL, MySQL, ClickHouse, Snowflake, DuckDB, BigQuery, Elasticsearch, and Salesforce.
The scaffold seeds the canonical NovaMart e-commerce dataset (52 tables, ~480K rows) by default β twelve generic e-commerce KPIs ship as starter prompts inside the chat UI; the canonical 5 below drive the eval harness (#2025) and the docs/landing copy. The scaffold defaults to SQLite + Anthropic; pass --defaults for non-interactive setup or follow the prompts to pick PostgreSQL / OpenAI / etc.
Ask one of the canonical questions in the chat UI:
revenue is status: ambiguous in the glossaryThe agent reads your YAML semantic layer first, picks the right entities, writes SQL, runs it through the validation pipeline, and returns answers with the underlying SQL on display.
The default landing for fresh installs is chat-first β admins can flip to admin in Settings β Profile. See the Default Landing guide for the underlying preference.
Once you have an Atlas instance (local from the demo above, self-hosted, or a hosted workspace), add it to Claude Desktop, Cursor, or Continue with one command. Auto-detects the client and merges into its config:
On WSL2? Bun's
bunxshim has resolution issues on some WSL2 setups β substitutebun x(space-separated) for anybunxcommand above (e.g.bun x @useatlas/mcp init --local). The space-separated form is a bun subcommand and resolves correctly.
Restart Claude Desktop / Cursor and ask the same canonical questions through your AI client. See the MCP guide for the full flow β hosted (mcp.useatlas.dev over OAuth 2.1 + DCR + PKCE) and self-hosted (stdio) live in the same page under tabs.
A 20-line slice of semantic/entities/orders.yml from the bundled NovaMart e-commerce demo (#2021):
That YAML is the contract between your team and the agent β version-controlled, code-reviewed, diffable. Sibling files (glossary.yml, metrics/*.yml, catalog.yml) round it out: glossary terms with status: ambiguous force the agent to clarify, metrics with objective: maximize / minimize make optimization direction explicit, and the catalog routes the agent to the right entity for a given question.
See the full Semantic Layer reference for the complete schema.
Atlas also ships an embeddable chat widget for any frontend:
Or use the React component:
The widget supports programmatic control (Atlas.open(), Atlas.ask("..."), Atlas.destroy()), event callbacks, and theming. See the widget docs.
| Atlas | Traditional BI | Other text-to-SQL | |
|---|---|---|---|
| Semantic layer | YAML on disk β query_patterns, virtual_dimensions, glossary.status: ambiguous, metrics.objective are all first-class | Proprietary metadata, GUI-authored | None or limited |
| Your docs as context | Knowledge Base pillar β ten vendor connectors, descriptive-only by construction (never extends the SQL whitelist) | Separate wiki, unlinked | None |
| Dashboards | Draft-first, publish-gated β built from chat answers, private until you ship | Core product, GUI-authored | Rare |
| Agent-native | MCP server first β Claude Desktop, Cursor, Continue with bunx @useatlas/mcp init | Bolted-on AI feature | Standalone chat UI |
| Embeddable | Script tag, React component, headless API, MCP, 6 chat platforms (Slack one-click; Teams/Discord/Telegram/WhatsApp bring-your-own-bot; Google Chat coming soon) | Standalone app | Standalone app |
| Deploy anywhere | Docker, Railway, Vercel, or your own infra | Vendor-hosted | Vendor-hosted |
| Plugin ecosystem | 24 plugins across 5 types β extend anything | Closed | Limited |
| Open source | AGPL-3.0 core, MIT client libs | Proprietary | Varies |
| Multi-database | PostgreSQL, MySQL, ClickHouse, Snowflake, DuckDB, BigQuery, Elasticsearch, Salesforce | Usually one | Usually one |
| REST APIs as datasources | Stripe, GitHub, Notion, any OpenAPI spec β read like a datasource, write-gated; generic OpenAPI installs auto-refresh | None | None |
Docker:
| Platform | Starter | Guide |
|---|---|---|
| Vercel | atlas-starter-vercel | Next.js + embedded Hono API + Neon Postgres |
| Railway | atlas-starter-railway | Docker + sidecar sandbox + Railway Postgres |
| Docker | atlas-starter-docker | Docker Compose + optional nsjail isolation |
SQL validation runs through multiple layers. Your database credentials and query results never leave your infrastructure β only questions reach the LLM provider (use Ollama for fully self-hosted).
| Layer | What it does |
|---|---|
| Read-only enforcement | Only SELECT queries allowed (regex + AST validation) |
| AST parsing | node-sql-parser verifies single-statement SELECT |
| Table whitelist | Only tables in your semantic layer are queryable |
| Auto LIMIT | Every query gets a LIMIT (default 1000) |
| Statement timeout | Queries killed after 30s (configurable) |
| Sandboxed execution | Filesystem access runs in Vercel Sandbox, nsjail, or the sidecar β with e2b, Daytona, and Railway available as bring-your-own-cloud backends |
| Row-level security | Optional RLS injection per-user |
See sandbox architecture for the full threat model.
| Variable | Default | Description |
|---|---|---|
ATLAS_PROVIDER | anthropic | LLM provider (anthropic, openai, bedrock, ollama, gateway) |
ATLAS_MODEL | Provider default | Model ID override |
DATABASE_URL | β | Atlas internal Postgres for auth, audit, settings |
ATLAS_DATASOURCE_URL | β | Analytics datasource (PostgreSQL, MySQL, etc.) |
ATLAS_ROW_LIMIT | 1000 | Max rows per query |
ATLAS_QUERY_TIMEOUT | 30000 | Query timeout in ms |
See .env.example for all options.
/ee features, AGPL vs commercial split, requireEnterprise APIQuick development setup:
Atlas was inspired by Abhi Sivasailam's work on Vercel's internal data agent d0 and the open-source vercel-labs/oss-data-analyst template. The core insight β invest in a rich semantic layer, trust the model, and keep the tool surface minimal β came from that work.
The Atlas server and core packages (@atlas/api, @atlas/cli, @atlas/web, @atlas/mcp, @atlas/sandbox-sidecar) are licensed under AGPL-3.0. If you modify the server and serve it to users, you must share those modifications.
The client libraries (@useatlas/sdk, @useatlas/react, @useatlas/types, @useatlas/plugin-sdk) and all plugins are licensed under MIT. Embed them in proprietary apps with no restrictions.
The ee/ directory (@atlas/ee β SSO, SCIM, custom roles, approval workflows, residency, branding, and the rest of the SaaS surfaces) is source-available under a commercial license. Self-hosted users get the full AGPL core for free; the commercial license adds enterprise governance and the polished hosted experience. See the Enterprise Boundary page for the full feature inventory.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/atlas-2)<a href="https://allmcps.com/mcp/atlas-2"><img src="https://allmcps.com/api/badge/atlas-2?style=directory" alt="Atlas on AllMCPs" /></a>