Interacts with a self-hosted Supabase instance from MCP clients such as IDE extensions.
Setup
Choose your client, copy the config, then fill in any required environment variables.
claude mcp add self-hosted-supabase --env SUPABASE_URL='<SUPABASE_URL>' --env SUPABASE_ANON_KEY='<SUPABASE_ANON_KEY>' -- node dist/index.js --url '{{config.SUPABASE_URL}}' --anon-key '{{config.SUPABASE_ANON_KEY}}' --service-key '{{config.SUPABASE_SERVICE_ROLE_KEY}}' --db-url '{{config.DATABASE_URL}}' --jwt-secret '{{config.SUPABASE_AUTH_JWT_SECRET}}' --tools-config '{{config.TOOLS_CONFIG_PATH}}'~/.codex/config.toml
[mcp_servers.self-hosted-supabase]
command = "node"
args = ["dist/index.js", "--url", "{{config.SUPABASE_URL}}", "--anon-key", "{{config.SUPABASE_ANON_KEY}}", "--service-key", "{{config.SUPABASE_SERVICE_ROLE_KEY}}", "--db-url", "{{config.DATABASE_URL}}", "--jwt-secret", "{{config.SUPABASE_AUTH_JWT_SECRET}}", "--tools-config", "{{config.TOOLS_CONFIG_PATH}}"]
env = { SUPABASE_URL = "<SUPABASE_URL>", SUPABASE_ANON_KEY = "<SUPABASE_ANON_KEY>" }
# codex mcp add self-hosted-supabase --env SUPABASE_URL='<SUPABASE_URL>' --env SUPABASE_ANON_KEY='<SUPABASE_ANON_KEY>' -- node dist/index.js --url '{{config.SUPABASE_URL}}' --anon-key '{{config.SUPABASE_ANON_KEY}}' --service-key '{{config.SUPABASE_SERVICE_ROLE_KEY}}' --db-url '{{config.DATABASE_URL}}' --jwt-secret '{{config.SUPABASE_AUTH_JWT_SECRET}}' --tools-config '{{config.TOOLS_CONFIG_PATH}}'~/.cursor/mcp.json
{
"mcpServers": {
"self-hosted-supabase": {
"command": "node",
"args": [
"dist/index.js",
"--url",
"{{config.SUPABASE_URL}}",
"--anon-key",
"{{config.SUPABASE_ANON_KEY}}",
"--service-key",
"{{config.SUPABASE_SERVICE_ROLE_KEY}}",
"--db-url",
"{{config.DATABASE_URL}}",
"--jwt-secret",
"{{config.SUPABASE_AUTH_JWT_SECRET}}",
"--tools-config",
"{{config.TOOLS_CONFIG_PATH}}"
],
"env": {
"SUPABASE_URL": "<SUPABASE_URL>",
"SUPABASE_ANON_KEY": "<SUPABASE_ANON_KEY>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"self-hosted-supabase": {
"type": "stdio",
"command": "node",
"args": [
"dist/index.js",
"--url",
"{{config.SUPABASE_URL}}",
"--anon-key",
"{{config.SUPABASE_ANON_KEY}}",
"--service-key",
"{{config.SUPABASE_SERVICE_ROLE_KEY}}",
"--db-url",
"{{config.DATABASE_URL}}",
"--jwt-secret",
"{{config.SUPABASE_AUTH_JWT_SECRET}}",
"--tools-config",
"{{config.TOOLS_CONFIG_PATH}}"
],
"env": {
"SUPABASE_URL": "<SUPABASE_URL>",
"SUPABASE_ANON_KEY": "<SUPABASE_ANON_KEY>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"self-hosted-supabase": {
"command": "node",
"args": [
"dist/index.js",
"--url",
"{{config.SUPABASE_URL}}",
"--anon-key",
"{{config.SUPABASE_ANON_KEY}}",
"--service-key",
"{{config.SUPABASE_SERVICE_ROLE_KEY}}",
"--db-url",
"{{config.DATABASE_URL}}",
"--jwt-secret",
"{{config.SUPABASE_AUTH_JWT_SECRET}}",
"--tools-config",
"{{config.TOOLS_CONFIG_PATH}}"
],
"env": {
"SUPABASE_URL": "<SUPABASE_URL>",
"SUPABASE_ANON_KEY": "<SUPABASE_ANON_KEY>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"self-hosted-supabase": {
"command": "node",
"args": [
"dist/index.js",
"--url",
"{{config.SUPABASE_URL}}",
"--anon-key",
"{{config.SUPABASE_ANON_KEY}}",
"--service-key",
"{{config.SUPABASE_SERVICE_ROLE_KEY}}",
"--db-url",
"{{config.DATABASE_URL}}",
"--jwt-secret",
"{{config.SUPABASE_AUTH_JWT_SECRET}}",
"--tools-config",
"{{config.TOOLS_CONFIG_PATH}}"
],
"env": {
"SUPABASE_URL": "<SUPABASE_URL>",
"SUPABASE_ANON_KEY": "<SUPABASE_ANON_KEY>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"self-hosted-supabase": {
"command": "node",
"args": [
"dist/index.js",
"--url",
"{{config.SUPABASE_URL}}",
"--anon-key",
"{{config.SUPABASE_ANON_KEY}}",
"--service-key",
"{{config.SUPABASE_SERVICE_ROLE_KEY}}",
"--db-url",
"{{config.DATABASE_URL}}",
"--jwt-secret",
"{{config.SUPABASE_AUTH_JWT_SECRET}}",
"--tools-config",
"{{config.TOOLS_CONFIG_PATH}}"
],
"env": {
"SUPABASE_URL": "<SUPABASE_URL>",
"SUPABASE_ANON_KEY": "<SUPABASE_ANON_KEY>"
}
}
}
}Environment variables
SUPABASE_URLSUPABASE_ANON_KEY
Replace the placeholders with your own credentials and keep them out of version control.