MCP — Model Context Protocol

Plug any LLM into Rheba.

23 tools — 15 read, 8 write — covering calendar, availability, groups, coordination, and spatial fit. OAuth 2.1 + PKCE + DPoP. Same surface from Claude, ChatGPT, Ollama, or your own client.

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:read

Read the user's availability buckets and group mutual times.

coordinate:read

Read coordination requests and group proposals.

coordinate:write

Create proposals, respond to slots, finalize accepted slots.

events:read

Read the user's calendar (creator-only at the MCP boundary).

events:write

Create, update, delete, restore the user's events.

groups:read

List the user's groups and their members (names only).

users:read

Search users in the caller's network (group-shared only).

Tool Catalog

23 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_bulk_clear_events

Soft-delete the user's scheduling events in a date range. Capped at 90 days per call.

write

Scopes

events:write

Arguments

startDatestringrequired
endDatestringrequired
rheba_check_spatial_fit

Pre-flight: can a candidate booking fit at the city + time given existing bookings?

read

Scopes

events:read

Arguments

datestringrequired
cityIdstringrequired
startTimestringrequired
endTimestringrequired
bufferMinutesnumber
rheba_create_event

Create a single non-recurring scheduling event. Default duration 1 hour. Use this for one-off events. For repeating series use rheba_create_recurring_events.

write

Scopes

events:write

Arguments

titlestringrequired
datestringrequiredISO YYYY-MM-DD
startTimestringrequiredHH:MM 24h, e.g. "14:30"
endTimestringHH:MM 24h. Defaults to startTime + 1 hour.
descriptionstring
cityIdstringCity id; defaults to user's home city
citystringDisplay name for the city
bufferMinutesnumber
rheba_create_proposal

Create 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.

write

Scopes

coordinate:writegroups:read

Arguments

groupIdstringrequired
titlestringrequired
messagestring
proposedSlotsarrayrequiredMust propose 3-5 candidate slots so the recipient has real options to pick from.
expiresInMinutesnumber
rheba_create_recurring_events

Create a recurring scheduling or task series.

write

Scopes

events:write

Arguments

titlestringrequired
anchorDatestringrequired
startTimestringrequired
endTimestringrequired
horizonMonthsnumberrequired
kindstringrequired
ruleobjectrequired
descriptionstring
cityIdstring
rheba_delete_event

Delete a single scheduling event by id. For recurring series use rheba_delete_event_series with scope 'one' | 'following' | 'all'.

write

Scopes

events:write

Arguments

eventIdstringrequired
rheba_delete_event_series

Delete one occurrence, this and following, or the whole series.

write

Scopes

events:write

Arguments

eventIdstringrequired
scopestringrequired
rheba_find_group_availability

Mutual free times across all members of a group on a date range.

read

Scopes

availability:readgroups:read

Arguments

groupIdstringrequired
startDatestringrequired
endDatestring
rheba_find_group_availability_range

Mutual 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.

read

Scopes

availability:readgroups:read

Arguments

groupIdstringrequired
startDatestringrequired
endDatestringrequired
flavorstring
rheba_find_mutual_with_person

When 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.

read

Scopes

availability:readgroups:readusers:read

Arguments

personNamestringrequiredThe other person's first name (or any substring of their name)
startDatestringrequiredISO YYYY-MM-DD
endDatestringISO YYYY-MM-DD (defaults to startDate)
rheba_get_availability

User's availability buckets for a date.

read

Scopes

availability:read

Arguments

datestringrequired
rheba_get_availability_buckets

Detailed 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.

read

Scopes

availability:read

Arguments

datestringrequiredISO YYYY-MM-DD
flavorstring
rheba_get_calendar

Return 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.

read

Scopes

events:read

Arguments

startDatestringrequiredISO YYYY-MM-DD
endDatestringISO YYYY-MM-DD
rheba_get_day_cities

User's own bookings on a date with cities, ordered by start.

read

Scopes

events:readavailability:read

Arguments

datestringrequired
rheba_get_deleted_events

User's recently soft-deleted events.

read

Scopes

events:read

Arguments

rangeDaysnumber
rheba_get_proposal

Full state of a coordination proposal: current slot, all proposed slots, per-member responses, and cycle history. Caller must be initiator or member.

read

Scopes

coordinate:read

Arguments

crCodestringrequired
rheba_list_group_members

Members of a group the caller belongs to.

read

Scopes

groups:read

Arguments

groupIdstringrequired
rheba_list_groups

List the user's groups.

read

Scopes

groups:read
rheba_list_proposals

Group coordination proposals where the user is the initiator or an invited member. Includes status, current slot, and members' responses.

read

Scopes

coordinate:read
rheba_respond_to_proposal

Confirm or decline the current slot of a proposal. Caller must be a member of the proposal. A reason is required when declining.

write

Scopes

coordinate:write

Arguments

crCodestringrequired
responsestringrequired
reasonstring
rheba_restore_events

Restore soft-deleted events by id list.

write

Scopes

events:write

Arguments

idsarrayrequired
rheba_search_users

Search 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.

read

Scopes

users:read

Arguments

querystringrequiredName or email substring (≥2 chars)
limitnumber
rheba_today

Today's date in ISO + RDate.

read