Before You Give an AI Agent a Key: What Supabase MCP "Read-Only" Really Means, and a Data Inventory Page A developer demonstrated that Supabase's MCP "read_only=true" setting runs queries as a Postgres role (supabase_read_only_user) that has rolbypassrls enabled, meaning it skips Row Level Security and can read every row in reach. Using a look-alike role with the same SELECT-only, bypassrls properties, the developer showed it could read all invoices across both tenants while write attempts were blocked, and built a small page listing what a read-only AI connection could access. The takeaway: read-only prevents writes but not data exposure, so it must be combined with project scoping and restricted tool groups. You can connect an AI agent straight to your Supabase project through MCP. The connection URL has three knobs that narrow what you hand over, and one of them is called read-only. I wanted to know what each knob changes, and what "read-only" means inside the database. So I flipped the switches, looked at the database role behind them, and built a small page that lists what a read-only AI connection could read. AI disclosure: I used Claude to help draft this post. I ran every step in my own project, checked the results, and edited the text. The mistakes are mine. Repo: https://github.com/tomozilla/mcp-least-privilege-demo-en https://github.com/tomozilla/mcp-least-privilege-demo-en Plain-language companion no code, no product names : https://medium.com/p/274dd42897e3 https://medium.com/p/274dd42897e3 Open Connect , then the MCP tab. In my project the starting point was: The project ref in this and the next screenshot is replaced with a fake one. The command it generates: claude mcp add --scope project --transport http supabase \ "https://mcp.supabase.com/mcp?project ref=