Connect your AI agent
Let Claude, ChatGPT, Cursor or your own script check your LCCBC outings, reply YES / NO and set your availability, as you.
Three steps
- Step 1: Create a tokenIn Settings → Calendar & agents. Pick read-only if the agent only needs to look. The token is shown once.
- Step 2: Add the MCP serverPaste one of the snippets below into your agent, with your token in place of
cb_YOUR_TOKEN. - Step 3: Just ask“What am I rowing this week?”, “Tell the captains I can't make Thursday”, “I'm free every morning next week”.
Connect
Run once in a terminal:
claude mcp add --transport http crewboard https://trustworthy-moose-24.convex.site/mcp \
--header "Authorization: Bearer cb_YOUR_TOKEN"Then type /mcp in Claude Code to check it is connected.
Safety
A token acts as you. Anything the agent does shows up as you, and captains see it came through the API. Keep tokens out of shared files and chats.
Agents should never reply YES or NO for you without asking. A NO alerts the captains and asks the squad for a sub.
Don't take your name out of a crew seat: reply NO and a captain moves you to the drop-outs. Only sub and erg slots can be withdrawn from.
Use a read-only token for agents that only need to look. Tokens expire (6 months by default) and you can revoke one any time in Settings; it stops working at once.
Tools and endpoints
OpenAPIEvery MCP tool is also a REST endpoint below /api/v1, with the same inputs and the same answer.
For everyone
whoamireadGET/meWho am I. Returns the signed-in person (the owner of this API token): name, email and every club membership with its status, display name, admin flag and squads (id, code, name, role).
list_sessionsreadGET/clubs/{club}/sessionsList sessions. Lists outings (on the water) and land / erg sessions in a club between two days (inclusive, at most 62 days).
my_upcoming_sessionsreadGET/clubs/{club}/me/upcomingMy upcoming sessions. The caller's own seats in published or cancelled sessions from today for the next `days` days (default 14, at most 62), soonest first.
get_sessionreadGET/sessions/{sessionId}Get a session. One session in full: everything from list_sessions plus every seat in order (id, kind crew | cox | land | sub | dropout, label, who is in it, their reply and note, `isMe`), notes, revision, cancel reason and what the caller may do (`permissions`).
reply_to_seatchanges dataPOST/seats/{seatId}/replyReply YES or NO. Replies YES (I'll be there) or NO (I can't make it) for one of the caller's own seats in a published session.
sign_up_for_sessionchanges dataPOST/sessions/{sessionId}/sign-upSign up for a session. Puts the caller into the first free sub slot of a published outing, or the first free erg slot of a land session (then a sub slot), and marks them YES.
withdraw_from_seatchanges dataPOST/seats/{seatId}/withdrawWithdraw from a sub or erg slot. Takes the caller out of a sub slot or an erg slot they hold.
list_open_slotsreadGET/clubs/{club}/open-slotsList open slots. Published sessions from today on (between `from` and `to`, at most 62 days) that the caller could still sign up for, with the number of free sub and erg slots.
get_availabilityreadGET/clubs/{club}/availabilityGet my availability. The caller's own availability per day between two days (at most 62): morning and afternoon each available | maybe | unavailable, with an optional note, or null when not set.
set_availabilitychanges dataPUT/clubs/{club}/availabilitySet my availability. Saves the caller's availability for up to 62 days (today up to 120 days ahead).
list_key_datesreadGET/clubs/{club}/key-datesList key dates. The club's key dates: races, Head-to-Heads, socials and deadlines, with date (or the original free-text date), entry deadline, location, organiser, course, link and the squads concerned.
list_squadsreadGET/clubs/{club}/squadsList squads. The club's squads (id, code, name, boat size, coxed, sub / erg slot counts, auto-publish rule) and the caller's role in each.
river_conditionsreadGET/conditionsRiver conditions. Current CUCBC flag on the Cam (with what it means for boating), the river level at the club's gauge, and today's and tomorrow's lighting-down / lighting-up times and weather.
For captains and coaches
create_sessionchanges dataPOST/squads/{squadId}/sessionsCreate a session (captains). Creates a DRAFT outing or land session for a squad, with the squad's default empty seats.
update_sessionchanges dataPATCH/sessions/{sessionId}Update a session (captains, coaches). Changes a session's details.
cancel_sessionchanges dataPOST/sessions/{sessionId}/cancelCancel a session (captains). Cancels a session (it stays visible, struck out) and tells everyone in it.
assign_seatchanges dataPOST/seats/{seatId}/assignAssign a seat (captains). Puts a member (membershipId, from list_members or squad_planner) or an unclaimed name from the old sheet (placeholderId) into a seat.
publish_weekchanges dataPOST/squads/{squadId}/publishPublish drafts (captains). Publishes every draft of a squad between `from` and `to` (default: the Monday–Sunday week containing `from`, or this week) and emails the crews.
squad_plannerreadGET/squads/{squadId}/plannerSquad planner (captains, coaches). The planning grid for one squad and one week (Monday–Sunday): the week's sessions, and every squad member with their availability per day (morning / afternoon) and the seats they already hold that day in any squad.
list_membersreadGET/clubs/{club}/membersList members. Active members of the club (or of one squad): membership id, display name, side, can cox / row, admin flag, committee titles and squads with roles.
list_join_requestsreadGET/clubs/{club}/join-requestsList join requests (captains). Open requests to join the club that the caller may decide: name, email, requested squad, side, can cox, message and when they asked.
approve_memberchanges dataPOST/memberships/{membershipId}/approveApprove a join request (captains). Lets a person into the club, into their requested squad (or `squadId`) with `role` (default member).
reject_memberchanges dataPOST/memberships/{membershipId}/rejectDecline a join request (captains). Declines an open join request.