Getting started
Prerequisites
Section titled “Prerequisites”- A Marques Boxing staff account (
owner,staff, orteacherrole) — the same login used forapp.marquesboxing.devfellowship.com. - An MCP client that speaks Streamable HTTP with a custom
Authorizationheader (Claude Code, Claude Desktop with a proxy, or any MCP SDK client).
1. Get a Supabase access token
Section titled “1. Get a Supabase access token”The MCP server accepts the same JWT the staff web app uses. The simplest way to get one for a script or a test is the password grant against Supabase Auth:
curl -s -X POST "$SUPABASE_URL/auth/v1/token?grant_type=password" \ -H "apikey: $SUPABASE_PUBLISHABLE_KEY" \ -H "Content-Type: application/json" \ -d "{\"email\":\"$EMAIL\",\"password\":\"$PASSWORD\"}" \ | jq -r .access_tokenSUPABASE_URL and SUPABASE_PUBLISHABLE_KEY are the same public values
apps/web’s .env uses — they identify the project, not a secret
credential. The email/password are a real staff account’s own login.
2. Point your MCP client at the server
Section titled “2. Point your MCP client at the server”- Endpoint:
https://mcp-server.marquesboxing.devfellowship.com/mcp - Transport: Streamable HTTP
- Header:
Authorization: Bearer <token from step 1> - Send an
initializerequest, thennotifications/initialized, thentools/listto confirm you see all 33 tools.
A minimal raw handshake, for debugging without a full MCP client:
curl -s -D - -o /dev/null -X POST https://mcp-server.marquesboxing.devfellowship.com/mcp \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{ "protocolVersion":"2025-06-18","capabilities":{}, "clientInfo":{"name":"my-client","version":"0.0.1"}}}'# -> read the `mcp-session-id` response header, then reuse it:curl -s -X POST https://mcp-server.marquesboxing.devfellowship.com/mcp \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "mcp-session-id: $SESSION_ID" \ -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'3. Call a tool
Section titled “3. Call a tool”curl -s -X POST https://mcp-server.marquesboxing.devfellowship.com/mcp \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "mcp-session-id: $SESSION_ID" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call", "params":{"name":"list_students","arguments":{}}}'See the tools reference for every tool’s full argument shape.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Cause |
|---|---|
401 on initialize | Missing/expired/malformed bearer token. Tokens from the password grant expire — mint a fresh one. |
Caller is not a registered staff user | The Supabase auth user has no matching public.users row (not staff, or provisioning didn’t complete). Ask an owner to invite the account via invite_staff. |
400 Bad Request: No valid session | You called a method other than initialize without an mcp-session-id header from a prior initialize response. |
| A tool call succeeds but returns nothing | RLS is filtering by organization — you’re authenticated, but scoped to a different (or no) org than you expected. |