Dataddo Data to AI
Securely connect AI assistants to business data from 400+ sources through a semantic layer, with fewer confidently wrong answers, added security and control…
What it can do
- List Models: List the semantic models available - each covers one source system and contains MANY entities - and which is the default. (A model here is a whole semantic layer, not a single table as in
- List Entities: List the business entities and blessed metrics in ONE model. Entities are business nouns (customer, invoice, deal), not source tables. This is what can be ASKED, which is narrower than
- Describe Entity: Show an entity's selectable fields and its declared relationships to other entities. An entity modelled automatically can carry hundreds of fields, so the most-filled ones are returne
What data it sees
Do you need an account
No: the server works without sign-in
Securely connect AI assistants to business data from 400+ sources through a semantic layer, with fewer confidently wrong answers, added security and control over what the agents can access. Supports masking of sensitive data.
How to connect
How to connect Dataddo Data to AI to Claude
The server address to paste into Claude settings:
https://data-to-ai--dataddo.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Dataddo Data to AI to ChatGPT
The server address to paste into ChatGPT settings:
https://data-to-ai--dataddo.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Dataddo Data to AI to Cursor
The server address to paste into Cursor settings:
https://data-to-ai--dataddo.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (12)
Raw names from tools/list. Only developers need these.
| list_models | List the semantic models available - each covers one source system and contains MANY entities - and which is the default. (A model here is a whole semantic layer, not a single table as in dbt.) Use it when you are about to ASK something and need to know which world to ask in. Do NOT answer "what data do we have" from this: models cover only the fraction of the account that has been modelled. That question is list_flows. |
| list_entities | List the business entities and blessed metrics in ONE model. Entities are business nouns (customer, invoice, deal), not source tables. This is what can be ASKED, which is narrower than what the account HAS - for that, use list_flows. declared_rows is what the PLATFORM says a flow holds, not a measurement. Returns a PAGE: 40 by default, at most 200, answerable first, with 'counts.entities_in_model' giving the true total - advance 'offset' rather than concluding the model ends there, and read 'counts.answerable_in_model' before judging from one page how much can be queried. A page can come back SHORTER than you asked when the response budget trims it; 'entities_truncated' says so, and you then advance by the number you RECEIVED, never by the limit you requested. Metrics are listed once, on the first page, and are model-wide. |
| describe_entity | Show an entity's selectable fields and its declared relationships to other entities. An entity modelled automatically can carry hundreds of fields, so the most-filled ones are returned by default and 'fields_selection' says how many were not - use 'matching' to search by name, 'fields' to name the ones you want, or 'offset' to page. A field not shown is not thereby absent. Call this before query so you use real field names. Relationships listed here are the ONLY joins available - they are declared by the data model, never inferred. |
| search | Find entities, fields, relationships and metrics by keyword across a model (or all models). Faster than calling describe_entity repeatedly when you are looking for 'the overdue one' or 'whatever holds revenue'. |
| report_problem | Record that an ANSWER was wrong: a figure a person says is off or contradicts what they know. Not for refusals or errors, which are already logged. Returns what is known about the entity - unreviewed fields, what its flow is scoped to - which is often the explanation, so call it before re-running the query another way. |
| known_gaps | List questions this data CANNOT answer, and why. Check this before answering anything involving trends over time, forecasts, or systems that may not be connected. If the question you were asked appears here, say so plainly instead of approximating an answer. An empty inventory is not evidence there are no gaps: gaps are written by hand and derivation produces none. |
| sample_values | Show the most common values of a field, with counts. Use this before filtering on a categorical field - filters fail silently when the value you guessed is not how the source system spells it. |
| query | Query an entity. Select fields by name and traverse relationships with dots (e.g. 'account_manager.full_name'); filters, grouping and ordering use the same names. Prefer blessed metrics over summing fields yourself: terms like revenue have several defensible definitions and the metrics encode which one is correct. A metric answers what the business means; an aggregate answers exactly what you asked and nothing more. describe_entity gives this entity's fields and how to write filters against them. Set dry_run to compile and return the SQL without executing it. This tool does not accept SQL. |
| data_status | Report how current an entity's data is: when it was last written, how many rows, and the freshness policy the model declares. Call this before presenting figures a person will act on. |
| list_flows | START HERE for "what business data do we have", "what are we connected to", or "what systems feed this account". Lists the Dataddo FLOWS this account is connected to and which ones a model covers, so they can actually be queried. Each flow reports how many columns it has, not the columns themselves - call describe_flow for one flow's inventory. Check columns_from: source_row_count and source_column_count describe the SOURCE behind a flow and are upper bounds, because a flow may filter rows or emit fewer columns. What those columns MEAN still requires a model: a flow with columns listed but queryable=false is connected and inspectable, NOT answerable - report it as connected, never as available, and use list_entities for what can be asked. Returns a page: 20 by default, at most 200, with counts.matched_filter giving the true total - advance 'offset' rather than concluding the account ends there. A page can come back SHORTER than you asked when the response budget trims it; 'flows_truncated' says so, and you then advance by the number you RECEIVED, never by the limit you requested. |
| describe_flow | Describe ONE flow in depth: how many rows carry a value per column, which are empty, which could identify a row, and the period the data covers. Use it after list_flows to judge whether a flow can answer a question before anyone models it. Reports MEASURED facts, not the schema's claims - a column can be declared and hold nothing. The most-filled columns are returned by default and 'columns_selection' says how many were not; use 'matching' to search by name or 'offset' to page. |
| refresh | Request fresh data for an entity from its upstream system. Reports honestly whether the running backend can do this at all, and is asynchronous when it can. |