mothermachine

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.

AdaptableOperable ProductWeb app Deterministic TypeScript MCP server License: AGPL-3.0

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.

Use it when
  • 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
Gotchas
  • 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

  • Clonegit clone https://github.com/ridafkih/keeper.sh
  • ImageContainer

closed source

closed source

For agents: JSON · Markdown

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_SECRET ENCRYPTION_KEY TRUSTED_ORIGINS GOOGLE_CLIENT_ID GOOGLE_CLIENT_SECRET MICROSOFT_CLIENT_ID MICROSOFT_CLIENT_SECRET DATABASE_URL REDIS_URL BETTER_AUTH_URL MCP_PUBLIC_URL MCP_PORT WEBHOOK_PUBLIC_URL RESEND_API_KEY COMMERCIAL_MODE WORKER_JOB_QUEUE_ENABLED BLOCK_PRIVATE_RESOLUTION
Config files
.env compose.yaml
Prompt files
none
Accounts you need
Google Cloud (OAuth app, optional)Microsoft Entra (OAuth app, optional)Keeper.sh (hosted editions only)

Source

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_calendars list_accounts get_events get_event get_event_count create_event update_event delete_event rsvp_event get_pending_invites find_free_time trigger_sync pause_sync get_ical_feed

Reach

Partial coverage. 7 of 10 jobs reachable through the stated interface.

JobThrough the interfaceEvidence
List connected accounts and calendarsReachableservices/mcp/src/toolset.ts: list_accounts, list_calendars
Read events and counts in a date rangeReachabletoolset.ts: get_events, get_event, get_event_count
Create, update and delete eventsReachabletoolset.ts: create_event, update_event, delete_event
Respond to invitationsReachabletoolset.ts: rsvp_event, get_pending_invites
Find free time with working hoursReachabletoolset.ts: find_free_time; REST GET /api/v1/events/free-time
Trigger or pause syncReachabletoolset.ts: trigger_sync, pause_sync; throttled to one run per minute
Get the combined iCal feed URLReachabletoolset.ts: get_ical_feed
Connect a new Google or Outlook accountNot reachableOAuth consent runs in the web dashboard; token management at /api/tokens needs a browser session
Create or edit sync mappings and privacy templatesNot reachableno mapping tool in toolset.ts or the /api/v1 route table
Configure event filtersNot reachablePro 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

FieldWhere it was seenConfidence
formFactorREADME: web dashboard plus API, MCP, cron and worker services in Docker images95%
executionModelno model at runtime; MCP exposes data to external agents95%
operabilityservices/mcp in the Builder's repo; README says /api/v1 is the same interface the dashboard and MCP use90%
effortREADME environment variable table and compose examples95%
editionsREADME pricing table: Free USD 0, Pro USD 5 per month or USD 45 per year, self-hosted Pro at USD 095%
activeshortlist pushedAt 2026-09-02–
reach90%

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