supabase-mcp-guard

supabase-mcp-guard

A local policy wrapper for Supabase MCP that secures access tokens and enforces strict execution models, including project allowlists and write-access restrictions. It provides a safety layer to prevent AI agents from accidentally executing migrations or writing SQL against production environments.

Category
Visit Server

README

supabase-mcp-guard

English | 简体中文

CI License: MIT

Local policy wrapper for Supabase MCP.

It keeps your Supabase access token out of MCP config files and command-line arguments, adds local policy checks before requests hit the official @supabase/mcp-server-supabase, and makes production write access an explicit action instead of a default capability.

This project does not replace Supabase MCP. It sits in front of it.

Why this exists

Supabase MCP is powerful, but AI coding clients usually treat MCP servers as highly trusted local tools. In practice that creates a few common problems:

  • Supabase access tokens end up in plain text config files.
  • Tokens are passed through command-line arguments.
  • Production and development projects share one broad access token.
  • Write-capable tools are available by default.
  • AI agents can accidentally run migrations or write SQL against production.

supabase-mcp-guard reduces that risk locally with a stricter execution model.

What it does

  • Reads the Supabase access token from a configurable secret provider.
  • Keeps the token out of command-line arguments.
  • Supports project allowlists.
  • Blocks selected high-risk tools permanently.
  • Keeps write protection enabled by default.
  • Allows short unlock windows for write operations.
  • Treats execute_sql specially: read-only SQL can pass while write/DDL SQL is blocked unless unlocked.
  • Writes a local audit log for tool calls and blocked operations.

Current platform support

  • macOS
    • macos-keychain
    • env
    • command
    • powershell-secretmanagement if you already use PowerShell on macOS
  • Windows
    • powershell-secretmanagement
    • windows-credential-manager
    • env
    • command
  • Linux
    • env
    • command
    • powershell-secretmanagement if PowerShell is installed

The first-class installers included in this repo are:

Supported MCP clients

This project uses stdio transport, so it can be wired into many MCP-capable clients.

Documented in this repo:

  • Codex
  • Claude Code
  • Cursor
  • VS Code

Install

Clone the repo

git clone https://github.com/askmeishi/supabase-mcp-guard.git
cd supabase-mcp-guard

Install dependencies

npm install

Install from npm

npm install -g supabase-mcp-guard

If you install from npm globally, you can run the wrapper directly without cloning the repo:

supabase-mcp-guard --self-test

This checks that the binary starts correctly and shows whether a config file is already present.

macOS installer

./scripts/install_macos.sh --client=codex

What it does:

  • prompts for a new Supabase access token
  • stores it in macOS Keychain
  • writes config to ~/.config/supabase-mcp-guard/config.json
  • installs the wrapper to /usr/local/bin/supabase-mcp-guard
  • optionally patches ~/.codex/config.toml

Windows installer

Open PowerShell and run:

Set-ExecutionPolicy -Scope Process Bypass
.\scripts\install_windows.ps1

What it does:

  • prompts for a new Supabase access token
  • installs PowerShell SecretManagement and SecretStore modules if missing
  • stores the token in SecretStore
  • writes config to %APPDATA%\supabase-mcp-guard\config.json
  • installs the wrapper under %LOCALAPPDATA%\Programs\supabase-mcp-guard
  • adds the local wrapper directory to the user PATH

If you installed from npm instead of cloning this repo, you can still use the wrapper directly and create your config manually from config.example.json.

Secret providers

macos-keychain

Use macOS Keychain:

{
  "secretProvider": {
    "type": "macos-keychain",
    "service": "supabase-mcp-guard",
    "account": "primary"
  }
}

powershell-secretmanagement

Use PowerShell SecretManagement and a named secret:

{
  "secretProvider": {
    "type": "powershell-secretmanagement",
    "name": "supabase-mcp-guard",
    "vault": "SecretStore"
  }
}

windows-credential-manager

Use a Windows Credential Manager target:

{
  "secretProvider": {
    "type": "windows-credential-manager",
    "target": "supabase-mcp-guard"
  }
}

This provider expects a PowerShell environment where the CredentialManager module and Get-StoredCredential are available.

env

Read the token from an environment variable:

{
  "secretProvider": {
    "type": "env",
    "name": "SUPABASE_ACCESS_TOKEN"
  }
}

command

Read the token from an arbitrary local command:

