Browse / Scheduling and staffing
Keeper.sh
Calendar sync across Google, Outlook, iCloud, Fastmail and CalDAV, with an MCP server and REST API from the Builder.
Keeper.sh pulls events from any connected calendar and pushes them to one or many destinations so busy slots line up, with per-source privacy templates and a combined iCal feed. It ships an MCP server (OAuth 2.1) and a /api/v1 REST API that share handlers with the dashboard: list calendars, read and create events, RSVP, find free time, trigger or pause sync. Self-hosting unlocks Pro features; the hosted edition has a free plan and a USD 5 Pro plan.
- I juggle a work calendar, a business calendar and a personal one and keep getting double-booked
- I want my agent to see one true picture of my availability and book into it through MCP
- AGPL-3.0 copyleft
- Self-hosting means registering your own Google and Microsoft OAuth apps; Google calendar scopes need app verification for non-test users
- Cloud Free: 2 linked accounts, 3 sync mappings, 30-minute refresh and 25 API requests per day
- The Bun rewrite changed environment variable names; migration notes are in issue #140
- Missing TRUSTED_ORIGINS fails CSRF checks for any origin other than http://localhost
Last activity Sep 2, 2026. Fit: adaptable 2, operable 3.
Editions
Self-hosted · Free open source
- Clone
git clone https://github.com/ridafkih/keeper.sh - ImageContainer
Cloud Free · $0 per month closed source
- HostedOpen the hosted app
Cloud Pro · $5 per month closed source
- HostedOpen the hosted app
Adaptable: what is yours to change
Make it yours
Config only19 things to edit
For the standalone image, generate BETTER_AUTH_SECRET and ENCRYPTION_KEY, set TRUSTED_ORIGINS to every origin you will use, and add GOOGLE_CLIENT_ID/GOOGLE_CLIENT_SECRET and MICROSOFT_CLIENT_ID/MICROSOFT_CLIENT_SECRET from your own OAuth apps. Split deployments add DATABASE_URL, REDIS_URL, BETTER_AUTH_URL, MCP_PUBLIC_URL and MCP_PORT; WEBHOOK_PUBLIC_URL turns on realtime push; RESEND_API_KEY enables email. Sources, destinations and privacy templates are configured in the dashboard.
- Env vars
BETTER_AUTH_SECRETENCRYPTION_KEYTRUSTED_ORIGINSGOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETMICROSOFT_CLIENT_IDMICROSOFT_CLIENT_SECRETDATABASE_URLREDIS_URLBETTER_AUTH_URLMCP_PUBLIC_URLMCP_PORTWEBHOOK_PUBLIC_URLRESEND_API_KEYCOMMERCIAL_MODEWORKER_JOB_QUEUE_ENABLEDBLOCK_PRIVATE_RESOLUTION- Config files
.envcompose.yaml- Prompt files
- none
- Accounts you need
- Google Cloud (OAuth app, optional)Microsoft Entra (OAuth app, optional)Keeper.sh (hosted editions only)
Source
- github.com/ridafkih/keeper.sh
- AGPL-3.0 license
- Last commit Sep 2, 2026
- 1,272 stars
Operable: what an agent can drive
Interface
OfficialMCP serverpublished by the builderremote or local
How an agent can drive an Operable Listing, in five levels: native (built for the agent as the primary interface), official (the Builder ships an agent interface), wrapped (a third party wraps the software's API), config (an agent can only drive it by editing files), gui (screen control only). An interface is official only when it is published by the same organization that ships the software. GUI-level Listings are allowed and sorted last.
- Docs
- github.com/ridafkih/keeper.sh#mcp-model-context-protocol
- Tools
list_calendarslist_accountsget_eventsget_eventget_event_countcreate_eventupdate_eventdelete_eventrsvp_eventget_pending_invitesfind_free_timetrigger_syncpause_syncget_ical_feed
Reach
Partial coverage. 7 of 10 jobs reachable through the stated interface.
| Job | Through the interface | Evidence |
|---|---|---|
| List connected accounts and calendars | Reachable | services/mcp/src/toolset.ts: list_accounts, list_calendars |
| Read events and counts in a date range | Reachable | toolset.ts: get_events, get_event, get_event_count |
| Create, update and delete events | Reachable | toolset.ts: create_event, update_event, delete_event |
| Respond to invitations | Reachable | toolset.ts: rsvp_event, get_pending_invites |
| Find free time with working hours | Reachable | toolset.ts: find_free_time; REST GET /api/v1/events/free-time |
| Trigger or pause sync | Reachable | toolset.ts: trigger_sync, pause_sync; throttled to one run per minute |
| Get the combined iCal feed URL | Reachable | toolset.ts: get_ical_feed |
| Connect a new Google or Outlook account | Not reachable | OAuth consent runs in the web dashboard; token management at /api/tokens needs a browser session |
| Create or edit sync mappings and privacy templates | Not reachable | no mapping tool in toolset.ts or the /api/v1 route table |
| Configure event filters | Not reachable | Pro feature set in the dashboard; not in the tool list |
Code stack
- Languages
- TypeScript
- Frameworks
- BunVite SSRBullMQbetter-authCaddy
- Package manager
- bun
- Database
- PostgreSQLRedis
- Hosting target
- docker
- Built
- Unknown (recorded, never ranked)
Model stack
- Providers
- any MCP client
- Models
- none
- Keys you need
- none
- Prompts live in
- none
Evidence and confidence
| Field | Where it was seen | Confidence |
|---|---|---|
| formFactor | README: web dashboard plus API, MCP, cron and worker services in Docker images | 95% |
| executionModel | no model at runtime; MCP exposes data to external agents | 95% |
| operability | services/mcp in the Builder's repo; README says /api/v1 is the same interface the dashboard and MCP use | 90% |
| effort | README environment variable table and compose examples | 95% |
| editions | README pricing table: Free USD 0, Pro USD 5 per month or USD 45 per year, self-hosted Pro at USD 0 | 95% |
| active | shortlist pushedAt 2026-09-02 | – |
| reach | 90% |
Open questions
- Triage called this native; recorded as official because the dashboard remains the primary interface and MCP is one of three callers. Curator to decide
- Is the hosted MCP endpoint available on the Cloud Free plan within the 25 requests per day cap?
Sources
- github.com/ridafkih/keeper.sh sourcing:scheduling-staffing:curated
- www.keeper.sh/ sourcing:scheduling-staffing:curated
- github.com/ridafkih/keeper.sh/blob/main/services/mcp/src/toolset.ts analysis:scheduling-staffing