list_tablesLABSCO SUMMARY
Administrative reach, with an administrative blast radius.
The coverage is unusually wide for a database server: RLS policies, roles, realtime channels and storage all sit next to ordinary CRUD, so an agent can do the things you would normally open the dashboard for. That is also the caution — drop_table, delete_role and a raw query tool are in the same list, and the connection string carries your database password, so scope the credential to what you are willing to have changed.
What it is
An MCP server that connects to your Supabase Postgres instance with a pooler connection string and exposes the whole administrative surface as tools. Not just queries: schema changes, row-level security policies, database roles, storage buckets, enumerated types, publications and the realtime configuration are all reachable, plus a query tool for arbitrary SQL when nothing else fits.
What you get
- Tables created, renamed and dropped, columns added, altered and dropped, and rows read and written —
list_tables,create_table,drop_table,rename_table,add_column,drop_column,alter_column,fetch_records,create_record,update_record,delete_record - Indexes and constraints managed as first-class objects —
list_indexes,create_index,delete_index,update_index,list_constraints,add_constraint,remove_constraint,update_constraint - Database functions and triggers written and replaced —
list_functions,create_function,update_function,delete_function,list_triggers,create_trigger,update_trigger,delete_trigger - Row-level security policies and database roles, the part most agents cannot reach —
list_policies,create_policy,update_policy,delete_policy,list_roles,create_role,update_role,delete_role - Storage buckets, files and folders —
list_buckets,create_bucket,delete_bucket,delete_file,bulk_delete_files,list_folders - Realtime policies, channels and messages, plus its status and views —
list_realtime_policies,create_realtime_policy,update_realtime_policy,delete_realtime_policy,list_realtime_channels,manage_realtime_channels,send_realtime_message,get_realtime_messages,manage_realtime_status,manage_realtime_views - Enumerated types, publications and auth users —
list_enumerated_types,create_enumerated_type,update_enumerated_type,delete_enumerated_type,list_publications,create_publication,update_publication,delete_publication,list_users,create_user,update_user,delete_user - Arbitrary SQL when the typed tools do not cover it —
query
Requirements
Node.js >= 16.x and npm >= 8.x, then npm install and npm run build — there is no published package, you run dist/index.js yourself. The Supabase project ID, the database password and the pooler connection string go on the command line as a single argument, so the credential sits in your client config; keep that file out of version control. Use absolute paths for both the node binary and dist/index.js, which is the most common reason the server fails to appear. DEBUG=true in front of the command prints detailed logs. On Windsurf/Cascade only tools are supported — no prompts, no resources, stdio only — and tool calls consume credits whether they succeed or fail.
Setup effort
Build from source — git clone https://github.com/Quegenx/supabase-mcp-server.git
USE CASES
Sketching a schema by describing it
Create the table, add the columns and put an index on the one you will filter by, then list the tables back to confirm what landed.
Checking who can actually read a table
List the row-level security policies and the database roles side by side, instead of clicking through the dashboard tab by tab.
Cleaning up a storage bucket
List folders to see what is there, then remove files individually or in bulk without writing a script.
Debugging a realtime subscription
Read the realtime channels and the messages that arrived, check the policies that govern them, and send a test message.
Answering a question the typed tools do not cover
Fall back to raw SQL for the one-off aggregate or join rather than stringing together five list calls.
64 tools
Listed in project docs. Your client may show a different list.
create_tabledrop_tablerename_tableadd_columndrop_columnalter_columnfetch_recordscreate_recordupdate_recorddelete_recordlist_indexescreate_indexdelete_indexupdate_indexlist_constraintsadd_constraintremove_constraintupdate_constraintlist_functionscreate_functionupdate_functiondelete_functionlist_triggerscreate_triggerupdate_triggerdelete_triggerlist_policiescreate_policyupdate_policydelete_policylist_rolescreate_roleupdate_roledelete_rolelist_bucketscreate_bucketdelete_bucketdelete_filebulk_delete_fileslist_folderslist_enumerated_typescreate_enumerated_typeupdate_enumerated_typedelete_enumerated_typelist_publicationscreate_publicationupdate_publicationdelete_publicationlist_realtime_policiescreate_realtime_policyupdate_realtime_policydelete_realtime_policylist_realtime_channelsmanage_realtime_channelssend_realtime_messageget_realtime_messagesmanage_realtime_statusmanage_realtime_viewslist_userscreate_userupdate_userdelete_userqueryBEFORE YOU INSTALL
What to know first
Tools you get
64 tools named in the project's documentation.
Requires
- Node.js >= 16.x
- npm >= 8.x
Where it runs
Both documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
git clone https://github.com/Quegenx/supabase-mcp-server.git
cd supabase-mcp-server
npm install
npm run buildMCP Clients
Cursor
Add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project). The README's one-line command was for Cursor's older Add New MCP Server dialog; it is the same node command and arguments as this block.
{
"mcpServers": {
"supabase-mcp": {
"command": "<YOUR_PATH_TO_NODE>",
"args": [
"<YOUR_PATH_TO_DIST>/index.js",
"postgresql://postgres.<YOUR_PROJECT_ID>:<YOUR_PASSWORD>@aws-0-eu-central-1.pooler.supabase.com:5432/postgres"
]
}
}
}<YOUR_PATH_TO_NODE> is the output of which node (where node on Windows), and <YOUR_PATH_TO_DIST>/index.js is the full path of dist/index.js in your supabase-mcp-server clone (it exists after npm run build). The connection string is an example for a project in eu-central-1: use your own project's pooler connection string from the Supabase dashboard in its place, with your database password where it says <YOUR_PASSWORD>. Only the <YOUR_PROJECT_ID> and <YOUR_PASSWORD> parts match every project; the host differs by region.
Windsurf
Create or edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"supabase-mcp": {
"command": "<YOUR_PATH_TO_NODE>",
"args": [
"<YOUR_PATH_TO_DIST>/index.js",
"postgresql://postgres.<YOUR_PROJECT_ID>:<YOUR_PASSWORD>@aws-0-eu-central-1.pooler.supabase.com:5432/postgres"
]
}
}
}<YOUR_PATH_TO_NODE> is the output of which node (where node on Windows), and <YOUR_PATH_TO_DIST>/index.js is the full path of dist/index.js in your supabase-mcp-server clone (it exists after npm run build). The connection string is an example for a project in eu-central-1: use your own project's pooler connection string from the Supabase dashboard in its place, with your database password where it says <YOUR_PASSWORD>. Only the <YOUR_PROJECT_ID> and <YOUR_PASSWORD> parts match every project; the host differs by region.