Bridges your YAML semantic layer to Claude Desktop, Cursor, and Continue so agents can generate validated SQL against your analytics schema. Exposes entities, dimensions, measures, joins, and glossary terms defined in version-controlled files. Instead of guessing table names or column semantics, the agent reads your documented data contracts complete with sample values, ambiguous term flags, and canonical query patterns. Returns read-only SQL with validation built in. One-line install with bunx detects your client and writes the config. Self-host it alongside your warehouse or point it at a hosted workspace. Best when you already maintain a semantic layer and want LLMs to query it correctly without inventing joins or misinterpreting revenue definitions.
Public tool metadata for what this MCP can expose to an agent.
Stock-QuoteGet a real-time stock quote including current price, dollar and percent change, previous close, open, high, low, and volume. Args: symbol: Ticker symbol (e.g. NVDA, SPY, AAPL) Types / example: symbol: string ticker — e.g. "SPY", "NVDA".1 paramsGet a real-time stock quote including current price, dollar and percent change, previous close, open, high, low, and volume. Args: symbol: Ticker symbol (e.g. NVDA, SPY, AAPL) Types / example: symbol: string ticker — e.g. "SPY", "NVDA".
symbolstringOption-Expiration-DatesList available option expiration dates for a symbol. Args: symbol: Ticker symbol (e.g. NVDA, SPY) filter: 'all' for every expiration (no 60-day cap), 'next_10' for the nearest 10 within 60 days, 'near_term' for within 60 days, 'monthly' for monthly only (still capped at 60 day...2 paramsList available option expiration dates for a symbol. Args: symbol: Ticker symbol (e.g. NVDA, SPY) filter: 'all' for every expiration (no 60-day cap), 'next_10' for the nearest 10 within 60 days, 'near_term' for within 60 days, 'monthly' for monthly only (still capped at 60 day...
filterstringsymbolstringAnalyze-Greek-ExposuresCalculate Gamma, Delta, Vanna, and Theta NET exposures for a symbol across multiple expiration dates. Returns per-strike data grouped by expiration plus portfolio totals and key strike levels. Use this for raw numerical exposure data (not charts). Args: symbol: Ticker symbol (...6 paramsCalculate Gamma, Delta, Vanna, and Theta NET exposures for a symbol across multiple expiration dates. Returns per-strike data grouped by expiration plus portfolio totals and key strike levels. Use this for raw numerical exposure data (not charts). Args: symbol: Ticker symbol (...
symbolstringexpirationvalueto_expirationvaluefrom_expirationvaluenum_expirationsintegerexpiration_rangevalueTop-Volume-and-OI-ContractsGet the highest-volume or highest-open-interest option contracts for a symbol. Returns strike, side, volume, OI, bid/ask, delta, IV, and DTE for each contract. Useful for spotting unusual activity. Args: symbol: Ticker symbol (e.g. NVDA, SPY) expiration: Specific expiration (Y...7 paramsGet the highest-volume or highest-open-interest option contracts for a symbol. Returns strike, side, volume, OI, bid/ask, delta, IV, and DTE for each contract. Useful for spotting unusual activity. Args: symbol: Ticker symbol (e.g. NVDA, SPY) expiration: Specific expiration (Y...
limitintegersymbolstringsort_bystringexpirationvalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueTicker-Symbol-LookupResolve a company name or partial name to its ticker symbol. Examples: 'Apple' -> AAPL, 'Google' -> GOOGL, 'Tesla' -> TSLA Args: company_name: Company name or partial match (e.g. 'Apple', 'Micro') Types / example: company_name: string — e.g. "Apple", "Microsoft".1 paramsResolve a company name or partial name to its ticker symbol. Examples: 'Apple' -> AAPL, 'Google' -> GOOGL, 'Tesla' -> TSLA Args: company_name: Company name or partial match (e.g. 'Apple', 'Micro') Types / example: company_name: string — e.g. "Apple", "Microsoft".
company_namestringOptions-ChainGet options chain data for one expiration or for a range of expirations. Single expiration: pass expiration=YYYY-MM-DD (LEAPS and any listed expiry supported). Range: omit expiration and pass from_expiration and/or to_expiration (inclusive ISO dates). Range mode returns up to...6 paramsGet options chain data for one expiration or for a range of expirations. Single expiration: pass expiration=YYYY-MM-DD (LEAPS and any listed expiry supported). Range: omit expiration and pass from_expiration and/or to_expiration (inclusive ISO dates). Range mode returns up to...
symbolstringexpirationvalueto_expirationvaluefrom_expirationvaluemax_expirationsintegerexpiration_rangevalueHistorical-Options-ChainGet the options chain for a symbol and expiration as of a specific past date (historical snapshot). Returns every contract with strike, side, bid, ask, mid, volume, open interest, and DTE as of that date. Use this to compare past options data or analyze how positioning changed...3 paramsGet the options chain for a symbol and expiration as of a specific past date (historical snapshot). Returns every contract with strike, side, bid, ask, mid, volume, open interest, and DTE as of that date. Use this to compare past options data or analyze how positioning changed...
datestringsymbolstringexpirationstringHistorical-Strike-QuotesGet historical quotes for a single strike: from_date to to_date (interval) or single date. Takes from_date and optional to_date. If to_date omitted or same as from_date: single date. Expiration is optional — when omitted, picks nearest expiration to the date(s). Returns one qu...6 paramsGet historical quotes for a single strike: from_date to to_date (interval) or single date. Takes from_date and optional to_date. If to_date omitted or same as from_date: single date. Expiration is optional — when omitted, picks nearest expiration to the date(s). Returns one qu...
sidestringstrikenumbersymbolstringto_datevaluefrom_datestringexpirationvalueStrike-Price-DetailsGet detailed contract data for a specific strike price. Returns call and put contracts at that strike with full Greeks, pricing, IV, volume, and open interest. If expiration is provided, returns data for that single date. If omitted, searches across all near-term expirations (...3 paramsGet detailed contract data for a specific strike price. Returns call and put contracts at that strike with full Greeks, pricing, IV, volume, and open interest. If expiration is provided, returns data for that single date. If omitted, searches across all near-term expirations (...
strikenumbersymbolstringexpirationvalueGamma-Exposure-HeatmapGenerate a single Gamma Exposure (GEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...9 paramsGenerate a single Gamma Exposure (GEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueDelta-Exposure-HeatmapGenerate a single Delta Exposure (DEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...9 paramsGenerate a single Delta Exposure (DEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueVanna-Exposure-HeatmapGenerate a single Vanna Exposure (VEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...9 paramsGenerate a single Vanna Exposure (VEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueTheta-Exposure-HeatmapGenerate a single Theta Exposure (TEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...9 paramsGenerate a single Theta Exposure (TEX) heatmap. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only used when...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueNet-Gamma-Exposure-ChartGenerate a single Net Gamma Exposure (NET GEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...9 paramsGenerate a single Net Gamma Exposure (NET GEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueNet-Delta-Exposure-ChartGenerate a single Net Delta Exposure (NET DEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...9 paramsGenerate a single Net Delta Exposure (NET DEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueNet-Vanna-Exposure-ChartGenerate a single Net Vanna Exposure (NET VEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...9 paramsGenerate a single Net Vanna Exposure (NET VEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueNet-Theta-Exposure-ChartGenerate a single Net Theta Exposure (NET TEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...9 paramsGenerate a single Net Theta Exposure (NET TEX) bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in image_format: 'png' or 'jpeg' (only...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueTop-Volume-Contracts-ChartGenerate a single highest-volume option contracts bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) image_format: 'png' or 'jpeg' (only used when platform='other') platform: 'openai' | 'claude' |...7 paramsGenerate a single highest-volume option contracts bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) image_format: 'png' or 'jpeg' (only used when platform='other') platform: 'openai' | 'claude' |...
symbolstringplatformstringexpirationvalueimage_formatstringto_expirationvaluefrom_expirationvalueexpiration_rangevalueTop-Open-Interest-ChartGenerate a single highest-open-interest option contracts bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) image_format: 'png' or 'jpeg' (only used when platform='other') platform: 'openai' | 'cla...7 paramsGenerate a single highest-open-interest option contracts bar chart. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Args: symbol: Ticker symbol (e.g. NVDA, SPY) image_format: 'png' or 'jpeg' (only used when platform='other') platform: 'openai' | 'cla...
symbolstringplatformstringexpirationvalueimage_formatstringto_expirationvaluefrom_expirationvalueexpiration_rangevalueAll-Greek-HeatmapsGenerate all four Greek exposure heatmaps in one call: GEX (Gamma), DEX (Delta), VEX (Vanna), TEX (Theta). TIP: To mix these with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600...9 paramsGenerate all four Greek exposure heatmaps in one call: GEX (Gamma), DEX (Delta), VEX (Vanna), TEX (Theta). TIP: To mix these with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueAll-Net-Exposure-ChartsGenerate all four NET exposure bar charts in one call: NET GEX, NET DEX, NET VEX, NET TEX. TIP: To mix these with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in ima...9 paramsGenerate all four NET exposure bar charts in one call: NET GEX, NET DEX, NET VEX, NET TEX. TIP: To mix these with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY) strike_range: Optional strike filter like '520-600' to zoom in ima...
symbolstringmarkingsvalueplatformstringexpirationvalueimage_formatstringstrike_rangevalueto_expirationvaluefrom_expirationvalueexpiration_rangevalueVolume-and-Open-Interest-ChartsGenerate both Volume and Open Interest bar charts in one call. TIP: To mix these with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY) image_format: 'png' or 'jpeg' (only used when platform='other') platform: 'openai' | 'claude'...7 paramsGenerate both Volume and Open Interest bar charts in one call. TIP: To mix these with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY) image_format: 'png' or 'jpeg' (only used when platform='other') platform: 'openai' | 'claude'...
symbolstringplatformstringexpirationvalueimage_formatstringto_expirationvaluefrom_expirationvalueexpiration_rangevalueMulti-Chart-ViewCombine multiple chart types and/or symbols into a single response. Pass a JSON array where each element specifies one chart: [ {"type": "gamma", "symbol": "SPY", "strike_range": "520-600"}, {"type": "price", "symbol": "NVDA", "interval": "1h", "period": "5d"}, {"type": "vol",...3 paramsCombine multiple chart types and/or symbols into a single response. Pass a JSON array where each element specifies one chart: [ {"type": "gamma", "symbol": "SPY", "strike_range": "520-600"}, {"type": "price", "symbol": "NVDA", "interval": "1h", "period": "5d"}, {"type": "vol",...
chartsstringplatformstringimage_formatstringPrice-ChartGenerate a single candlestick price chart with volume bars and optional visual markings. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Shows OHLC candles (green up, red down), volume at bottom, and current price line. Intervals: 1m, 2m, 3m, 5m, 10m...14 paramsGenerate a single candlestick price chart with volume bars and optional visual markings. NOTE: If the user wants more than one chart, use Multi-Chart-View instead. Shows OHLC candles (green up, red down), volume at bottom, and current price line. Intervals: 1m, 2m, 3m, 5m, 10m...
endvaluebarsvaluestartvaluethemestringperiodstringsymbolstringintervalstringmarkingsvalueplatformstringindicatorsvaluetrend_linesvalueimage_formatstringforce_refreshbooleanindicator_colorsvalueMulti-Timeframe-Price-OverviewGenerate three price charts at once: daily (3 months), weekly (1 year), and hourly (5 days). Good for a quick multi-timeframe overview. TIP: To mix price charts with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY, AAPL) theme: '...4 paramsGenerate three price charts at once: daily (3 months), weekly (1 year), and hourly (5 days). Good for a quick multi-timeframe overview. TIP: To mix price charts with other chart types or symbols, use Multi-Chart-View. Args: symbol: Ticker symbol (e.g. NVDA, SPY, AAPL) theme: '...
themestringsymbolstringplatformstringimage_formatstringChart-Vision-AnalysisAnswer questions about Atlas charts (Greek heatmaps, net exposure bars, price candles, volume, open interest). Pass the user's question in plain language; the tool selects a suitable chart when needed and returns a written interpretation. After drawing markings or trend lines...1 paramsAnswer questions about Atlas charts (Greek heatmaps, net exposure bars, price candles, volume, open interest). Pass the user's question in plain language; the tool selects a suitable chart when needed and returns a written interpretation. After drawing markings or trend lines...
questionstringPrice-Data-OHLCVGet OHLCV price data as JSON — useful for reading exact values at a specific point on a chart, or for building analysis from raw data. If timestamp is given (YYYY-MM-DD or YYYY-MM-DD HH:MM), returns the single bar nearest to that time. Otherwise returns all bars in the range....7 paramsGet OHLCV price data as JSON — useful for reading exact values at a specific point on a chart, or for building analysis from raw data. If timestamp is given (YYYY-MM-DD or YYYY-MM-DD HH:MM), returns the single bar nearest to that time. Otherwise returns all bars in the range....
endvaluebarsvaluestartvalueperiodstringsymbolstringintervalstringtimestampvalueBroker-ConnectionsList all connected brokerage accounts for the authenticated user. Types / example: (no parameters — uses authenticated session).List all connected brokerage accounts for the authenticated user. Types / example: (no parameters — uses authenticated session).
No parameter schema in public metadata yet.
Account-BalancesCash balance, buying power, and equity for one linked brokerage account. Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".1 paramsCash balance, buying power, and equity for one linked brokerage account. Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".
account_idstringAccount-HoldingsStock and option positions (holdings) for one linked brokerage account. Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".1 paramsStock and option positions (holdings) for one linked brokerage account. Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".
account_idstringAll-Account-HoldingsGet positions across ALL connected brokerage accounts. Types / example: (no parameters — uses authenticated session).Get positions across ALL connected brokerage accounts. Types / example: (no parameters — uses authenticated session).
No parameter schema in public metadata yet.
Transaction-HistoryTransaction history for one linked brokerage account. Optional start_date and end_date in YYYY-MM-DD. Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". start_dat...3 paramsTransaction history for one linked brokerage account. Optional start_date and end_date in YYYY-MM-DD. Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". start_dat...
end_datevalueaccount_idstringstart_datevalueAccount-Symbol-LookupResolve how a ticker is represented inside a linked brokerage account (instrument id and related fields). Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". symbo...2 paramsResolve how a ticker is represented inside a linked brokerage account (instrument id and related fields). Types / example: account_id: string — copy "id" (or equivalent) from Broker-Connections for that account. Example: account_id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx". symbo...
symbolstringaccount_idstringPreview-OrderStage an order for user review WITHOUT calling the broker. Persists a trading_orders row at status='preview' and returns a preview_id + a UI link the user opens to Accept or Cancel. No trade is submitted until the Accept button on that page hits Place-Order. The caller must pa...4 paramsStage an order for user review WITHOUT calling the broker. Persists a trading_orders row at status='preview' and returns a preview_id + a UI link the user opens to Accept or Cancel. No trade is submitted until the Accept button on that page hits Place-Order. The caller must pa...
ruleobjectphasestringsymbolvalueaccount_idvaluePreview-Multiple-OrdersPreview multiple orders at once — e.g. buy 5 NVDA, 5 MSFT, and 5 ASML in one shot. Pass a list of {rule, symbol, account_id?, phase?} objects. Returns a vertical stack of order preview cards, each with a Place button. Use this instead of calling Preview-Order repeatedly for mu...2 paramsPreview multiple orders at once — e.g. buy 5 NVDA, 5 MSFT, and 5 ASML in one shot. Pass a list of {rule, symbol, account_id?, phase?} objects. Returns a vertical stack of order preview cards, each with a Place button. Use this instead of calling Preview-Order repeatedly for mu...
ordersarrayaccount_idvaluePlace-OrderSubmit an order to the broker via SnapTrade. Stocks use place_force_order; options use place_mleg_order; bracket orders use place_bracket_order (entry + stop_loss + take_profit as a broker-managed OCO pair). Two modes: * Pass preview_id to place an already-staged preview — the...5 paramsSubmit an order to the broker via SnapTrade. Stocks use place_force_order; options use place_mleg_order; bracket orders use place_bracket_order (entry + stop_loss + take_profit as a broker-managed OCO pair). Two modes: * Pass preview_id to place an already-staged preview — the...
rulevaluephasestringsymbolvalueaccount_idvaluepreview_idvalueList-Preview-OrdersList the user's recent staged/placed/failed orders. Defaults to status in ('preview','failed') so the UI can surface orders still pending acceptance. Pass statuses=['placed'] to see executed orders. Types / example: statuses: array<string> — optional filter (e.g. ['preview','f...2 paramsList the user's recent staged/placed/failed orders. Defaults to status in ('preview','failed') so the UI can surface orders still pending acceptance. Pass statuses=['placed'] to see executed orders. Types / example: statuses: array<string> — optional filter (e.g. ['preview','f...
limitintegerstatusesvalueDelete-Preview-OrderCancel/delete one staged or placed order. For status='preview' or 'failed' the local record is deleted (nothing was ever sent to SnapTrade — our preview is a local staging step, not a broker call). For status='placed' SnapTrade's cancel_user_account_order is called and the row...1 paramsCancel/delete one staged or placed order. For status='preview' or 'failed' the local record is deleted (nothing was ever sent to SnapTrade — our preview is a local staging step, not a broker call). For status='placed' SnapTrade's cancel_user_account_order is called and the row...
preview_idstringPreview-Trading-TriggerShow a trigger preview card for user review WITHOUT saving anything. ALWAYS call this instead of Create-Trading-Trigger — the user reads the card, then clicks 'Activate trigger' to commit it or 'Cancel' to dismiss. Never call Create-Trading-Trigger directly; it is invoked by t...3 paramsShow a trigger preview card for user review WITHOUT saving anything. ALWAYS call this instead of Create-Trading-Trigger — the user reads the card, then clicks 'Activate trigger' to commit it or 'Cancel' to dismiss. Never call Create-Trading-Trigger directly; it is invoked by t...
ruleobjectsymbolvalueaccount_idvalueCreate-Trading-TriggerPersist a price-trigger rule. IMPORTANT: Do NOT call this tool directly — call Preview-Trading-Trigger first and let the user confirm by clicking 'Activate trigger' in the preview card. This tool is invoked by the widget on the user's behalf. The background worker monitors liv...3 paramsPersist a price-trigger rule. IMPORTANT: Do NOT call this tool directly — call Preview-Trading-Trigger first and let the user confirm by clicking 'Activate trigger' in the preview card. This tool is invoked by the widget on the user's behalf. The background worker monitors liv...
ruleobjectsymbolvalueaccount_idvalueList-Trading-TriggersList the user's trading triggers — both currently watching (is_active=true) and paused (is_active=false). Each row carries its own is_active flag so you can label them. Completed/fired triggers are moved to the archive — use List-Fired-Triggers to see those. Types / example: i...3 paramsList the user's trading triggers — both currently watching (is_active=true) and paused (is_active=false). Each row carries its own is_active flag so you can label them. Completed/fired triggers are moved to the archive — use List-Fired-Triggers to see those. Types / example: i...
limitintegersymbolvalueis_activevalueUpdate-Trading-TriggerEdit one trading trigger in place. PRE-ENTRY (phase='enter'): all fields are editable — rule, symbol, account_id. POST-ENTRY (phase='exit'): the enter leg has already fired and a position is open at the broker. Symbol and account are locked. You CAN still update the EXIT block...5 paramsEdit one trading trigger in place. PRE-ENTRY (phase='enter'): all fields are editable — rule, symbol, account_id. POST-ENTRY (phase='exit'): the enter leg has already fired and a position is open at the broker. Symbol and account are locked. You CAN still update the EXIT block...
rulevaluesymbolvalueis_activevalueaccount_idvaluetrigger_idstringDelete-Trading-TriggerDelete a trading trigger. Triggers are not broker orders — nothing is cancelled at SnapTrade. If the trigger was the source of a placed order, the order row and broker position are unaffected; use Delete-Preview-Order to cancel a placed order at the broker. Idempotent: deletin...1 paramsDelete a trading trigger. Triggers are not broker orders — nothing is cancelled at SnapTrade. If the trigger was the source of a placed order, the order row and broker position are unaffected; use Delete-Preview-Order to cancel a placed order at the broker. Idempotent: deletin...
trigger_idstringList-Fired-TriggersList the user's completed (fired) triggers from the archive. These are triggers that ran to completion. Use Reactivate-Trigger to restart one from the beginning. Types / example: symbol: string — optional ticker filter. limit: integer — max rows (default 50, cap 200).2 paramsList the user's completed (fired) triggers from the archive. These are triggers that ran to completion. Use Reactivate-Trigger to restart one from the beginning. Types / example: symbol: string — optional ticker filter. limit: integer — max rows (default 50, cap 200).
limitintegersymbolvalueReactivate-TriggerMove a fired trigger from the archive back to the active triggers table, resetting it to phase='enter' so it starts monitoring prices again from scratch. The original rule is preserved; only triggered_at is cleared. Types / example: fired_trigger_id: string — the id from List-...1 paramsMove a fired trigger from the archive back to the active triggers table, resetting it to phase='enter' so it starts monitoring prices again from scratch. The original rule is preserved; only triggered_at is cleared. Types / example: fired_trigger_id: string — the id from List-...
fired_trigger_idstringEarnings-CalendarGet the earnings calendar for a date range, optionally filtered by a single symbol. Types / examples: from_date, to_date: strings — "YYYY-MM-DD", e.g. "2024-01-01" to "2024-12-31" symbol: optional string | null — ticker filter, e.g. "MSFT" Example: from_date="2026-01-01", to_d...3 paramsGet the earnings calendar for a date range, optionally filtered by a single symbol. Types / examples: from_date, to_date: strings — "YYYY-MM-DD", e.g. "2024-01-01" to "2024-12-31" symbol: optional string | null — ticker filter, e.g. "MSFT" Example: from_date="2026-01-01", to_d...
symbolvalueto_datestringfrom_datestringInsider-TransactionsGet insider transactions for a given stock symbol. Useful for analyzing insider buying and selling activity. Types / examples: symbol: string — "BA" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="BA", from_date=null, to_date=null3 paramsGet insider transactions for a given stock symbol. Useful for analyzing insider buying and selling activity. Types / examples: symbol: string — "BA" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="BA", from_date=null, to_date=null
symbolstringto_datevaluefrom_datevalueSEC-FilingsGet recent SEC filings (10-K, 10-Q, 8-K, etc.) for a given stock symbol. Types / examples: symbol: string — "BA" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="BA", from_date=null, to_date=null3 paramsGet recent SEC filings (10-K, 10-Q, 8-K, etc.) for a given stock symbol. Types / examples: symbol: string — "BA" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="BA", from_date=null, to_date=null
symbolstringto_datevaluefrom_datevalueStock-PeersGet a list of peer tickers for a given stock symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsGet a list of peer tickers for a given stock symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringIPO-CalendarGet the IPO calendar for a date range. Includes upcoming and historical IPOs. Types / examples: from_date, to_date: strings — "YYYY-MM-DD" Example: from_date="2026-01-01", to_date="2026-06-30"2 paramsGet the IPO calendar for a date range. Includes upcoming and historical IPOs. Types / examples: from_date, to_date: strings — "YYYY-MM-DD" Example: from_date="2026-01-01", to_date="2026-06-30"
to_datestringfrom_datestringSenate-Lobbying-DataGet US political lobbying data for a company. This covers lobbying disclosures and related activity. Types / examples: symbol: optional string | null — e.g. "CAT" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="CAT", from_date="2023-01-01", to_date=...3 paramsGet US political lobbying data for a company. This covers lobbying disclosures and related activity. Types / examples: symbol: optional string | null — e.g. "CAT" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="CAT", from_date="2023-01-01", to_date=...
symbolvalueto_datevaluefrom_datevalueFinancial-MetricsGet basic financial metrics for a stock (P/E, margins, growth, etc.). Types / examples: symbol: string — "XOM" metric: string — "all" (default) or a specific metric key supported by the feed Example: symbol="CVX", metric="all"2 paramsGet basic financial metrics for a stock (P/E, margins, growth, etc.). Types / examples: symbol: string — "XOM" metric: string — "all" (default) or a specific metric key supported by the feed Example: symbol="CVX", metric="all"
metricstringsymbolstringUSA-Spending-DataGet USA spending data related to a company, including contracts and awards tied to the symbol. Types / examples: symbol: optional string | null — e.g. "CAT" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="CAT", from_date="2023-01-01", to_date=null3 paramsGet USA spending data related to a company, including contracts and awards tied to the symbol. Types / examples: symbol: optional string | null — e.g. "CAT" from_date, to_date: optional strings | null — "YYYY-MM-DD" Example: symbol="CAT", from_date="2023-01-01", to_date=null
symbolvalueto_datevaluefrom_datevalueIncome-StatementIncome statement for a symbol. freq is 'yearly' or 'quarterly'. Types / examples: symbol: string — "IBM" freq: string — "yearly" or "quarterly" Example: symbol="GOOGL", freq="quarterly"2 paramsIncome statement for a symbol. freq is 'yearly' or 'quarterly'. Types / examples: symbol: string — "IBM" freq: string — "yearly" or "quarterly" Example: symbol="GOOGL", freq="quarterly"
freqstringsymbolstringBalance-SheetBalance sheet for a symbol. freq is 'yearly' or 'quarterly'. Types / examples: symbol: string — "IBM" freq: string — "yearly" or "quarterly" Example: symbol="GOOGL", freq="quarterly"2 paramsBalance sheet for a symbol. freq is 'yearly' or 'quarterly'. Types / examples: symbol: string — "IBM" freq: string — "yearly" or "quarterly" Example: symbol="GOOGL", freq="quarterly"
freqstringsymbolstringCashflow-StatementCash flow statement for a symbol. freq is 'yearly' or 'quarterly'. Types / examples: symbol: string — "IBM" freq: string — "yearly" or "quarterly" Example: symbol="GOOGL", freq="quarterly"2 paramsCash flow statement for a symbol. freq is 'yearly' or 'quarterly'. Types / examples: symbol: string — "IBM" freq: string — "yearly" or "quarterly" Example: symbol="GOOGL", freq="quarterly"
freqstringsymbolstringEarnings-DatesEarnings dates for a symbol; limit caps how many rows are returned. Types / examples: symbol: string — "META" limit: integer — default 12 Example: symbol="NFLX", limit=82 paramsEarnings dates for a symbol; limit caps how many rows are returned. Types / examples: symbol: string — "META" limit: integer — default 12 Example: symbol="NFLX", limit=8
limitintegersymbolstringEPS-EstimatesEPS estimates for upcoming periods. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsEPS estimates for upcoming periods. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringRevenue-EstimatesRevenue estimates for upcoming periods. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsRevenue estimates for upcoming periods. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringEPS-TrendEPS trend for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsEPS trend for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringEPS-RevisionsEPS revision stats (up/down changes) for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsEPS revision stats (up/down changes) for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringAnalyst-Price-TargetsAnalyst price target summary (low, high, mean, median) for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsAnalyst price target summary (low, high, mean, median) for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringAnalyst-Upgrades-and-DowngradesRecent analyst upgrades and downgrades for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsRecent analyst upgrades and downgrades for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringDividends-and-SplitsHistorical dividends and splits. period defaults to 'max'. Types / examples: symbol: string — "KO" period: string — "max" (default), "1y", "5y", etc. Example: symbol="AAPL", period="5y"2 paramsHistorical dividends and splits. period defaults to 'max'. Types / examples: symbol: string — "KO" period: string — "max" (default), "1y", "5y", etc. Example: symbol="AAPL", period="5y"
periodstringsymbolstringInstitutional-HoldersInstitutional holders for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsInstitutional holders for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringGrowth-EstimatesAnalyst growth estimates across horizons for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"1 paramsAnalyst growth estimates across horizons for a symbol. Types / example: symbol: string ticker — e.g. "DIS", "F"
symbolstringSearchDiscovery placeholder; returns no rows. Use the Atlas market and strategy tools. Types / example: query: string — ignored; e.g. ""1 paramsDiscovery placeholder; returns no rows. Use the Atlas market and strategy tools. Types / example: query: string — ignored; e.g. ""
querystringFetch-URLCompatibility hook; does not load arbitrary URLs. Use Atlas data tools instead. Types / example: url: string — ignored; e.g. "https://example.com"1 paramsCompatibility hook; does not load arbitrary URLs. Use Atlas data tools instead. Types / example: url: string — ignored; e.g. "https://example.com"
urlstringSubscription-StatusGet the authenticated user's subscription tier, monthly usage, remaining requests, and limits. Returns a dashboard_url the user can visit to manage their account, upgrade their plan, connect a broker, or see available tools. Always share the dashboard link when the user asks a...Get the authenticated user's subscription tier, monthly usage, remaining requests, and limits. Returns a dashboard_url the user can visit to manage their account, upgrade their plan, connect a broker, or see available tools. Always share the dashboard link when the user asks a...
No parameter schema in public metadata yet.
Get-InstructionsRead the signed-in user's saved instructions (read-only). Optional platform='discord' with parameters for Discord context. Types / examples: platform: string — "other" (default) or "discord" parameters: optional array of objects | null — host-specific context for Discord Examp...2 paramsRead the signed-in user's saved instructions (read-only). Optional platform='discord' with parameters for Discord context. Types / examples: platform: string — "other" (default) or "discord" parameters: optional array of objects | null — host-specific context for Discord Examp...
platformstringparametersvalueAutofetch-StrategyGiven a question in natural language, return the best-matching strategies for this user (up to 10), including titles, content, and related material. Optional platform='discord' with parameters for Discord. Types / examples: question: string — e.g. "How do I size trades for ear...3 paramsGiven a question in natural language, return the best-matching strategies for this user (up to 10), including titles, content, and related material. Optional platform='discord' with parameters for Discord. Types / examples: question: string — e.g. "How do I size trades for ear...
platformstringquestionstringparametersvalueList-StrategyList this user's strategies (id, title, visibility, dates) without full body text. Use Fetch-Strategy when you need the complete document. Types / examples: platform: string — "other" or "discord" parameters: optional array of objects | null2 paramsList this user's strategies (id, title, visibility, dates) without full body text. Use Fetch-Strategy when you need the complete document. Types / examples: platform: string — "other" or "discord" parameters: optional array of objects | null
platformstringparametersvalueFetch-StrategyLoad one strategy by id with full content and related material. Optional question narrows what is retrieved. Types / examples: strategy_id: string — UUID from List-Strategy or Strategy-Open question: optional string | null — narrows retrieved excerpts platform: string — "other...4 paramsLoad one strategy by id with full content and related material. Optional question narrows what is retrieved. Types / examples: strategy_id: string — UUID from List-Strategy or Strategy-Open question: optional string | null — narrows retrieved excerpts platform: string — "other...
platformstringquestionvalueparametersvaluestrategy_idstringStrategy-OpenOpen the strategy experience for the signed-in user (view mode). - strategy_id: optional; defaults to their primary strategy. - platform: optional host hint — openai, claude, or other. Response includes strategy id, title, content, journal when applicable, a short discovery li...2 paramsOpen the strategy experience for the signed-in user (view mode). - strategy_id: optional; defaults to their primary strategy. - platform: optional host hint — openai, claude, or other. Response includes strategy id, title, content, journal when applicable, a short discovery li...
platformstringstrategy_idvalueStrategy-PreviewSame as Strategy-Open but can include proposed edits for the UI to review. - proposed_title: new document title (optional). - proposed_content: optional JSON string; same accepted shapes as Strategy-Create `content`. - proposed_journal_entry: optional single journal line. - st...5 paramsSame as Strategy-Open but can include proposed edits for the UI to review. - proposed_title: new document title (optional). - proposed_content: optional JSON string; same accepted shapes as Strategy-Create `content`. - proposed_journal_entry: optional single journal line. - st...
platformstringstrategy_idvalueproposed_titlevalueproposed_contentvalueproposed_journal_entryvalueStrategy-UpdateSave changes to an existing strategy. - strategy_id: which strategy to update (required). - title, content, visibility, update_note: optional new values. - journal: optional full journal list to replace the current one. - journal_entry: optional line to append to the journal....11 paramsSave changes to an existing strategy. - strategy_id: which strategy to update (required). - title, content, visibility, update_note: optional new values. - journal: optional full journal list to replace the current one. - journal_entry: optional line to append to the journal....
titlevaluetoolsvaluesearchvaluecontentvaluejournalvalueanalysisvaluevisibilityvaluestrategy_idstringupdate_notevalueinstructionsvaluejournal_entryvalueStrategy-CreateCreate a new strategy. - title: name (required). - content: optional JSON string; leave empty for a blank strategy. - visibility: private, invite-only, unlisted, Atlas-public, web-public (default private). Accepted JSON for section bodies (pass the whole value as one string, e...3 paramsCreate a new strategy. - title: name (required). - content: optional JSON string; leave empty for a blank strategy. - visibility: private, invite-only, unlisted, Atlas-public, web-public (default private). Accepted JSON for section bodies (pass the whole value as one string, e...
titlestringcontentstringvisibilitystringStrategy-Save-InstructionsSave the user's strategy-selection notes. - instructions: text to store; leave empty to clear. These notes steer how strategies are chosen for their questions. Types / examples: instructions: optional string | null — free text; empty clears saved notes Example: instructions="P...1 paramsSave the user's strategy-selection notes. - instructions: text to store; leave empty to clear. These notes steer how strategies are chosen for their questions. Types / examples: instructions: optional string | null — free text; empty clears saved notes Example: instructions="P...
instructionsvalueStrategy-ImportCopy a catalog or shared strategy into this user's account as a new private strategy (content and attachments). - strategy_id: id of the strategy to copy (required). Requires an active signed-in session. You cannot import a strategy you already own. Types / examples: strategy_...2 paramsCopy a catalog or shared strategy into this user's account as a new private strategy (content and attachments). - strategy_id: id of the strategy to copy (required). Requires an active signed-in session. You cannot import a strategy you already own. Types / examples: strategy_...
platformstringstrategy_idstringTrigger-Workflow-SchemaFetch the canonical schema for AI trigger workflows. Returns every legal field the workflow decision AI can fill, its data type, allowed options, and when-conditions, plus worked examples. Use this when an external client (ChatGPT, Claude) is helping a user author or edit a wo...Fetch the canonical schema for AI trigger workflows. Returns every legal field the workflow decision AI can fill, its data type, allowed options, and when-conditions, plus worked examples. Use this when an external client (ChatGPT, Claude) is helping a user author or edit a wo...
No parameter schema in public metadata yet.
Atlas is a YAML-defined semantic layer for analytics — authored by humans, consumed by AI agents.
Documentation · Live Demo · The Semantic Layer · MCP Guide · Issues
Atlas turns a directory of YAML files into a complete semantic layer for analytics — entities, dimensions, measures, joins, virtual dimensions, query patterns, glossary terms, and authoritative metrics. Humans author the YAML. AI agents consume it through a built-in chat UI, an embeddable widget, Slack-native chat, or the Model Context Protocol (MCP) for Claude Desktop / Cursor / Continue — all returning deterministic, validated, read-only SQL.
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.
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.
bun create atlas-agent my-app
cd my-app
# edit .env and set your LLM API key (Anthropic / OpenAI / etc.)
bun run dev
# Open http://localhost:3000
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:
bunx @useatlas/mcp init --local # paste-ready config for a local Atlas instance
bunx @useatlas/mcp init --local --write # merge into the detected client config (with a .bak)
bunx @useatlas/mcp init --hosted --write # for an app.useatlas.dev workspace via OAuth 2.1
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):
name: Orders
type: fact_table
table: orders
grain: one row per order
description: |
Customer orders — the primary fact table for revenue analysis.
shipping_cost uses MIXED UNITS (some rows in dollars, some in cents).
dimensions:
- name: status
sql: status
type: string
sample_values: [pending, processing, shipped, delivered, cancelled]
- name: order_month
sql: TO_CHAR(created_at, 'YYYY-MM')
type: string
virtual: true
measures:
- name: total_gmv_cents
sql: total_cents
type: sum
joins:
- target_entity: Customers
relationship: many_to_one
join_columns: { from: customer_id, to: id }
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:
<script
src="https://your-atlas.example.com/widget.js"
data-api-url="https://your-atlas.example.com"
data-theme="dark"
></script>
Or use the React component:
import { AtlasChat } from "@useatlas/react";
export default function App() {
return <AtlasChat apiUrl="https://your-atlas.example.com" />;
}
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 |
| 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, Slack, Teams | Standalone app | Standalone app |
| Deploy anywhere | Docker, Railway, Vercel, or your own infra | Vendor-hosted | Vendor-hosted |
| Plugin ecosystem | 21 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:
git clone https://github.com/AtlasDevHQ/atlas-starter-docker.git && cd atlas-starter-docker
cp .env.example .env # Set your API key + database URL
docker compose up
| 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 |
Question → YAML semantic layer → SQL generation → Multi-layer validation → Query execution → Charts + narrative
bun run atlas -- init # Profile DB and generate YAMLs
bun run atlas -- init --enrich # Profile + LLM enrichment
bun run atlas -- init --demo # Load NovaMart demo data + profile
atlas/
├── packages/
│ ├── api/ # @atlas/api — Hono API server + agent loop + tools + auth
│ ├── web/ # @atlas/web — Next.js frontend + chat UI components
│ ├── cli/ # @atlas/cli — CLI (profiler, schema diff, enrichment)
│ ├── mcp/ # @atlas/mcp — MCP server (Claude Desktop, Cursor, etc.)
│ ├── sandbox-sidecar/ # @atlas/sandbox-sidecar — Isolated explore sidecar
│ ├── sdk/ # @useatlas/sdk — TypeScript SDK
│ ├── react/ # @useatlas/react — Embeddable chat component + hooks
│ ├── types/ # @useatlas/types — Shared wire-format types
│ ├── schemas/ # @useatlas/schemas — Shared Zod schemas
│ └── plugin-sdk/ # @useatlas/plugin-sdk — Plugin type definitions
├── plugins/ # 21 plugins (datasource, context, interaction, action, sandbox)
├── ee/ # @atlas/ee — Enterprise features (source-available, commercial license)
├── create-atlas/ # Scaffolding CLI (bun create atlas-agent)
├── apps/
│ ├── www/ # Landing page (useatlas.dev)
│ └── docs/ # Documentation (docs.useatlas.dev)
└── examples/ # Docker + Vercel deploy examples
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 nsjail / Firecracker / sidecar |
| 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:
git clone https://github.com/AtlasDevHQ/atlas.git && cd atlas
bun install
bun run db:up # Start Postgres + sandbox sidecar
cp .env.example .env # Set ATLAS_PROVIDER + API key
bun run dev # http://localhost:3000
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.
ATLAS_DATASOURCE_URLsecretAnalytics datasource URL (postgres, mysql, clickhouse, snowflake, duckdb, bigquery, salesforce). Optional — falls back to a bundled NovaMart SQLite demo when unset.
ATLAS_PROVIDERLLM provider: anthropic, openai, bedrock, ollama, openai-compatible, gateway. Optional — the MCP server does not call an LLM directly (the client does); set this only if you also run Atlas's chat or scheduler.
ATLAS_API_URLURL of a running Atlas API. Optional — defaults to http://localhost:3001. When set, the MCP server inherits the API's connections, semantic layer, and governance.
io.github.infoinlet-marketplace/mcp-observability
betterdb-inc/monitor
com.mcparmory/datadog
thotischner/observability-mcp
io.github.tantiope/datadog-mcp
io.github.us-all/datadog