renfield-mcp-calendar
Unified MCP server for calendar access connecting Exchange (EWS), Google Calendar, and CalDAV through a single MCP interface, enabling multi-calendar event management via natural language.
README
renfield-mcp-calendar
Unified MCP server for calendar access — connect Exchange (EWS), Google Calendar, and CalDAV (Nextcloud, ownCloud, Radicale) through a single Model Context Protocol interface.
Features
- Multi-calendar — Configure multiple calendar accounts via YAML, query them individually or all at once
- Cross-calendar merge —
list_eventswithout a calendar parameter returns events from ALL calendars sorted chronologically - Three backends — Exchange Web Services (EWS), Google Calendar API, CalDAV
- No passwords in config — Credentials referenced via environment variable names
- Lazy connections — Backend clients are initialized on first use, not at startup
- Async-ready — All blocking I/O wrapped with
asyncio.run_in_executor - Google OAuth2 helper — Built-in
--auth googleCLI for initial token setup
Installation
pip install renfield-mcp-calendar
Or directly from GitHub:
pip install "renfield-mcp-calendar @ https://github.com/ebongard/renfield-mcp-calendar/archive/refs/heads/main.tar.gz"
Configuration
Set CALENDAR_CONFIG to point to your YAML config file (default: /config/calendar_accounts.yaml).
Example calendar_accounts.yaml
calendars:
# Exchange 2019 (on-premise, direct EWS endpoint)
- name: work
label: "Work Calendar"
type: ews
ews_url: "https://exchange.example.com/EWS/Exchange.asmx"
username_env: CALENDAR_WORK_USERNAME
password_env: CALENDAR_WORK_PASSWORD
# Google Calendar (OAuth2 Desktop Flow)
- name: family
label: "Family Calendar"
type: google
calendar_id: "primary"
credentials_file: "/config/google_calendar_credentials.json"
token_file: "/data/google_calendar_token.json"
# Nextcloud / CalDAV
- name: club
label: "Club Calendar"
type: caldav
url: "https://nextcloud.example.com/remote.php/dav/calendars/user/club/"
username_env: CALENDAR_CLUB_USERNAME
password_env: CALENDAR_CLUB_PASSWORD
Security: Passwords and tokens are never stored in the YAML file — use *_env fields to reference environment variable names.
Backend-specific notes
| Backend | Library | Auth | Notes |
|---|---|---|---|
| EWS | exchangelib | NTLM/Basic | Direct EWS URL, no Autodiscover needed |
| google-api-python-client | OAuth2 Desktop Flow | Token auto-refresh, one-time browser auth | |
| CalDAV | caldav | Basic Auth | Works with Nextcloud, ownCloud, Radicale, etc. |
Google Calendar setup (one-time)
- Google Cloud Console → Create project → Enable Google Calendar API
- Create OAuth2 credentials (Desktop App) → Download
credentials.json - Place as
google_calendar_credentials.jsonin your config directory - Run the auth flow:
python -m renfield_mcp_calendar --auth google --calendar family - Complete the browser-based authorization — token is saved automatically
MCP Tools
| Tool | Parameters | Description |
|---|---|---|
list_calendars |
— | List all configured calendar accounts |
list_events |
calendar?, start, end |
Events from one or all calendars. Empty calendar = merged from all. |
create_event |
calendar, title, start, end, description?, location? |
Create a new event |
update_event |
calendar, event_id, title?, start?, end?, ... |
Update specific fields of an event |
delete_event |
calendar, event_id |
Delete an event |
get_event |
calendar, event_id |
Get a single event with full details |
Example queries (via LLM)
- "Was steht heute an?" →
list_events()(all calendars, today) - "Was steht im Firmenkalender diese Woche?" →
list_events(calendar="work", start="...", end="...") - "Erstelle einen Familientermin morgen um 14 Uhr: Zahnarzt" →
create_event(calendar="family", ...) - "Bin ich morgen Nachmittag frei?" →
list_events(start="...", end="...")
Usage
# Run as MCP server (stdio transport)
python -m renfield_mcp_calendar
# Or via entry point
renfield-mcp-calendar
# Google OAuth2 setup (one-time)
python -m renfield_mcp_calendar --auth google --calendar family
Claude Desktop / MCP client config
{
"mcpServers": {
"calendar": {
"command": "python",
"args": ["-m", "renfield_mcp_calendar"],
"env": {
"CALENDAR_CONFIG": "/path/to/calendar_accounts.yaml",
"CALENDAR_WORK_USERNAME": "user@example.com",
"CALENDAR_WORK_PASSWORD": "secret"
}
}
}
}
Development
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests (29 tests)
pytest tests/ -v
License
MIT
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.