Who can see what
Three controls decide what an agent can reach on behalf of the person asking, and they stack:
The first two apply to every answer the agent builds from the semantic layer, which is its default mode. The third sits outside the semantic layer: raw SQL is not filtered by user attributes, and only users who could already open the SQL Runner can turn it on. Agent instructions shape how the agent reasons and answers; they can’t widen what it reaches. For a worked setup over explores that some users can only partly see, read Agent access to restricted data.
The agent and its model never connect to your warehouse themselves. The model asks for a query through a tool, and Lightdash compiles and runs it over the project’s warehouse connection, the same query path Explore and the SQL Runner use. The model only sees the results Lightdash returns, and only when data access is enabled. On a project that requires personal warehouse credentials, that connection is the signed-in person’s own saved credentials — the same ones their charts and Explore queries use. See When are personal warehouse credentials used?.
On Snowflake, BigQuery, Databricks, Athena, Postgres, Redshift, Trino and ClickHouse, agent identity also lets the warehouse decide what agent queries can read. With agent identity on, Lightdash also checks who can read each saved result. See Who can read a saved result.
Scoping raw SQL to specific schemas
Raw SQL bypasses the semantic layer, so tags and user attributes don’t narrow it. Agent data scope is the project setting that limits which warehouse schemas and catalogs raw SQL can read instead. Find it at Settings → Current project → Agent data scope, where the card is titled Warehouse access. The page only shows when AI agents are available for your organization. The setting has four lists:- Allowed schemas — raw SQL can only read from these. Empty means no restriction.
- Allowed catalogs — optional, and only selectable once you’ve allowed at least one schema. Narrows the allowed schemas to specific catalogs or databases.
- Excluded schemas and Excluded catalogs — never readable, even when the allow lists above would permit them. A denial always wins over an allow.
manage:SqlRunner can query.
The lists work at schema and catalog level only, with no table-level or name-prefix rule. If your staging, intermediate and mart models share one schema, Agent data scope can’t separate the marts from the rest. Build your mart models into their own schema and allow only that schema instead.
manage:SqlRunner from roles that shouldn’t run raw SQL at all, and treat agent instructions and agent context as guidance rather than enforcement — they shape how the agent reasons, not what it’s allowed to query.
Data access modes
Data access enabled (default):- Agents receive actual query results in addition to metadata
- Can provide specific insights, identify trends, and analyze patterns in your data
- Offers detailed summaries and data-driven recommendations
- Can search for actual field values to ensure accurate filters when building visualizations
- Only shares data when explicitly enabled per agent
- Agents can see your data structure, field names, and model definitions
- They can generate appropriate queries and visualizations
- No actual data values are shared with the agent — its query tools return row counts (and column names, for SQL queries) but never the rows themselves
- Perfect for exploring data structure and creating initial analyses

Personalizing answers to who is asking
By default, an agent doesn’t know who it’s talking to — everyone gets the same style of answer. When you turn on Pass user information, the agent tailors its responses to the person asking, so a business user and a data developer can get differently-pitched answers to the same question. With this setting on, a non-technical viewer gets plain-language answers and is pointed to the data team when something needs changing, while a technical user gets more detailed, hands-on guidance. The agent stays the same — only the tone and level of detail adapt to the audience. What the agent receives when enabled:- The user’s name
- Their role
- Their group memberships

Limiting access to specific explores and fields
You can control which explores and fields your AI agent can access using tags. When you configure tags in your agent settings, the agent will only see explores and fields that have matching tags. Two tagging options:- dbt tags - Native dbt tags applied at the model level (using the
tagsproperty orconfig.tags). These control explore-level access - Lightdash metadata tags - Tags defined in the Lightdash
metasection, applied at the column level (individual metrics and dimensions). These control field-level access
- Add one or more tags to your agent settings
- Fields or explores with any of those tags will be accessible to the agent
- If no tags are configured, the agent can access everything
- As you add tags, you can interactively explore which explores and fields will be available in the agent settings interface

