Self-Hosted Supabase MCP Server
This server enables developers to manage and interact with self-hosted Supabase instances through the Model Context Protocol (MCP), providing comprehensive database management tools:
Database Operations: List tables and extensions, execute SQL queries, generate TypeScript types, and access database statistics
Migration Management: List and apply SQL migration scripts
Configuration Access: Retrieve project URL, anonymous key, service role key, and verify JWT secret
User Authentication: List, retrieve, create, update, and delete auth users (note: some operations require direct DB access)
Storage Management: List storage buckets and objects within buckets
Monitoring Tools: View active connections, database stats, and Realtime publications
Development Utilities: Restart the
pg_networker
Provides tools for direct PostgreSQL database operations, including executing SQL queries, viewing database connections and statistics, listing extensions, and querying system catalogs.
Enables interaction with self-hosted Supabase instances, providing tools for database introspection, SQL query execution, schema management, migrations, auth user management, storage bucket operations, and TypeScript type generation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Self-Hosted Supabase MCP Servershow me the list of tables in the database"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Self-Hosted Supabase MCP Server
Overview
This project provides a Model Context Protocol (MCP) server designed specifically for interacting with self-hosted Supabase instances. It bridges the gap between MCP clients (like IDE extensions) and your local or privately hosted Supabase projects, enabling database introspection, management, and interaction directly from your development environment.
This server was built from scratch, drawing lessons from adapting the official Supabase cloud MCP server, to provide a minimal, focused implementation tailored for the self-hosted use case.
Related MCP server: Self-Hosted Supabase MCP Server
Purpose
The primary goal of this server is to enable developers using self-hosted Supabase installations to leverage MCP-based tools for tasks such as:
Querying database schemas and data.
Managing database migrations.
Inspecting database statistics and connections.
Managing authentication users.
Interacting with Supabase Storage.
Generating type definitions.
It avoids the complexities of the official cloud server related to multi-project management and cloud-specific APIs, offering a streamlined experience for single-project, self-hosted environments.
Features (Implemented Tools)
Tools are categorized by privilege level:
Regular tools are accessible by any authenticated Supabase JWT (
authenticatedorservice_rolerole).Privileged tools require a
service_roleJWT (HTTP mode) or direct database/service-key access (stdio mode).
Schema & Migrations
Tool | Description | Privilege |
| Lists tables in the database schemas | Regular |
| Lists installed PostgreSQL extensions | Regular |
| Lists all available (installable) extensions | Regular |
| Lists applied migrations from | Regular |
| Applies a SQL migration and records it in | Privileged |
| Lists columns for a specific table | Regular |
| Lists indexes for a specific table | Regular |
| Lists constraints for a specific table | Regular |
| Lists foreign keys for a specific table | Regular |
| Lists triggers for a specific table | Regular |
| Lists user-defined database functions | Regular |
| Gets the source definition of a function | Regular |
| Gets the source definition of a trigger | Regular |
Database Operations & Stats
Tool | Description | Privilege |
| Executes an arbitrary SQL query | Privileged |
| Runs | Privileged |
| Shows active connections ( | Regular |
| Retrieves database statistics ( | Regular |
| Shows index usage statistics | Regular |
| Shows pgvector index statistics | Regular |
Security & RLS
Tool | Description | Privilege |
| Lists Row-Level Security policies for a table | Regular |
| Shows RLS enabled/disabled status for tables | Regular |
| Retrieves security and performance advisory notices | Regular |
Project Configuration
Tool | Description | Privilege |
| Returns the configured Supabase URL | Regular |
| Checks if the JWT secret is configured | Regular |
Development & Extension Tools
Tool | Description | Privilege |
| Generates TypeScript types from the database schema | Regular |
| Restarts the | Privileged |
| Retrieves recent log entries (analytics stack or CSV fallback) | Regular |
Auth User Management
Tool | Description | Privilege |
| Lists users from | Regular |
| Retrieves details for a specific user | Regular |
| Creates a new user in | Privileged |
| Updates user details (password bcrypt-hashed if changed) | Privileged |
| Deletes a user from | Privileged |
Storage
Tool | Description | Privilege |
| Lists all storage buckets | Regular |
| Lists objects within a specific bucket | Regular |
| Retrieves storage bucket configuration | Regular |
| Updates storage bucket settings | Privileged |
Realtime Inspection
Tool | Description | Privilege |
| Lists PostgreSQL publications (e.g. | Regular |
Extension-Specific Tools
Tool | Description | Privilege |
| Lists scheduled jobs (requires | Regular |
| Shows recent execution history for a cron job | Regular |
| Lists pgvector indexes (requires | Regular |
Edge Functions
Tool | Description | Privilege |
| Lists deployed Edge Functions | Regular |
| Gets details and metadata for an Edge Function | Regular |
| Retrieves recent logs for an Edge Function | Regular |
About supabase_migrations.schema_migrations
The list_migrations and apply_migration tools rely on the supabase_migrations.schema_migrations table. This table is created and managed by the Supabase CLI — it is not part of the MCP server itself.
How the table is created:
The table is automatically created when you initialise or run migrations using the Supabase CLI:
supabase db push # pushes local migrations to a remote database
supabase migration up # applies pending local migration filesIf you have never run the Supabase CLI against your database, the table will not exist and list_migrations will return an error. You can create it manually with:
CREATE SCHEMA IF NOT EXISTS supabase_migrations;
CREATE TABLE IF NOT EXISTS supabase_migrations.schema_migrations (
version text NOT NULL PRIMARY KEY,
name text NOT NULL DEFAULT '',
inserted_at timestamptz NOT NULL DEFAULT now()
);Schema difference vs. official Supabase:
The Supabase cloud platform tracks additional columns (e.g. statements, dirty). This MCP server uses the minimal schema (version + name + inserted_at) that is compatible with the Supabase CLI's local-development workflow. If your existing table has extra columns they are simply ignored.
Setup and Installation
Installing via Smithery
To install Self-Hosted Supabase MCP Server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @HenkDz/selfhosted-supabase-mcp --client claudePrerequisites
Bun v1.1 or later (replaces Node.js/npm — used for runtime and builds)
Access to your self-hosted Supabase instance (URL, keys, and optionally a direct PostgreSQL connection string).
Steps
Clone the repository:
git clone <repository-url> cd selfhosted-supabase-mcpInstall dependencies:
bun installBuild the project:
bun run buildThis compiles the TypeScript source to JavaScript in the
distdirectory.
Configuration
The server requires configuration details for your Supabase instance. These can be provided via command-line arguments or environment variables. CLI arguments take precedence.
Required:
--url <url>orSUPABASE_URL=<url>: The main HTTP URL of your Supabase project (e.g.,http://localhost:8000).--anon-key <key>orSUPABASE_ANON_KEY=<key>: Your Supabase project's anonymous key.
Optional (but Recommended/Required for certain tools):
--service-key <key>orSUPABASE_SERVICE_ROLE_KEY=<key>: Your Supabase project's service role key. Required for privileged tools and for auto-creating theexecute_sqlhelper function on startup.--db-url <url>orDATABASE_URL=<url>: The direct PostgreSQL connection string for your Supabase database (e.g.,postgresql://postgres:password@localhost:5432/postgres). Required for tools needing direct database access (apply_migration, Auth tools, Storage tools,pg_catalogqueries).--jwt-secret <secret>orSUPABASE_AUTH_JWT_SECRET=<secret>: Your Supabase project's JWT secret. Required when using--transport httpand needed by theverify_jwt_secrettool.--tools-config <path>: Path to a JSON file specifying which tools to enable (whitelist). If omitted, all tools are enabled. Format:{"enabledTools": ["tool_name_1", "tool_name_2"]}.
HTTP transport options (when using --transport http):
--port <number>: HTTP server port (default:3000).--host <string>: HTTP server host (default:127.0.0.1).--cors-origins <origins>: Comma-separated list of allowed CORS origins. Defaults to localhost only.--rate-limit-window <ms>: Rate limit window in milliseconds (default:60000).--rate-limit-max <count>: Max requests per rate limit window (default:100).--request-timeout <ms>: Request timeout in milliseconds (default:30000).
Important Notes:
execute_sqlHelper Function: Many tools rely on apublic.execute_sqlfunction within your Supabase database for SQL execution via RPC. The server attempts to check for this function on startup. If it's missing and aservice-keyanddb-urlare provided, it will attempt to create the function automatically. If creation fails or keys aren't provided, tools relying solely on RPC may fail.Direct Database Access: Tools interacting directly with privileged schemas (
auth,storage) or system catalogs (pg_catalog) generally requireDATABASE_URLto be configured.Coolify / reverse-proxy deployments:
The
DATABASE_URLmust use the internal hostname reachable from wherever the MCP server process runs, not the public-facing domain.An
ECONNRESETerror during startup means theDATABASE_URLcannot be reached from the server's network context.The server will still start successfully and all tools that don't require a direct DB connection will continue to work normally.
Security
HTTP transport (recommended for remote access)
When running with --transport http, the server enforces:
JWT authentication on all
/mcpendpoints using yourSUPABASE_AUTH_JWT_SECRET.Privilege-based access control (RBAC) — the
roleclaim in the JWT determines which tools are accessible:service_role: Full access (all tools including privileged ones).authenticated: Regular tools only.anon: No tool access.
Rate limiting — configurable request rate limit per IP address.
CORS — configurable allow-list of origins (defaults to localhost only).
Security headers —
X-Content-Type-Options,X-Frame-Options,Strict-Transport-Security, etc.Request timeouts — configurable timeout to prevent resource exhaustion.
Stdio transport (local development)
Stdio mode has no authentication — all tools (including privileged ones) are accessible. It is intended for trusted local clients only (e.g., an IDE extension running on your local machine). A warning is printed on startup when this mode is used.
Password handling for auth user tools
create_auth_user and update_auth_user accept a plain-text password from the MCP client, then immediately hash it with bcrypt (via PostgreSQL's pgcrypto extension: crypt($password, gen_salt('bf'))) before storing it in auth.users. The plain-text password is never stored. Passwords are passed as query parameters (not string-interpolated into SQL), preventing SQL injection.
Note: The password travels over the MCP transport in plain text between the MCP client and server. This is inherent to the MCP protocol interface and unavoidable at this layer. Use the HTTP transport with TLS termination (e.g., behind Kong/nginx) for network protection.
SQL execution security
All database operations in the MCP server use parameterized queries ($1, $2, ...) to prevent SQL injection. The execute_sql tool is an intentional exception — it executes arbitrary SQL by design (it is the tool's purpose). This tool is restricted to service_role privilege level to limit exposure.
Usage
Stdio mode (local MCP clients)
Run the server using Bun, providing the necessary configuration:
# Using CLI arguments (stdio mode — default)
bun run dist/index.js --url http://localhost:8000 --anon-key <your-anon-key> \
--db-url postgresql://postgres:password@localhost:5432/postgres \
--service-key <your-service-key>
# Example with tool whitelisting via config file
bun run dist/index.js --url http://localhost:8000 --anon-key <your-anon-key> \
--tools-config ./mcp-tools.json
# Or configure using environment variables and run:
# export SUPABASE_URL=http://localhost:8000
# export SUPABASE_ANON_KEY=<your-anon-key>
# export DATABASE_URL=postgresql://postgres:password@localhost:5432/postgres
# export SUPABASE_SERVICE_ROLE_KEY=<your-service-key>
bun run dist/index.jsHTTP mode (Docker / remote access)
bun run dist/index.js \
--transport http \
--port 3100 \
--host 0.0.0.0 \
--url http://kong:8000 \
--anon-key <your-anon-key> \
--service-key <your-service-key> \
--jwt-secret <your-jwt-secret> \
--db-url postgresql://postgres:password@db:5432/postgresHTTP mode requires --jwt-secret. All /mcp requests must include a valid Supabase JWT in the Authorization: Bearer <token> header.
The server communicates via stdio (default) or HTTP (Streamable HTTP Transport) and is designed to be invoked by an MCP client application (e.g., an IDE extension like Cursor). The client will connect to the server's stdio stream or HTTP endpoint to list and call the available tools.
Client Configuration Examples
Below are examples of how to configure popular MCP clients to use this self-hosted server.
Important:
Replace placeholders like
<your-supabase-url>,<your-anon-key>,<your-db-url>,<path-to-dist/index.js>etc., with your actual values.Ensure the path to the compiled server file (
dist/index.js) is correct for your system.Be cautious about storing sensitive keys directly in configuration files, especially if committed to version control. Consider using environment variables or more secure methods where supported by the client.
Cursor
Create or open the file
.cursor/mcp.jsonin your project root.Add the following configuration:
{ "mcpServers": { "selfhosted-supabase": { "command": "bun", "args": [ "run", "<path-to-dist/index.js>", // e.g., "/home/user/selfhosted-supabase-mcp/dist/index.js" "--url", "<your-supabase-url>", // e.g., "http://localhost:8000" "--anon-key", "<your-anon-key>", // Optional - Add these if needed by the tools you use "--service-key", "<your-service-key>", "--db-url", "<your-db-url>", // e.g., "postgresql://postgres:password@host:port/postgres" "--jwt-secret", "<your-jwt-secret>", // Optional - Whitelist specific tools "--tools-config", "<path-to-your-mcp-tools.json>" // e.g., "./mcp-tools.json" ] } } }
Visual Studio Code (Copilot)
VS Code Copilot allows using environment variables populated via prompted inputs, which is more secure for keys.
Create or open the file
.vscode/mcp.jsonin your project root.Add the following configuration:
{ "inputs": [ { "type": "promptString", "id": "sh-supabase-url", "description": "Self-Hosted Supabase URL", "default": "http://localhost:8000" }, { "type": "promptString", "id": "sh-supabase-anon-key", "description": "Self-Hosted Supabase Anon Key", "password": true }, { "type": "promptString", "id": "sh-supabase-service-key", "description": "Self-Hosted Supabase Service Key (Optional)", "password": true, "required": false }, { "type": "promptString", "id": "sh-supabase-db-url", "description": "Self-Hosted Supabase DB URL (Optional)", "password": true, "required": false }, { "type": "promptString", "id": "sh-supabase-jwt-secret", "description": "Self-Hosted Supabase JWT Secret (Optional)", "password": true, "required": false }, { "type": "promptString", "id": "sh-supabase-server-path", "description": "Path to self-hosted-supabase-mcp/dist/index.js" }, { "type": "promptString", "id": "sh-supabase-tools-config", "description": "Path to tools config JSON (Optional, e.g., ./mcp-tools.json)", "required": false } ], "servers": { "selfhosted-supabase": { "command": "bun", "args": [ "run", "${input:sh-supabase-server-path}", "--tools-config", "${input:sh-supabase-tools-config}" ], "env": { "SUPABASE_URL": "${input:sh-supabase-url}", "SUPABASE_ANON_KEY": "${input:sh-supabase-anon-key}", "SUPABASE_SERVICE_ROLE_KEY": "${input:sh-supabase-service-key}", "DATABASE_URL": "${input:sh-supabase-db-url}", "SUPABASE_AUTH_JWT_SECRET": "${input:sh-supabase-jwt-secret}" } } } }When you use Copilot Chat in Agent mode (@workspace), it should detect the server. You will be prompted to enter the details (URL, keys, path) when the server is first invoked.
Other Clients (Windsurf, Cline, Claude)
Adapt the configuration structure shown for Cursor or the official Supabase documentation, replacing the command and args with the bun run command and the arguments for this server, similar to the Cursor example:
{
"mcpServers": {
"selfhosted-supabase": {
"command": "bun",
"args": [
"run",
"<path-to-dist/index.js>",
"--url", "<your-supabase-url>",
"--anon-key", "<your-anon-key>",
"--service-key", "<your-service-key>",
"--db-url", "<your-db-url>",
"--jwt-secret", "<your-jwt-secret>",
"--tools-config", "<path-to-your-mcp-tools.json>"
]
}
}
}Consult the specific documentation for each client on where to place the mcp.json or equivalent configuration file.
Docker Integration with Self-Hosted Supabase
This MCP server can be integrated directly into a self-hosted Supabase Docker Compose stack, making it available alongside other Supabase services via the Kong API gateway.
Architecture Overview
When integrated with Docker:
The MCP server runs in HTTP transport mode (not stdio)
It's exposed through Kong at
/mcp/v1/*JWT authentication is handled by the MCP server itself
The server has direct access to the database and all Supabase keys
Setup Steps
1. Add the MCP Server as a Git Submodule
From your Supabase Docker directory:
git submodule add https://github.com/HenkDz/selfhosted-supabase-mcp.git selfhosted-supabase-mcp2. Create the Dockerfile
Create volumes/mcp/Dockerfile:
# Dockerfile for selfhosted-supabase-mcp HTTP mode
# Multi-stage build using Bun runtime for self-hosted Supabase
FROM oven/bun:1.1-alpine AS builder
WORKDIR /app
# Copy package files from submodule
COPY selfhosted-supabase-mcp/package.json selfhosted-supabase-mcp/bun.lock* ./
# Install dependencies
RUN bun install --frozen-lockfile || bun install
# Copy source code
COPY selfhosted-supabase-mcp/src ./src
COPY selfhosted-supabase-mcp/tsconfig.json ./
# Build the application
RUN bun build src/index.ts --outdir dist --target bun
# Production stage
FROM oven/bun:1.1-alpine AS runner
WORKDIR /app
# Create non-root user for security
RUN addgroup --system --gid 1001 mcp && \
adduser --system --uid 1001 --ingroup mcp mcp
# Copy built application from builder
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
# Set ownership
RUN chown -R mcp:mcp /app
USER mcp
# Default environment variables
ENV NODE_ENV=production
# Health check
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3100/health || exit 1
# Expose HTTP port
EXPOSE 3100
# Start the MCP server in HTTP mode
CMD ["bun", "run", "dist/index.js"]3. Add the MCP Service to docker-compose.yml
Add this service definition to your docker-compose.yml:
## MCP Server - Model Context Protocol for AI integrations
## DISABLED BY DEFAULT - Add 'mcp' to COMPOSE_PROFILES to enable
mcp:
container_name: ${COMPOSE_PROJECT_NAME:-supabase}-mcp
profiles:
- mcp
build:
context: .
dockerfile: ./volumes/mcp/Dockerfile
restart: unless-stopped
healthcheck:
test:
[
"CMD",
"wget",
"--no-verbose",
"--tries=1",
"--spider",
"http://localhost:3100/health"
]
timeout: 5s
interval: 10s
retries: 3
depends_on:
db:
condition: service_healthy
rest:
condition: service_started
environment:
SUPABASE_URL: http://kong:8000
SUPABASE_ANON_KEY: ${ANON_KEY}
SUPABASE_SERVICE_ROLE_KEY: ${SERVICE_ROLE_KEY}
SUPABASE_AUTH_JWT_SECRET: ${JWT_SECRET}
DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
command:
[
"bun",
"run",
"dist/index.js",
"--transport", "http",
"--port", "3100",
"--host", "0.0.0.0",
"--url", "http://kong:8000",
"--anon-key", "${ANON_KEY}",
"--service-key", "${SERVICE_ROLE_KEY}",
"--jwt-secret", "${JWT_SECRET}",
"--db-url", "postgresql://postgres:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"
]4. Add Kong API Gateway Routes
Add the MCP routes to volumes/api/kong.yml in the services section:
## MCP Server routes - Model Context Protocol for AI integrations
## Authentication is handled by the MCP server itself (JWT validation)
- name: mcp-v1
_comment: 'MCP Server: /mcp/v1/* -> http://mcp:3100/*'
url: http://mcp:3100/
routes:
- name: mcp-v1-all
strip_path: true
paths:
- /mcp/v1/
plugins:
- name: cors
config:
origins:
- "$SITE_URL_PATTERN"
- "http://localhost:3000"
- "http://127.0.0.1:3000"
methods:
- GET
- POST
- DELETE
- OPTIONS
headers:
- Accept
- Authorization
- Content-Type
- X-Client-Info
- apikey
- Mcp-Session-Id
exposed_headers:
- Mcp-Session-Id
credentials: true
max_age: 36005. Enable the MCP Service
The MCP service uses Docker Compose profiles, so it's disabled by default. To enable it:
Option A: Set in .env file:
COMPOSE_PROFILES=mcpOption B: Enable at runtime:
docker compose --profile mcp up -dAccessing the MCP Server
Once running, the MCP server is available at:
Internal (from other containers):
http://mcp:3100External (via Kong):
http://localhost:8000/mcp/v1/
Authentication
When running in HTTP mode, the MCP server validates JWTs using the configured JWT_SECRET. Clients must include a valid Supabase JWT in the Authorization header:
Authorization: Bearer <supabase-jwt>The JWT's role claim determines access:
service_role: Full access to all tools (regular + privileged)authenticated: Access to regular tools onlyanon: No tool access
Health Check
The MCP server exposes a health endpoint:
curl http://localhost:8000/mcp/v1/healthSecurity Considerations
When deploying via Docker:
The MCP server runs as a non-root user (
mcp:mcp)JWT authentication is enforced for all tool calls
Privileged tools (like
execute_sql) requireservice_roleJWTCORS is configured via Kong - adjust origins for your deployment
Development
Language: TypeScript
Build:
bun build(viabun run build)Runtime: Bun v1.1+
Test runner:
bun testDependencies: Managed via
bun(bun.lock)Core Libraries:
@supabase/supabase-js,pg(node-postgres),zod(validation),commander(CLI args),@modelcontextprotocol/sdk(MCP server framework),express,jsonwebtoken.
License
This project is licensed under the MIT License. See the LICENSE file for details.
Available Tools
21 toolsapply_migrationA
Applies a SQL migration script and records it in the supabase_migrations.schema_migrations table within a transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | The migration version string (e.g., '20240101120000'). | |
| name | No | An optional descriptive name for the migration. | |
| sql | Yes | The SQL DDL content of the migration. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions transactional execution and recording, which is useful, but lacks critical details like whether this requires admin permissions, what happens on failure (e.g., rollback), if it's idempotent, or any rate limits. For a tool that modifies database schema, this leaves significant behavioral gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that efficiently conveys the core functionality without redundancy. It's front-loaded with the primary action and includes essential behavioral context (transactional execution and recording). Every word earns its place with no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (applies SQL migrations with transactional safety) and lack of both annotations and output schema, the description is moderately complete. It covers the what and how but misses important context like error handling, permissions, and return values. For a mutation tool with no structured safety hints, it should provide more operational guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all three parameters (version, name, sql). The description doesn't add any parameter-specific semantics beyond what's in the schema—it doesn't explain parameter relationships, formatting constraints, or usage examples. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('applies a SQL migration script') and resource ('records it in the supabase_migrations.schema_migrations table'), distinguishing it from sibling tools like 'execute_sql' (which doesn't record migrations) and 'list_migrations' (which only lists them). It precisely defines the tool's function with both execution and tracking components.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context through 'SQL migration script' and 'within a transaction', suggesting it's for database schema changes. However, it doesn't explicitly state when to use this versus alternatives like 'execute_sql' for non-migration SQL or 'list_migrations' for checking status. No explicit when-not-to-use guidance or prerequisites are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_auth_userA
Creates a new user directly in auth.users. WARNING: Requires plain password, insecure. Use with extreme caution.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The email address for the new user. | ||
| password | Yes | Plain text password (min 6 chars). WARNING: Insecure. | |
| role | No | User role. | authenticated |
| user_metadata | No | Optional user metadata. | |
| app_metadata | No | Optional app metadata. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively communicates critical behavioral traits: this is a write operation (implied by 'Creates'), it requires plain text passwords (security risk), and it operates directly on the auth.users system. The warning about insecurity adds important context beyond what the input schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly sized at two sentences with zero wasted words. The first sentence states the purpose clearly, and the second provides crucial warnings. Every sentence earns its place, and the structure is front-loaded with the core functionality followed by important caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write operation with no annotations and no output schema, the description does well by clearly stating it's a creation tool and providing critical security warnings. However, it doesn't mention what happens on success/failure, whether the operation is idempotent, or what permissions are required. Given the complexity of user creation and lack of output schema, some additional behavioral context would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the schema already documents all 5 parameters thoroughly. The description doesn't add any parameter-specific information beyond what's in the schema descriptions. However, it does reinforce the password security warning mentioned in the schema, providing marginal additional context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Creates a new user') and target resource ('directly in auth.users'), distinguishing it from sibling tools like 'update_auth_user' or 'get_auth_user'. It uses precise language that leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool ('Creates a new user') and includes a strong warning about security implications ('WARNING: Requires plain password, insecure. Use with extreme caution.'). However, it doesn't explicitly mention when NOT to use it or name specific alternatives among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_auth_userA
Deletes a user from auth.users by their ID. Requires service_role key and direct DB connection.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | The UUID of the user to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively communicates that this is a destructive operation ('Deletes'), specifies authentication requirements ('Requires service_role key'), and indicates infrastructure needs ('direct DB connection'). It does not mention potential side effects (e.g., cascading deletions) or response format, but covers critical safety and access aspects adequately for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with zero wasted words: the first states the core action and target, and the second specifies prerequisites. It is front-loaded with the primary purpose and efficiently conveys essential information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive operation with authentication requirements), no annotations, and no output schema, the description does well by covering purpose, prerequisites, and behavioral traits. It lacks details on return values or error handling, but for a single-parameter tool with high schema coverage, it provides sufficient context for safe invocation, though not fully exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'user_id' fully documented in the schema as a UUID. The description adds no additional parameter semantics beyond implying the ID is used for deletion, which is already clear from the schema. This meets the baseline score of 3 when the schema provides complete parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Deletes'), target resource ('a user from auth.users'), and identifier mechanism ('by their ID'), distinguishing it from sibling tools like update_auth_user or list_auth_users. It provides a precise verb+resource combination that leaves no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states prerequisites ('Requires service_role key and direct DB connection'), which helps determine when this tool can be used. However, it does not specify when to use it versus alternatives (e.g., update_auth_user for deactivation vs. deletion) or provide exclusions, limiting its guidance to context setup rather than comparative decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_sqlC
Executes an arbitrary SQL query against the database, using direct database connection when available or RPC function as fallback.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | The SQL query to execute. | |
| read_only | No | Hint for the RPC function whether the query is read-only (best effort). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden but lacks critical behavioral details. It mentions connection methods but doesn't disclose permissions required, potential for data modification, rate limits, error handling, or that 'read_only' is a hint (not enforced). This is inadequate for a tool executing arbitrary SQL.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core action and includes necessary technical context about connection methods without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of executing arbitrary SQL, no annotations, and no output schema, the description is incomplete. It should warn about security risks, explain the 'read_only' hint's limitations, and describe return formats or error cases to be minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both parameters. The description adds no additional meaning about parameters beyond implying SQL execution, which is already clear from the schema. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'executes' and the resource 'SQL query against the database', specifying it handles both direct connections and RPC fallbacks. However, it doesn't explicitly differentiate from sibling tools like 'apply_migration' or 'list_tables', which also interact with the database but for specific purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, risks of arbitrary SQL execution, or when to prefer other tools like 'list_tables' for read-only operations or 'apply_migration' for schema changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_typescript_typesA
Generates TypeScript types from the database schema using the Supabase CLI (supabase gen types) and downloads the file to the specified absolute path. The tool returns the current platform (win32, darwin, linux) to help with path formatting. Requires DATABASE_URL configuration and Supabase CLI installed.
| Name | Required | Description | Default |
|---|---|---|---|
| included_schemas | No | Database schemas to include in type generation. | |
| output_filename | No | Filename to save the generated types to in the workspace root. | database.types.ts |
| output_path | Yes | Absolute path where to download the generated TypeScript file. Examples: Windows: "C:\\path\\to\\project\\database.types.ts", macOS/Linux: "/path/to/project/database.types.ts". This parameter is required. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds useful context beyond basic functionality by mentioning the download action, platform return for path formatting, and prerequisites. However, it lacks details on error handling, rate limits, or what happens if the file already exists, which are important for a tool that writes files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the core purpose stated first, followed by key behavioral details and prerequisites. Every sentence adds necessary information without redundancy, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (file generation with prerequisites) and no output schema, the description is mostly complete. It covers the purpose, key behavior, and prerequisites, but could improve by detailing the return value format or error scenarios. However, it adequately supports tool selection and invocation in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds some value by implying the use of 'supabase gen types' and mentioning platform-specific path examples, but it does not provide additional semantic details beyond what the schema specifies, such as format constraints or interactions between parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Generates TypeScript types from the database schema') using the Supabase CLI, identifies the resource ('database schema'), and distinguishes it from sibling tools like 'execute_sql' or 'list_tables' by focusing on type generation rather than data manipulation or listing operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool ('Generates TypeScript types from the database schema') and mentions prerequisites ('Requires DATABASE_URL configuration and Supabase CLI installed'), but it does not explicitly state when not to use it or name specific alternatives among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_anon_keyA
Returns the configured Supabase anon key for this server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states this is a read operation ('Returns'), but doesn't disclose behavioral traits like authentication requirements, rate limits, whether the key is sensitive data, or what format the key is returned in. The description is minimal and lacks important operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and appropriately sized for a simple, parameterless tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema) and lack of annotations, the description is complete enough for basic understanding but inadequate for operational use. It doesn't address security implications (anon keys are typically public but should be handled carefully), return format, or error conditions that would help an agent use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema coverage, so no parameter documentation is needed. The description appropriately doesn't discuss parameters, earning a baseline score of 4 for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Returns') and resource ('configured Supabase anon key for this server'), distinguishing it from sibling tools like get_service_key or get_project_url by specifying the exact type of key being retrieved.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (when you need the anon key for this server), but doesn't explicitly state when to use this tool versus alternatives like get_service_key or when not to use it. No prerequisites or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auth_userB
Retrieves details for a specific user from auth.users by their ID.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | The UUID of the user to retrieve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('Retrieves details') but doesn't describe what 'details' include, error handling (e.g., for invalid IDs), permissions required, or rate limits. For a read operation with zero annotation coverage, this leaves significant behavioral aspects unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action and resource. Every word contributes meaning without redundancy, making it easy to parse quickly. It avoids unnecessary elaboration while covering the essential purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, read-only operation) and high schema coverage, the description is adequate for basic use. However, without annotations or an output schema, it lacks details on return values, error cases, and security context. It meets minimum viability but has clear gaps in behavioral transparency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'user_id' fully documented in the schema as a UUID. The description adds minimal value beyond the schema by reiterating 'by their ID', but doesn't provide additional context like ID format examples or sourcing guidance. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Retrieves') and resource ('details for a specific user from auth.users'), making the purpose unambiguous. It specifies the data source ('auth.users') and key identifier ('by their ID'), which helps distinguish it from generic user-fetching tools. However, it doesn't explicitly differentiate from sibling 'list_auth_users', which is a minor gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'by their ID', suggesting this tool is for fetching a single known user rather than listing multiple users. However, it doesn't explicitly state when to use this versus 'list_auth_users' or mention prerequisites like authentication requirements. The guidance is functional but lacks explicit alternatives or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_database_connectionsB
Retrieves information about active database connections from pg_stat_activity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states it retrieves information (implying read-only), but doesn't specify permissions needed, rate limits, or what 'active' means (e.g., time thresholds). This leaves significant gaps for a tool that accesses system-level data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and includes the specific source ('pg_stat_activity'), making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of accessing database connections (a system-level operation) with no annotations and no output schema, the description is insufficient. It doesn't explain what information is returned (e.g., connection details, query states), security implications, or how to interpret results, leaving the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the input structure. The description doesn't need to add parameter details, and it correctly implies no inputs are required, earning a baseline high score for this context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('retrieves') and resource ('information about active database connections from pg_stat_activity'), making the purpose specific and understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_database_stats' or 'list_tables', which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_database_stats' or 'execute_sql'. It lacks context about use cases, prerequisites, or exclusions, leaving the agent to infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_database_statsB
Retrieves statistics about database activity and the background writer from pg_stat_database and pg_stat_bgwriter.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool retrieves statistics, implying a read-only operation, but doesn't specify if it requires authentication, has rate limits, returns real-time or cached data, or any error conditions. For a tool with zero annotation coverage, this leaves key behavioral traits unclear, scoring a 2.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose and data sources. It's front-loaded with the core action ('Retrieves statistics') and avoids any unnecessary words, making it highly concise and well-structured, earning a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (simple read operation with no parameters), no annotations, and no output schema, the description is minimally complete. It explains what the tool does but lacks details on return values, behavioral traits, or usage context. For a tool with no structured support, it's adequate but has clear gaps, scoring a 3.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100% (though empty). The description doesn't need to add parameter details, so it meets the baseline of 4 for tools with no parameters. It appropriately focuses on the tool's purpose without redundant parameter explanations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Retrieves statistics about database activity and the background writer' with specific sources (pg_stat_database and pg_stat_bgwriter). It distinguishes itself from siblings like get_database_connections (which focuses on connections) and list_tables (which lists tables), but doesn't explicitly contrast with all siblings. The verb 'retrieves' and resources 'statistics' are specific, earning a 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, context for usage, or compare with siblings like get_database_connections for connection stats or execute_sql for custom queries. Without any usage context, this is a significant gap, scoring a 2.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_urlB
Returns the configured Supabase project URL for this server.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It implies a read-only operation ('Returns'), but does not specify if this requires authentication, involves rate limits, or details the return format. The description adds minimal context beyond the basic action, resulting in an average score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that directly states what the tool does without any unnecessary words. It is front-loaded and efficiently conveys the essential information, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters, no output schema, no annotations), the description is adequate but minimal. It covers the basic purpose but lacks details on behavioral aspects like authentication or return format, which could be helpful for an agent in a broader context. It meets the minimum viable standard without being comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema description coverage is 100%, so there is no need for parameter details in the description. The baseline for zero parameters is 4, as the description appropriately focuses on the tool's purpose without redundant parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Returns') and the resource ('configured Supabase project URL'), making the purpose evident. However, it does not explicitly differentiate this tool from sibling tools like 'get_anon_key' or 'get_service_key', which also retrieve configuration values, so it falls short of a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, such as other 'get_' tools for different configuration values. It lacks context about prerequisites or typical use cases, leaving the agent to infer usage based on the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_service_keyB
Returns the configured Supabase service role key for this server, if available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns a key 'if available,' which adds some context about potential failure modes, but doesn't cover other critical aspects like authentication requirements, rate limits, error handling, or what the return value looks like (e.g., format, structure). For a tool that handles sensitive data (service role key), this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that efficiently conveys the core functionality ('Returns the configured Supabase service role key') and a key condition ('if available'). It is front-loaded with the main action and avoids any redundant or verbose language, making it highly concise and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (handling a sensitive service role key), lack of annotations, and no output schema, the description is insufficiently complete. It doesn't explain the return format, error conditions beyond availability, security implications, or how this tool differs from siblings like 'get_anon_key.' For a tool in this context, more detail is needed to ensure safe and correct usage by an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the input schema has 100% description coverage (though empty). In such cases, the baseline score is 4, as there are no parameters to document. The description doesn't need to compensate for any parameter gaps, and it appropriately focuses on the tool's purpose without unnecessary parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Returns') and resource ('configured Supabase service role key'), making it immediately understandable. It distinguishes itself from siblings like 'get_anon_key' by specifying the service role key, though it doesn't explicitly contrast with all similar tools. The purpose is not vague or tautological, but could be slightly more specific about what 'this server' refers to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_anon_key' or other sibling tools. It mentions 'if available,' which hints at a condition, but doesn't explain when the key might be unavailable or what to do in such cases. There are no explicit when/when-not instructions or named alternatives, leaving usage context largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_auth_usersC
Lists users from the auth.users table.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of users to return | |
| offset | No | Number of users to skip |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action is a list operation, implying read-only behavior, but doesn't cover critical aspects like authentication requirements, rate limits, pagination details (beyond implied by limit/offset), or error conditions. This leaves significant gaps for a tool accessing user data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero wasted words. It's front-loaded with the core purpose and efficiently conveys the essential information without unnecessary elaboration, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete for a tool that lists users from an authentication table. It misses details like return format (e.g., array of user objects), error handling, security implications, or how it interacts with sibling tools. For a data-access tool with no structured support, this leaves the agent under-informed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters ('limit' and 'offset') well-documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, such as default behaviors or constraints, so it meets the baseline for high schema coverage without compensating value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Lists') and resource ('users from the auth.users table'), making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools like 'get_auth_user' (which likely retrieves a single user), but the plural 'users' implies a listing operation versus retrieval of a specific user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_auth_user' for single-user retrieval or 'list_tables' for broader table listings, nor does it specify prerequisites such as authentication or database access.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_extensionsB
Lists all installed PostgreSQL extensions in the database.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool does but doesn't describe how it behaves: no information on output format (e.g., list structure, fields returned), pagination, error conditions, or whether it requires specific permissions. This leaves significant gaps for an agent to understand the tool's operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with zero wasted words. It's front-loaded with the core action and resource, making it immediately scannable and efficient. Every word earns its place by specifying the exact scope ('all installed PostgreSQL extensions').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters) but lack of annotations and output schema, the description is incomplete. It doesn't explain what the output looks like (e.g., array of extension names with versions), which is critical for a list operation. For a read-only tool with no structured output documentation, more behavioral context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100% (though empty). The description appropriately doesn't discuss parameters since none exist. It could theoretically mention that no inputs are required, but this is adequately covered by the schema, so a baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('all installed PostgreSQL extensions in the database'), making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools like 'list_tables' or 'list_auth_users', but the specificity of 'PostgreSQL extensions' provides inherent distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., database connection), use cases (e.g., checking available extensions before installation), or how it differs from other list tools like 'list_tables' or 'list_auth_users'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_migrationsB
Lists applied database migrations recorded in supabase_migrations.schema_migrations table.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states it 'Lists applied database migrations,' implying a read-only operation, but doesn't disclose behavioral traits like permissions needed, rate limits, output format (e.g., list of migration IDs/timestamps), or pagination. For a tool with zero annotation coverage, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core action ('Lists applied database migrations') and adds specific detail ('recorded in supabase_migrations.schema_migrations table'). Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and zero parameters, the description is minimal. It states what the tool does but lacks context on behavior, output, or usage. For a tool that likely returns structured migration data, this leaves the agent guessing about results and applicability.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100% (though trivial here). The description doesn't need to add parameter semantics, so it meets the baseline of 4 for zero-parameter tools. No extra value is required beyond stating the purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('applied database migrations'), specifying the exact table ('supabase_migrations.schema_migrations'). It distinguishes from siblings like 'list_tables' or 'list_extensions' by focusing on migrations. However, it doesn't explicitly differentiate from hypothetical similar tools (e.g., 'list_pending_migrations'), so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., after applying migrations), exclusions (e.g., not for pending migrations), or related tools like 'apply_migration'. The agent must infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_realtime_publicationsB
Lists PostgreSQL publications, often used by Supabase Realtime.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It states this is a list operation, implying read-only behavior, but doesn't disclose any behavioral traits like pagination, rate limits, authentication requirements, or what specific publication data is returned. For a tool with zero annotation coverage, this is inadequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with zero waste. It's front-loaded with the core purpose and adds only relevant context about Supabase Realtime. Every word earns its place, making it appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description is incomplete. It doesn't explain what the list returns (e.g., publication names, details, format) or any behavioral aspects. For a list operation in a complex environment with many siblings, more context is needed to be fully helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the absence of inputs. The description doesn't need to add parameter information, and it correctly doesn't mention any. Baseline for 0 parameters is 4, as it avoids unnecessary details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('PostgreSQL publications'), providing a specific purpose. It also adds context about Supabase Realtime usage, which is helpful. However, it doesn't explicitly distinguish this tool from sibling tools like 'list_tables' or 'list_extensions', which would require a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions Supabase Realtime context, but doesn't specify scenarios, prerequisites, or exclusions. With many sibling tools available, this lack of differentiation is a significant gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storage_bucketsB
Lists all storage buckets in the project.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the action ('Lists') but doesn't describe how the listing works—e.g., whether it returns all buckets at once, uses pagination, requires specific permissions, or has rate limits. For a read operation with zero annotation coverage, this leaves significant gaps in understanding the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that directly states the tool's purpose without any wasted words. It is front-loaded and efficiently conveys the essential information, making it easy for an agent to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is minimally adequate. It tells what the tool does but lacks details on behavior, output format, or usage context. For a list operation, more information on return values or constraints would be helpful, but the low complexity keeps it from being severely incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% description coverage, so no parameter documentation is needed. The description doesn't add parameter information, which is appropriate here. A baseline of 4 is given as it correctly avoids redundancy, though it doesn't compensate for any gaps (none exist).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('all storage buckets in the project'), making the tool's function immediately understandable. It doesn't explicitly differentiate from sibling tools like 'list_storage_objects' or 'list_tables', but the specificity of 'storage buckets' provides adequate distinction. The purpose is unambiguous though not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'list_storage_objects' (which might list objects within buckets) or 'get_database_connections' (which might relate to storage), nor does it specify prerequisites or contexts for use. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storage_objectsC
Lists objects within a specific storage bucket, optionally filtering by prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| bucket_id | Yes | The ID of the bucket to list objects from. | |
| limit | No | Max number of objects to return | |
| offset | No | Number of objects to skip | |
| prefix | No | Filter objects by a path prefix (e.g., 'public/') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions filtering by prefix but fails to describe critical behaviors like pagination mechanics (implied by limit/offset), authentication requirements, rate limits, error conditions, or what the output looks like. For a list operation with 4 parameters, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Lists objects within a specific storage bucket') and adds a useful qualifier ('optionally filtering by prefix'). There is no wasted verbiage or redundancy, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and output schema, the description is incomplete. It doesn't explain the return format (e.g., list of objects with metadata), pagination behavior, error handling, or authentication needs. For a tool with 4 parameters and no structured output documentation, this leaves significant gaps for an agent to operate effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents all parameters. The description adds minimal value by mentioning prefix filtering but doesn't provide additional context beyond what's in the schema (e.g., examples of prefix usage, interaction between limit/offset). This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('objects within a specific storage bucket'), making the purpose immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'list_storage_buckets' or 'list_tables', which would require a more specific scope statement to earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It mentions optional filtering by prefix but doesn't address scenarios like when to use 'list_storage_buckets' instead or prerequisites for accessing buckets. This lack of contextual direction leaves the agent without usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesB
Lists all accessible tables in the connected database, grouped by schema.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions grouping by schema, which is helpful, but doesn't cover important aspects like pagination, rate limits, authentication requirements, error conditions, or what 'accessible' means in practice. For a tool with zero annotation coverage, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that gets straight to the point. Every word earns its place—'Lists' (action), 'all accessible tables' (scope), 'in the connected database' (context), and 'grouped by schema' (organizational detail). No wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is adequate but has clear gaps. It explains what the tool does but doesn't provide enough behavioral context (like how results are structured or what 'accessible' entails). For a read-only listing tool, it meets minimum viability but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema already fully documents the lack of inputs. The description doesn't need to add parameter information, and it appropriately focuses on what the tool does rather than inputs. A baseline of 4 is appropriate for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lists') and resource ('all accessible tables in the connected database'), and adds useful context about grouping by schema. It doesn't explicitly distinguish from siblings like 'list_extensions' or 'list_migrations', but the resource specificity makes the purpose clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites, timing considerations, or how it differs from other listing tools like 'list_extensions' or 'list_migrations' in the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rebuild_hooksA
Attempts to restart the pg_net worker. Requires the pg_net extension to be installed and available.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the prerequisite for the pg_net extension, which is useful behavioral context. However, it lacks details on potential side effects (e.g., downtime, errors), success criteria, or response format, leaving gaps in transparency for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, consisting of two sentences that efficiently convey the action and prerequisite without any wasted words. Every sentence earns its place by providing essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity as a mutation operation with no annotations and no output schema, the description is incomplete. It covers the prerequisite but omits details on what 'restart' entails, potential outcomes, or error handling. This leaves the agent with insufficient guidance for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the absence of inputs. The description does not add parameter-specific information, which is unnecessary here. A baseline of 4 is appropriate as it compensates for the lack of parameters by focusing on usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('restart') and resource ('pg_net worker'), making it understandable. However, it does not explicitly differentiate from sibling tools like 'list_extensions' or 'execute_sql', which might involve similar system operations, so it falls short of a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool by stating the prerequisite that 'the pg_net extension to be installed and available.' This helps guide usage, but it does not specify when not to use it or name alternatives among siblings, such as other maintenance tools, which would be needed for a higher score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_auth_userA
Updates fields for a user in auth.users. WARNING: Password handling is insecure. Requires service_role key and direct DB connection.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | The UUID of the user to update. | |
| No | New email address. | ||
| password | No | New plain text password (min 6 chars). WARNING: Insecure. | |
| role | No | New role. | |
| user_metadata | No | New user metadata (will overwrite existing). | |
| app_metadata | No | New app metadata (will overwrite existing). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It effectively adds critical context: the 'WARNING: Password handling is insecure' highlights a security risk, and 'Requires service_role key and direct DB connection' specifies authentication and connection requirements. This goes beyond what the input schema provides, covering safety and operational constraints that are essential for an agent to understand the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded, with the core purpose stated first ('Updates fields for a user in auth.users'), followed by critical warnings and requirements. Every sentence earns its place by adding essential information without redundancy. It's concise yet comprehensive for its length, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (6 parameters, no output schema, no annotations), the description does a good job of being complete enough. It covers the purpose, security warnings, and prerequisites, which are crucial for a mutation tool. However, it doesn't explain return values or error handling, and with no output schema, this leaves a minor gap. For a tool with significant behavioral implications, it's mostly adequate but could be slightly more comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all parameters thoroughly. The description doesn't add any additional meaning or context about the parameters beyond what's in the schema. According to the rules, when schema coverage is high (>80%), the baseline score is 3 even with no param info in the description, which applies here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Updates') and resource ('fields for a user in auth.users'), making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools like 'create_auth_user' or 'delete_auth_user', but the 'update' action is distinct enough to imply difference. The description is specific about what gets updated (user fields) rather than being vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides some usage context with 'Requires service_role key and direct DB connection', which indicates prerequisites. However, it doesn't explicitly state when to use this tool versus alternatives like 'create_auth_user' or 'delete_auth_user', nor does it provide exclusions or comparisons. The guidance is implied rather than explicit, leaving some ambiguity about optimal use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_jwt_secretB
Checks if the Supabase JWT secret is configured for this server and returns a preview.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool 'checks' and 'returns a preview,' implying a read-only operation, but doesn't specify details like what 'preview' entails (e.g., format, content), whether it requires authentication, or potential error conditions. For a tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose. Every word contributes to understanding the tool's function without redundancy or unnecessary elaboration. It's appropriately sized for a simple, parameter-less tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 0 parameters, no annotations, and no output schema, the description is minimally adequate. It explains what the tool does but lacks details on behavior, output format, or usage context. For a simple check tool, this might suffice, but the absence of output schema means the description should ideally clarify what 'returns a preview' means, leaving some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description doesn't add parameter information, which is appropriate here. A baseline of 4 is applied since the schema fully covers the lack of parameters, and the description doesn't introduce confusion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Checks if the Supabase JWT secret is configured for this server and returns a preview.' It specifies the verb ('Checks'), resource ('Supabase JWT secret'), and scope ('for this server'), which distinguishes it from siblings like get_anon_key or get_service_key that retrieve different credentials. However, it doesn't explicitly differentiate from all siblings, such as get_database_connections, which might also involve configuration checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., server setup), exclusions (e.g., when other tools are more appropriate), or context for usage. Given the sibling tools include various configuration and management functions, this lack of guidance leaves the agent to infer usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
1 tool update
v1.0.0- Changed
generate_typescript_types3 fields changed- added
Input schema / properties / output_filenameAdded value: +{ + "default": "database.types.ts", + "description": "Filename to save the generated types to in the workspace root.", + "type": "string" +} - added
Input schema / properties / output_pathAdded value: +{ + "description": "Absolute path where to download the generated TypeScript file. Examples: Windows: \"C:\\\\path\\\\to\\\\project\\\\database.types.ts\", macOS/Linux: \"/path/to/project/database.types.ts\". This parameter is required.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[]New value: +[ + "output_path" +]
21 tool updates
- First observed
apply_migration - First observed
create_auth_user - First observed
delete_auth_user - First observed
execute_sql - First observed
generate_typescript_types - First observed
get_anon_key - First observed
get_auth_user - First observed
get_database_connections - First observed
get_database_stats - First observed
get_project_url - First observed
get_service_key - First observed
list_auth_users - First observed
list_extensions - First observed
list_migrations - First observed
list_realtime_publications - First observed
list_storage_buckets - First observed
list_storage_objects - First observed
list_tables - First observed
rebuild_hooks - First observed
update_auth_user - First observed
verify_jwt_secret
TDQS
Most tools have distinct purposes targeting specific Supabase domains like auth, database, storage, and migrations. However, some overlap exists between list_tables and list_extensions/list_migrations as they all list database entities, though their descriptions clarify the specific resources. The auth tools (create/update/delete/get/list_auth_user) are clearly differentiated by action.
Tool names follow a highly consistent verb_noun pattern throughout, using snake_case uniformly. Examples include apply_migration, create_auth_user, execute_sql, list_tables, and update_auth_user. This predictability makes it easy for agents to understand and select tools.
With 21 tools, the count is on the higher side but reasonable for a self-hosted Supabase server covering multiple domains like auth, database, storage, and migrations. It might feel slightly heavy, but each tool appears to serve a specific function without obvious redundancy.
The toolset provides comprehensive coverage for core Supabase operations, including CRUD for auth users, database queries, migrations, storage, and monitoring. Minor gaps exist, such as no direct tools for managing storage objects (only listing) or handling realtime subscriptions beyond listing publications, but agents can work around these using execute_sql or other tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- SupabaseOAuthcom.supabase
MCP server for interacting with the Supabase platform
Butterbase MCP server — manage your backend: schemas, auth, functions, storage, RAG, deploys.
- XataOAuthio.github.xataio
Xata MCP server lets AI agents interact with your Xata projects, and Postgres database branches.
Related MCP Servers
- FlicenseAqualityDmaintenanceA Model Context Protocol server that enables interaction with self-hosted Supabase instances, allowing developers to query database schemas, manage migrations, inspect statistics, and interact with Supabase features directly from MCP-compatible development environments.211-
- FlicenseNot gradedqualityDmaintenanceEnables developers to interact with self-hosted Supabase instances, providing database introspection, migration management, auth user operations, storage management, and TypeScript type generation directly from MCP-compatible development environments.-
- AlicenseNot gradedqualityDmaintenanceMCP server for Supabase, enabling database CRUD, storage management, auth administration, project management, edge functions, and secrets via 31 tools.13MIT
- AlicenseNot gradedqualityFmaintenanceMCP server for self-hosted Supabase with RLS-aware PostgreSQL and PostgREST layers, enabling safe database introspection, SQL queries, and PostgREST access via natural language.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/HenkDz/selfhosted-supabase-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server