notion-calendar-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NOTION_CALENDAR_TOKEN | No | Your session JWT or Bearer token. The server will construct the Authorization header. Alternative to NOTION_CALENDAR_AUTHORIZATION. | |
| NOTION_CALENDAR_BASE_URL | No | Optional base URL for the Notion Calendar API. Defaults to https://calendar-api.notion.so if not provided. | |
| NOTION_CALENDAR_AUTHORIZATION | No | The full Authorization header value, e.g. 'Bearer YOUR_SESSION_JWT'. Alternative to NOTION_CALENDAR_TOKEN. |
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 |
|---|---|
| get_userA | Call first to learn who is signed in and which calendar accounts exist. POST /v2/getUser {}. Returns profile + linked accounts (title/email first). Use before get_calendar_lists / get_events. Session JWT required. |
| get_holdsA | List scheduling Holds (booking pages) for the signed-in user. POST /v2/getHolds {}. Call when you need hold aliases/ids before get_hold / create_hold. Name/alias first, never lead with id. |
| get_notion_session_usersA | List Notion session users tied to this Calendar session. POST /v2/getNotionSessionUsers {}. Call when bridging Calendar ↔ Notion identity. Display name/email first. |
| get_calendar_listsA | List calendars for one or more accounts (sidebar calendar list). Call after get_user when you need calendarId values. POST /v2/getCalendarLists {queries:[{provider, accountId}]}. queries_json: JSON array. Calendar summary/name first. |
| get_calendarsA | Fetch calendar metadata (colors, access role, timeZone) for accounts. POST /v2/getCalendars {queries:[{provider, accountId, query?}]}. queries_json: JSON array. Prefer get_calendar_lists for the sidebar list. Summary first. |
| get_eventsA | Fetch events in a time window for specific calendars. Call after you know provider/accountId/calendarId. POST /v2/getEvents {queries:[...]}. timeMin/timeMax are ms epoch. queries_json: JSON array; provider defaults to google. Return order: summary/title first, never lead with event id. |
| get_eventA | Fetch one event by id. Call when you already have provider/accountId/calendarId/eventId. POST /v2/getEvent {query:{...}}. Optional userTimeZone. Summary first in any presentation. |
| search_eventsA | Full-text search events across accounts/calendars in a time range. Call when the user asks to find meetings by keyword. POST /v2/searchEvents. time_min/time_max are ms epoch. accounts_json: [{accountId, calendarIds:[]}]. Title/summary first. |
| create_eventA | Create a calendar event. Call after confirming calendar + time with the user. POST /v2/createEvent. eventData must include id (uuid hex ok), summary, start, end, status, provider, accountId, calendarId, reminders:{useDefault:true}. Use start/end only (never startTime/endTime). start_json/end_json: {dateTime,timeZone} or {date}. send_updates: all|none|externalOnly. Summary first. |
| update_eventsA | Update one or more existing events. Call when changing time/title/details. POST /v2/updateEvents {mutations:[{provider, accountId, eventId, calendarId, eventData, userTimeZone?, sendUpdates?}]}. mutations_json: JSON array. Patch eventData with fields to change; keep summary visible. sendUpdates: all|none|externalOnly. |
| delete_eventsA | Delete one or more events. Call only after confirming which event(s). POST /v2/deleteEvents {mutations:[{provider, accountId, calendarId, eventId, sendUpdates?}]}. mutations_json: JSON array. Destructive. sendUpdates: all|none|externalOnly. |
| rsvp_eventA | RSVP to an event invite (accepted|declined|tentative). Call when the user wants to respond to an invitation. POST /v2/rsvpEvent. response_status must NOT be needsAction. Optional comment and counter_proposal_json {start,end}. |
| get_calendar_free_busyA | Get free/busy blocks for calendars in a time range. Call when checking availability before scheduling. POST /v2/getCalendarFreeBusy. time_min/time_max ms epoch. calendars_json: [{accountId, calendarId}]. |
| get_user_preferencesA | Read Calendar user preferences (working hours, defaults, etag). Call before update_user_preferences (etag required for force check). POST /v2/getUserPreferences {}. |
| update_user_preferencesA | Update Calendar user preferences. Call only with an etag from get_user_preferences (412 if stale). POST /v2/updateUserPreferences {userPreferences:{...}}. user_preferences_json: full/partial prefs object including etag. |
| get_contactsA | Fetch contacts via POST /v2/getContacts (Spectral-proven; may be alias). Call for quick contact lookup; prefer get_people for paginated directory. Optional body_json object. Display name/email first. |
| get_peopleA | List people/contacts from connected accounts (paginated). POST /v2/getPeople {accountIds?, cursor?, limit?}. Call when searching attendees by directory. Display name/email first. |
| export_eventsA | Normalize/export partial event objects (ICS-oriented shape). POST /v2/exportEvents {events:[...]}. events_json: array of partial events with id/start/end/summary/…. Call when packaging events for export. |
| incremental_syncA | Drive incremental calendar sync with sync tokens. POST /v2/incrementalSync {syncTokens, metadata:{caller}}. Often 400 without valid tokens from a prior sync — expose for advanced use; prefer get_events for normal reads. sync_tokens_json + optional metadata_json. |
| get_colorsA | Fetch calendar color palette. Call when rendering/assigning calendar colors. POST /v2/getColors {}. |
| get_synchronized_calendarsA | List synchronized/mirrored calendars. Call when inspecting Calendar sync links between accounts. POST /v2/getSynchronizedCalendars {}. Name first. |
| get_calendar_resourcesA | List room/resource calendars for accounts. POST /v2/getCalendarResources {accounts:[accountId,...]}. accounts_json: JSON string array. Call when booking rooms. |
| get_group_membersA | Resolve Google group members for attendee expansion. POST /v2/getGroupMembers {accountId, emails:[...]}. emails_json: JSON array. Call when an invitee is a group address. |
| get_holdA | Fetch one Hold (scheduling page) by username, alias, or holdShortId. POST /v2/getHold. Optional time_min/time_max (ms). Call after get_holds when inspecting availability slots. Alias/name first. |
| create_holdA | Create a Hold scheduling page. POST /v2/createHold. hold_json must include id, timeRanges, userPrimaryTimeZone (and usual Hold fields). Call when the user wants a new booking link. Alias/title first. |
| update_holdA | Update an existing Hold. POST /v2/updateHold. hold_json should include id plus fields to change (alias, timeRanges, …). Call after get_hold / get_holds. |
| delete_holdA | Delete a Hold by holdId. POST /v2/deleteHold {holdId}. Destructive — confirm with the user first. |
| update_calendarsA | Patch calendar metadata (summary, color, selected, …). POST /v2/updateCalendars {mutations:[{provider, accountId, calendarId, calendarData, colorRgbFormat?, variant?}]}. mutations_json: JSON array. Call when renaming/recoloring calendars. Summary first. |
| insert_calendar_listA | Subscribe/add a calendar to the user's calendar list. POST /v2/insertCalendarList {mutation:{provider, accountId, calendarId, calendarData?}}. mutation_json: JSON object. Call when adding a shared calendar. |
| delete_calendar_listA | Unsubscribe/remove a calendar from the calendar list. POST /v2/deleteCalendarList {mutation:{provider, accountId, calendarId}}. mutation_json: JSON object. Destructive for the sidebar entry (not the calendar itself). |
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/felipeorlando/notion-calendar-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server