mkimelblat/calendly-mcp-server
If you are the rightful owner of calendly-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to dayong@mcphub.com.
A complete Model Context Protocol (MCP) server for the Calendly API, providing full access to all Calendly API endpoints.
Calendly MCP Server
A complete Model Context Protocol (MCP) server for the Calendly API. This server provides full access to all Calendly API endpoints, including the newly released Scheduling API and Event Type Management APIs.
What This Enables
Event Type Management
- Create new event types without using the Calendly UI (1:1 event types only)
- Update event type durations, locations, and settings in bulk (1:1 event types only)
- Modify availability schedules programmatically
- Configure meeting locations via API
Scheduling & Events
- View and analyze availability
- Book meetings programmatically (Scheduling API)
- Cancel and manage scheduled events
- Track invitees and no-shows
- Bulk operations on multiple events
Organization & Users
- Manage organization memberships
- Invite and remove users
- Configure webhooks for real-time updates
- GDPR compliance tools
Prerequisites
- Python 3.10 or higher
- A Calendly account
- A Calendly API key (Personal Access Token)
Installation
1. Clone this repository
git clone https://github.com/mkimelblat/calendly-mcp-server.git
cd calendly-mcp-server
2. Create a virtual environment and install dependencies
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
pip install -r requirements.txt
3. Get your Calendly API key
- Go to https://calendly.com
- Log in to your account
- Navigate to: Profile → Settings → Integrations → API & Webhooks
- Click "Generate New Token"
- Copy the token (keep it secure!)
4. Configure the server
Create a .env file in the project root:
CALENDLY_API_KEY=your_api_key_here
Important: Never commit your .env file to GitHub! It's already in .gitignore.
Usage with Claude
Option 1: Using Claude Desktop
Add this to your Claude Desktop configuration file:
On macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
On Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"calendly": {
"command": "/path/to/venv/bin/python",
"args": ["/path/to/calendly-mcp-server/server.py"],
"env": {
"CALENDLY_API_KEY": "your_api_key_here"
}
}
}
}
Replace /path/to/ with your actual paths.
Option 2: Using with Claude API
from anthropic import Anthropic
client = Anthropic(api_key="your_anthropic_api_key")
# The MCP server will be available as tools
response = client.messages.create(
model="claude-sonnet-4-5-20250929",
max_tokens=1024,
tools=[...], # MCP tools will be injected here
messages=[
{"role": "user", "content": "Create a new 45 minute strategy session event type"}
]
)
Available Operations
The Calendly MCP Server exposes 45+ tools mapped one-to-one to Calendly's public API v2. All operations support natural language interaction through AI assistants.
Users
| Tool | Description | REST Endpoint |
|---|---|---|
get_current_user | Get the authenticated user | GET /users/me |
get_user | Get a specific user by UUID | GET /users/{uuid} |
Event Types
| Tool | Description | REST Endpoint |
|---|---|---|
create_event_type | Create a new event type | POST /event_types |
update_event_type | Update event type details | PATCH /event_types/{uuid} |
list_event_types | List event types for a user/org | GET /event_types |
get_event_type | Retrieve event type details | GET /event_types/{uuid} |
list_event_type_available_times | List available time slots | GET /event_type_available_times |
list_event_type_availability_schedules | List availability schedules | GET /event_types/{uuid}/availability_schedules |
update_event_type_availability_schedule | Update an availability schedule | PUT /event_types/{uuid}/availability_schedule |
list_user_meeting_locations | List a user's meeting locations | GET /user_meeting_locations |
Scheduled Events
| Tool | Description | REST Endpoint |
|---|---|---|
list_events | List scheduled events | GET /scheduled_events |
get_event | Retrieve event details | GET /scheduled_events/{uuid} |
cancel_event | Cancel a scheduled event | POST /scheduled_events/{uuid}/cancellation |
create_event_invitee | Create a new booking (Scheduling API) | POST /invitees |
list_event_invitees | List invitees for an event | GET /scheduled_events/{uuid}/invitees |
get_event_invitee | Get invitee details | GET /scheduled_events/{uuid}/invitees/{invitee_uuid} |
Scheduling Links
| Tool | Description | REST Endpoint |
|---|---|---|
create_scheduling_link | Create a single-use link | POST /scheduling_links |
Availability
| Tool | Description | REST Endpoint |
|---|---|---|
list_user_availability_schedules | List user availability schedules | GET /user_availability_schedules |
get_user_availability_schedule | Get a schedule's details | GET /user_availability_schedules/{uuid} |
list_user_busy_times | List busy times within a range | GET /user_busy_times |
No-Shows
| Tool | Description | REST Endpoint |
|---|---|---|
create_invitee_no_show | Mark invitee as no-show | POST /invitee_no_shows |
get_invitee_no_show | Get no-show details | GET /invitee_no_shows/{uuid} |
delete_invitee_no_show | Remove no-show status | DELETE /invitee_no_shows/{uuid} |
Organizations
| Tool | Description | REST Endpoint |
|---|---|---|
get_organization | Retrieve org details | GET /organizations/{uuid} |
list_organization_memberships | List organization members | GET /organization_memberships |
get_organization_membership | Get membership details | GET /organization_memberships/{uuid} |
delete_organization_membership | Remove a member | DELETE /organization_memberships/{uuid} |
list_organization_invitations | List pending invitations | GET /organizations/{uuid}/invitations |
create_organization_invitation | Invite a user | POST /organizations/{uuid}/invitations |
revoke_organization_invitation | Revoke an invitation | DELETE /organizations/{uuid}/invitations/{invitation_uuid} |
Routing Forms
| Tool | Description | REST Endpoint |
|---|---|---|
list_routing_forms | List routing forms | GET /routing_forms |
get_routing_form | Get form details | GET /routing_forms/{uuid} |
list_routing_form_submissions | List form submissions | GET /routing_forms/{uuid}/submissions |
get_routing_form_submission | Retrieve a submission | GET /routing_form_submissions/{uuid} |
Webhooks
| Tool | Description | REST Endpoint |
|---|---|---|
list_webhook_subscriptions | List webhook subscriptions | GET /webhook_subscriptions |
create_webhook_subscription | Create a webhook | POST /webhook_subscriptions |
get_webhook_subscription | Retrieve webhook details | GET /webhook_subscriptions/{uuid} |
delete_webhook_subscription | Delete a webhook | DELETE /webhook_subscriptions/{uuid} |
Data Compliance
| Tool | Description | REST Endpoint |
|---|---|---|
delete_invitee_data | Delete invitee data (GDPR) | POST /data_compliance/deletion/invitees |
Examples
Create a new event type
# Through Claude:
"Create a new 45-minute event type called 'Strategy Session' with Zoom as the location"
Update an event type duration
# Through Claude:
"Update my '30 min chat' event type to be 20 minutes instead"
Change event type location
# Through Claude:
"Change my 'Team Sync' event type location from Google Meet to Zoom"
Book a meeting programmatically
# Through Claude:
"Schedule a meeting for john@example.com tomorrow at 2pm using my '30 min chat' event type"
Bulk update event types
# Through Claude:
"Update all my 30-minute event types to 25 minutes"
API Endpoint Coverage
This server provides access to 45+ Calendly API v2 endpoints:
- ✅ Users (2 endpoints)
- ✅ Event Types (7 endpoints) - Including NEW management APIs
- ✅ Scheduled Events (5 endpoints) - Including Scheduling API
- ✅ Event Invitees (2 endpoints)
- ✅ Availability Schedules (3 endpoints)
- ✅ Organizations (7 endpoints)
- ✅ Webhooks (4 endpoints)
- ✅ Routing Forms (4 endpoints)
- ✅ Scheduling Links (1 endpoint)
- ✅ No-Shows (3 endpoints)
- ✅ Meeting Locations (1 endpoint) - NEW
- ✅ Data Compliance (1 endpoint)
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Security
- Never commit your API keys or
.envfile - Use environment variables for sensitive data
- Rotate your API keys regularly
- Follow the principle of least privilege
Troubleshooting
"Module not found" errors
Make sure you've installed all dependencies:
pip install -r requirements.txt
"Authentication failed" errors
Check that your CALENDLY_API_KEY is correct and hasn't expired.
Connection issues
Ensure you have internet connectivity and can reach api.calendly.com
Python version errors
Make sure you're using Python 3.10 or higher:
python3 --version
License
MIT License - see file for details
Acknowledgments
- Built using the Model Context Protocol
- Powered by the Calendly API
- Created for use with Claude
Support
For issues and questions:
- Open an issue on GitHub
- Check the Calendly API documentation
- Review the MCP documentation
Version History
v2.1.0 (Current)
- Added Event Type Management APIs
- Create and update event types programmatically
- Manage event type availability schedules
- List user meeting locations
- Complete coverage of all Calendly API v2 endpoints (45+ tools)
v1.0.0
- Initial release
- Core API endpoint coverage
- Scheduling API support
Made with ❤️ for the Claude and Calendly communities