Preview available explores and fields as you add tags
- Explore-level tags - Tag the model to control access to entire explores
- Field-level tags - Tag individual metrics and dimensions for granular control
How filtering works
The filtering behavior depends on how you’ve tagged your models: Explore visibility:- An explore is only visible if its base table has matching tags at either:
- Explore level (model tags match agent tags), OR
- Field level (at least one base table field has matching tags)
- If only joined tables have matching tags but the base table doesn’t, the explore will be hidden
Virtual views never carry explore-level or field-level tags, so they can never match any configured tag. As soon as you add any tag to an agent, every virtual view is excluded from that agent regardless of what the tag is — a virtual view is only reachable by an agent with no tag restriction configured.
-
Field-level mode (when ANY field in the table has tags defined):
- Only fields with matching tags are visible
- Other fields are hidden, even if the explore is tagged
- Note: An empty tags array (
tags: []) activates field-level mode but matches nothing
-
Explore-level mode (when NO fields in the table have tags):
- If explore tags match: ALL fields in the table are visible
- If explore tags don’t match: NO fields are visible
Adding tags at the model level
Tag entire models to give your AI agent access to all metrics and dimensions within that explore:View code examples
View code examples
Adding tags to individual metrics & dimensions
For more granular control, tag specific metrics and dimensions:View code examples
View code examples
Common scenarios
Here are some common tagging scenarios and their results: Scenario 1: Explore-level only (no field tags)["ai-enabled"] tag, ALL fields in the customers explore are visible.
Scenario 2: Field-level only (no explore tags)
["ai-enabled"] tag, only customer_name is visible. The email field is hidden.
Scenario 3: Mixed - explore tagged with fields that have different tags
["ai-enabled"] tag, NO fields are visible. Field-level mode is active (because fields have tags), and none of the field tags match “ai-enabled”.
Scenario 4: Mixed mode - base model with explore tags, joined model with field tags
["ai-enabled"] tag:
orderstable: ALL fields visible (explore-level mode - no field tags defined)customerstable: Onlyemailvisible (field-level mode - has field tags, onlyemailmatches)
orders) has no matching tags.
Scenario 6: Tagged base model with an untagged joined model
["ai-enabled"] tag:
orderstable: ALL fields visible (explore-level mode - explore tags match)customerstable: ALL fields visible (explore-level mode - the joined model has no tags anywhere, so nothing restricts it)
User attributes and permissions
When an agent answers from the semantic layer, which is its default mode, it respects all data access controls configured through user attributes. This ensures that agents only access data that the user is authorized to see, maintaining your existing security policies. The exception is raw SQL, covered below.How user attributes flow through AI queries
When an AI agent generates and executes queries on behalf of a user, it inherits that user’s attribute values and applies them to all data access: Row-level security:- Agents automatically apply
sql_filterrules defined in your models - Only rows matching the user’s attribute values are included in query results
- Example: If a user has
sales_region: 'EMEA', the agent will only query data for that region
- Agents respect
required_attributeson dimensions - Columns the user cannot access are invisible to the agent
- Agents respect
required_attributeson metrics. Metrics defined under restricted columns inherit the column’s restriction unless they set their own; model-level metrics are not restricted by the columns they reference (see metric access control) - Example: If
salaryrequiresis_admin: 'true', non-admin users’ agents cannot query salary data
- Agents respect
required_attributeson models - Tables the user cannot access are completely hidden from the agent
- The agent cannot reference or join restricted tables
- Example: If
paymentsrequiresis_admin: 'true', non-admin users’ agents cannot query the payments table
Default behavior
In the Lightdash app: AI agents automatically use the logged-in user’s attributes for all queries. In Slack: By default, AI agents use the attributes of the user who created the agent. To have each Slack user’s individual permissions respected, enable the AI Agents OAuth requirement toggle in your Lightdash Slack settings. When enabled, each Slack user must OAuth into Lightdash before using the agent, and their individual permissions are applied to all queries.How this works behind the scenes
When an agent generates a query:- The agent receives the user’s complete attribute profile (both direct user attributes and group attributes)
- All
sql_filterrules are automatically applied to the generated SQL - Dimensions and tables with
required_attributesare filtered from the available schema - The agent only sees and can query data within the user’s permissions
Example: Regional sales access
Consider this model configuration:sales_region: 'EMEA' and no can_view_pii attribute:
- The agent can query
revenuedata, but only for EMEA region - The agent cannot see or query
customer_name(PII restriction) - If the agent tries to analyze customer names, it will fail with a permissions error
- All generated queries automatically include
WHERE region IN ('EMEA')
Security considerations
- Metadata mode: Even in metadata-only mode, agents respect user attributes when showing available fields
- Data access mode: When data access is enabled, query results are filtered by user attributes
- Query generation: Semantic queries the agent generates cannot bypass user attribute restrictions
- Error handling: If an agent attempts to access restricted data through the semantic layer, the query fails with a permissions error
Raw SQL is outside the semantic layer
User attributes are enforced by the semantic layer, so they apply to every query built from an explore: Explore, charts and dashboards, and AI agents answering in their default (semantic) mode. Anything that runs raw SQL against the warehouse runs outside the semantic layer, andsql_filter, required_attributes and any_attributes do not apply to it:
- The SQL Runner
- SQL mode in an AI agent conversation
- The Run SQL tool of the Lightdash MCP server
- Hand-written SQL inside a semantic query: custom SQL dimensions, custom SQL metrics, and SQL table calculations. They’re pasted into the query as written, which is why authoring them needs
manage:CustomFieldsormanage:CustomSqlTableCalculations.
manage:SqlRunner for the first three, manage:CustomFields or manage:CustomSqlTableCalculations for the last. A user without those cannot run raw SQL from any of them, whatever an agent’s instructions say. If someone needs raw SQL and warehouse-enforced permissions at the same time, require personal warehouse credentials on the project so their queries run as their own warehouse user, and put the restrictions in the warehouse.
Limiting how much agent queries scan
On BigQuery, you can set an AI agent query limit on the connection. Lightdash dry-runs every agent query before it executes and refuses queries estimated to process more than the limit. The agent receives the estimate so it can narrow the query and try again.Maximum bytes billed, or AI agent maximum bytes billed when it’s set, stays the hard limit, because dry-run estimates can be lower than what a query is billed for. See Query cost estimates in the BigQuery connection settings.