Read-only unless you said otherwise
A datasource flagged read-only refuses write-shaped nodes at save time and again at execution, against the live row. The documented pattern pairs it with a SELECT-only database user.
Agent-authored · person-released · every call audited
Agentic data engineering
An agent writing SQL in a chat window produces an answer. An AI data pipeline has to produce something else: an artefact your team can read, review, version, rerun next month, and explain to whoever asks. Four things make the difference, and none of them is the model.
One
Of the 41 tools, the introspection reads exist for exactly this:
datasources_get_schemas, datasources_get_tables,
datasources_get_columns and datasources_preview_rows. The agent grounds its query
in the columns that exist and the values they actually hold, instead of inferring a schema from table names.
Introspection is a read, and it is scoped like everything else — the server builds the statement and quotes every identifier itself; the agent supplies names, never SQL fragments.
Two
A pipeline is declarative JSON: nodes, their dependencies, their parameters, where each one reads and where its output goes. The SQL lives in named templates the pipeline references. Both diff like code in review, because they are code.
Values reach the SQL as bound parameters, never as interpolated strings — the template engine refuses the interpolated form outright. That rule is not there for tidiness; it is what keeps an agent-authored query from becoming an injection surface.
Three
Editing a released pipeline never edits it: the first write copies it into a draft, and the release you were running keeps running. There is one draft per entity at a time, and releasing locks it. What ran last quarter is still exactly what ran last quarter.
Moving a release into a higher environment is a human, UI-triggered action — there is no MCP tool for promotion and no schedule. An agent can author and run; a person promotes.
Four
A datasource flagged read-only refuses write-shaped nodes at save time and again at execution, against the live row. The documented pattern pairs it with a SELECT-only database user.
mcp.tool.called for each call, mcp.tool.write for each mutating one — beside the login, key-issuance and decryption events.
Per-milestone events stream over SSE with heartbeats, so the agent — and the human watching — know which node is running rather than waiting on a spinner.
Every refusal is a catalogued {domain}.{entity}.{failure} code with details, not a stack trace. An agent can branch on the code; a person can search for it.
executions_get_result returns the actual data through a paged cursor, so the agent verifies its own work instead of reporting success.
Each source is read in place and staged into an in-memory database created for that one execution, then destroyed. The federated-query story.
How this compares with a text-to-SQL tool → · vs Airflow → · vs dbt →
Asked before
Your real schema: datasources_get_schemas, datasources_get_tables, datasources_get_columns and datasources_preview_rows return the columns that exist and the values they actually hold, so the query is grounded rather than inferred from table names. The tool list is docs/mcp-server.md §6.1.
As bound parameters: a declared name is translated to a positional parameter on a prepared statement before the driver sees it, so a STRING value is never parsed as SQL — an injected payload matches no row. The binding contract is docs/templates.md §8.4.
No. The first write to a released pipeline copies it into a draft, and the released version keeps running until a person releases the new one — one draft at a time, releases immutable. The lifecycle is docs/versioning.md §3.1.
Every MCP call is written with the key and the tool — mcp.tool.called, and mcp.tool.write for the mutating ones — beside the login and key-issuance events, and never the SQL text, the rows or the parameter values. The audit log is docs/auth.md §10.1.
Bring up the demo sources, describe a question in your own words, and read what the agent drafts — then release it, or don't. The artefact either way is a pipeline you can read.