Skip to main content
This walkthrough ends where Datris is different: an agent lands data from a public source, but only after a person approves the run, and every row it lands can be traced back to the run, the script, and the source. You will need Docker, one AI provider key (Anthropic, OpenAI, or Grok), and an MCP client — Claude Desktop, Claude Code, or Cursor.
Want the plain REST version first — register a pipeline, upload a CSV, query it? That walkthrough is on File Upload.

1. Install and start

Press Enter at every prompt for a standard install, paste your AI key when asked. Wait for the datris container to log Started Application, then confirm:
Other install paths (Windows, single-file Compose, git clone) are on Installation.

2. Turn on the governed defaults

These are off in a fresh install so that existing deployments are unchanged. Add them to ./datris/.env:
Recreate the server so it picks them up (the MCP server reads the same flag and starts requiring a key automatically):
Open http://localhost:4200. The first login is admin with no password; you are asked to set one before anything else works.

3. Set one policy rule

Configuration → Agent Policy → Use recommended. That starting point pauses deletes, job kills, and destination-type migrations for approval and refuses secret and configuration writes. Add one rule for this walkthrough: set tap:run to Approve. From now on, any agent that tries to run a tap waits for a person.

4. Issue a scoped key for your agent

Configuration → API-Keys → Issue new key. Label it after the client (claude-desktop, cursor), pick the rag-builder template — it can create pipelines and taps and run the ones it created, and nothing else — and copy the value; it is shown once.

5. Connect your agent

Add the Datris MCP server to your client with the key from step 4. Claude Desktop (claude_desktop_config.json), Claude Code (.mcp.json in your project root), and Cursor all take the same snippet — see Configuring Claude for the file locations and the no-Docker alternative.
Restart the client. In the Datris UI, the Agent Monitor tab now shows the agent connected under its key label, and streams every tool call it makes from here on.

6. Ask the agent to build a tap against a public source

The USGS earthquake feed needs no credentials, so nothing has to be stored before the first run. Ask your agent:
“Create a Postgres pipeline called earthquakes and a tap called usgs-earthquakes that fetches the USGS ‘all earthquakes, past day’ GeoJSON feed at https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.geojson and produces one row per event with its id, time, place, magnitude, longitude, latitude, and depth. Test the tap so I can see a sample, but don’t run it yet.”
Watch the Agent Monitor: create_pipeline, create_tap, test_tap. The agent shows you a handful of sample rows. Nothing has been landed.

7. Turn on provenance stamping

In the UI: Catalog → earthquakes → Edit → Destination step → “Stamp provenance on landed data” → save. From the next run on, every row this pipeline lands carries six extra columns naming the run, the time, the config version, the tap run, the script commit, and the source. (Do this before the run rather than after — an approval executes exactly what was proposed, and a pipeline changed underneath a pending approval is refused as stale.)

8. Run it — and watch it wait for you

“Run the usgs-earthquakes tap.”
The agent calls run_tap and gets back pending_approval with an approval id instead of a result, because of the rule from step 3. It tells you so, and can poll get_approval while it waits. Nothing has run. Open Activity → Approvals. The card shows exactly what will execute — the method, path, and body of the agent’s request, with the reason the agent gave, if any. Click Approve. The platform performs the original request on your behalf; the agent’s next poll sees it executed and it follows the load to completion with get_pipeline_status. Ask it to confirm:
“Did the run land? How many rows?“

9. Ask where a row came from

“Pick one row from earthquakes and tell me where it came from — the run, the tap run, the script commit, and the source.”
The agent reads the row’s _datris_run_id and calls get_provenance, which walks the chain and returns the pipeline run with its status and record count, the tap run that fed it, the pipeline definition version in force, and the declared source. You can see the raw stamp yourself:
(_datris_script_sha is populated when the tap’s script is stored in a git repository — see Tap GitHub Storage.)

10. Read the record

Configuration → Audit Log. Two linked entries tell the whole story: the agent’s queued tap:run request under its key label, and your approval executing it under your login. The pipeline and tap creations from step 6 are there too, attributed to the same key. Everything you just watched happen is now something you can answer questions about next month.

What you just saw

  • An agent with a scoped key could build and test, but its run was gated by policy — enforced by the platform, not by a prompt.
  • A person approved exactly what was proposed, and the platform executed it on their behalf.
  • Every landed row carries provenance, and the agent can resolve it back to the run, script, and source.
  • The audit log holds the request, the decision, and the result.

Next steps