{
  "secretProvider": {
    "type": "command",
    "command": "op",
    "args": ["read", "op://vault/item/token"]
  }
}

This is the most flexible option for unsupported platforms or custom secret stores.

Config

Example config: config.example.json

Typical config:

{
  "secretProvider": {
    "type": "macos-keychain",
    "service": "supabase-mcp-guard",
    "account": "primary"
  },
  "projectRef": null,
  "readOnly": false,
  "features": null,
  "apiUrl": null,
  "logFile": "~/.local/state/supabase-mcp-guard/audit.log",
  "stateFile": "~/.local/state/supabase-mcp-guard/write_lock.json",
  "defaultUnlockMinutes": 10,
  "allowedProjectIds": ["your-project-ref"],
  "alwaysBlockedTools": ["create_project", "pause_project", "restore_project"]
}

Notes:

  • allowedProjectIds: if set, requests for other project IDs are blocked.
  • projectRef: optional upstream fixed project binding.
  • readOnly: if true, all write-sensitive upstream tools are blocked even during unlock windows.
  • alwaysBlockedTools: tools that are always denied.

Client snippets

The CLI can print snippets directly:

supabase-mcp-guard print-snippet --client codex
supabase-mcp-guard print-snippet --client claude-code
supabase-mcp-guard print-snippet --client cursor
supabase-mcp-guard print-snippet --client vscode

Codex

[mcp_servers.supabase]
command = "supabase-mcp-guard"
startup_timeout_sec = 30

Claude Code

Use a stdio MCP server entry in your Claude Code MCP JSON:

{
  "mcpServers": {
    "supabase": {
      "type": "stdio",
      "command": "supabase-mcp-guard",
      "args": []
    }
  }
}

Cursor

Use a stdio MCP server entry in your Cursor MCP JSON:

{
  "mcpServers": {
    "supabase": {
      "type": "stdio",
      "command": "supabase-mcp-guard",
      "args": []
    }
  }
}

VS Code

Use a stdio MCP server entry in your VS Code MCP config:

{
  "servers": {
    "supabase": {
      "type": "stdio",
      "command": "supabase-mcp-guard",
      "args": []
    }
  }
}

Usage

Start as MCP stdio server:

supabase-mcp-guard

Check current lock state:

supabase-mcp-guard status

Temporarily unlock writes:

supabase-mcp-guard unlock --minutes 10

Lock again:

supabase-mcp-guard lock

Self-test:

supabase-mcp-guard --self-test

Security model

The guard enforces a local policy layer before forwarding requests upstream:

  • execute_sql
    • read-only SQL is allowed
    • write/DDL SQL is blocked unless unlocked
  • tools marked by upstream as write-capable
    • blocked unless unlocked
  • tools in alwaysBlockedTools
    • always blocked
  • project IDs outside allowedProjectIds
    • always blocked

This helps reduce accidental misuse, but it is not a substitute for correct database-side security:

  • do not expose sensitive schemas
  • use proper grants
  • use RLS where appropriate
  • keep SECURITY DEFINER and search_path under control

Audit log

The wrapper writes a local audit log to the configured logFile.

Examples:

  • macOS/Linux default: ~/.local/state/supabase-mcp-guard/audit.log
  • Windows default: %LOCALAPPDATA%\supabase-mcp-guard\audit.log

Blocked requests and completed upstream tool calls are both recorded.

Threat model

This project is designed for the common local AI-assistant risk model:

  • you trust your own machine
  • you do not want secrets sitting in plaintext config
  • you want a last-mile local policy check before production writes

It does not protect against:

  • a fully compromised machine
  • malicious code already running with your user privileges
  • overbroad permissions granted directly inside Supabase

Publishing

This repository is set up for both local package validation and tagged releases.

Local verification before release:

npm run check
npm pack --dry-run

Release flow:

  1. bump package.json version
  2. commit and push to main
  3. create and push a version tag such as v0.1.1
  4. GitHub Actions Release publishes to npm and creates a GitHub Release

Required secret:

  • NPM_TOKEN in the GitHub repository secrets

Roadmap

  • Linux first-class installer
  • client-specific helper commands beyond config snippets
  • finer-grained SQL policy rules
  • environment-specific policies
  • notification hooks for blocked high-risk actions

References

For the latest client-specific MCP setup details, check the official client docs:

The JSON snippets above are intended for stdio-based MCP clients and may need minor path adjustments depending on how you install the wrapper.

License

MIT

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured