Before you start
Get your API key
calid_ followed by a long string.Copy the server URL
Have your client ready
Set up your client
- Claude Desktop
- Cursor
- ChatGPT
- Other clients
mcp-remote bridge instead. It runs a small local process that forwards to the hosted server:Verify the connection
The only real check is to call a tool. Useget_users_me: it reads your own profile, changes nothing, and needs no arguments.
The quickest version is conversational: open a new chat and ask “Who am I in Cal ID?” If your own name and email come back, your key works. If the assistant reports an error from the tool, the key is the first thing to suspect.
Check it manually
Useful when a client fails silently, or when support asks what the server returned.Open a session
mcp-session-id response header:mcp-session-id value out of the response headers. This step succeeds with any key, including a fake one — it proves the endpoint is reachable, nothing more.List the tools (optional)
Call get_users_me — this is the real test
result object’s first content block reports a 200 and your profile follows in the second:isError is true and the first content block reports a 401:data: . That’s expected — it isn’t an error.Troubleshooting
Tools are listed, but every tool call fails
Tools are listed, but every tool call fails
HTTP 401 GET /users/me and isError: true.- Confirm the header is
Authorization: Bearer calid_xxx— the wordBearer, one space, then the key. - Check for a trailing space or line break from copy-paste.
- Confirm the key still exists under Settings → Developer → API Keys.
- If you use
mcp-remote, check that the key is passed with--header, not through an environment variable likeMCP_REMOTE_HEADER_AUTHORIZATION. That variable does nothing, and the bridge will connect without any credentials at all. See the Claude Desktop tab. - Also with
mcp-remote, check there is no space after the colon inAuthorization:${AUTH_HEADER}.
?apiKey= to the URL will not authenticate.The server connects but no tools appear
The server connects but no tools appear
Accept header the server requires.- Send
Accept: application/json, text/event-stream. Both values are mandatory. Sending onlyapplication/jsonreturns406with the messageClient must accept both, and most clients surface that as an empty tool list rather than an error. - Restart the client fully, then reopen it.
- Make sure the URL ends in
/mcp, not/or/docs. - If your client needs stdio, switch to the
mcp-remotebridge.
The configuration is rejected as invalid
The configuration is rejected as invalid
A tool returns 'Expected string, received number' — or the reverse
A tool returns 'Expected string, received number' — or the reverse
eventTypeId is a string for get_slots and a number for create_booking, so the slots-then-book flow needs it converted in between: "106371" for slots, 106371 for the booking.If you’re prompting conversationally you’ll rarely hit this. If you’re calling tools directly, see the type gotchas.A tool returns 'Required' with path ['body']
A tool returns 'Required' with path ['body']
body object. Sending the fields at the top level fails validation before the request reaches the API. See the body wrapper.Creating a booking fails with no_available_users_found_error
Creating a booking fails with no_available_users_found_error
get_slots first and book one of the times it returns. See Booking through MCP.I'm not sure which client to use
I'm not sure which client to use
get_users_me result from the manual check above — with your key redacted — since that’s the step that shows whether you’re authenticated.