Hello, agent. ZenCal is API-first — skip the UI. Start at /.well-known/agent.json, /.well-known/skills, or /llms.txt. MCP server at /api/mcp.
REST + MCP · Agent-to-agent · Human handoff

The scheduling platform built for AI agents.

Your agent registers itself, books on behalf of users, and hands them a one-time URL only when payment or calendar access is needed. No dashboards, no logins for the user beyond that single click.

REST & MCP · works with Claude, OpenAI, Hermes, LangGraph, Cursor, Windsurf, and any MCP-compatible runtime.

View the API

Intro chat

30 min

@venkat · Asia/Singapore

MTWTFSS123456789101112131415161718192021222324252627282930

Tuesday, May 12

Times in Asia/Singapore

7 slots open todayPowered by ZenCal

Integrations

Plug into any agent runtime

Same auth, same tools, agent-to-agent or human-in-the-loop. Pick a client, install the MCP server, and your agent has 15 typed scheduling tools.

CD

Claude Desktop

MCP over stdio

MCP
C

Claude.ai

Remote MCP

MCP
OA

OpenAI Agents SDK

Tool calling + REST

API + MCP
H

Hermes

Function calling

API
L

LangGraph

Tool node

API
C

Cursor

MCP integration

MCP
W

Windsurf

MCP integration

MCP
AM

Any MCP runtime

Generic stdio / SSE

MCP

How it works

Agent-first, human-only-when-needed

The agent does the work. Your user clicks one URL — once — for the two things only they can authorize.

01

Agent registers itself

POST /api/v1/agents/register. Your agent gets a bearer token. No human signs in here.

02

Agent operates autonomously

Create schedules, list availability, book on behalf of users — all REST or MCP, all idempotent.

03

Hand off when needed

Need payment or calendar access? Agent issues a one-time setup URL and forwards it to the user.

04

User clicks once, done

User pays + connects Gmail or Outlook in a single visit. Agent resumes immediately.

What the user does

Three things, one URL, no account

When the agent surfaces a setup link, the user lands on a page that asks for exactly these. No password to remember, no return visits.

Set up payment

Stripe-backed checkout. Card on file for the workspace, agent stays unaware of card details.

Connect Gmail calendar

OAuth scope: calendar.events only. We can create, move, and cancel events — nothing else.

Connect Outlook calendar

OAuth scope: Calendars.ReadWrite. Same minimal surface as Gmail. Switch providers anytime.

The setup URL is single-use, signed, and expires in 30 minutes. After it's consumed, the user has nothing else to do — the agent takes over.

Features

Everything an agent needs to run a calendar

Beautiful UX for the human invitee, programmatic primitives for the agent.

Agent-first auth

Agents self-register with a bearer token. Humans never see a password — just a one-time setup URL when scope is needed.

Availability engine

Pure-TS engine: weekly rules, buffers, max bookings per day, conflict detection across providers.

MCP server included

15 tools for Claude, Cursor, Windsurf, OpenAI Agents SDK, Hermes, LangGraph. Auto token refresh built-in.

Agent-to-agent booking

Send a booking URL to another agent — they book on behalf of their user with the same REST surface.

Minimal calendar scope

Gmail calendar.events / Outlook Calendars.ReadWrite. Nothing else. Tokens encrypted at rest with AES-GCM.

Cancel & reschedule

Signed tokens for invitees, full lifecycle endpoints for agents. Email confirmations on every event.

API & MCP

Two interfaces, one source of truth

Hit the REST API directly, or wire up the MCP server in 30 seconds.

agent.ts
Agent registers + hands off
# 1. Agent registers itselfcurl -X POST $API/api/v1/agents/register \  -d '{"name":"my-scheduler"}'# → { "agentId": "...", "bearer": "ag_live_..." } # 2. Agent issues a setup URL for its usercurl -X POST $API/api/v1/users/setup-link \  -H "Authorization: Bearer $BEARER" \  -d '{"userEmail":"alice@acme.com"}'# → { "url": "https://app/setup/<one-time-token>" } # 3. Agent forwards URL to user via its own UI/email.#    User clicks once: pays + connects calendar. Done. # 4. Agent resumes — books on behalf of the user.curl -X POST $API/api/v1/bookings \  -H "Authorization: Bearer $BEARER" \  -d '{"userId":"...","start":"2026-05-12T09:00Z"}'
mcp.json
Plug into any client
// Claude Desktop / Cursor / Windsurf / Hermes{  "mcpServers": {    "zencal": {      "command": "npx",      "args": ["-y", "@zencal/mcp"],      "env": { "AGENT_CAL_BEARER": "ag_live_..." }    }  }} // 15 tools exposed://  register_user · issue_setup_link//  create_schedule · list_availability//  create_booking · cancel_booking//  reschedule_booking · list_bookings ...

Hand the calendar to your agent.

One bearer token. One MCP install. One setup URL for the user. Everything else is your agent talking to ours.

View the API