Kairos
FreeNot checkedwhen2meet-style scheduling polls — self-hostable, reverse-proxy-auth friendly, agent-first API (OpenAPI + llms.txt + MCP).
About
when2meet-style scheduling polls — self-hostable, reverse-proxy-auth friendly, agent-first API (OpenAPI + llms.txt + MCP).
README
Website · ▶ Try it in your browser — the actual Python server on Pyodide/WASM, nothing leaves your machine.
when2meet-style scheduling polls — self-hostable, reverse-proxy-auth friendly, agent-first API (OpenAPI + llms.txt + MCP).
Quickstart
uvx --from kairos-scheduler kairos # SQLite + demo auth on :8003
or with Docker / a real database:
KAIROS_DB_URL=mysql://user:pass@host:3306/db \
KAIROS_AUTH=header SESSION_SECRET=$(openssl rand -hex 32) \
uvx --from 'kairos-scheduler[mysql]' kairos --host 0.0.0.0
Features
- Full-day or time-slot polls, when2meet drag grids, heatmaps
- Public share links + personal email invites (required/optional participants)
- Convergence light: collecting → ready / partial / blocked
- Idempotent smart reminders + per-participant contact audit trail
- Decide a final date → .ics download + "email everyone" with the file attached
- Light/dark colorblind-friendly theme (Dalton)
- Agents: REST API (Bearer),
/llms.txt, OpenAPI, Swagger UI, MCP server - Reverse-calendar (optional): push candidate slots into the respondent's calendar instead of reading their free/busy — subscribe-able feeds + native iMIP Accept/Maybe/Decline. Off by default (see below).
Reverse the calendar (iMIP) — optional
Instead of asking for calendar access, Kairos can push the candidate slots into the respondent's calendar and let them Accept/Maybe/Decline — capturing what's truly blocking, not mechanical free/busy. Two layers, both opt-in:
- Candidate feed (
KAIROS_FEED=on) — a subscribe-able, disposable.icscalendar of the poll's slots. The per-invite feed (/p/i/<token>/feed.ics) embeds deep-link Accept/Maybe/Decline URLs; tapping one records that slot and lands on the poll page (the instant surface — subscribed feeds refresh slowly, Google ~daily, so never rely on the calendar reflecting a vote quickly). - Native iMIP invitations (
KAIROS_IMIP=on) — realMETHOD:REQUESTinvites with Accept/Maybe/Decline buttons.KAIROS_IMIP_ORGANIZERis the mailbox replies route to; it must equal the IMAP mailbox Kairos polls (KAIROS_IMAP_HOST/PORT/USER/PASSWORD/MAILBOX). SchedulePOST /api/imip/poll(cron / systemd timer, Bearer auth) to ingest replies;POST /api/polls/{id}/imip-decisionsends the decided slot as a native invite.
Cross-client reality (verified live): Outlook and Apple render native Accept/Maybe/Decline; Gmail does not for a Gmail-organized event (Google policy) — the deep-link Accept/Maybe/Decline in the event description covers it, so every client gets one-click RSVP. For native Gmail RSVP, use a non-Gmail (custom-domain) organizer.
Agent-native (no API key): the invite link self-describes —
GET /p/i/<token>/agent.json returns the options, your current vote, and the
one-click vote URLs (also feed.ics, and /s/<slot>/<yes|maybe|no> to vote).
Hand your assistant the link and it RSVPs for you. See /llms.txt.
See docs/design/reverse-calendar-imip.md and issue #23 for the full design.
Deployment model
Kairos trusts identity headers from whatever reverse proxy you already run
(KAIROS_AUTH=header): Shibboleth/Apache, oauth2-proxy, Authelia, Cloudflare
Access, Tailscale… Respondents never need accounts — share links and invite
tokens are self-contained. See kairos/settings.py for all env knobs.
Cookie note for operators: Kairos sets only strictly-necessary cookies (session, signed response-edit token, theme preference) — disclosed on
/privacy, no consent banner required (ePrivacy Art. 5(3) / Swiss TCA 45c exemptions). If you add analytics or any third-party embeds to your deployment, that changes — you'll need consent management.
Install Kairos in Claude Desktop, Claude Code & Cursor
unyly install kairosInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add kairos -- uvx --from git+https://github.com/gerchowl/kairos kairos-schedulerFAQ
Is Kairos MCP free?
Yes, Kairos MCP is free — one-click install via Unyly at no cost.
Does Kairos need an API key?
No, Kairos runs without API keys or environment variables.
Is Kairos hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Kairos in Claude Desktop, Claude Code or Cursor?
Open Kairos on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Fetch
Web content fetching and conversion for efficient LLM usage.
AWS KB Retrieval
Retrieval from AWS Knowledge Base using Bedrock Agent Runtime.
by modelcontextprotocolSpring AI MCP Server
Provides auto-configuration for setting up an MCP server in Spring Boot applications.
llm-analysis-assistant
A very streamlined mcp client that supports calling and monitoring stdio/sse/streamableHttp, and can also view request responses through the /logs page. It also
by xuzexin-hzCompare Kairos with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All ai MCPs
