Neon Postgres Branching
The outcome of this skill should be a created Neon branch (or a clear, actionable next step if creation cannot proceed). Choose the correct branch type, then execute branch creation via MCP or CLI.
- Normal branch for realistic migration and query testing with real data.
- Schema-only branch (Beta) for sensitive data workflows where structure is needed without copying rows.
Branch Type Decision
Use this decision rule first:
- If the user wants to test complex migrations, performance, or behavior against production-like data, choose a normal branch.
- If the user needs to avoid copying sensitive data, choose a schema-only branch.
If the request is ambiguous, ask one clarifying question: "Do you need realistic data for testing, or only schema structure because the data is sensitive?"
Tool Selection: CLI or MCP
Always support both Neon CLI and Neon MCP server. Prefer the tool the user already has installed and authenticated.
MCP link: https://neon.com/docs/ai/neon-mcp-server.md CLI link: https://neon.com/docs/reference/cli-quickstart
Selection order
- Check MCP first in MCP-enabled environments:
- If Neon MCP tools are available and authenticated (for example, listing projects works), use MCP.
- If MCP is unavailable or not authenticated, check CLI:
- Run
neonctl --versionto confirm CLI is installed. - Run
neonctl projects listto confirm auth/context.
- Run
- If CLI is missing, direct installation via quickstart.
- If CLI is installed but not authenticated, guide the user through
neonctl auth(or API key auth), then continue. - If both MCP and CLI paths are unsuccessful, use the Neon REST API:
MCP branch flow
- Choose normal vs schema-only based on data sensitivity and migration-testing goals.
- Use branch tools (for example,
create_branch) to create the branch. - Validate with read tools (for example,
describe_branch). - For migration workflows, prefer branch-based migration flows before applying to main.
Create a Normal Branch (Preferred for Real-Data Migration Testing)
Use this when the user needs realistic testing conditions. Real production-like data can expose edge cases your seed or data migration scripts miss, which helps catch migration issues before going live.
Link: https://neon.com/docs/introduction/branching.md
Steps
- Use MCP if already available/authenticated; otherwise verify CLI with
neonctl --version. - Ensure project context is set (
neonctl set-context --project-id <your-project-id>) or include--project-idon commands. - Create branch:
neonctl branches create \
--name <branch-name> \
--parent <parent-branch-id-or-name> \
--expires-at 2026-12-15T18:02:16Z
- Optionally fetch a connection string for the new branch:
neonctl connection-string <branch-name>
Create a Schema-Only Branch (Beta, Sensitive Data)
Use this when users must not copy production rows into the test branch.
Link: https://neon.com/docs/guides/branching-schema-only.md
Steps
- Use MCP if already available/authenticated; otherwise verify CLI with
neonctl --version. - Create schema-only branch:
neonctl branches create \
--name <schema-only-branch-name> \
--parent <parent-branch-id-or-name> \
--schema-only \
--expires-at 2026-12-15T18:02:16Z
If multiple projects exist, include:
neonctl branches create \
--name <schema-only-branch-name> \
--parent <parent-branch-id-or-name> \
--schema-only \
--project-id <your-project-id> \
--expires-at 2026-12-15T18:02:16Z
Beta Support Guidance (Mandatory)
Schema-only branching is in Beta. If users report unexpected behavior, errors, or missing capabilities:
- Ask them to share feedback in the Neon Console:
- Recommend opening a support conversation in the Neon Discord:
Reset from parent
Use this when a child branch has drifted and the user wants a clean refresh from the parent branch's latest schema and data.
Link: https://neon.com/docs/guides/reset-from-parent.md
What it does
- Fully replaces the child branch schema and data with the parent's latest state.
- Does not merge; local changes on the child branch are lost.
- Keeps the same connection details, but active connections are briefly interrupted during reset.
When to recommend it
- Development or staging branch is too far behind production.
- User wants to start a new feature from a clean parent-aligned state.
- Team wants to refresh staging from production for consistent testing baselines.
Hard constraints and blockers
- Only child branches can be reset (root branches and schema-only root branches cannot be reset from parent).
- If the target branch has children, reset is blocked until those child branches are removed.
- After a parent branch is restored from snapshot, reset-from-parent may be unavailable for up to 24 hours.
- Reset-from-parent always uses the current parent state; use Instant restore for point-in-time recovery needs.
CLI usage
neonctl branches reset <id|name> --parent --preserve-under-name <backup-branch-name>
If project context is not already set, include project ID:
neonctl branches reset <id|name> --parent --preserve-under-name <backup-branch-name> --project-id <project-id>
--preserve-under-name keeps the pre-reset state as a backup branch for rollback, but adds one extra branch to clean up later.
Optional context setup to avoid repeating --project-id:
neonctl set-context --project-id <project-id>
Console and API usage
- Console: Open the target child branch, then select Reset from parent from Actions.
- API: Use the restore endpoint for the branch and set
source_branch_idto the parent branch ID.
Notes and Caveats
- Schema-only branches are for structure-only cloning and sensitive/compliant data controls.
- Schema-only branches are independent root branches (no parent branch and no shared history), so reset-from-parent does not apply.
- For migration testing that depends on real-world row shapes, volumes, and edge cases, prefer normal branches.
- Root branch allowances and per-branch storage limits can cap how many schema-only branches users can create.
- If a user is unsure, default recommendation is:
- Normal branch for migration validation.
- Schema-only branch for compliance and privacy constraints.
Useful Workflow Patterns
If the user asks for process recommendations (not just a single command), suggest these:
- One branch per PR: Create branch when PR opens, delete when merged/closed, keep migration tests isolated.
- One branch per test run: Create branch at pipeline start, run migrations/tests, delete at end for deterministic CI.
- One branch per developer: Isolated dev environments with production-like shape; avoid team collisions on shared test data.
- PII-aware branching: If production has sensitive data, derive dev/PR branches from an anonymized branch or use schema-only branches.
- Ephemeral lifecycle hygiene: Set branch expiration and automate cleanup so old branches do not accumulate avoidable storage/history cost.
Post-creation environment update prompt
After branch creation, ask whether the user wants to update local environment credentials to point at the new branch.
- Ask: "Do you want me to update your
.envDATABASE_URLto this new branch connection string?" - If yes, write the new branch connection string to the requested env file/key.
- If no, leave credentials unchanged and share the connection string for manual use.
- Never overwrite an existing env key without explicit confirmation.
Examples
Example 1: Migration testing with realistic data
User input: "I need to test a risky migration against production-like data."
Agent output shape:
- Recommend a normal branch and explain why.
- Share docs link: https://neon.com/docs/introduction/branching
- Check the available/authenticated tool path first (MCP, otherwise CLI with
neonctl --version). - Provide commands:
neonctl branches create --name migration-test --parent main --expires-at 2026-12-15T18:02:16Zneonctl connection-string migration-test
Example 2: Sensitive data development workflow
User input: "We cannot copy production data because of compliance."
Agent output shape:
- Recommend schema-only branch and explain why.
- Share docs link: https://neon.com/docs/guides/branching-schema-only
- Check the available/authenticated tool path first (MCP, otherwise CLI with
neonctl --version). - Provide command:
neonctl branches create --name compliance-dev --parent main --schema-only --project-id <your-project-id> --expires-at 2026-12-15T18:02:16Z
- Mention Beta support path: