SavvyCal MCP Server
# SavvyCal MCP Server
[](https://github.com/OfirOhan/savvycal-mcp/actions/workflows/ci.yml)


A [Model Context Protocol](https://modelcontextprotocol.io) server for **[SavvyCal](https://savvycal.com)**. It lets Claude, Cursor, ChatGPT and other AI agents find open times, book and cancel meetings, and manage your scheduling links.
> **Unofficial.** This is a community project and is not affiliated with SavvyCal. It was built from SavvyCal's public API docs.
## What you can ask your agent
- "Find three 30-minute slots on my **Intro call** link next week, in New York time, and draft an email offering them to Sam."
- "Book Dana (dana@acme.com, London) into the first Tuesday-morning slot on my **Demo** link."
- "What meetings do I have this week, and who are they with?"
- "Cancel tomorrow's 3pm and tell them I'm sick."
- "Turn off my **Office hours** link until further notice."
## Tools
| Tool | What it does | Writes? |
|---|---|---|
| `get_current_user` | Who am I (name, email, time zone) | No |
| `list_scheduling_links` | All links with durations and state | No |
| `get_scheduling_link` | One link's settings and booking form fields | No |
| `find_available_slots` | Bookable slots, **grouped by day with local times**, filterable by duration | No |
| `list_events` | Meetings by state, upcoming/past/date range, link | No |
| `get_event` | One meeting with attendees and conferencing info | No |
| `book_meeting` | Book a slot for someone (sends real invites) | Yes |
| `cancel_meeting` | Cancel a meeting (notifies attendees) | **Destructive** |
| `toggle_scheduling_link` | Enable or disable a link | Yes |
| `list_webhooks` / `create_webhook` / `delete_webhook` | Manage webhooks | Yes |
`find_available_slots` turns SavvyCal's raw slot list into something an LLM can reason about. It groups slots by day, shows them in any time zone (`10:00 AM–10:30 AM`), lists the available durations, and searches the next 7 days by default. Booking and cancelling tools carry MCP annotations, so clients can ask before running them.
## Setup
1. Create a personal access token at **[savvycal.com/developers](https://savvycal.com/developers)**.
2. Build it:
```bash
git clone https://github.com/OfirOhan/savvycal-mcp.git
cd savvycal-mcp && npm install && npm run build
```
### Claude Desktop
Add this to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"savvycal": {
"command": "node",
"args": ["/absolute/path/to/savvycal-mcp/dist/index.js"],
"env": { "SAVVYCAL_TOKEN": "pt_secret_..." }
}
}
}
```
### Claude Code / Cursor / other MCP clients
```bash
claude mcp add savvycal -e SAVVYCAL_TOKEN=pt_secret_... -- node /path/to/savvycal-mcp/dist/index.js
```
For Cursor and other clients, use the same command with `SAVVYCAL_TOKEN` in the environment.
| Variable | Default | Notes |
|---|---|---|
| `SAVVYCAL_TOKEN` | (required) | Personal access token, or an OAuth access token |
| `SAVVYCAL_BASE_URL` | `https://api.savvycal.com` | Override for testing |
## Development
```bash
npm install
npm test # builds, runs unit tests and an end-to-end MCP stdio test against a fake SavvyCal API
```
The tests run on Node 20, 22 and 24 in CI.
## Author
Built by [Ofir Ohana](https://github.com/OfirOhan), an AI agents engineer. Issues and PRs are welcome.
## License
MIT
TDQS
Scored across 12 tools
Each tool targets a distinct resource+action: user, scheduling links (list/get/toggle), availability slots, events (list/get/book/cancel), and webhooks (list/create/delete). The find_available_slots vs book_meeting pairing and toggle vs get for links are clearly separated by descriptions. No two tools appear interchangeable.
Nearly all tools follow a clean verb_noun snake_case pattern (list_scheduling_links, get_event, create_webhook, delete_webhook). Minor inconsistency: the same underlying entity is referred to both as 'event' (list_events, get_event) and 'meeting' (book_meeting, cancel_meeting), and 'book' vs 'create' diverge slightly. Still highly readable and predictable.
12 tools is well-scoped for a scheduling/booking domain, spanning the three natural clusters (links, events, webhooks) plus user context. Every tool maps to a real workflow with no filler or redundancy.
Core booking lifecycle is covered (find slots, book, cancel, list/get events) and webhooks have near-full CRUD. Notable gap: scheduling links only support list/get/toggle, with no create/update/delete, and events can't be rescheduled directly (only cancel+rebook). Agents can work around these but the surface isn't fully symmetric.