- Run the commands for the user, but explain why you are running them so they can follow along.
- The Xata CLI detects coding agents and disables interactive prompts. Always pass explicit flags, and add
--jsonwhen you need to parse output. When a command fails because a value is missing or invalid, the error names the flag to pass — ask the user for that value rather than guessing. - Before starting, look at the current directory. If there is an existing application, ask whether to connect it to Xata; if not, ask whether they want to scaffold a small app or just explore the database workflow. Don’t scaffold a project without agreement.
- Ask before installing software, creating billable cloud resources, deleting branches, or copying data from an existing database.
- Never print full connection strings or API keys into the conversation; write them to env files instead.
What is Xata?
Xata is a PostgreSQL platform built around instant, copy-on-write branching. It is standard PostgreSQL, not a fork: existing drivers, ORMs, and Postgres tools work normally, and there is no SDK to install. (Available extensions are listed at https://xata.io/docs/platform/extensions.) Key capabilities to explain to the user:- Instant branching — a branch is a full Postgres database that starts as a copy-on-write copy of its parent, without copying the entire dataset. Copy-on-write avoids duplicating inherited data; additional storage and snapshots are billed according to your plan.
- Scale to zero — when scale-to-zero is enabled, idle branches release their compute and wake on the next connection, reducing compute costs for per-developer, per-PR, and per-agent branches. Manually hibernated branches without scale-to-zero enabled must be explicitly woken.
- Data anonymization — production data can be cloned into branches with PII masked, so development and agent work happens on realistic but safe data.
Getting started
Step 1: Install the CLI
The CLI is the main way you (the agent) and the user will interact with Xata. Confirm with the user, then run the install:~/.config/xata/bin. Make sure that directory is on the PATH, then verify with xata version.
Step 2: Log in
Check whether the user is already authenticated:xata auth login. It prints a URL and a code, then waits. Tell the user to open the URL in their browser, enter the code, and sign in (they can create a free account during this flow with GitHub, Google, or email). Keep the command running until it confirms success.
In headless or CI environments, authenticate with an API key from the environment instead: set XATA_API_KEY (keys are created at https://console.xata.io or with xata keys user create). Prefer a scoped key stored in a secret manager over pasting keys into commands.
Step 3: Create a project and branch
A project is the top-level container; a branch is a running Postgres database inside it. Before creating resources, check whether the folder already has a.xata/ configuration. If so, inspect xata status and ask whether to reuse that setup or connect to a different project. xata init does not replace an existing project link just because new flags are supplied. Don’t delete existing configuration or create another project without agreement.
Ask whether the user is setting up development and branching or a production database, then recommend settings in plain language:
- For development-only setups, use
--replicas 0: one primary with no read replicas, reducing compute cost but providing no standby failover target. For production, default to--replicas 1: one primary plus one read replica, which provides a standby failover target and adds compute cost. - For development-only setups, use
--scale-to-zero-base trueso the base branch can sleep when idle. For production, use--scale-to-zero-base falseto keep it running. Use--scale-to-zero-child truefor development branches in either case. When scale-to-zero is enabled, the default inactivity interval is 30 minutes. Explain that sleeping branches save compute but incur wake-up latency.
main branch. For development-only use, replace <replicas> with 0 and <base-scale-to-zero> with true; for production, use 1 and false, respectively. Because prompts are disabled for agents, pass explicit flags:
xata project create --name "<project>" in their own terminal, where the CLI lists the valid options interactively. Explain any change to the proposed settings before proceeding.
Wait for the branch to be ready, then link the user’s project folder so later commands don’t need IDs. The explicit wait also supports CLI versions that return from init before an unhealthy branch is ready:
xata init writes the configuration to .xata/ in the current folder. --database selects the Postgres database on the branch; use the existing postgres database for onboarding. Verify with xata status that the organization, project, branch, and database match the intended target before changing application configuration or running migrations. A successful exit alone is not proof that the folder was linked to the new project.
Step 4: Connect the user’s application
Get the branch connection string and put it wherever the user’s app reads its database URL (commonlyDATABASE_URL):
postgresql:// connection string containing credentials. Before writing it anywhere: check which env file the framework actually loads (.env.local for Next.js, .env otherwise), make sure that file is gitignored, don’t duplicate an existing DATABASE_URL entry, and don’t echo the URL into the conversation. A safe pattern:
--type pooler for serverless workloads that need pooled connections.
Step 5: Create the schema and some data
Prefer the project’s existing migration tooling (Prisma migrate, Drizzle Kit, etc.) if there is one — point it at the branch and run it. Otherwise apply SQL directly. Check thatpsql is installed (command -v psql) before using it; if it’s missing, use the ORM or ask before installing anything:
Step 6: Show off branching
This is the part that makes Xata click. Create a development branch as a copy-on-write copy ofmain, including its data. Child branches default to one primary and zero read replicas, even when the parent has replicas. Keep that zero-replica default for development to reduce compute cost; the child has no standby failover target:
dev: xata branch url prints the dev connection string. Note that xata checkout changes only the CLI context — the application keeps using whatever DATABASE_URL is in its env file until you update it.
Prove the isolation to the user: query dev and show the data copied from main is already there, insert a row on dev, then query main and show it is unchanged. Explain the workflow this enables: a branch per feature, per pull request, per teammate, or per coding agent — each isolated, each disposable. Clean up experiments with xata branch delete <name> (ask the user before deleting anything).
Switch back with xata checkout main when done.
Step 7: The console
Tell the user about https://console.xata.io, where they can see their branch tree, metrics, query insights, schema, and manage API keys and team members. The CLI and console are two views of the same platform: agents mostly use the CLI, humans often prefer the console.Ongoing agent access
Set the user up so their coding agents keep working well with Xata after onboarding:- MCP server — Xata hosts an MCP server at
https://api.xata.tech/mcp(Streamable HTTP, OAuth or API-key auth). Offer to configure it in the user’s client now, for exampleclaude mcp add --transport http xata https://api.xata.tech/mcpfor Claude Code, or an entry in.cursor/mcp.jsonfor Cursor. Per-client instructions: https://xata.io/docs/platform/mcp. - Agent authentication — a machine-readable guide to obtaining Xata API credentials as an agent: https://xata.io/auth.md.
- Claude Code skill — https://xata.io/xata-claude-skill/SKILL.md teaches Claude Code to create isolated branches per task.
- Per-agent branches — recommend giving every agent task its own branch created from
main(or an anonymized clone of production) and reviewing changes before they reachmain. Details: https://xata.io/docs/ai-agents/overview.
Appendix: migrating an existing database
If the user has an existing Postgres database (RDS, Aurora, Cloud SQL, Neon, Supabase, self-hosted, …),xata clone snapshots it into a Xata branch. Treat this as a sensitive operation: get explicit approval before connecting to their database, and never paste its connection string into the conversation — have the user put it in the environment.
.xata/clone.yaml; it does not guarantee anonymization. Auto-generated noop rules copy values unchanged. Identify sensitive columns and replace their noop rules with appropriate masking transformations before copying any data. Only use --validation-mode relaxed if the user explicitly confirms the data contains nothing sensitive — relaxed mode copies uncovered columns unchanged. Double-check which branch is checked out before starting, so the clone lands where intended.
Provider-specific guides start at https://xata.io/docs/migrations/aws-rds (sibling pages cover Aurora, Cloud SQL, Azure, Neon, Supabase, and self-hosted). For continuous replication instead of a one-time snapshot, see xata clone stream.
Notes
- It’s the coding agent’s job to run CLI commands and write schema migrations, not the human user. The human can use https://console.xata.io to see everything you did.
- Every page on https://xata.io is available as markdown by appending
.mdto its URL. The docs index for agents is at https://xata.io/docs/llms.txt. - If something fails,
xata status,xata auth status, andxata branch describeare the fastest ways to diagnose state.