Flanj drift.flanj.io · daily contract watch

drift.flanj.io / servers / neon

Server sheet · api · credentialed

Neon neon

5 change events over 51 comparison days: 2 breaking, 44 warning and 106 info findings, each with the two contracts as served behind it.

watched since 2026-08-24 as of 2026-10-15 52 days observed 51 comparison days latest snapshot 2026-10-15

01 / the server

What the watch knows about it.

Neonoperator
apikind
credentialedauth posture
114tools listed
52days observed
2025-11-25MCP revision · floor, not ceiling
0 / 114outputSchema declared

This server answers tools/list only with a credential attached, so its findings cannot be reproduced anonymously; the watch attaches the credential the operator documents for machine access.

02 / event timeline — every event, expanded

5 change events, newest first.

2026-09-30 → 2026-10-01 1 warning 12 info 3 tools
7 input-optional-property-removed5 input-required-property-removed1 description-changedas served: 2026-09-30 → 2026-10-01on the index
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
create_trigger inputbodyenabled
their contract · 2026-09-30
{"type":"boolean"}
their contract · 2026-10-01
absent
location
input.body.enabled
as served: 2026-09-30 → 2026-10-01
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
create_trigger inputbodyfunction_path
their contract · 2026-09-30
{"maxLength":2048,"minLength":1,"type":"string"}
their contract · 2026-10-01
absent
location
input.body.function_path
as served: 2026-09-30 → 2026-10-01
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
create_trigger inputbodyfunction_slug
their contract · 2026-09-30
{"pattern":"^[a-z0-9]{1,20}$","type":"string"}
their contract · 2026-10-01
absent
location
input.body.function_slug
as served: 2026-09-30 → 2026-10-01
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
create_trigger inputbodyname
their contract · 2026-09-30
{"maxLength":256,"minLength":1,"type":"string"}
their contract · 2026-10-01
absent
location
input.body.name
as served: 2026-09-30 → 2026-10-01
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
create_trigger inputbodyschedule
their contract · 2026-09-30
{"additionalProperties":false,"properties":{"cron":{…}},"required":["cron"],"type":"object"}
their contract · 2026-10-01
absent
location
input.body.schedule
full fragment
{"additionalProperties":false,"properties":{"cron":{"maxLength":1024,"minLength":1,"type":"string"}},"required":["cron"],"type":"object"}
as served: 2026-09-30 → 2026-10-01
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
create_trigger inputbodytype
their contract · 2026-09-30
{"enum":["schedule"],"type":"string"}
their contract · 2026-10-01
absent
location
input.body.type
as served: 2026-09-30 → 2026-10-01
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
explain_sql_statement description
Analyze Generate the query execution plan for a SQL statement. When `analyze` is true, PostgreSQL executes the statement using EXPLAIN ANALYZE. and any side effects. Use `analyze: false` to inspect a statement without executing it. Never analyze potentially destructive SQL autonomously. Do not use when you need to execute the query for results (use `run_sql` instead).
as served: 2026-09-30 → 2026-10-01
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
update_trigger inputbodyenabled
their contract · 2026-09-30
{"type":"boolean"}
their contract · 2026-10-01
absent
location
input.body.enabled
as served: 2026-09-30 → 2026-10-01
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
update_trigger inputbodyfunction_path
their contract · 2026-09-30
{"maxLength":2048,"minLength":1,"type":"string"}
their contract · 2026-10-01
absent
location
input.body.function_path
as served: 2026-09-30 → 2026-10-01
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
update_trigger inputbodyfunction_slug
their contract · 2026-09-30
{"pattern":"^[a-z0-9]{1,20}$","type":"string"}
their contract · 2026-10-01
absent
location
input.body.function_slug
as served: 2026-09-30 → 2026-10-01
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
update_trigger inputbodyname
their contract · 2026-09-30
{"maxLength":256,"minLength":1,"type":"string"}
their contract · 2026-10-01
absent
location
input.body.name
as served: 2026-09-30 → 2026-10-01
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
update_trigger inputbodyschedule
their contract · 2026-09-30
{"additionalProperties":false,"properties":{"cron":{…}},"required":["cron"],"type":"object"}
their contract · 2026-10-01
absent
location
input.body.schedule
full fragment
{"additionalProperties":false,"properties":{"cron":{"maxLength":1024,"minLength":1,"type":"string"}},"required":["cron"],"type":"object"}
as served: 2026-09-30 → 2026-10-01
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
update_trigger inputbodytype
their contract · 2026-09-30
{"enum":["schedule"],"type":"string"}
their contract · 2026-10-01
absent
location
input.body.type
as served: 2026-09-30 → 2026-10-01
2026-09-25 → 2026-09-26 1 warning 1 tool
1 description-changedas served: 2026-09-25 → 2026-09-26on the index
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
get_connection_string description
[…] `create_branch` do not return one; call this after they succeed. All parameters are optional; the tool resolves the project, branch, Branch, compute, and database are optional and resolved automatically if not specified. specified; `project_id` follows the connection scope. Requires write access: the connection string carries a privileged role […]
as served: 2026-09-25 → 2026-09-26
2026-09-11 → 2026-09-12 2 warning 2 tools
2 description-changedas served: 2026-09-11 → 2026-09-12on the index
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
create_project description
[…] Neon project and waits until the default compute is ready. Pass `org_id` with a is optional: organization API keys use their organization; personal API key. keys auto-select when unambiguous and otherwise return the IDs to choose from. Does not return a connection string; call `get_connection_string` with the […]
as served: 2026-09-11 → 2026-09-12
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_projects description
[…] limit to cap how many. There is no `cursor` argument. Pass `org_id` with a is optional: organization API keys use their organization; personal API key keys auto-select when unambiguous and otherwise return the IDs to list that org's projects. choose from.
as served: 2026-09-11 → 2026-09-12
2026-08-28 → 2026-08-29 2 breaking 39 warning 94 info 35 tools
86 input-property-renamed33 description-changed6 input-required-property-added5 input-optional-property-removed2 input-required-property-removed2 operation-removed1 input-type-narrowedas served: 2026-08-28 → 2026-08-29on the index
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
compare_database_schema description
<use_case> Use this tool to compare the schema of a database between two branches. The output of the tool is a JSON object with one field: `diff`. <example> ```json { "diff": "--- a/neondb +++ b/neondb @@ -27,7 +27,10 @@ CREATE TABLE public.users ( id integer NOT NULL, - username character varying(50) NOT NULL + username character varying(50) NOT NULL, + is_deleted boolean DEFAULT false NOT NULL, + created_at timestamp with time zone DEFAULT now() NOT NULL, + updated_at timestamp with time zone ); @@ -79,6 +82,13 @@ -- +-- Name: users_created_at_idx; Type: INDEX; Schema: public; Owner: neondb_owner +-- + +CREATE INDEX users_created_at_idx ON public.users USING btree (created_at DESC) WHERE (is_deleted = false); + + +-- -- Name: DEFAULT PRIVILEGES FOR SEQUENCES; Type: DEFAULT ACL; Schema: public; Owner: cloud_admin -- " } ``` </example> At this field you will find a difference between two schemas. The diff represents the changes required to make the parent branch schema match the child branch schema. The diff field contains a unified diff (git-style patch) as a string. You MUST be able to generate a zero-downtime migration from the diff and apply it to the parent branch. (This branch is a child and has a parent. You can get parent id just querying the branch details.) </use_case> <important_notes> To generate schema diff, you MUST SPECIFY the `database_name`. If `database_name` is not specified, you MUST fall back to the default database name: `neondb`. You MUST TAKE INTO ACCOUNT the PostgreSQL version. The PostgreSQL version is the same for both branches. You MUST ASK user consent before running each generated SQL query. You SHOULD USE `run_sql` tool to run each generated SQL query. You SHOULD suggest creating a backup or point-in-time restore before running the migration. Generated queries change the schema of the parent branch and MIGHT BE dangerous to execute. Generated SQL migrations SHOULD be idempotent where possible (i.e., safe to run multiple times without failure) and include `IF NOT EXISTS` / `IF EXISTS` where applicable. You SHOULD recommend including comments in generated SQL linking back to diff hunks (e.g., `-- from diff @@ -27,7 +27,10 @@`) to make audits easier. Generated SQL should be reviewed for dependencies (e.g., foreign key order) before execution. </important_notes> <next_steps> After executing this tool, you MUST follow these steps: 1. Review the schema diff and suggest generating a zero-downtime migration. 2. Follow these instructions to respond to the client: <response_instructions> <instructions> Provide brief information about the changes: * Tables * Views * Indexes * Ownership * Constraints * Triggers * Policies * Extensions * Schemas * Sequences * Tablespaces * Users * Roles * Privileges </instructions> </response_instructions> 3. If a migration fails, you SHOULD guide the user on how to revert the schema changes, for example by using backups, point-in-time restore, or generating reverse SQL statements (if safe). </next_steps> This tool: 1. Generates a diff between the child branch and its parent. 2. Generates a SQL migration from the diff. 3. Suggest generating zero-downtime migration. <workflow> 1. User asks you to generate a diff between two branches. 2. You suggest generating a SQL migration from the diff. 3. Ensure the generated migration is zero-downtime; otherwise, warn the user. 4. You ensure that your suggested migration is also matching the PostgreSQL version. 5. You use `run_sql` tool to run each generated SQL query and ask the user consent before running it. Before requesting user consent, present a summary of all generated SQL statements along with their potential impact (e.g., table rewrites, lock risks, validation steps) so the user can make an informed decision. 6. Propose to rerun the schema diff tool one more time to ensure that the migration is applied correctly. 7. If the diff is empty, confirm that the parent schema now matches the child schema. 8. If the diff is not empty after migration, warn the user and assist in resolving the remaining differences. </workflow> <hints> <hint> Adding the column with a `DEFAULT` static value will not have any locks. But if the function is called that is not deterministic, it will have locks. <example> ```sql -- No table rewrite, minimal lock time ALTER TABLE users ADD COLUMN status text DEFAULT 'active'; ``` </example> There is an example of a case where the function is not deterministic and will have locks: <example> ```sql -- Table rewrite, potentially longer lock time ALTER TABLE users ADD COLUMN created_at timestamptz DEFAULT now(); ``` The fix for this is next: ```sql -- Adding a nullable column first ALTER TABLE users ADD COLUMN created_at timestamptz; -- Setting the default value because the rows are updated UPDATE users SET created_at = now(); ``` </example> </hint> <hint> Adding constraints in two phases (including foreign keys) <example> ```sql -- Step 1: Add constraint without validating existing data -- Fast - only blocks briefly to update catalog ALTER TABLE users ADD CONSTRAINT users_age_positive CHECK (age > 0) NOT VALID; -- Step 2: Validate existing data (can take time but doesn't block writes) -- Uses SHARE UPDATE EXCLUSIVE lock - allows reads/writes ALTER TABLE users VALIDATE CONSTRAINT users_age_positive; ``` </example> <example> ```sql -- Step 1: Add foreign key without validation -- Fast - only updates catalog, doesn't validate existing data ALTER TABLE orders ADD CONSTRAINT orders_user_id_fk FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID; -- Step 2: Validate existing relationships -- Can take time but allows concurrent operations ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fk; ``` </example> </hint> <hint> Setting columns to NOT NULL <example> ```sql -- Step 1: Add a check constraint (fast with NOT VALID) ALTER TABLE users ADD CONSTRAINT users_email_not_null CHECK (email IS NOT NULL) NOT VALID; -- Step 2: Validate the constraint (allows concurrent operations) ALTER TABLE users VALIDATE CONSTRAINT users_email_not_null; -- Step 3: Set NOT NULL (fast since constraint guarantees no nulls) ALTER TABLE users ALTER COLUMN email SET NOT NULL; -- Step 4: Drop the redundant check constraint ALTER TABLE users DROP CONSTRAINT users_email_not_null; ``` </example> <example> For PostgreSQL v18+ (to get PostgreSQL version, you can use `describe_project` tool or `run_sql` tool and execute `SELECT version();` query) ```sql -- PostgreSQL 18+ - Simplified approach ALTER TABLE users ALTER COLUMN email SET NOT NULL NOT VALID; ALTER TABLE users VALIDATE CONSTRAINT users_email_not_null; ``` </example> </hint> <hint> In some cases, you need to combine two approaches to achieve a zero-downtime migration. <example> ```sql -- Step 1: Adding a nullable column first ALTER TABLE users ADD COLUMN created_at timestamptz; -- Step 2: Updating the all rows with the default value UPDATE users SET created_at = now() WHERE created_at IS NULL; -- Step 3: Creating a not null constraint ALTER TABLE users ADD CONSTRAINT users_created_at_not_null CHECK (created_at IS NOT NULL) NOT VALID; -- Step 4: Validating the constraint ALTER TABLE users VALIDATE CONSTRAINT users_created_at_not_null; -- Step 5: Setting the column to NOT NULL ALTER TABLE users ALTER COLUMN created_at SET NOT NULL; -- Step 6: Dropping the redundant NOT NULL constraint ALTER TABLE users DROP CONSTRAINT users_created_at_not_null; -- Step 7: Adding the default value ALTER TABLE users ALTER COLUMN created_at SET DEFAULT now(); ``` </example> For PostgreSQL v18+ <example> ```sql -- Step 1: Adding a nullable column first ALTER TABLE users ADD COLUMN created_at timestamptz; -- Step 2: Updating the all rows with the default value UPDATE users SET created_at = now() WHERE created_at IS NULL; -- Step 3: Creating a not null constraint ALTER TABLE users ALTER COLUMN created_at SET NOT NULL NOT VALID; -- Step 4: Validating the constraint ALTER TABLE users VALIDATE CONSTRAINT users_created_at_not_null; -- Step 5: Adding the default value ALTER TABLE users ALTER COLUMN created_at SET DEFAULT now(); ``` </example> </hint> <hint> Create index CONCURRENTLY <example> ```sql CREATE INDEX CONCURRENTLY idx_users_email ON users (email); ``` </example> </hint> <hint> Drop index CONCURRENTLY <example> ```sql DROP INDEX CONCURRENTLY idx_users_email; ``` </example> </hint> <hint> Create materialized view WITH NO DATA <example> ```sql CREATE MATERIALIZED VIEW mv_users AS SELECT name FROM users WITH NO DATA; ``` </example> </hint> <hint> Refresh materialized view CONCURRENTLY <example> ```sql REFRESH MATERIALIZED VIEW CONCURRENTLY mv_users; ``` </example> </hint> </hints> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> Compare one database's SQL schema on a branch to another. `database_name` is required. Omit `base_branch_id` to compare against the parent; it is a branch id (`br-...`), not a name. Pass `lsn`, `timestamp`, `base_lsn`, or `base_timestamp` only for a point-in-time comparison. branch_id is a branch id (br-...), not a branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
compare_database_schema inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID of the branch","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
compare_database_schema inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
compare_database_schema inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
complete_database_migration description
Complete Apply or discard a database prepared migration by applying changes to the main branch and cleaning up delete the temporary branch. NEVER run autonomously; always ask the user first first. Pass migration_id, migration_sql, database_name, project_id, temporary_branch_id, and verify in the temporary branch. <important_notes> You MUST pass ALL values from the `prepare_database_migration` response: - migrationId: The migration ID - migrationSql: The exact SQL parent_branch_id from prepare step - databaseName: The database name - projectId: The project ID - temporaryBranchId: The temporary branch to delete - parentBranchId: The branch to apply migration to - applyChanges: prepare_database_migration. Set to true to apply the migration, or apply_changes false to just delete the temp branch without applying </important_notes> <workflow> 1. If applyChanges is true, discard; omitting it applies the migration SQL to the parent branch 2. Deletes the temporary branch (cleanup) 3. Returns confirmation of the operation </workflow> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> migration.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputapplyChanges
their contract · 2026-08-28
{"name":"applyChanges","schema":{"default":true,"description":"Whether to apply the migration. Set to false to …","type":"boolean"}}
their contract · 2026-08-29
{"name":"apply_changes","schema":{"default":true,"description":"Whether to apply the migration. Set to false to …","type":"boolean"}}
location
input.applyChanges
full fragment
{"name":"applyChanges","schema":{"default":true,"description":"Whether to apply the migration. Set to false to just delete the temp branch without applying.","type":"boolean"}}
{"name":"apply_changes","schema":{"default":true,"description":"Whether to apply the migration. Set to false to just delete the temp branch without applying.","type":"boolean"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The database name. Pass the exact value from pre…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The database name. Pass the exact value from pre…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The database name. Pass the exact value from prepare_database_migration.","type":"string"}}
{"name":"database_name","schema":{"description":"The database name. Pass the exact value from prepare_database_migration.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputmigrationId
their contract · 2026-08-28
{"name":"migrationId","schema":{"description":"The migration ID from prepare_database_migration…","type":"string"}}
their contract · 2026-08-29
{"name":"migration_id","schema":{"description":"The migration ID from prepare_database_migration…","type":"string"}}
location
input.migrationId
full fragment
{"name":"migrationId","schema":{"description":"The migration ID from prepare_database_migration.","type":"string"}}
{"name":"migration_id","schema":{"description":"The migration ID from prepare_database_migration.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputmigrationSql
their contract · 2026-08-28
{"name":"migrationSql","schema":{"description":"The SQL statements to apply. Pass the exact valu…","type":"string"}}
their contract · 2026-08-29
{"name":"migration_sql","schema":{"description":"The SQL statements to apply. Pass the exact valu…","type":"string"}}
location
input.migrationSql
full fragment
{"name":"migrationSql","schema":{"description":"The SQL statements to apply. Pass the exact value from prepare_database_migration.","type":"string"}}
{"name":"migration_sql","schema":{"description":"The SQL statements to apply. Pass the exact value from prepare_database_migration.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputparentBranchId
their contract · 2026-08-28
{"name":"parentBranchId","schema":{"description":"The parent branch ID where migration will be app…","type":"string"}}
their contract · 2026-08-29
{"name":"parent_branch_id","schema":{"description":"The parent branch ID where migration will be app…","type":"string"}}
location
input.parentBranchId
full fragment
{"name":"parentBranchId","schema":{"description":"The parent branch ID where migration will be applied.","type":"string"}}
{"name":"parent_branch_id","schema":{"description":"The parent branch ID where migration will be applied.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The project ID. Pass the exact value from prepar…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The project ID. Pass the exact value from prepar…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The project ID. Pass the exact value from prepare_database_migration.","type":"string"}}
{"name":"project_id","schema":{"description":"The project ID. Pass the exact value from prepare_database_migration.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_database_migration inputtemporaryBranchId
their contract · 2026-08-28
{"name":"temporaryBranchId","schema":{"description":"The temporary branch ID to delete after migratio…","type":"string"}}
their contract · 2026-08-29
{"name":"temporary_branch_id","schema":{"description":"The temporary branch ID to delete after migratio…","type":"string"}}
location
input.temporaryBranchId
full fragment
{"name":"temporaryBranchId","schema":{"description":"The temporary branch ID to delete after migration.","type":"string"}}
{"name":"temporary_branch_id","schema":{"description":"The temporary branch ID to delete after migration.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
complete_query_tuning description
Complete a query tuning session by either applying the changes to the main branch Apply or discarding them. NEVER run autonomously; always ask the user first discard query-tuning changes and verify on delete the temporary branch. <important_notes> BEFORE RUNNING THIS TOOL: test out the changes in the temporary branch first by running - `run_sql` with the NEVER run autonomously. Before calling, apply suggested DDL statements. - `explain_sql_statement` SQL with the original query and run_sql on the temporary branch. This tool is the ONLY way to finally apply changes after the `prepare_query_tuning` tool to the main branch. You MUST NOT use `prepare_database_migration` or other tools to apply query tuning changes. You MUST pass branch and re-run explain_sql_statement. Pass the `tuning_id` obtained tuning_id from the `prepare_query_tuning` tool, NOT the temporary branch ID as `tuning_id` to this tool. You MUST pass prepare_query_tuning, not the temporary branch ID used in the `prepare_query_tuning` tool as TEMPORARY branchId id, plus temporary_branch_id. Set apply_changes true to apply; omitting it discards. Call this tool. The tool OPTIONALLY receives a second branch ID or name which can be used instead of the main branch to apply the changes. This tool MUST be called after tool `prepare_query_tuning` even when the user rejects the changes, to ensure proper cleanup of temporary branches. </important_notes> This tool: 1. Applies suggested changes (like creating indexes) to the main branch (or specified branch) if approved 2. Handles cleanup of temporary branch 3. Must be called even when changes are rejected to ensure proper cleanup Workflow: 1. After `prepare_query_tuning` suggests changes 2. User reviews and approves/rejects changes 3. This tool is called to either: - Apply approved changes to main branch and cleanup - OR just cleanup if changes are rejected <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> changes. Do not use prepare_database_migration.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputapplyChanges
their contract · 2026-08-28
{"name":"applyChanges","schema":{"default":false,"description":"Whether to apply the suggested changes to the ma…","type":"boolean"}}
their contract · 2026-08-29
{"name":"apply_changes","schema":{"default":false,"description":"Whether to apply the suggested changes to the ma…","type":"boolean"}}
location
input.applyChanges
full fragment
{"name":"applyChanges","schema":{"default":false,"description":"Whether to apply the suggested changes to the main branch","type":"boolean"}}
{"name":"apply_changes","schema":{"default":false,"description":"Whether to apply the suggested changes to the main branch","type":"boolean"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID or name of the branch that receives the c…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"The ID or name of the branch that receives the c…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"The ID or name of the branch that receives the changes. If not provided, the default (main) branch will be used.","type":"string"}}
{"name":"branch_id","schema":{"description":"The ID or name of the branch that receives the changes. If not provided, the default (main) branch will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database to execute the query ag…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database to execute the query ag…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database to execute the query against","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputroleName
their contract · 2026-08-28
{"name":"roleName","schema":{"description":"The name of the role to connect with. If you hav…","type":"string"}}
their contract · 2026-08-29
{"name":"role_name","schema":{"description":"The name of the role to connect with. If you hav…","type":"string"}}
location
input.roleName
full fragment
{"name":"roleName","schema":{"description":"The name of the role to connect with. If you have used a specific role in prepare_query_tuning you MUST pass the same role again to this tool. If not provided, the default role (usually \"neondb_owner\") will be used.","type":"string"}}
{"name":"role_name","schema":{"description":"The name of the role to connect with. If you have used a specific role in prepare_query_tuning you MUST pass the same role again to this tool. If not provided, the default role (usually \"neondb_owner\") will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputshouldDeleteTemporaryBranch
their contract · 2026-08-28
{"name":"shouldDeleteTemporaryBranch","schema":{"default":true,"description":"Whether to delete the temporary branch after tun…","type":"boolean"}}
their contract · 2026-08-29
{"name":"should_delete_temporary_branch","schema":{"default":true,"description":"Whether to delete the temporary branch after tun…","type":"boolean"}}
location
input.shouldDeleteTemporaryBranch
full fragment
{"name":"shouldDeleteTemporaryBranch","schema":{"default":true,"description":"Whether to delete the temporary branch after tuning","type":"boolean"}}
{"name":"should_delete_temporary_branch","schema":{"default":true,"description":"Whether to delete the temporary branch after tuning","type":"boolean"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputsuggestedSqlStatements
their contract · 2026-08-28
{"name":"suggestedSqlStatements","schema":{"description":"The SQL DDL statements to execute to improve per…","items":{…},"type":"array"}}
their contract · 2026-08-29
{"name":"suggested_sql_statements","schema":{"description":"The SQL DDL statements to execute to improve per…","items":{…},"type":"array"}}
location
input.suggestedSqlStatements
full fragment
{"name":"suggestedSqlStatements","schema":{"description":"The SQL DDL statements to execute to improve performance. These statements are the result of the prior steps, for example creating additional indexes.","items":{"type":"string"},"type":"array"}}
{"name":"suggested_sql_statements","schema":{"description":"The SQL DDL statements to execute to improve performance. These statements are the result of the prior steps, for example creating additional indexes.","items":{"type":"string"},"type":"array"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputtemporaryBranchId
their contract · 2026-08-28
{"name":"temporaryBranchId","schema":{"description":"The ID of the temporary branch that needs to be …","type":"string"}}
their contract · 2026-08-29
{"name":"temporary_branch_id","schema":{"description":"The ID of the temporary branch that needs to be …","type":"string"}}
location
input.temporaryBranchId
full fragment
{"name":"temporaryBranchId","schema":{"description":"The ID of the temporary branch that needs to be deleted after tuning.","type":"string"}}
{"name":"temporary_branch_id","schema":{"description":"The ID of the temporary branch that needs to be deleted after tuning.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
complete_query_tuning inputtuningId
their contract · 2026-08-28
{"name":"tuningId","schema":{"description":"The ID of the tuning to complete. This is NOT th…","type":"string"}}
their contract · 2026-08-29
{"name":"tuning_id","schema":{"description":"The ID of the tuning to complete. This is NOT th…","type":"string"}}
location
input.tuningId
full fragment
{"name":"tuningId","schema":{"description":"The ID of the tuning to complete. This is NOT the branch ID. Remember this ID from the prior step using tool prepare_query_tuning.","type":"string"}}
{"name":"tuning_id","schema":{"description":"The ID of the tuning to complete. This is NOT the branch ID. Remember this ID from the prior step using tool prepare_query_tuning.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
breaking catalog operation-removed Every call to that tool now fails; an agent that learned it yesterday has nothing to call today. credentialed #
configure_neon_auth
their contract · 2026-08-28
"configure_neon_auth"
their contract · 2026-08-29
absent
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
create_branch description
Create Creates a branch in with a Neon project for isolated development or testing. By default the branch read-write compute and waits until it is created from the project's default branch; pass `parentId` to fork an existing non-default branch instead (e.g. ready. Pass `no_compute: true` to make a disposable copy of skip the endpoint. Does not return a dev/staging branch). <notice> Notice: Write mode active. Destructive tools are exposed. For tools connection string; call `get_connection_string` with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> project and branch id. Copies the parent at HEAD; point-in-time restore is `restore_snapshot`.
as served: 2026-08-28 → 2026-08-29
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
create_branch inputbranchName
their contract · 2026-08-28
{"description":"An optional name for the branch","type":"string"}
their contract · 2026-08-29
absent
location
input.branchName
as served: 2026-08-28 → 2026-08-29
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
create_branch inputexpiresAt
their contract · 2026-08-28
{"description":"An optional ISO 8601 timestamp after which Neon …","type":"string"}
their contract · 2026-08-29
absent
location
input.expiresAt
full fragment
{"description":"An optional ISO 8601 timestamp after which Neon automatically deletes the branch.","type":"string"}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
create_branch inputparentId
their contract · 2026-08-28
{"name":"parentId","schema":{"description":"An optional branch ID (e.g. 'br-...') to branch …","type":"string"}}
their contract · 2026-08-29
{"name":"parent_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.parentId
full fragment
{"name":"parentId","schema":{"description":"An optional branch ID (e.g. 'br-...') to branch from. If omitted, the branch is created from the project's default branch. Use this to fork an existing non-default branch — for example, to make an isolated copy of a dev/staging branch for experimentation.","type":"string"}}
{"name":"parent_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
create_branch inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to create the branch in","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
create_project description
Create Creates a new Neon project with a default database and branch. If someone waits until the default compute is trying to create ready. Pass `org_id` with a database, use this tool. Returns personal API key. Does not return a connection string for the new project automatically. Supports optional `org_id` (assign to a specific organization) and `name` parameters. <notice> Notice: Write mode active. Destructive tools are exposed. For tools string; call `get_connection_string` with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> project id.
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
delete_branch description
[…] data. NEVER run autonomously; always ask the user first. For deleting an entire the whole project, use `delete_project` instead. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> `delete_project`. branch_id is a branch id (br-...), not a branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
delete_branch inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID of the branch to delete","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
delete_branch inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project containing the branch","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
delete_project description
[…] data. NEVER run autonomously; always ask the user first. For removing a single branches, branch, use `delete_branch` instead. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> `delete_branch`.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
delete_project inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to delete","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
describe_branch description
[…] names (use `get_database_tables` instead) or column detail (use `describe_table_schema` instead). <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_branch inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An ID of the branch to describe","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An ID of the branch to describe","type":"string"}}
location
input.branchId
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_branch inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_branch inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
describe_project description
Get details and configuration of a specific Neon project. Do not use when you need to list all projects (use `list_projects` instead). <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask Retrieves the user first. </notice> project record (settings, compute, usage). Call `list_branches` for branches.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_project inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to describe","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
describe_table_schema description
[…] you need all tables in a database (use `get_database_tables` instead). <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_table_schema inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_table_schema inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_table_schema inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
describe_table_schema inputtableName
their contract · 2026-08-28
{"name":"tableName","schema":{"description":"The table name, optionally schema-qualified (for…","type":"string"}}
their contract · 2026-08-29
{"name":"table_name","schema":{"description":"The table name, optionally schema-qualified (for…","type":"string"}}
location
input.tableName
full fragment
{"name":"tableName","schema":{"description":"The table name, optionally schema-qualified (for example, crm.contacts)","type":"string"}}
{"name":"table_name","schema":{"description":"The table name, optionally schema-qualified (for example, crm.contacts)","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
explain_sql_statement description
[…] need to execute the query for results (use `run_sql` instead). <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
explain_sql_statement inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
explain_sql_statement inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
explain_sql_statement inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
fetch description
[…] or branch using the ID returned by the `search` tool. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
get_connection_string description
Get a PostgreSQL connection string for a Neon database. The branch must have a compute endpoint. `create_project` and `create_branch` do not return one; call this after they succeed. All parameters are optional; the tool resolves the project, branch, […] who needs a DATABASE_URL must copy it from https://console.neon.tech manually. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_connection_string inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID or name of the branch. If not provided, t…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"The ID or name of the branch. If not provided, t…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"The ID or name of the branch. If not provided, the default branch will be used.","type":"string"}}
{"name":"branch_id","schema":{"description":"The ID or name of the branch. If not provided, the default branch will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_connection_string inputcomputeId
their contract · 2026-08-28
{"name":"computeId","schema":{"description":"The ID of the compute/endpoint. If not provided,…","type":"string"}}
their contract · 2026-08-29
{"name":"compute_id","schema":{"description":"The ID of the compute/endpoint. If not provided,…","type":"string"}}
location
input.computeId
full fragment
{"name":"computeId","schema":{"description":"The ID of the compute/endpoint. If not provided, the read-write compute associated with the branch will be used.","type":"string"}}
{"name":"compute_id","schema":{"description":"The ID of the compute/endpoint. If not provided, the read-write compute associated with the branch will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_connection_string inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_connection_string inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project. If not provided, the only…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project. If not provided, the only…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project. If not provided, the only available project will be used.","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project. If not provided, the only available project will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_connection_string inputroleName
their contract · 2026-08-28
{"name":"roleName","schema":{"description":"The name of the role to connect with. If not pro…","type":"string"}}
their contract · 2026-08-29
{"name":"role_name","schema":{"description":"The name of the role to connect with. If not pro…","type":"string"}}
location
input.roleName
full fragment
{"name":"roleName","schema":{"description":"The name of the role to connect with. If not provided, the database owner name will be used.","type":"string"}}
{"name":"role_name","schema":{"description":"The name of the role to connect with. If not provided, the database owner name will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
get_database_tables description
[…] need column-level detail for a specific table (use `describe_table_schema` instead). <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_database_tables inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch. If not provided th…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch. If not provided th…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_database_tables inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_database_tables inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
get_doc_resource description
<use_case> Fetches a specific Fetch one Neon documentation page as markdown content. Use the list_docs_resources tool first to discover available page slugs, then pass the slug to this tool. Use this tool when: - You have identified a specific docs page to fetch (from list_docs_resources results) - You need detailed guidance on a Neon feature, workflow, or configuration - The user needs step-by-step instructions for markdown. Pass a Neon-related task </use_case> <workflow> 1. First call list_docs_resources to get the index of available pages 2. Pick the relevant page slug from the list (e.g. "docs/guides/prisma.md") 3. Call this tool with that slug to get the full page content as markdown </workflow> <important_notes> - The slug parameter is the path portion of the docs .md URL (e.g. "docs/connect/connection-pooling.md") - Slugs use .md file endings matching the URLs in the documentation index - Always use list_docs_resources first to discover the correct slug — do not guess slugs - This tool fetches the page directly from https://neon.com/{slug} as markdown - Returns the full documentation page content as markdown text </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> (for example docs/guides/prisma.md).
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
get_neon_auth_config description
Read full Neon Auth configuration for a branch. Do not use when you need to update config (use `configure_neon_auth` instead). Requires Neon Auth to be provisioned first (use `provision_neon_auth`). Returns Neon Auth (Better Auth) for a branch as one JSON object: integration metadata (base_url, jwks_url, db_name, auth_provider, branch_id, created_at, owned_by, transfer_status, auth_provider_project_id), branch_name from the Neon branch API, project_id and resolved branch_id, plus the same configurable fields as configure_neon_auth (trusted_origins, allow_localhost, auth_methods.email_password with enabled, allow_sign_up, verify_email_on_sign_up, verify_email_on_sign_in, email_verification_method, require_email_verification, auto_sign_in_after_verification, oauth_providers (id, type, client_id, client_secret), email_provider (discriminated by type)). Top-level base_url, jwks_url, and db_name duplicate integration for quick copy. Optional _errors records partial fetch failures for configurable slices. Secrets — OAuth client_secret and the SMTP password — are NEVER returned. When the upstream config indicates a secret is set, this endpoint surfaces it secrets redacted as the literal sentinel "***redacted***"; when no secret is set the field is null. Use the matching configure_neon_auth operations to write or rotate these values. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user "***redacted***". Requires provision_neon_auth first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_neon_auth_config inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"Branch ID. If omitted, the project default branc…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"Branch ID. If omitted, the project default branc…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"Branch ID. If omitted, the project default branch is used (same as provision_neon_auth).","type":"string"}}
{"name":"branch_id","schema":{"description":"Branch ID. If omitted, the project default branch is used (same as provision_neon_auth).","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
get_neon_auth_config inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"Neon project ID","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"Neon project ID","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
inspect_database description
<use_case> Reach for this first when asked why a database is slow, large, bloated, or behind. It runs Run one predefined, read-only Postgres diagnostic against a Neon branch — pick the one that answers the question from the neon inspect db check (pick `check` parameter's list, instead of writing catalog SQL by hand. These are the same checks as from the `neon inspect db` CLI command. </use_case> <important_notes> input schema). Not for: for arbitrary SQL (`run_sql`), the slowest queries by average execution time with your own threshold and limit (`list_slow_queries`), the plan of one statement statement's plan (`explain_sql_statement`), applying an optimization (`prepare_query_tuning`), compute and Neon Function logs (`query_logs`), or listing tables and columns (`get_database_tables`, `describe_table_schema`). Several checks read alike and are not: `long-running-queries` is what is running right now in the inspected database and has been for over five minutes; `stalled-queries` is a compute-wide snapshot of active queries running longer than 30 seconds with parallel-worker grouping, waits, and blockers; `outliers` is cumulative execution time since statistics were last reset; and `calls` is call frequency over that same history. applying indexes (`prepare_query_tuning`). Omit `databaseName` `database_name` to run a database-scoped check against cover every database on the branch. The result adds a `database` column. `stalled-queries`, `lfc-hit-rate`, `working-set`, and `replication-slots` database; some checks are compute-wide: they run once against the first listed database. For `lfc-hit-rate` and `working-set`, cache counters reset when the compute restarts. One failing database fails the whole run. `bloat` is a statistical estimate, not a measurement. When compute-wide. If a check needs an extension that is not installed, extension, the tool says so and names the `CREATE EXTENSION` statement. Installing it writes to the user's database — EXTENSION`; ask before running it. </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
inspect_database inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch. If not provided th…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch. If not provided th…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
inspect_database inputcomputeId
their contract · 2026-08-28
{"name":"computeId","schema":{"description":"The ID of the compute/endpoint. If not provided,…","type":"string"}}
their contract · 2026-08-29
{"name":"compute_id","schema":{"description":"The ID of the compute/endpoint. If not provided,…","type":"string"}}
location
input.computeId
full fragment
{"name":"computeId","schema":{"description":"The ID of the compute/endpoint. If not provided, the read-write compute associated with the branch will be used.","type":"string"}}
{"name":"compute_id","schema":{"description":"The ID of the compute/endpoint. If not provided, the read-write compute associated with the branch will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
inspect_database inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"Database to inspect. Omit to cover every databas…","minLength":1,"type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"For a database-scoped check, the database to ins…","minLength":1,"type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"Database to inspect. Omit to cover every database on the branch. Ranking and SQL row limits stay per database. One failing database fails the whole run. Compute-wide checks run once against the first listed database. The response `limit` applies to the combined rows after that.","minLength":1,"type":"string"}}
{"name":"database_name","schema":{"description":"For a database-scoped check, the database to inspect. Omit to cover every database on the branch. Ranking and SQL row limits stay per database. One failing database fails the whole run. For a compute-wide check, the database to connect through; the check still runs once for the whole compute and the result does not include `databaseName`. The response `limit` applies to the combined rows after that.","minLength":1,"type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
inspect_database inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to inspect","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to inspect","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_branch_computes description
List Retrieves a list of compute endpoints for a project or the specified branch. Do branch_id is a branch id (br-...), not use when you need a connection string: use `get_connection_string`, which requires write access and is unavailable in read-only mode. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_branch_computes inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID of the branch. If provided, endpoints for…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"The ID of the branch. If provided, endpoints for this specific branch will be listed.","type":"string"}}
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_branch_computes inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project. If not provided, the only…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project. If not provided, the only available project will be used.","type":"string"}}
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_docs_resources description
<use_case> Lists all available Neon documentation pages by fetching the index from https://neon.com/docs/llms.txt. Returns a markdown index of documentation page URLs (with .md file endings) and titles that can be fetched individually using the get_doc_resource tool. Use this tool when: - You need to find the right Neon documentation page for a topic - The user asks about List Neon features, setup, configuration, or best practices - You want to discover what documentation is available before fetching a specific page - The user says "Get started with Neon" or similar onboarding phrases </use_case> <workflow> 1. slugs from neon.com/docs/llms.txt. Call this tool (no parameters needed) to get the full list of Neon docs pages 2. Identify the relevant page(s) based on the user's question 3. Use the get_doc_resource tool with the page slug (including .md extension) to fetch the full content </workflow> <important_notes> - This tool returns a markdown index of all Neon documentation pages with their .md URLs - Documentation URLs use .md file endings (e.g. https://neon.com/docs/guides/prisma.md) - Always call this tool first before using get_doc_resource to find the correct slug - Do get_doc_resource; do not guess documentation page slugs — use this index to find them </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> slugs.
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_log_field_values description
List the Lists distinct values of for a low-cardinality log field (e.g. all service_name or severity_text values seen) within a branch and time window. Use values with the corresponding query_logs structured input when one exists, or with raw logql otherwise. The field must be one of the names list_log_fields reports field. Call `list_log_fields` first for the branch; anything else is rejected as an unknown `field_name`; a field rather than returning an empty list. `truncated: true` means more distinct values exist than were returned because the endpoint's result limit branch has never emitted returns `unknown_field`. Pass `since` or server scan cap was reached, so the list `start_time`, not both; default is an arbitrary subset — narrow the time window and ask again before filtering on it. Logs require the Neon Platform Beta and are currently only available for projects in the aws-us-east-2 region. A previous six hours, max seven days. Private beta. branch_id is a branch without logs access returns HTTP 404 with reason "telemetry_not_enabled". <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> id (br-...), not a branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_log_field_values inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID of the branch. Defaults to the project's …","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"The ID of the branch. Defaults to the project's default branch.","type":"string"}}
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
list_log_field_values inputfield
their contract · 2026-08-28
{"description":"The log field (label) whose distinct values to l…","minLength":1,"type":"string"}
their contract · 2026-08-29
absent
location
input.field
full fragment
{"description":"The log field (label) whose distinct values to list, e.g. \"service_name\" or \"severity_text\". Use list_log_fields to discover valid field names.","minLength":1,"type":"string"}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_log_field_values inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project. Defaults to your only pro…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project. Defaults to your only project if unambiguous.","type":"string"}}
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning input input-required-property-added A caller that does not send the new field is rejected, with no change on its own side. credentialed #
list_log_field_values inputfield_name
their contract · 2026-08-28
absent
their contract · 2026-08-29
{"minLength":1,"type":"string"}
location
input.field_name
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_log_fields description
List Lists the low-cardinality log fields whose values list_log_field_values can enumerate for a observed on this branch. The endpoint currently returns `service_name`, `severity_text`, `scope_name`, and `entity_type`. Call this tool instead of hardcoding that set so clients remain compatible if the endpoint adds fields. Fields without `list_log_field_values` with `field_name` to list distinct values. branch_id is a structured query_logs input can be filtered through raw logql. Logs require the Neon Platform Beta and are currently only available for projects in the aws-us-east-2 region. A branch without logs access returns HTTP 404 with reason "telemetry_not_enabled". <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> id (br-...), not a branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_log_fields inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID of the branch. Defaults to the project's …","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"The ID of the branch. Defaults to the project's default branch.","type":"string"}}
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_log_fields inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project. Defaults to your only pro…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project. Defaults to your only project if unambiguous.","type":"string"}}
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_organizations description
[…] Supports optional `search` parameter to filter by name or ID. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_projects description
List Neon projects in your account. Do not use for projects shared with you (use `list_shared_projects` instead). Supports optional `search` (filter by name or ID) and `limit` (default 10) parameters. <notice> Notice: Write mode active. Destructive tools are exposed. For tools own. Returns every page. Pass limit to cap how many. There is no `cursor` argument. Pass `org_id` with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> a personal API key to list that org's projects.
as served: 2026-08-28 → 2026-08-29
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
list_projects inputcursor
their contract · 2026-08-28
{"description":"Specify the cursor value from the previous respo…","type":"string"}
their contract · 2026-08-29
absent
location
input.cursor
full fragment
{"description":"Specify the cursor value from the previous response to retrieve the next batch of projects.","type":"string"}
as served: 2026-08-28 → 2026-08-29
info input input-type-narrowed A caller sending the dropped type is rejected. credentialed #
list_projects inputlimit
their contract · 2026-08-28
{"type":"number"}
their contract · 2026-08-29
{"type":"integer"}
location
input.limit
as served: 2026-08-28 → 2026-08-29
breaking catalog operation-removed Every call to that tool now fails; an agent that learned it yesterday has nothing to call today. credentialed #
list_shared_projects
their contract · 2026-08-28
"list_shared_projects"
their contract · 2026-08-29
absent
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
list_slow_queries description
<use_case> Use this tool to list slow List queries from your Neon database. </use_case> <important_notes> This tool queries the pg_stat_statements extension to find queries that are taking longer than expected. The tool will return queries sorted by execution time, with the slowest queries first. For sizes, index and scan usage, indexes, locks, cache hit rate, cache, bloat, or replication state, use `inspect_database`. </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> inspect_database.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_slow_queries inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch. If not provided th…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch. If not provided th…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_slow_queries inputcomputeId
their contract · 2026-08-28
{"name":"computeId","schema":{"description":"The ID of the compute/endpoint. If not provided,…","type":"string"}}
their contract · 2026-08-29
{"name":"compute_id","schema":{"description":"The ID of the compute/endpoint. If not provided,…","type":"string"}}
location
input.computeId
full fragment
{"name":"computeId","schema":{"description":"The ID of the compute/endpoint. If not provided, the read-write compute associated with the branch will be used.","type":"string"}}
{"name":"compute_id","schema":{"description":"The ID of the compute/endpoint. If not provided, the read-write compute associated with the branch will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_slow_queries inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_slow_queries inputminExecutionTime
their contract · 2026-08-28
{"name":"minExecutionTime","schema":{"default":1000,"description":"Minimum execution time in milliseconds to consid…","type":"number"}}
their contract · 2026-08-29
{"name":"min_execution_time","schema":{"default":1000,"description":"Minimum execution time in milliseconds to consid…","type":"number"}}
location
input.minExecutionTime
full fragment
{"name":"minExecutionTime","schema":{"default":1000,"description":"Minimum execution time in milliseconds to consider a query as slow","type":"number"}}
{"name":"min_execution_time","schema":{"default":1000,"description":"Minimum execution time in milliseconds to consider a query as slow","type":"number"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
list_slow_queries inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to list slow queries from","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to list slow queries from","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
prepare_database_migration description
<use_case> This tool performs database schema migrations by automatically generating and executing DDL statements. Supported operations: CREATE operations: - Add new columns (e.g., "Add email column to users table") - Create new tables (e.g., "Create posts table with title and content columns") - Add constraints (e.g., "Add unique constraint on `users.email`") ALTER operations: - Modify column types (e.g., "Change posts.views to bigint") - Rename columns (e.g., "Rename user_name to username in users table") - Add/modify indexes (e.g., "Add index on `posts.title`") - Add/modify foreign keys (e.g., "Add foreign key from `posts.user_id` to `users.id`") DROP operations: - Remove columns (e.g., "Drop temporary_field from users table") - Drop tables (e.g., "Drop the old_logs table") - Remove constraints (e.g., "Remove unique constraint from posts.slug") The tool will: 1. Parse your natural language request 2. Generate appropriate SQL 3. Execute in a temporary branch for safety 4. Verify the changes before applying to main branch Project ID and database name will be automatically extracted from your request. If the database name is not provided, the default neondb or first available database is used. </use_case> <workflow> 1. Creates a temporary branch 2. Applies the migration SQL in that branch 3. Returns migration details for verification </workflow> <important_notes> After executing this tool, you MUST: 1. Test the migration in the temporary branch using the `run_sql` tool 2. Ask for confirmation before proceeding 3. Use `complete_database_migration` tool to apply changes to main branch </important_notes> <example> For a migration like: ```sql ALTER TABLE users ADD COLUMN last_login TIMESTAMP; ``` You should test it with: ```sql SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'last_login'; ``` You can use `run_sql` to test the migration in the temporary branch that this tool creates. </example> <next_steps> After executing this tool, you MUST follow these steps: 1. Use `run_sql` to verify changes on temporary branch 2. Follow these instructions to respond to the client: <response_instructions> <instructions> Provide a brief confirmation of the requested change and ask for migration commit approval. You MUST include ALL of the following fields in your response: - Migration ID (this is required for commit and must be shown first) - Temporary Branch Name (always include exact branch name) - Temporary Branch ID (always include exact ID) - Migration Result (include brief success/failure status) Even if some fields are missing from the tool's response, use placeholders like "not provided" rather than omitting fields. </instructions> <do_not_include> IMPORTANT: Your response MUST NOT contain ANY technical implementation details such as: - Data types (e.g., DO NOT mention if a column is boolean, varchar, timestamp, etc.) - Column specifications or properties - SQL syntax or statements - Constraint definitions or rules - Default values - Index types - Foreign key specifications Keep the response focused ONLY on confirming the high-level change and requesting approval. <example> INCORRECT: "I've added a boolean `is_published` column to the `posts` table..." CORRECT: "I've added the `is_published` column to the `posts` table..." </example> </do_not_include> <example> I've verified that [requested change] has been successfully applied to a temporary branch. Would you like to commit the migration `[migration_id]` to the main branch? Migration Details: - Migration ID (required for commit) - Temporary Branch Name - Temporary Branch ID - Migration Result </example> </response_instructions> 3. If approved, use `complete_database_migration` tool with the `migration_id` </next_steps> <error_handling> On error, the tool will: 1. Automatically attempt ONE retry of the exact same operation 2. If the retry fails: - Terminate execution - Return error details - DO NOT attempt any other tools or alternatives Error response will include: - Original error details - Confirmation that retry was attempted - Final error state Important: After a failed retry, you must terminate the current flow completely. Do not attempt to use alternative tools or workarounds. </error_handling> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> Apply a schema change on a temporary branch and return a migration_id. Test with run_sql on that branch, ask the user, then complete_database_migration — even if they reject, so the temporary branch is deleted. Pass every field from the prepare response.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
prepare_database_migration inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
prepare_database_migration inputmigrationSql
their contract · 2026-08-28
{"name":"migrationSql","schema":{"description":"The SQL to execute to create the migration","type":"string"}}
their contract · 2026-08-29
{"name":"migration_sql","schema":{"description":"The SQL to execute to create the migration","type":"string"}}
location
input.migrationSql
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
prepare_database_migration inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
prepare_query_tuning description
<use_case> This tool helps developers improve PostgreSQL query performance for slow queries or DML statements by analyzing execution plans and suggesting optimizations. The tool will: 1. Create a temporary branch for testing optimizations and remember the branch ID 2. Extract and analyze the current query execution plan 3. Extract all fully qualified table names (`schema.table`) referenced in the plan 4. Gather detailed schema information for each referenced table using `describe_table_schema` 5. Suggest and implement improvements like: - Adding or modifying indexes based on table schemas and query patterns - Query structure modifications - Identifying potential performance bottlenecks 6. Apply the changes to the temporary branch using `run_sql` 7. Compare performance before and after changes (but ONLY on the temporary branch passing branch ID to all tools) 8. Continue with next steps using `complete_query_tuning` tool (on `main` branch) Project ID and database name will be automatically extracted from your request. The temporary branch ID will be added when invoking other tools. Default database is `neondb` if not specified. <important_notes> This tool is part of the query tuning workflow. Any suggested changes (like creating indexes) must first be applied to the temporary branch using the `run_sql` tool. And then to the main branch using the `complete_query_tuning` tool, NOT the `prepare_database_migration` tool. To apply using the `complete_query_tuning` tool, you must pass the `tuning_id`, NOT the temporary branch ID to it. </important_notes> </use_case> <workflow> 1. Creates a temporary branch 2. Analyzes current query performance and extracts table information 3. Implements and tests improvements (using tool `run_sql` for schema modifications and `explain_sql_statement` for performance analysis, but ONLY on the temporary branch created in step 1 passing the same branch ID to all tools) 4. Returns tuning details for verification </workflow> <important_notes> After executing this tool, you MUST: 1. Review the suggested changes 2. Verify the performance improvements on temporary branch - by applying the changes with `run_sql` and running `explain_sql_statement` again) 3. Decide whether to keep or discard the changes 4. Use `complete_query_tuning` tool to apply or discard changes to the main branch DO NOT use `prepare_database_migration` tool for applying query tuning changes. Always use `complete_query_tuning` to ensure changes are properly tracked and applied. Note: - Some operations like creating indexes can take significant time on large tables - Table statistics updates (ANALYZE) are NOT automatically performed as they can be long-running - Table statistics maintenance should be handled by PostgreSQL auto-analyze or scheduled maintenance jobs - If statistics are suspected to be stale, suggest running ANALYZE as a separate maintenance task </important_notes> <example> For a query like: ```sql SELECT o.*, c.name FROM orders o JOIN customers c ON c.id = o.customer_id WHERE o.status = 'pending' AND o.created_at > '2024-01-01'; ``` The tool will: 1. Extract referenced tables: `public.orders`, `public.customers` 2. Gather schema information for both tables 3. Analyze the execution plan 4. Suggest improvements like: - Creating a composite index on orders(status, created_at) - Optimizing the join conditions 5. If confirmed, apply the suggested changes to the temporary branch using `run_sql` 6. Compare execution plans and performance before and after changes (but ONLY on the temporary branch passing branch ID to all tools) </example> <next_steps> After executing this tool, you MUST follow these steps: 1. Review the execution plans and suggested changes 2. Follow these instructions to respond to the client: <response_instructions> <instructions> Provide a brief summary of the performance analysis and ask for approval to apply changes on the temporary branch. You MUST include ALL of the following fields in your response: - Tuning ID (this is required for completion) - Temporary Branch Name - Temporary Branch ID - Original Query Cost - Improved Query Cost - Referenced Tables (list all tables found in the plan) - Suggested Changes Even if some fields are missing from the tool's response, use placeholders like "not provided" rather than omitting fields. </instructions> <do_not_include> IMPORTANT: Your response MUST NOT contain ANY technical implementation details such as: - Exact index definitions - Internal PostgreSQL settings - Complex query rewrites - Table partitioning details Keep the response focused on high-level changes and performance metrics. </do_not_include> <example> I've analyzed your query and found potential improvements that could reduce execution time by [X]%. Would you like to apply these changes to improve performance? Analysis Details: - Tuning ID: [id] - Temporary Branch: [name] - Branch ID: [id] - Original Cost: [cost] - Improved Cost: [cost] - Referenced Tables: * public.orders * public.customers - Suggested Changes: * Add index for frequently filtered columns * Optimize join conditions To apply these changes, I will use the `complete_query_tuning` tool after your approval and pass the `tuning_id`, NOT the temporary branch ID to it. </example> </response_instructions> 3. If approved, use ONLY the `complete_query_tuning` tool with the `tuning_id` </next_steps> <error_handling> On error, the tool will: 1. Automatically attempt ONE retry of the exact same operation 2. If the retry fails: - Terminate execution - Return error details - Clean up temporary branch - DO NOT attempt any other tools or alternatives Error response will include: - Original error details - Confirmation that retry was attempted - Final error state Important: After a failed retry, you must terminate the current flow completely. </error_handling> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> Analyze a slow query on a temporary branch and return a tuning_id. Apply suggested SQL with run_sql on that branch, re-run explain_sql_statement there, then complete_query_tuning with the tuning_id (not the branch id) — apply_changes true if they accept, omit it or pass false if they reject, so the temporary branch is deleted. Do not use prepare_database_migration.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
prepare_query_tuning inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database to execute the query ag…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database to execute the query ag…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database to execute the query against","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
prepare_query_tuning inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
prepare_query_tuning inputroleName
their contract · 2026-08-28
{"name":"roleName","schema":{"description":"The name of the role to connect with. If not pro…","type":"string"}}
their contract · 2026-08-29
{"name":"role_name","schema":{"description":"The name of the role to connect with. If not pro…","type":"string"}}
location
input.roleName
full fragment
{"name":"roleName","schema":{"description":"The name of the role to connect with. If not provided, the default role (usually \"neondb_owner\") will be used.","type":"string"}}
{"name":"role_name","schema":{"description":"The name of the role to connect with. If not provided, the default role (usually \"neondb_owner\") will be used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
provision_neon_auth description
Provisions Enables Neon Auth for a Neon branch. Neon Auth is a managed authentication service built on Better Auth, fully integrated with Lakebase Postgres and the rest of the Neon backend primitives. <workflow> The tool will: 1. Create the `neon_auth` schema in your database to store users, sessions, project configs and organizations 2. Set up secure Auth related APIs for your specified branch 3. Deploy by connecting it to an auth service in the same region as your Neon compute for low-latency requests 4. Return the Auth URL specific authentication provider. branch_id is a branch id (br-...), not a branch name. Call list_branches to your branch, along with credentials for your application </workflow> <key_features> - Branch-compatible: Auth data (users, sessions, config) branches with your database - Google and GitHub OAuth included out of the box - Works with RLS: JWTs are validated by the Data API for authenticated queries - Better Auth compatible: Exposes the same APIs and schema as Better Auth </key_features> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
provision_neon_auth inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch to provision Neon A…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch to provision Neon Auth for. If not provided, the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
provision_neon_auth inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The database name to provision Neon Auth for. If…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The database name to provision Neon Auth for. If not provided, the default database is used.","type":"string"}}
{"name":"database_name","schema":{"type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
provision_neon_auth inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to provision Neon Auth for","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning input input-required-property-added A caller that does not send the new field is rejected, with no change on its own side. credentialed #
provision_neon_auth inputauth_provider
their contract · 2026-08-28
absent
their contract · 2026-08-29
{"enum":["mock","stack","better_auth"],"type":"string"}
location
input.auth_provider
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
provision_neon_data_api description
Provisions the Neon Data API for Creates a Neon branch. The Data API enables HTTP-based access to your Postgres database with automatic JWT authentication support. <interactive_behavior> When called WITHOUT an authProvider: 1. Automatically checks if new instance of Neon Auth is already provisioned 2. Checks if Data API already exists 3. Returns authentication options for user selection: - neon_auth: Use Neon Auth (recommended) - external: Use external provider (Clerk, Auth0, Stytch) - none: No authentication (not recommended) 4. User selects an option, then call this tool again with authProvider in the specified When called WITH authProvider="neon_auth" and provisionNeonAuthFirst=true: - Automatically provisions Neon Auth first (if branch. branch_id is a branch id (br-...), not already set up) - Then provisions the Data API with Neon Auth integration When called WITH authProvider="none": - Provisions Data API without a pre-configured JWKS - User will need branch name. Call list_branches to manually configure resolve a JWKS URL before the Data API can be used </interactive_behavior> <workflow> The tool will: 1. Resolve the default branch if branchId is not provided 2. Resolve the default database if databaseName is not provided 3. If no authProvider: check existing config and return options for selection 4. If authProvider specified: create the Data API endpoint with that auth 5. If provisionNeonAuthFirst: set up Neon Auth before Data API 6. Return the Data API URL for your application </workflow> <key_features> - HTTP-based API: Access your Postgres database via REST endpoints - JWT Authentication: Supports Neon Auth or external providers (Clerk, Auth0, Stytch, etc.) - Row Level Security: Works with RLS policies for fine-grained access control - Branch-compatible: Data API configuration branches with your database - PostgREST-compatible: Uses the same API patterns as PostgREST </key_features> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> name.
as served: 2026-08-28 → 2026-08-29
warning input input-required-property-added A caller that does not send the new field is rejected, with no change on its own side. credentialed #
provision_neon_data_api inputbranch_id
their contract · 2026-08-28
absent
their contract · 2026-08-29
{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}
location
input.branch_id
as served: 2026-08-28 → 2026-08-29
warning input input-required-property-added A caller that does not send the new field is rejected, with no change on its own side. credentialed #
provision_neon_data_api inputdatabase_name
their contract · 2026-08-28
absent
their contract · 2026-08-29
{"type":"string"}
location
input.database_name
as served: 2026-08-28 → 2026-08-29
warning input input-required-property-added A caller that does not send the new field is rejected, with no change on its own side. credentialed #
provision_neon_data_api inputproject_id
their contract · 2026-08-28
absent
their contract · 2026-08-29
{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}
location
input.project_id
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
query_logs description
<use_case> Query logs emitted by your Neon serverless functions (and other services like storage). Logs are OpenTelemetry-based; this tool exposes them through structured filters so you don't have to write a query language. Use this tool when the user wants to: - See recent Returns logs / errors for a function or service - Investigate a failure ("why did my function error in the last hour?") - Correlate logs to a distributed trace via trace_id </use_case> <workflow> 1. For structured queries, pick the source (defaults branch. Pass `limit` to "function") and optionally narrow by serviceName, minSeverity, or bodyContains. For a raw query, supply cap how many. There is no `cursor` argument. Filters combine with AND. Pass `logql` and omit instead of structured filters. 2. Set a time window: filters, not with them. Give the window as `since` (relative, e.g. "1h" — default, optionally ending at endTime) OR startTime/endTime (absolute RFC3339). 3. Use list_log_fields / list_log_field_values first if you need to discover valid service names or severities. </workflow> <important_notes> - Logs require the Neon Platform Beta and are currently only available for projects in `start_time`, not both; default is the aws-us-east-2 region. A previous hour, max seven days; `end_time` is exclusive. Private beta; a branch without logs access returns HTTP 404 with reason "telemetry_not_enabled". - Defaults to the project's default branch and the last 1 hour if unspecified. - Results are newest-first and capped by `limit` (default 100); `truncated: true` means more records matched than were returned — narrow the filters or time range. - `minSeverity` follows OTel ordering (trace < debug < info < warn < error < fatal), so "error" also returns FATAL. - The returned preferred `logql` field and legacy `query` field contain the LogQL these filters stand for. Always pass `logql` back to refine it by hand. - Advanced: pass raw `logql` instead of the structured filters. Only stream selectors `{label="v"}` and line filters (|= |~ != !~) are supported — no aggregations or parsers. Combining `logql` with structured filters branch_id is rejected. - `query` remains available as a legacy input alias for `logql` and preserves its previous override behavior: when supplied, structured filters are ignored. Do branch id (br-...), not supply both raw fields. </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice> a branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputbodyContains
their contract · 2026-08-28
{"name":"bodyContains","schema":{"description":"Return only logs whose rendered message contains…","minLength":1,"type":"string"}}
their contract · 2026-08-29
{"name":"body_contains","schema":{"minLength":1,"type":"string"}}
location
input.bodyContains
full fragment
{"name":"bodyContains","schema":{"description":"Return only logs whose rendered message contains this case-sensitive substring. Structured messages use compact JSON, so match JSON syntax such as `\"http_status\":200`, not prose such as `http_status: 200`.","minLength":1,"type":"string"}}
{"name":"body_contains","schema":{"minLength":1,"type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"The ID of the branch whose logs to query. Defaul…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"The ID of the branch whose logs to query. Defaults to the project's default branch.","type":"string"}}
{"name":"branch_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputendTime
their contract · 2026-08-28
{"name":"endTime","schema":{"description":"Absolute end of the window, RFC3339. Ends either…","type":"string"}}
their contract · 2026-08-29
{"name":"end_time","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]…","type":"string"}}
location
input.endTime
full fragment
{"name":"endTime","schema":{"description":"Absolute end of the window, RFC3339. Ends either a relative `since` window or an absolute `startTime` window; defaults to now.","type":"string"}}
{"name":"end_time","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
query_logs inputminSeverity
their contract · 2026-08-28
{"description":"Return only logs at this OTel severity level or …","enum":["trace","debug","info","warn","error","fatal"],"type":"string"}
their contract · 2026-08-29
absent
location
input.minSeverity
full fragment
{"description":"Return only logs at this OTel severity level or above (trace \u003c debug \u003c info \u003c warn \u003c error \u003c fatal). E.g. \"error\" returns ERROR and FATAL.","enum":["trace","debug","info","warn","error","fatal"],"type":"string"}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project whose logs to query. If om…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project whose logs to query. If omitted and you have exactly one project, that project is used.","type":"string"}}
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-optional-property-removed Depending on whether the new schema forbids unknown fields, a caller still sending it is ignored or rejected; the row says which. credentialed #
query_logs inputquery
their contract · 2026-08-28
{"description":"Legacy compatibility alias for `logql`. Preserve…","minLength":1,"type":"string"}
their contract · 2026-08-29
absent
location
input.query
full fragment
{"description":"Legacy compatibility alias for `logql`. Preserves the previous behavior of overriding any structured filters. Do not supply both raw fields.","minLength":1,"type":"string"}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputserviceName
their contract · 2026-08-28
{"name":"serviceName","schema":{"description":"Filter to a specific OTel service name (service.…","minLength":1,"type":"string"}}
their contract · 2026-08-29
{"name":"service_name","schema":{"minLength":1,"type":"string"}}
location
input.serviceName
full fragment
{"name":"serviceName","schema":{"description":"Filter to a specific OTel service name (service.name).","minLength":1,"type":"string"}}
{"name":"service_name","schema":{"minLength":1,"type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputseverityText
their contract · 2026-08-28
{"name":"severityText","schema":{"description":"Filter to an exact severity text (e.g. \"ERROR\").…","minLength":1,"type":"string"}}
their contract · 2026-08-29
{"name":"severity_text","schema":{"minLength":1,"type":"string"}}
location
input.severityText
full fragment
{"name":"severityText","schema":{"description":"Filter to an exact severity text (e.g. \"ERROR\"). Takes precedence over minSeverity.","minLength":1,"type":"string"}}
{"name":"severity_text","schema":{"minLength":1,"type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputstartTime
their contract · 2026-08-28
{"name":"startTime","schema":{"description":"Absolute start of the window, RFC3339 (e.g. \"202…","type":"string"}}
their contract · 2026-08-29
{"name":"start_time","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]…","type":"string"}}
location
input.startTime
full fragment
{"name":"startTime","schema":{"description":"Absolute start of the window, RFC3339 (e.g. \"2026-07-16T09:00:00Z\"). Overrides `since`; the startTime/endTime window must not span more than seven days.","type":"string"}}
{"name":"start_time","schema":{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
query_logs inputtraceId
their contract · 2026-08-28
{"name":"traceId","schema":{"description":"Correlate to a distributed trace: return only lo…","pattern":"^[0-9a-f]{32}$","type":"string"}}
their contract · 2026-08-29
{"name":"trace_id","schema":{"pattern":"^[0-9a-f]{32}$","type":"string"}}
location
input.traceId
full fragment
{"name":"traceId","schema":{"description":"Correlate to a distributed trace: return only logs with this trace_id.","pattern":"^[0-9a-f]{32}$","type":"string"}}
{"name":"trace_id","schema":{"pattern":"^[0-9a-f]{32}$","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
reset_from_parent description
Reset a branch to its parent's current state, discarding all changes made on HEAD. Discards every change the branch. branch has written since it diverged. NEVER run autonomously; always ask the user first. Use `preserveUnderName` to preserve `preserve_under_name` saves the current state under a new first and is required when the branch name before resetting. <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask has children; those children move to the user first. </notice> new branch. Point-in-time restore is `restore_snapshot`. branch_id is a branch id (br-...), not a branch name. Call list_branches to resolve a name.
as served: 2026-08-28 → 2026-08-29
info input input-required-property-removed Callers can stop sending it; a server that rejects unknown fields rejects callers that do not. credentialed #
reset_from_parent inputbranchIdOrName
their contract · 2026-08-28
{"description":"The name or ID of the branch to reset from its p…","type":"string"}
their contract · 2026-08-29
absent
location
input.branchIdOrName
full fragment
{"description":"The name or ID of the branch to reset from its parent","type":"string"}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
reset_from_parent inputpreserveUnderName
their contract · 2026-08-28
{"name":"preserveUnderName","schema":{"description":"Optional name to preserve the current state unde…","type":"string"}}
their contract · 2026-08-29
{"name":"preserve_under_name","schema":{"description":"Name under which to save the current branch befo…","type":"string"}}
location
input.preserveUnderName
full fragment
{"name":"preserveUnderName","schema":{"description":"Optional name to preserve the current state under a new branch before resetting","type":"string"}}
{"name":"preserve_under_name","schema":{"description":"Name under which to save the current branch before the reset. Required when the branch has children; those children move to the new branch.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
reset_from_parent inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project containing the branch","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}}
location
input.projectId
as served: 2026-08-28 → 2026-08-29
warning input input-required-property-added A caller that does not send the new field is rejected, with no change on its own side. credentialed #
reset_from_parent inputbranch_id
their contract · 2026-08-28
absent
their contract · 2026-08-29
{"pattern":"^[a-z0-9-]{1,60}$","type":"string"}
location
input.branch_id
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
run_sql description
<use_case> Use this tool to execute a single Execute one SQL statement against on a Neon database. </use_case> <important_notes> If you have a temporary branch from a prior step, you MUST: 1. Pass the branch ID to this tool unless explicitly told otherwise 2. Tell the user that you are using the step created a temporary branch with ID [branch_id] branch, pass that branch_id. NEVER run destructive SQL (DROP, DELETE, TRUNCATE, UPDATE without WHERE) autonomously; always ask the user first. Prefer testing on a temporary branch first. </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
run_sql_transaction description
<use_case> Use this tool to execute a SQL transaction against a Neon database, should be used for Execute multiple SQL statements. </use_case> <important_notes> statements as one transaction. If you have a temporary branch from a prior step, you MUST: 1. Pass the branch ID to this tool unless explicitly told otherwise 2. Tell the user that you are using the step created a temporary branch with ID [branch_id] branch, pass that branch_id. NEVER run destructive SQL (DROP, DELETE, TRUNCATE, UPDATE without WHERE) autonomously; always ask the user first. Prefer testing on a temporary branch first. </important_notes> <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql_transaction inputbranchId
their contract · 2026-08-28
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
their contract · 2026-08-29
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the quer…","type":"string"}}
location
input.branchId
full fragment
{"name":"branchId","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
{"name":"branch_id","schema":{"description":"An optional ID of the branch to execute the query against. If not provided the default branch is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql_transaction inputdatabaseName
their contract · 2026-08-28
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
their contract · 2026-08-29
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the d…","type":"string"}}
location
input.databaseName
full fragment
{"name":"databaseName","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
{"name":"database_name","schema":{"description":"The name of the database. If not provided, the default neondb or first available database is used.","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql_transaction inputprojectId
their contract · 2026-08-28
{"name":"projectId","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
their contract · 2026-08-29
{"name":"project_id","schema":{"description":"The ID of the project to execute the query again…","type":"string"}}
location
input.projectId
full fragment
{"name":"projectId","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
{"name":"project_id","schema":{"description":"The ID of the project to execute the query against","type":"string"}}
as served: 2026-08-28 → 2026-08-29
info input input-property-renamed Callers still sending the old name must switch to the new one; the parameter itself is unchanged. credentialed #
run_sql_transaction inputsqlStatements
their contract · 2026-08-28
{"name":"sqlStatements","schema":{"description":"The SQL statements to execute","items":{…},"type":"array"}}
their contract · 2026-08-29
{"name":"sql_statements","schema":{"description":"The SQL statements to execute","items":{…},"type":"array"}}
location
input.sqlStatements
full fragment
{"name":"sqlStatements","schema":{"description":"The SQL statements to execute","items":{"type":"string"},"type":"array"}}
{"name":"sql_statements","schema":{"description":"The SQL statements to execute","items":{"type":"string"},"type":"array"}}
as served: 2026-08-28 → 2026-08-29
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
search description
[…] not use when you need all projects (use `list_projects` instead). <notice> Notice: Write mode active. Destructive tools are exposed. For tools with `destructiveHint: true`, NEVER invoke autonomously; always ask the user first. </notice>
as served: 2026-08-28 → 2026-08-29
2026-08-24 → 2026-08-25 1 warning 1 tool
1 description-changedas served: 2026-08-24 → 2026-08-25on the index
warning wording description-changed The wording an agent reads to choose and call the tool changed; its behaviour may or may not have. credentialed #
inspect_database description
[…] Function logs (`query_logs`), or listing tables and columns (`get_database_tables`, `describe_table_schema`). Three Several checks read alike and are not: `long-running-queries` is what is running right now in the inspected database and has been for over five minutes, minutes; `stalled-queries` is a compute-wide snapshot of active queries running longer than 30 seconds with parallel-worker grouping, waits, and blockers; `outliers` is cumulative execution time since statistics were last reset, reset; and `calls` is call frequency over that same history. Omit […] database on the branch. The result adds a `database` column. `stalled-queries`, `lfc-hit-rate`, `working-set`, and `replication-slots` are compute-wide: they run once against the first listed database, database. For `lfc-hit-rate` and `working-set`, cache counters reset when the compute restarts. One failing database […]
as served: 2026-08-24 → 2026-08-25

03 / tool inventory · as served on 2026-10-15

114 tools in the latest contract.

From the snapshot as served; descriptions shortened to their first sentence. “Changes” counts this server’s findings on the tool.

Tools in the latest snapshot with their input property counts, outputSchema declaration and finding counts
ToolDescriptionInputsRequiredoutputSchemaAnnotationsChanges
add_auth_oauth_provider Adds an OAuth provider configuration to the specified branch's Neon Auth integration. 6 2 none 0
add_auth_trusted_domain Adds a domain to the redirect URI whitelist for the specified branch. 4 3 none 0
compare_database_schema Compare one database's SQL schema on a branch to another. 8 2 none readOnly · idempotent 4
complete_database_migration Apply or discard a prepared migration and delete the temporary branch. 7 5 none destructive 8
complete_query_tuning Apply or discard query-tuning changes and delete the temporary branch. 9 4 none destructive 10
create_auth_user Creates a new user in the Neon Auth user directory for the specified branch. 4 2 none 0
create_branch Creates a branch with a read-write compute and waits until it is ready. 5 0 none 5
create_credential Issues a new scoped service credential anchored to the specified branch. 5 3 none 0
create_postgres_database Creates a database in the specified branch. 4 3 none 0
create_postgres_endpoint Creates a compute endpoint on a branch. 14 2 none 0
create_postgres_role Creates a Postgres role in the specified branch. 4 2 none 0
create_project Creates a Neon project and waits until the default compute is ready. 12 0 none 2
create_snapshot Creates a snapshot from the specified branch. 6 1 none 0
create_storage_bucket Creates a new branchable object storage bucket on the specified branch. 4 2 none openWorld 0
create_trigger Creates a trigger for a Function visible on the branch. 3 2 none 6
delete_auth_oauth_provider Deletes an OAuth provider from the specified project. 3 2 none destructive 0
delete_auth_trusted_domain Removes a domain from the redirect URI whitelist for the specified branch. 4 3 none destructive 0
delete_auth_user Deletes the specified user from the Neon Auth user directory for the specified branch. 3 2 none destructive 0
delete_branch Delete a branch and all its data. 2 1 none destructive 3
delete_data_api Deletes the Neon Data API for the specified branch. 3 2 none destructive 0
delete_function Deletes the function identified by its slug. 3 2 none destructive 0
delete_functions_custom_domain Removes a custom domain registered on the branch and stops routing it. 3 2 none destructive 0
delete_postgres_database Deletes the specified database from the branch. 3 2 none destructive 0
delete_postgres_endpoint Deletes the specified compute endpoint. 2 1 none destructive 0
delete_postgres_role Deletes the specified Postgres role from the branch. 3 2 none destructive 0
delete_project Delete a Neon project and all its data. 1 1 none destructive 2
delete_snapshot Deletes the specified snapshot. 2 1 none destructive 0
delete_storage_bucket Deletes the named bucket from the specified branch. 3 2 none destructive 0
delete_storage_object Deletes the named object from the bucket on the specified branch. 4 3 none destructive 0
delete_storage_objects_by_prefix Soft-deletes every object on the specified branch whose key starts with `prefix`, in a single call. 4 3 none destructive 0
delete_trigger Deletes a branch-local trigger or writes a branch-local tombstone for an inherited trigger so it does not reappear. 3 2 none destructive 0
deploy_function Creates a deployment for the function. 6 2 none destructive 0
describe_branch Get a tree view of all objects in a branch, including databases, schemas, tables, views, and functions. 3 1 none readOnly · idempotent 4
describe_project Retrieves the project record (settings, compute, usage). 1 0 none readOnly · idempotent 2
describe_table_schema Get column definitions, data types, and constraints for a specific table. 4 1 none readOnly · idempotent 5
disable_auth Disables the Neon Auth integration for the specified branch, removing the connection to the authentication provider. 3 1 none destructive 0
explain_sql_statement Generate the execution plan for a SQL statement. 5 1 none destructive 5
fetch Fetch detailed information about a specific organization, project, or branch using the ID returned by the `search` tool. 1 1 none readOnly · idempotent 1
finalize_branch_restore Finalize a branch created with `restore_snapshot` and `finalize: false`: reassign computes (this restarts them) and swap names so it replaces the original branch. 3 1 none destructive 0
get_ai_gateway Returns the AI Gateway endpoint host for the specified branch, used to render code-snippet base URLs. 2 1 none readOnly · idempotent 0
get_auth Retrieves the Neon Auth integration details for the specified branch, including the auth provider type and integration status. 2 1 none readOnly · idempotent 0
get_branch Retrieves information about the specified branch. 2 1 none readOnly · idempotent 0
get_connection_string Get a PostgreSQL connection string for a Neon database. 5 0 none readOnly · idempotent 7
get_data_api Retrieves the Neon Data API configuration for the specified branch, including endpoint URL, enabled state, and database settings. 3 2 none readOnly · idempotent 0
get_database_tables List all tables in a Neon database. 3 0 none readOnly · idempotent 4
get_default_branch Resolve the project's default branch by the default flag, not by name. 1 0 none readOnly · idempotent 0
get_doc_resource Fetch one Neon documentation page as markdown. 1 1 none readOnly · idempotent · openWorld 1
get_function Returns the function identified by its slug. 3 2 none readOnly · idempotent 0
get_neon_auth_config Read Neon Auth config for a branch with OAuth and SMTP secrets redacted as "***redacted***". 2 0 none readOnly · idempotent 3
get_operation Retrieves details for the specified operation. 2 1 none readOnly · idempotent 0
get_postgres_database Retrieves information about the specified database. 3 2 none readOnly · idempotent 0
get_postgres_endpoint Retrieves information about the specified compute endpoint. 2 1 none readOnly · idempotent 0
get_postgres_role Retrieves details about the specified role. 3 2 none readOnly · idempotent 0
get_snapshot_schedule Returns the backup schedule for the specified branch, including the configured snapshot frequencies. 2 1 none readOnly · idempotent 0
get_storage Returns whether branchable object storage is usable for the specified branch. 2 1 none readOnly · idempotent 0
get_trigger Returns the trigger visible on the branch. 3 2 none readOnly · idempotent 0
inspect_database Run one read-only neon inspect db check (pick `check` from the input schema). 6 1 none readOnly · idempotent 6
list_auth_oauth_providers Lists the OAuth providers configured for the specified branch's Neon Auth integration. 2 1 none readOnly 0
list_auth_trusted_domains Lists the trusted domains in the redirect URI whitelist for the specified branch. 2 1 none readOnly · idempotent 0
list_branch_computes Retrieves a list of compute endpoints for the specified branch. 2 1 none readOnly · idempotent 3
list_branches Retrieves a list of branches for the specified project. 6 0 none readOnly · idempotent 0
list_credentials Returns metadata for customer-issued credentials on the branch. 2 1 none readOnly · idempotent 0
list_docs_resources List Neon documentation page slugs from neon.com/docs/llms.txt. 0 0 none readOnly · idempotent · openWorld 1
list_functions Lists functions on the specified branch. 3 1 none readOnly · idempotent 0
list_functions_custom_domains Lists all custom domains registered on the branch, across every target entity. 3 1 none readOnly · idempotent 0
list_log_field_values Lists distinct values for a low-cardinality log field. 8 2 none readOnly · idempotent 5
list_log_fields Lists the low-cardinality log fields observed on this branch. 2 1 none readOnly · idempotent 3
list_operations Lists operations for a project. 2 0 none readOnly · idempotent 0
list_organizations List all organizations the current user belongs to. 1 0 none readOnly · idempotent 1
list_postgres_databases Retrieves a list of databases for the specified branch. 2 1 none readOnly · idempotent 0
list_postgres_endpoints Retrieves a list of compute endpoints for the specified project. 1 0 none readOnly · idempotent 0
list_postgres_roles Retrieves a list of Postgres roles from the specified branch. 2 1 none readOnly · idempotent 0
list_project_members Lists organization members and their per-project roles for an org-owned project. 2 0 none readOnly · idempotent 0
list_project_permissions Retrieves details about users who have access to the project, including the permission `id`, the granted-to email address, and the date project access was granted. 1 0 none readOnly · idempotent 0
list_projects List Neon projects you own. 5 0 none readOnly · idempotent 4
list_regions Lists Neon regions available to the authenticated account. 0 0 none readOnly · idempotent 0
list_slow_queries List queries from pg_stat_statements by execution time, slowest first. 6 0 none readOnly 6
list_snapshots Lists the snapshots for the specified project. 1 0 none readOnly · idempotent 0
list_storage_buckets Lists branchable object storage buckets visible on the specified branch, including those inherited from ancestor branches. 2 1 none readOnly · idempotent 0
list_storage_objects Lists objects visible in the named bucket on the specified branch, including those inherited from ancestor branches. 6 2 none readOnly · idempotent 0
list_triggers Lists the complete project-bounded set of triggers visible on the branch, ordered by `trigger_id`. 2 1 none readOnly · idempotent 0
prepare_database_migration Apply a schema change on a temporary branch and return a migration_id. 3 1 none 4
prepare_query_tuning Analyze a slow query on a temporary branch and return a tuning_id. 4 2 none 4
presign_storage_object Returns a presigned URL that transfers bytes directly to or from the object's bucket on the specified branch, without the caller ever handling S3 credentials. 7 4 none destructive 0
provision_neon_auth Enables Neon Auth for the specified branch by connecting it to an authentication provider. 4 2 none 5
provision_neon_data_api Creates a new instance of Neon Data API in the specified branch. 10 2 none 4
query_logs Returns logs for a branch. 15 1 none readOnly · idempotent 11
recover_project Recovers a deleted project within the 7-day deletion recovery period. 1 0 none 0
register_functions_custom_domain Registers a hostname on the branch and routes it to a function. 5 4 none 0
reset_from_parent Reset a branch to its parent's current HEAD. 3 1 none destructive 5
reset_postgres_role_password Resets the password for the specified Postgres role. 3 2 none destructive 0
restart_postgres_endpoint Restarts the specified compute endpoint by immediately suspending it and then starting it again. 2 1 none destructive 0
restore_snapshot Restore a snapshot onto a new or existing branch. 5 1 none destructive 0
revoke_credential Soft-deletes the credential. 3 2 none destructive 0
rotate_credential Replaces the secret material on an existing scoped credential in place. 3 2 none destructive 0
run_sql Execute one SQL statement on a Neon database. 6 1 none destructive 4
run_sql_transaction Execute multiple SQL statements as one transaction. 6 1 none destructive 5
search Search across all organizations, projects, and branches by keyword. 1 1 none readOnly · idempotent 1
send_feedback Send anonymous feedback about Neon or this MCP server to the Neon team. 1 1 none openWorld 0
set_default_branch Sets the specified branch as the project's default branch. 2 1 none destructive 0
set_snapshot_schedule Replace a branch's automatic snapshot schedule. 3 2 none destructive 0
start_postgres_endpoint Starts a compute endpoint. 2 1 none 0
suspend_postgres_endpoint Suspends the specified compute endpoint. 2 1 none destructive 0
update_auth_config Updates the auth configuration for the branch. 3 2 none destructive 0
update_auth_oauth_provider Updates an OAuth provider for the specified project. 6 2 none destructive 0
update_auth_user_role Updates the role of a user in the Neon Auth user directory for the specified branch. 4 3 none destructive 0
update_branch Updates the specified branch. 5 1 none destructive 0
update_data_api Updates the Neon Data API configuration for the specified branch. 13 2 none destructive 0
update_function Updates the function's mutable metadata — currently only the display `name`. 4 3 none destructive 0
update_postgres_database Updates the specified database in the branch. 5 2 none destructive 0
update_postgres_endpoint Updates the specified compute endpoint. 13 1 none destructive 0
update_project Updates the specified project. 5 0 none destructive 0
update_snapshot Updates the specified snapshot. 4 1 none destructive 0
update_trigger Applies a partial update. 4 3 none destructive 6