kalendia-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KALENDIA_TOKEN | Yes | Your personal access token from Kalendia (starts with kld_) | |
| KALENDIA_API_URL | No | The Kalendia API base URL (default: https://api.kalendia.io) | https://api.kalendia.io |
| KALENDIA_MCP_URL | No | Public URL for HTTP mode metadata (e.g., https://example.com/mcp) | |
| KALENDIA_MCP_HOST | No | Bind host for HTTP mode (default: 0.0.0.0) | 0.0.0.0 |
| KALENDIA_MCP_PORT | No | Bind port for HTTP mode (default: 8000) | 8000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_connectionsA | List the user's connected calendar accounts (Google, Microsoft, iCloud, ICS, Zoom). Each item: id, provider, email, status, scopes. Use the id with list_calendars. |
| list_calendarsA | List the LIVE provider calendars under one connection (a fresh fetch from the provider): each item is name, provider_calendar_id (use this as calendar_id in get_agenda), is_primary, is_writable, is_hidden. This is the provider view and has NO Kalendia calendar id; to get the numeric calendar id needed for sync rules and scheduling pages, use list_all_calendars. |
| list_sync_rulesA | List all sync (mirror) rules. Each rule mirrors events from a source calendar onto a target calendar. Returns id, source_calendar_id, target_calendar_id, visibility_mode, mirror_prefix, enabled. |
| get_agendaA | Read events from one calendar in a time window. connection_id comes from list_connections; calendar_id is a calendar's provider_calendar_id from list_calendars (e.g. an email, or "primary"). from_iso / to_iso are ISO-8601 datetimes (e.g. "2026-06-15T00:00:00Z"); omit them to use Kalendia's default window. Returns {events: [...]}. |
| list_scheduling_pagesB | List the user's scheduling (booking) pages. |
| create_sync_ruleA | Create a sync rule that mirrors events from source_calendar_id onto target_calendar_id. Calendar ids come from list_calendars; the target must be writable. visibility_mode is one of "busy_only" (hide all details, default), "title_only", or "full_details". mirror_prefix is an optional string prepended to mirrored event titles (e.g. "[Personal]"). Set enabled=False to create it paused. Mirrors the source's current events into the target on creation. |
| delete_sync_ruleA | Delete a sync rule (rule_id from list_sync_rules). The mirrored events it created on the target calendar are cleaned up afterward by Kalendia. This cannot be undone. |
| run_sync_ruleA | Run a sync rule now (a full reconcile that backfills the target from the source). Returns counts of events created / updated / deleted, plus any per-event errors. |
| create_eventA | Create a calendar event. connection_id from list_connections; calendar_id is a writable calendar's provider_calendar_id from list_calendars. start_iso / end_iso are ISO-8601 datetimes (e.g. "2026-06-20T14:00:00Z"; naive is read as UTC). attendees is a list of email addresses; notify=True (default) emails them an invitation. add_conference=True attaches a native video link (Google Meet / Teams). The target must be writable and must NOT be the target of a sync rule. Returns {event: {...}}. |
| reschedule_eventA | Reschedule one event to a new time window (the core "move this call" action). connection_id from list_connections; calendar_id from list_calendars; event_id is the event's provider_event_id from get_agenda. For a recurring meeting, pass the specific occurrence's id (get_agenda returns each occurrence separately) to move just that one. start_iso / end_iso are ISO-8601 datetimes. Only the time changes: title, attendees, location, and the video link are preserved. notify=True (default) emails the attendees about the new time. Returns {event: {...}}. |
| cancel_eventA | Cancel (delete) one event. Cannot be undone. connection_id from list_connections; calendar_id from list_calendars; event_id from get_agenda. notify=True (default) sends a cancellation to the attendees. An unknown event returns an error on Google / Microsoft; iCloud treats an already-deleted event as success. |
| list_all_calendarsA | List every calendar across all connected accounts as a flat list (id, connection_id, provider_calendar_id, display_name, custom_name, is_primary, is_writable, sync_enabled). Use the calendar id as a sync-rule source/target or a scheduling-page calendar. |
| connect_icloudA | Connect an Apple iCloud calendar. Requires an app-specific password (NOT your normal Apple password; generate one at appleid.apple.com under Sign-In and Security). Credentials are validated before saving. Returns the new connection. |
| connect_icsA | Connect a read-only calendar from a public ICS feed URL (an https/webcal .ics link). The feed is fetched and parsed to validate it. An ICS calendar can be a sync source but not a target. |
| refresh_calendarsA | Re-discover calendars across ALL connected accounts in one call (picks up calendars created since the account was connected). A connection whose provider errors is skipped, not fatal. |
| discover_calendarsA | Re-discover the calendars under one connection (connection_id from list_connections). Newly visible calendars are auto-activated up to the plan's calendar limit. |
| set_active_calendarsA | Set which calendars under a connection are active (synced and usable in rules/pages). This REPLACES the full active set for that connection. Note: passing an empty list would disconnect the whole account, so this tool rejects an empty list; use disconnect_connection for that. |
| rename_calendarA | Set a friendly display name for a calendar (calendar_id from list_calendars). Pass null or an empty string to clear the override and fall back to the provider's name. |
| disconnect_connectionA | Disconnect a calendar account: permanently deletes the connection and its stored credentials, pauses any booking pages that targeted its calendars, and removes sync rules that used them. The provider OAuth grant is revoked best-effort. Cannot be undone (you would reconnect from scratch). Returns which pages were paused and how many rules were removed. |
| get_scheduling_pageA | Get one scheduling (booking) page's full config, including its availability_window. Fetch this before update_scheduling_page, since update is a full replace. |
| get_availabilityA | Get bookable slots for a scheduling page by its slug, optionally within an ISO-8601 UTC window (from_iso/to_iso). Returns {slug, title, duration_minutes, slots: [ISO datetimes]}. Omit the window for the page's full horizon. |
| create_scheduling_pageA | Create a scheduling (booking) page. slug is the public URL suffix (unique per account). availability_window is {"timezone": "<IANA, e.g. Europe/Bucharest>", "weekly": {"mon": [["09:00","17:00"]], "tue": [...]}} where each day key (mon..sun) maps to a list of [start, end] "HH:MM" intervals; omit a day for no availability. source_calendar_ids are checked for conflicts; target_calendar_id (must be writable and active) is where confirmed bookings are created. video_provider is one of none | google_meet | teams | zoom (zoom also needs zoom_connection_id). |
| update_scheduling_pageA | Update a scheduling page. This is a FULL REPLACE: call get_scheduling_page first, change the fields you want, and pass every field back (any omitted optional field resets to its default). Set is_active=False to pause the page. Field meanings match create_scheduling_page. |
| delete_scheduling_pageA | Delete a scheduling page (page_id from list_scheduling_pages). Cannot be undone. |
| get_billingA | Get the current plan and subscription status: plan, tier, subscription_status, current_period_end, is_comp. |
| get_billing_overviewA | Get plan plus current usage and limits: usage {calendars, scheduling_pages} against limits {max_calendars, max_scheduling_pages, teams_app, custom_domain} (null limit = unlimited). |
| get_audit_logA | Get recent account audit-log entries, most recent first: id, action, target_type, target_id, payload, created_at. limit is clamped to 1..500. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bradbogdan/kalendia-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server