supabase-rb MCP server

Point Claude Code, Cursor, or Windsurf at https://supabase-ruby.dev/api/mcp and your AI assistant gets structured access to every supabase-rb (Ruby) and supabase-rails page on this site — search, list, and fetch full markdown — without you copying snippets back and forth.

Sign in to authorize MCP access

The server is gated by OAuth via Better Auth's MCP plugin. MCP-compatible clients discover the authorization server at /.well-known/oauth-authorization-server, register themselves, and walk you through the GitHub login the first time they connect — no tokens to copy or paste.

Checking sign-in status…

Why this exists

AI assistants are good at answering Supabase questions; they are less good at answering supabase-rb questions because the gem's surface (Ruby keyword args, the Rails Authentication concern, the encrypted-cookie session store) is small relative to the JS ecosystem and easy to hallucinate. The MCP server pins your assistant to the actual docs: it can search for a topic, list_pages to discover what's covered, and get_page to read the canonical markdown.

Claude Code CLI

One-shot registration. The flag picks the streamable-HTTP transport so no mcp-remote bridge is needed:

claude mcp add --transport http supabase-rb https://supabase-ruby.dev/api/mcp

Or, if you'd rather commit the config so collaborators get it for free, drop this in .mcp.json at the root of your project:

{
  "mcpServers": {
    "supabase-rb": {
      "type": "http",
      "url": "https://supabase-ruby.dev/api/mcp"
    }
  }
}

Restart Claude Code after either change; it will prompt you to approve the server on first use.

Prefer a personal access token over the OAuth flow? Generate one in the sign-in card above, then either pass it on the CLI:

claude mcp add --transport http supabase-rb https://supabase-ruby.dev/api/mcp \
  --header "Authorization: Bearer $SUPABASE_RB_MCP_TOKEN"

…or commit it as an Authorization header in .mcp.json:

{
  "mcpServers": {
    "supabase-rb": {
      "type": "http",
      "url": "https://supabase-ruby.dev/api/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_TOKEN_HERE"
      }
    }
  }
}

Don't check a real token into source control — keep it in your shell env (e.g. SUPABASE_RB_MCP_TOKEN) and reference it from the CLI form above.

Codex CLI

Add to ~/.codex/config.toml for your user, or .codex/config.toml at the project root to scope it to one repo. Codex speaks streamable HTTP directly — no stdio bridge:

[mcp_servers.supabase-rb]
url = "https://supabase-ruby.dev/api/mcp"

Restart the codex session to pick the new server up. On first connect, Codex will open a browser tab so you can authorize the server with GitHub.

To skip the browser hop, generate a personal token above and add an Authorization header to the same TOML block:

[mcp_servers.supabase-rb]
url = "https://supabase-ruby.dev/api/mcp"

[mcp_servers.supabase-rb.headers]
Authorization = "Bearer YOUR_TOKEN_HERE"

stdio-only clients (Claude Desktop, older Cursor)

Tools that only speak stdio reach the remote endpoint through mcp-remote:

{
  "mcpServers": {
    "supabase-rb": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://supabase-ruby.dev/api/mcp"]
    }
  }
}

If the client can't complete the OAuth flow either, pass the personal token straight through mcp-remote via a header:

{
  "mcpServers": {
    "supabase-rb": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://supabase-ruby.dev/api/mcp",
        "--header",
        "Authorization: Bearer ${SUPABASE_RB_MCP_TOKEN}"
      ],
      "env": {
        "SUPABASE_RB_MCP_TOKEN": "YOUR_TOKEN_HERE"
      }
    }
  }
}

Tools exposed

search({ query, namespace?, limit? })

Ranked keyword search across titles, descriptions, and bodies. Returns slug, URL, title, description, namespace, score, and a snippet. Filter to ruby or rails with namespace.

list_pages({ namespace? })

Returns every documented page (slug, URL, title, description, namespace). Use this to discover what is covered before searching or fetching.

get_page({ slug })

Returns the full markdown body of one page. Slugs look like 'ruby/auth/signinwithpassword' or 'rails/authentication'.

See also

  • /llms.txt — the raw site index, for AI tools that consume llms.txt directly.
  • /llms-full.txt — every page concatenated into one markdown document.
  • Ruby reference — browse the same content the MCP server indexes.