Skip to main content
Glama
JiayuuWang

Supabase MCP Server

by JiayuuWang
README.md
# Supabase MCP Server

A Supabase MCP server built with the [Dedalus MCP framework](https://dedaluslabs.ai). Provides secure access to Supabase databases via the PostgREST API and management APIs with credential encryption and JIT token exchange.

## Features

### Database Tools (PostgREST)

#### Read Operations

| Tool | Description |
|------|-------------|
| `db_select` | Select rows from a table with optional filters, ordering, and pagination |
| `db_get_by_id` | Get a single row by primary key |

#### Write Operations

| Tool | Description |
|------|-------------|
| `db_insert` | Insert one or more rows into a table |
| `db_update` | Update rows matching specified filters |
| `db_delete` | Delete rows matching specified filters |
| `db_upsert` | Insert or update rows on conflict |

#### RPC

| Tool | Description |
|------|-------------|
| `db_rpc` | Call a Supabase stored procedure/function |

### Management Tools (Management API)

#### Projects & Organizations

| Tool | Description |
|------|-------------|
| `list_projects` | List all Supabase projects |
| `get_project` | Get details of a specific project |
| `list_organizations` | List all organizations |

#### Schema & Migrations

| Tool | Description |
|------|-------------|
| `list_tables` | List database schemas |
| `list_extensions` | List installed database extensions |
| `list_migrations` | List database migrations |
| `apply_migration` | Apply a DDL migration |
| `execute_sql` | Execute raw SQL with safety checks |

#### Branches

| Tool | Description |
|------|-------------|
| `list_branches` | List preview branches |
| `create_branch` | Create a preview branch |

#### Logs & Advisors

| Tool | Description |
|------|-------------|
| `get_logs` | Get project logs (database, api, auth) |
| `get_advisors` | Get security and performance advisors |

#### Codegen

| Tool | Description |
|------|-------------|
| `generate_typescript_types` | Generate TypeScript types for database schema |

## Prerequisites

- Python 3.10+
- [uv](https://docs.astral.sh/uv/) package manager
- Supabase project URL and API keys
- Dedalus API Key

## Setup

1. **Clone the repository**

```bash
git clone https://github.com/dedalus-labs/supabase-mcp.git
cd supabase-mcp
```

2. **Install dependencies**

```bash
uv sync
```

3. **Configure environment variables**

Create a `.env` file based on .env.example.

## Client Usage

```python
import asyncio
import os

from dotenv import load_dotenv
from dedalus_labs import AsyncDedalus, DedalusRunner
from dedalus_mcp.auth import Connection, SecretKeys, SecretValues

load_dotenv()

# Database connection (PostgREST)
supabase = Connection(
    name="supabase-mcp",
    secrets=SecretKeys(key="SUPABASE_SECRET_KEY"),
    base_url=f"{SUPABASE_URL}/rest/v1",
    auth_header_name="apikey",
    auth_header_format="{api_key}",
)

# Management API connection
supabase_mgmt = Connection(
    name="supabase-mcp-mgmt",
    secrets=SecretKeys(access_token="SUPABASE_ACCESS_TOKEN"),
    base_url="https://api.supabase.com/v1",
    auth_header_format="Bearer {api_key}",
)

# Bind credentials (encrypted client-side, decrypted at dispatch time)
db_secrets = SecretValues(supabase, key=os.getenv("SUPABASE_SECRET_KEY", ""))
mgmt_secrets = SecretValues(supabase_mgmt, access_token=os.getenv("SUPABASE_ACCESS_TOKEN", ""))

async def main():
    client = AsyncDedalus(
        api_key=os.getenv("DEDALUS_API_KEY"),
        base_url=os.getenv("DEDALUS_API_URL"),
        as_base_url=os.getenv("DEDALUS_AS_URL"),
    )
    runner = DedalusRunner(client)

    result = await runner.run(
        input="Select all rows from the users table, limit to 5.",
        model="anthropic/claude-sonnet-4-5",
        mcp_servers=["dedalus-labs/supabase-mcp"],
        credentials=[db_secrets, mgmt_secrets],
    )

    print(result.output)

if __name__ == "__main__":
    asyncio.run(main())
```

## Security

DAuth ensures that your Supabase credentials are encrypted client-side and only decrypted inside a sealed execution boundary. Your server code, logs, and error traces never contain raw credentials.

## License

MIT License - see [LICENSE](LICENSE) for details.