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.
README
supabase-mcp-guard
English | 简体中文
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_sqlspecially: 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-keychainenvcommandpowershell-secretmanagementif you already use PowerShell on macOS
- Windows
powershell-secretmanagementwindows-credential-managerenvcommand
- Linux
envcommandpowershell-secretmanagementif PowerShell is installed
The first-class installers included in this repo are:
- macOS: scripts/install_macos.sh
- Windows: scripts/install_windows.ps1
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
SecretManagementandSecretStoremodules 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 DEFINERandsearch_pathunder 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:
- bump
package.jsonversion - commit and push to
main - create and push a version tag such as
v0.1.1 - GitHub Actions
Releasepublishes to npm and creates a GitHub Release
Required secret:
NPM_TOKENin 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
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。