Overview
Hosted HTTP
POST https://rheba.io/mcp with JSON-RPC 2.0. One round-trip per call. Best for hosted LLM platforms (Claude.ai, ChatGPT plugins, custom apps).
Stdio (local)
@rheba/mcp-server — runs as a subprocess of Claude Desktop, Codex, or any MCP-compatible client. Owns its own OAuth dance + DPoP keypair.
Transport
Both transports speak JSON-RPC 2.0. The HTTP endpoint accepts tools/list, tools/call, and the standard initialize handshake. Tools/list is filtered by the token's scopes — an LLM never sees a tool it isn't authorized to call.
curl -X POST https://rheba.io/mcp \
-H "Authorization: DPoP <access-token>" \
-H "DPoP: <dpop-proof-jwt>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Authentication
OAuth 2.1 with PKCE. Tokens may optionally be sender-constrained with DPoP (RFC 9449) — the stdio client does this by default. The authorization-server metadata is served at the standard well-known location:
→ /.well-known/oauth-authorization-server
→ Dashboard → Apps shows connected agents and lets users disconnect any one of them with immediate effect.
→ POST /api/v1/auth/revoke for RFC 7009 token revocation.
Scopes
The user grants scopes during authorize. The MCP layer enforces them per tool call and filters the tool list at tools/list.
availability:readRead the user's availability buckets and group mutual times.
backoffice:read(no description)
backoffice:write(no description)
cities:read(no description)
coordinate:readRead coordination requests and group proposals.
coordinate:writeCreate proposals, respond to slots, finalize accepted slots.
credits:read(no description)
events:readRead the user's calendar (creator-only at the MCP boundary).
events:writeCreate, update, delete, restore the user's events.
groups:readList the user's groups and their members (names only).
groups:write(no description)
notifications:read(no description)
notifications:writeCreate notifications attributable to this agent.
tasks:read(no description)
tasks:write(no description)
users:readSearch users in the caller's network (group-shared only).
Tool Catalog
76 tools
Below is the live catalog from the running server — sourced directly from app/mcp/tools.ts. Names, descriptions, and argument schemas update with each deploy.
rheba_add_group_memberAdd a user to a group by userId, with a role (owner|admin|member|follower; default member). Caller must have manage-members permission in the group. Find a userId with rheba_search_users.
Scopes
groups:writeArguments
groupIdstringrequireduserIdstringrequiredThe user to add (from rheba_search_users).rolestringDefault 'member'.rheba_auto_book_timeAUTO-BOOK — the write half of Auto-find. Re-runs the find, then HOLDS the best slot as a potential group event and invites every member (available ones flagged). Use after rheba_auto_find_time to commit the chosen slot in one step. slotIndex 0 = the chosen slot (default), 1+ = an alternative. Requires coordinator (create_bookings) authority. This creates a HOLD, not a confirmed event.
Scopes
events:writegroups:readArguments
groupIdstringrequiredtitlestringrequiredEvent title for the hold.durationMinutesnumberrequiredHow long the block needs to be.startDatestringrequiredISO YYYY-MM-DD — window start.endDatestringISO YYYY-MM-DD — window end (default = startDate).slotIndexnumber0 = chosen (default), 1+ = an alternative.modestringDefault 'all' (everyone free).minMembersnumberFor mode 'most' — the floor (default = majority).flavorstringhourFromnumber0–24 — restrict to hours ≥ this.hourTonumber0–24 — restrict to hours ≤ this.policystringDefault 'soonest'.rheba_auto_find_timeAUTO-FIND — the 'system decides' way to schedule. Given a group, a duration, and a date window, returns the SINGLE best time everyone (or the most people) is free, computed straight from the availability graph — no proposing, no voting. Returns { chosen, alternatives } for a one-tap confirm. mode 'all' (everyone free) | 'most' (with minMembers); policy 'soonest' (default) | 'max_attendance'. Use this instead of asking people 'when are you free?' — Rheba already knows.
Scopes
availability:readgroups:readArguments
groupIdstringrequireddurationMinutesnumberrequiredHow long the block needs to be.startDatestringrequiredISO YYYY-MM-DD — window start.endDatestringISO YYYY-MM-DD — window end (default = startDate).modestringDefault 'all' (everyone free).minMembersnumberFor mode 'most' — the floor (default = majority).flavorstringhourFromnumber0–24 — restrict to hours ≥ this.hourTonumber0–24 — restrict to hours ≤ this.policystringDefault 'soonest'.rheba_bulk_clear_eventsSoft-delete the user's scheduling events in a date range. Capped at 90 days per call.
Scopes
events:writeArguments
startDatestringrequiredendDatestringrequiredrheba_cancel_jobCancel a Back Office job and remove its booking events. Caller must dispatch for the job's group.
Scopes
backoffice:writeArguments
jobIdstringrequiredrheba_cancel_proposalCancel (withdraw) a proposal you initiated while it's still in flight. Members are notified. Accepted / fully-declined / expired proposals can't be cancelled. Only the initiator may cancel.
Scopes
coordinate:writeArguments
crCodestringrequiredrheba_check_spatial_fitPre-flight: can a candidate booking fit at the city + time given existing bookings?
Scopes
events:readArguments
datestringrequiredcityIdstringrequiredstartTimestringrequiredendTimestringrequiredbufferMinutesnumberrheba_claim_slotClaim an opening on a board. You must be a group member. Capacity is enforced atomically — the last spot cannot be double-claimed. Re-claiming a slot you hold is a no-op.
Scopes
availability:readgroups:readArguments
claimIdstringrequiredslotIdstringrequiredrheba_close_claim_boardClose a claim board (no more claims). Creator or coordinator only.
Scopes
events:writegroups:readArguments
claimIdstringrequiredrheba_close_collectionClose a collection (no more share updates). Creator or coordinator only.
Scopes
groups:writeArguments
collectionIdstringrequiredrheba_close_preference_pollClose a preference round. Pass book=true to also HOLD the winning slot as a potential group event (inviting everyone) in one step. Only the round's creator or a group coordinator may close it.
Scopes
events:writegroups:readArguments
pollIdstringrequiredbookbooleanAlso book the winner.rheba_commit_quorumCommit to (or out of) a quorum round — stance 'in' or 'out'. You must be a group member. When the 'in' count reaches the threshold the event auto-locks and is scheduled.
Scopes
availability:readgroups:readArguments
quorumIdstringrequiredstancestringrequiredrheba_complete_jobMark a Back Office job complete. Caller must dispatch for the job's group.
Scopes
backoffice:writeArguments
jobIdstringrequiredrheba_complete_taskMark a task as completed. Irreversible via MCP — use delete if you want to remove it instead.
Scopes
tasks:writeArguments
eventIdstringrequiredTask eventId from rheba_list_tasksrheba_convert_pipeline_leadConvert an ACCEPTED booking-request lead into a dispatchable Job with unfilled role slots. Idempotent — re-converting the same lead returns the existing job. Caller must dispatch for the lead's group.
Scopes
backoffice:writeArguments
requestIdstringrequiredrheba_create_claim_boardCLAIM — the 'who grabs it' way to coordinate. Post a set of limited openings (shifts, sub spots, volunteer slots, 'bring the drinks'); members claim them first-come. Each slot has an optional time and a capacity (default 1). Requires coordinator (create_bookings) authority.
Scopes
events:writegroups:readArguments
groupIdstringrequiredtitlestringrequiredslotsarrayrequiredThe openings to post.closesAtstringOptional ISO soft deadline.rheba_create_collectionCOLLECT MONEY from a group — dues, a split cost, a tip jar ('collect $20 each for the trip'). TRACKING only: Rheba records who owes/paid, it never holds or moves funds (payment happens off-app via payTo). Split one of three ways: `shares` (explicit per-member amounts) | `perMember` (everyone pays the same) | `total` (split equally). memberIds defaults to all group members. Requires coordinator (manage_members).
Scopes
groups:writeArguments
groupIdstringrequiredtitlestringrequiredcurrencystringDefault USD.notestringpayTostringHow to pay (e.g. "Venmo @you", a link) — display only.dueDatestringOptional ISO due date.perMembernumberEveryone pays this amount.totalnumberSplit this total equally.memberIdsarrayWho to collect from (default all members).sharesarrayrheba_create_eventCreate a single non-recurring scheduling event. Default duration 1 hour. Use this for one-off events. For repeating series use rheba_create_recurring_events.
Scopes
events:writeArguments
titlestringrequireddatestringrequiredISO YYYY-MM-DDstartTimestringrequiredHH:MM 24h, e.g. "14:30"endTimestringHH:MM 24h. Defaults to startTime + 1 hour.descriptionstringcityIdstringCity id; defaults to user's home citycitystringDisplay name for the citybufferMinutesnumberrheba_create_groupCreate a new group owned by the user. Groups are the core container for members, a shared calendar, and coordination. Free-tier users are limited to one group (returns an upgrade error beyond that). Returns the created group incl. its groupId.
Scopes
groups:writeArguments
namestringrequireddescriptionstringisPublicbooleanDefault false (private).typeSlugstringOptional group type/category slug.maxMembersnumberOptional cap; 0 = unlimited.rheba_create_preference_pollPREFERENCE — the 'members decide' way to schedule. Seeds candidate slots straight from the availability graph (only times that already work for the threshold), then members rank preference + confirm intent in one pass and the system picks the winner. NOT a blank poll, NOT a discussion — members only ever rank times everyone is already free for. Requires coordinator (create_bookings) authority. Returns the poll + its candidate slots (each with an index members vote by).
Scopes
events:writegroups:readArguments
groupIdstringrequiredtitlestringrequireddurationMinutesnumberrequiredstartDatestringrequiredISO YYYY-MM-DD — window start.endDatestringISO YYYY-MM-DD — window end (default startDate).modestringminMembersnumberflavorstringhourFromnumberhourTonumberpolicystringmaxCandidatesnumberHow many slots to offer (2–10, default 5).closesAtstringOptional ISO soft deadline.rheba_create_proposalCreate a group coordination proposal with 3–5 candidate slots. Initiator must be a member of the target group. Slot 0 goes out for confirmation immediately; on any decline the cycle advances to the next slot. Always propose 3+ slots — single-slot proposals leave the recipient no real choice.
Scopes
coordinate:writegroups:readArguments
groupIdstringrequiredtitlestringrequiredmessagestringproposedSlotsarrayrequiredMust propose 3-5 candidate slots so the recipient has real options to pick from.expiresInMinutesnumberrheba_create_quorumQUORUM — the 'whether, not when' way to schedule. Propose a specific time and a threshold N; the event LOCKS IN only when ≥N members commit 'in' (else it doesn't happen). Pickup games, optional gigs, min-enrollment classes. Reaching the threshold auto-holds the time as a group event. Requires coordinator (create_bookings) authority.
Scopes
events:writegroups:readArguments
groupIdstringrequiredtitlestringrequiredstartDatestringrequiredISO YYYY-MM-DD of the proposed time.startTimenumberrequiredHHMM military start (e.g. 1900).durationMinutesnumberrequiredthresholdnumberrequiredMembers needed for it to happen.closesAtstringOptional ISO soft deadline.rheba_create_recurring_eventsCreate a recurring scheduling or task series.
Scopes
events:writeArguments
titlestringrequiredanchorDatestringrequiredstartTimestringrequiredendTimestringrequiredhorizonMonthsnumberrequiredkindstringrequiredruleobjectrequireddescriptionstringcityIdstringrheba_create_subgroupCreate a private subgroup under a parent group (e.g. a committee or team). Caller must have manage-members permission in the parent. Returns the new subgroup incl. its groupId.
Scopes
groups:writeArguments
groupIdstringrequiredThe PARENT group id.namestringrequireddescriptionstringrheba_create_taskCreate a personal task. Tasks can be flexible (floating, no time anchor) or pinned to a time slot. Use rheba_list_tasks to verify after creation.
Scopes
tasks:writeArguments
titlestringrequiredTask title (required)descriptionstringstartTimestringISO datetime for a pinned taskendTimestringISO datetime for a pinned taskflexiblebooleanTrue for floating tasks (default true)deadlinestringISO datetime deadlineestimatedMinutesnumberEstimated duration in minutesimportancestringurgencystringrheba_delete_eventDelete a single scheduling event by id. For recurring series use rheba_delete_event_series with scope 'one' | 'following' | 'all'.
Scopes
events:writeArguments
eventIdstringrequiredrheba_delete_event_seriesDelete one occurrence, this and following, or the whole series.
Scopes
events:writeArguments
eventIdstringrequiredscopestringrequiredrheba_delete_taskDelete (soft-delete) a personal task. Deleted tasks are not restorable via MCP. Prefer rheba_complete_task for tasks that are done.
Scopes
tasks:writeArguments
eventIdstringrequiredTask eventId from rheba_list_tasksrheba_find_group_availabilityMutual free times across all members of a group on a date range.
Scopes
availability:readgroups:readArguments
groupIdstringrequiredstartDatestringrequiredendDatestringrheba_find_group_availability_rangeMutual free times across a group over a date range. Wider than find_group_availability (which is single-day). Use for 'when can the family meet next week?' patterns.
Scopes
availability:readgroups:readArguments
groupIdstringrequiredstartDatestringrequiredendDatestringrequiredflavorstringrheba_find_mutual_with_personWhen the user asks 'when can X and I meet?' — pass the person's first name. Returns mutual free times for the smallest group both share. Permission-gated: only finds people the user already shares at least one group with — if there's no match, the user is not connected to anyone by that name.
Scopes
availability:readgroups:readusers:readArguments
personNamestringrequiredThe other person's first name (or any substring of their name)startDatestringrequiredISO YYYY-MM-DDendDatestringISO YYYY-MM-DD (defaults to startDate)rheba_get_availabilityUser's availability buckets for a date.
Scopes
availability:readArguments
datestringrequiredrheba_get_availability_bucketsDetailed availability breakdown for a date: avail (marked available), scheduled (booked by an event), other (unmarked free gaps), and a combined times array. Optionally filter by flavor.
Scopes
availability:readArguments
datestringrequiredISO YYYY-MM-DDflavorstringrheba_get_calendarReturn events the user CREATED in a date range. Does NOT return events the user was invited to or is attending — those are app-only and not exposed via MCP for privacy. Dates are ISO YYYY-MM-DD.
Scopes
events:readArguments
startDatestringrequiredISO YYYY-MM-DDendDatestringISO YYYY-MM-DDrheba_get_claim_boardGet a claim board: its slots, who claimed each, and remaining capacity.
Scopes
availability:readgroups:readArguments
claimIdstringrequiredrheba_get_collectionGet a collection: per-member shares (owed/paid/waived) + totals (total/collected/outstanding).
Scopes
groups:readArguments
collectionIdstringrequiredrheba_get_credit_balanceThe user's Rheba credit balance (cents + a formatted dollar string), lifetime earned, and recent credit history.
Scopes
credits:readrheba_get_day_citiesUser's own bookings on a date with cities, ordered by start.
Scopes
events:readavailability:readArguments
datestringrequiredrheba_get_deleted_eventsUser's recently soft-deleted events.
Scopes
events:readArguments
rangeDaysnumberrheba_get_group_analyticsOwner-facing group analytics: membership + COORDINATION THROUGHPUT (events, preference/quorum/claim rounds, collections, jobs — total + last 30 days), money coordinated, and last activity. Shows how much real coordination the group drives. Aggregate + read-only; coordinator (manage_members) only.
Scopes
groups:readArguments
groupIdstringrequiredrheba_get_jobFull detail of a Back Office job — role assignments + status. Caller must dispatch for the job's group.
Scopes
backoffice:readArguments
jobIdstringrequiredrheba_get_job_invoiceGet the recorded invoice for a job (number, status, online URL) if one has been created.
Scopes
backoffice:readArguments
jobIdstringrequiredrheba_get_job_payoutsList the per-assignee payout amounts recorded on a Back Office job.
Scopes
backoffice:readArguments
jobIdstringrequiredrheba_get_preference_pollGet a preference round with its live tally — the candidate slots, each one’s score and preferred/ok/cant breakdown, and the current winner. Use to show members where the round stands.
Scopes
availability:readgroups:readArguments
pollIdstringrequiredrheba_get_proposalFull state of a coordination proposal: current slot, all proposed slots, per-member responses, and cycle history. Caller must be initiator or member.
Scopes
coordinate:readArguments
crCodestringrequiredrheba_get_quorumGet a quorum round: commitments, in/out counts, and whether the threshold is met.
Scopes
availability:readgroups:readArguments
quorumIdstringrequiredrheba_list_claim_boardsList the claim boards for a group (optionally only open ones).
Scopes
availability:readgroups:readArguments
groupIdstringrequiredopenOnlybooleanrheba_list_collectionsList a group’s money collections (optionally only open ones).
Scopes
groups:readArguments
groupIdstringrequiredopenOnlybooleanrheba_list_group_membersMembers of a group the caller belongs to.
Scopes
groups:readArguments
groupIdstringrequiredrheba_list_groupsList the user's groups.
Scopes
groups:readrheba_list_jobsList Back Office jobs across the groups you dispatch for (Business tier), newest first. Each carries a rolled-up status: filled | partially_filled | pending | at_risk.
Scopes
backoffice:readArguments
limitnumberDefault 30.offsetnumberDefault 0.rheba_list_notificationsList the user's own notifications, newest first. Set unreadOnly to show just the unread ones. Each has a title, body, type, read flag, and optional actionUrl.
Scopes
notifications:readArguments
unreadOnlybooleanOnly unread notifications.limitnumberDefault 25.offsetnumberDefault 0.rheba_list_pipelineList inbound booking-request leads across the groups you dispatch for, optionally filtered by status (pending|accepted|declined|cancelled). Convert an ACCEPTED lead into a job with rheba_convert_pipeline_lead.
Scopes
backoffice:readArguments
statusstringrheba_list_preference_pollsList the preference rounds for a group (optionally only open ones).
Scopes
availability:readgroups:readArguments
groupIdstringrequiredopenOnlybooleanrheba_list_proposalsGroup coordination proposals where the user is the initiator or an invited member. Includes status, current slot, and members' responses.
Scopes
coordinate:readrheba_list_quorumsList the quorum rounds for a group (optionally only open ones).
Scopes
availability:readgroups:readArguments
groupIdstringrequiredopenOnlybooleanrheba_list_tasksList the user's personal tasks. Filter by status ('pending'|'completed'|'all'), flexibility, and date range. Returns tasks the user created or was assigned. Personal tasks only — group / job tasks are a separate surface.
Scopes
tasks:readArguments
statusstringDefault 'pending'flexiblebooleanFilter to flexible tasks only when truedateFromstringISO YYYY-MM-DD — only tasks with startTime ≥ this datedateTostringISO YYYY-MM-DD — only tasks with startTime ≤ this datelimitnumberDefault 50, max 100rheba_mark_notifications_readMark the user's notification(s) read — one by notificationId, or all unread with all=true.
Scopes
notifications:writeArguments
notificationIdstringMark this one read.allbooleanMark every unread notification read.rheba_release_claimGive up an opening you claimed, freeing it for someone else.
Scopes
availability:readgroups:readArguments
claimIdstringrequiredslotIdstringrequiredrheba_remove_group_memberRemove a user from a group. Removing YOURSELF (leaving) needs no special permission; removing anyone else requires manage-members permission.
Scopes
groups:writeArguments
groupIdstringrequireduserIdstringrequiredrheba_resolve_quorumFinalize a quorum round now (deadline/manual). If the threshold is met it locks in and books the time; otherwise it's marked 'nogo'. Creator or coordinator only.
Scopes
events:writegroups:readArguments
quorumIdstringrequiredrheba_respond_to_proposalConfirm or decline the current slot of a proposal. Caller must be a member of the proposal. A reason is required when declining.
Scopes
coordinate:writeArguments
crCodestringrequiredresponsestringrequiredreasonstringrheba_restore_eventsRestore soft-deleted events by id list.
Scopes
events:writeArguments
idsarrayrequiredrheba_schedule_jobCreate a Back Office job (a gig) directly, assigning team members to role slots. Auto-confirms the assignees (owner direct-assign) and creates one booking event per assignee. For invite-based staffing use the pipeline/dispatch flow instead. Business tier + dispatch capability required.
Scopes
backoffice:writeArguments
dispatchGroupIdstringrequiredThe group you dispatch for.titlestringrequireddatestringrequiredYYYY-MM-DDstartHournumberrequired0–23endHournumberrequired0–23venuestringnotesstringslotsarrayrequiredOne entry per role to staff. assignedUserIds from rheba_list_group_members / rheba_search_users.rheba_search_citiesSearch cities by name (supports 'City, ST' format). Returns cityId, city, state, and stateName. Use cityId when creating events with a specific city. Results are sorted by population descending.
Scopes
cities:readArguments
querystringrequiredCity name or 'City, ST' (e.g. 'Nashville, TN')limitnumberDefault 8, max 20rheba_search_usersSearch the user's network by name or email. Scoped to people who share a group with the caller — not a global directory. Use to resolve names like 'Brad' to userIds before calling availability tools.
Scopes
users:readArguments
querystringrequiredName or email substring (≥2 chars)limitnumberrheba_send_notificationSend a notification to a Rheba user (e.g. a reminder or update). It's sent FROM the current user's account. Find a recipient userId with rheba_search_users. Not for bulk/marketing sends.
Scopes
notifications:writeArguments
recipientIdstringrequiredThe user to notify (from rheba_search_users).titlestringrequiredbodystringrequiredtypestringCategory, e.g. 'reminder'. Default 'agent_message'.actionUrlstringOptional deep link the notification opens.rheba_set_job_clientSet the billing client on a job — either a Rheba user/group on the network (kind='network' with clientType + clientId) or an off-network contact (kind='inline' with name + optional email/phone). This is who the job's invoice bills.
Scopes
backoffice:writeArguments
jobIdstringrequiredkindstringrequiredclientTypestringnetwork onlyclientIdstringnetwork only — the user/group idnamestringinline onlyemailstringinline onlyphonestringinline onlyrheba_set_job_payoutSet (upsert) one assignee's payout amount on a job. amount is a non-negative number in the given currency (default USD). Records the intended payout; pushing it to accounting is a separate Xero-connected step.
Scopes
backoffice:writeArguments
jobIdstringrequireduserIdstringrequiredThe assignee to pay.amountnumberrequiredcurrencystringISO code; default 'USD'.rheba_set_member_roleChange a member's role in a group (admin|member|follower). Caller needs manage-members permission. The owner's role can only be changed by the owner. 'owner' cannot be assigned here.
Scopes
groups:writeArguments
groupIdstringrequireduserIdstringrequiredrolestringrequiredrheba_submit_preference_voteCast (or update) your ballot in a preference round. prefs maps a candidate index to a rating: 'preferred' (this is my pick), 'ok' (I can do it), or 'cant' (free but won't). Omitted candidates default to 'ok'. You must be a member of the round's group. Returns the updated tally.
Scopes
availability:readgroups:readArguments
pollIdstringrequiredprefsobjectrequiredMap of candidate index → 'preferred'|'ok'|'cant'.rheba_todayToday's date in ISO + RDate.
rheba_update_groupUpdate a group's name, description, and/or public visibility. Caller must have edit-settings permission (owner/admin). Send only the fields you want to change.
Scopes
groups:writeArguments
groupIdstringrequirednamestringdescriptionstringisPublicbooleanrheba_update_proposalEdit a proposal you initiated while it's still in flight: title, message, expiry, and/or the candidate slots. Slots can only be changed BEFORE any member has responded (afterwards, cancel and create a fresh one). Only the initiator may edit; provide only the fields you want to change.
Scopes
coordinate:writeArguments
crCodestringrequiredtitlestringmessagestringproposedSlotsarrayReplacement candidate slots (1-5). Only allowed before anyone has responded.expiresInMinutesnumberrheba_update_taskUpdate editable fields on a task — title, description, times, deadline, priority, flexibility. Pass only the fields you want to change; omitted fields are preserved.
Scopes
tasks:writeArguments
eventIdstringrequiredTask eventId from rheba_list_taskstitlestringdescriptionstringstartTimestringISO datetimeendTimestringISO datetimeflexiblebooleandeadlinestringISO datetime deadlineestimatedMinutesnumberimportancestringurgencystring