Novacal MCP
Manage your Novacal calendar from your AI client — browse event types, check availability, and book, reschedule, or cancel events.
Documentation
Novacal MCP Server
Minimal Cloudflare Worker that exposes a Novacal MCP server over Streamable HTTP with a simple hosted OAuth flow.
Users connect to the MCP server with OAuth, then paste their Novacal API key once on the Worker-hosted /authorize page. The key is encrypted into the OAuth session props, so it is only recoverable with the user's access token and is never stored in readable form.
MVP tools
novacal_get_event_typesnovacal_get_event_typenovacal_create_event_typenovacal_get_availabilitynovacal_get_eventsnovacal_create_eventnovacal_cancel_eventnovacal_reschedule_event
Event type scope
novacal_get_event_types accepts an optional scope:
{
"scope": "personal"
}
Use personal for the authenticated account owner's event types and team for team event types. Omit scope to return both.
Availability date ranges
novacal_get_availability accepts start and end as YYYY-MM-DD dates.
The range is start-inclusive and end-exclusive:
[start 00:00, end 00:00)
For a single day, pass the next calendar day as end.
Examples:
{
"event_type_id": 123,
"start": "2026-05-29",
"end": "2026-05-30",
"timezone": "Europe/Amsterdam"
}
This returns availability for May 29, 2026.
Do not use the same value for start and end when asking for one day. For example, start=2026-05-29 and end=2026-05-29 is an empty range and returns no slots.
timezone is optional and defaults to UTC. When provided, use an IANA timezone such as Europe/Amsterdam, America/New_York, or Asia/Tokyo.
Environment variables
NOVACAL_API_BASE_URL- defaults tohttps://api.novacal.io
Cloudflare resources
Create these once:
npx wrangler kv namespace create OAUTH_KV
npx wrangler d1 create novacal-mcp-server-db
Then copy the returned IDs into wrangler.toml for:
OAUTH_KVDB
Apply the D1 schema:
npx wrangler d1 execute novacal-mcp-server-db --remote --file=./migrations/0001_user_credentials.sql
The user_credentials table is legacy. Credentials now live in the encrypted
OAuth session, and nothing reads or writes this table — it and the DB binding
are kept only so existing deployments keep validating.
Local development
npm install
npm run dev
The MCP endpoint is available at http://127.0.0.1:8787/mcp.
The OAuth authorize page is at http://127.0.0.1:8787/authorize.
Deploy
npm run deploy
This deploys the production Wrangler environment.
Connection flow
- Add the remote MCP URL in your client:
- local:
http://127.0.0.1:8787/mcp - deployed:
https://<your-worker-url>/mcp
- local:
- Use OAuth / remote auth in the MCP client.
- On first connect, the Worker sends you to
/authorize. - Paste your Novacal API key.
- The Worker verifies it with
GET /v1/users/me, encrypts it into the OAuth session, and completes the flow.
to inspect locally, run: npx @modelcontextprotocol/inspector