Skip to main content
Glama

jmap-calendar-mcp

An MCP server that lets an AI agent see your calendars, find events, and create, change or (if you allow it) delete events on any JMAP server that supports JMAP for Calendars, such as Stalwart 1.0 and later.

One Python file, standard library only.

Tools

Tool

What it does

list_calendars

Calendars on the account, and which one is the default

find_calendar_events

Events in a time range (default: the next 30 days), optionally matching text; recurring events are expanded

create_calendar_event

New event: title, start, time zone, length or all-day, description, location, attendees

update_calendar_event

Change only the given fields of an existing event, or move it to another calendar

delete_calendar_event

Delete an event, every occurrence if it repeats. Only offered with JMAP_ALLOW_DELETE=1

Built to be safe to hand to an agent:

  • No delete by default. An agent can move or rename an event but cannot remove one. Set JMAP_ALLOW_DELETE=1 to offer delete_calendar_event; it sends no cancellations.

  • No invitations by default. Attendees are added without being emailed. Sending invitations needs both JMAP_ALLOW_INVITES=1 on the server and send_invitations: true on the call.

  • Use a key with calendar permissions only, so the agent cannot read or send mail through it.

Related MCP server: Google Calendar MCP

Setup

  1. Create an API key for the account. On Stalwart, open the account in the admin (Directory → Accounts), set the key's permissions to Replace all permissions, and give it only these:

    • Sign in to the server

    • JMAP: Retrieve calendar details and properties

    • JMAP: Track changes to calendars since a given state

    • JMAP: Retrieve calendar event details

    • JMAP: Track changes to calendar events since a given state

    • JMAP: Search for calendar events matching criteria

    • JMAP: Track changes to calendar event query results

    • JMAP: Create new calendar events

    • JMAP: Modify existing calendar events

    • JMAP: Remove calendar events (only if you set JMAP_ALLOW_DELETE=1)

    The key then cannot read or send mail.

  2. Add the server to your MCP client. For Claude Code:

claude mcp add calendar \
  -e JMAP_SESSION_URL=https://mail.example.com/.well-known/jmap \
  -e JMAP_BEARER_TOKEN=your-api-key \
  -- uvx jmap-calendar-mcp

For several accounts, add one server per account (calendar-work, calendar-home).

Variable

Meaning

JMAP_SESSION_URL

The server's JMAP session URL, usually https://<host>/.well-known/jmap

JMAP_BEARER_TOKEN

API key for the account

JMAP_ALLOW_INVITES

1 to allow sending invitations when a call asks for it; off by default

JMAP_ALLOW_DELETE

1 to offer delete_calendar_event; off by default

Keep the key out of shell history and config files where you can: load it from your password manager or secret store when the server starts.

License

MIT

Available Tools

4 tools
create_calendar_eventA

Create an event. Confirm title, time and time zone with the user first. Attendees are added without being emailed unless send_invitations is true.

NameRequiredDescriptionDefault
daysNoLength of an all-day event, default 1
startYesLocal start time, YYYY-MM-DDTHH:MM (a date alone for all-day)
titleYes
all_dayNo
calendarNoCalendar name or id; default calendar if omitted
locationNo
attendeesNoEmail addresses
time_zoneNoIANA zone for a timed event, e.g. America/Chicago
descriptionNo
duration_minutesNoDefault 60
send_invitationsNoEmail invitations to attendees. Only when the user asked for it.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations at all, the description carries the full burden, and it does disclose the single most consequential behavior: attendees are silently added unless send_invitations is true. That is genuinely useful side-effect disclosure, but it says nothing about permissions/scopes required, what happens on duplicate or conflicting events, or what the tool returns on success.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no filler, and the highest-risk behavior is placed where it will be read. Every sentence carries a distinct instruction or disclosure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter write tool with no annotations and no output schema, the description covers the interaction protocol and the invitation side effect but omits conflict handling, required permissions, and confirmation of what is returned. It is adequate to call the tool correctly but not complete for a mutation of this surface area.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 64%, so the schema already explains start format, time_zone, calendar, days, and duration defaults. The description adds real semantic value for send_invitations and attendees by explaining the silent-add default, which the schema only hints at. The remaining parameters (title, location, description, all_day) are self-evident, so the baseline of 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ("Create an event"), which cleanly separates it from the read-oriented siblings list_calendars and find_calendar_events. It does not explicitly contrast itself with update_calendar_event, but the create/update distinction is obvious enough that an agent can route without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one concrete procedural rule ("Confirm title, time and time zone with the user first") and a conditional for invitations, which is real usage guidance rather than none. However, it never states when to use this versus update_calendar_event or what to do when an event may already exist, leaving the sibling comparison to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_calendar_eventsA

Find events between two times (default: the next 30 days), optionally matching text. Recurring events are expanded into their occurrences.

NameRequiredDescriptionDefault
textNo
afterNoISO date/time; UTC unless an offset is given
limitNo
beforeNoISO date/time; UTC unless an offset is given
calendarNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose two meaningful behaviors: the default 30-day window and that recurring events are expanded into individual occurrences (which affects result volume). It is silent on result ordering, pagination behavior, whether all calendars are searched when none is specified, and any permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, no filler, and the core scope plus default behavior are front-loaded before the recurrence note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter read tool with no annotations, no output schema, and 40% schema coverage, the description is adequate but leaves real gaps: which calendar is searched by default, how results are ordered, and whether limit truncates occurrences or base events. These matter for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, and the description compensates for part of it by explaining that text is an optional match filter and that the two time bounds define the search window (with a default). It says nothing about the 'calendar' parameter's semantics (default calendar vs. all calendars) or how 'limit' interacts with recurrence expansion, leaving two of five parameters unexplained in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find) and resource (calendar events) plus the temporal scope, which implicitly separates it from the create/update/list_calendars siblings. It never explicitly contrasts itself with those siblings, but the read/search nature is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The default window ('the next 30 days') and the optional text filter imply the intended use case, but there is no explicit when-to-use or when-not-to-use guidance and no pointer to a sibling for other needs (e.g., listing calendars first to obtain a calendar identifier).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_calendarsA

List the calendars this account can see, with which is the default.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the behavioral burden. It does disclose the visibility scope ("can see") and that the response marks the default calendar, which implies a read-only operation, but it says nothing about ordering, whether hidden/subscribed calendars are included, or permission/auth requirements for a listing call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence with zero filler; the scope qualifier and the default-flag detail are front-loaded and each earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read with no output schema and no annotations, the description covers what the tool returns (visible calendars plus the default marker). Only minor gaps remain, such as result ordering or whether the output is meant to feed the sibling event tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4 and there is no parameter meaning left to compensate for. The description correctly implies no input is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"List the calendars this account can see, with which is the default" names a specific verb (List) and resource (calendars) and scopes it to the account's visibility, which cleanly separates it from the event-oriented siblings. It does not explicitly reference those siblings, but the resource distinction is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent can infer this is the discovery step before calling find_calendar_events or create_calendar_event, but the description never says when to use it, when not to, or that its output feeds the other tools. No exclusions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_calendar_eventA

Change an existing event: give event_id and only the fields to change.

NameRequiredDescriptionDefault
daysNoLength of an all-day event, default 1
startNoLocal start time, YYYY-MM-DDTHH:MM (a date alone for all-day)
titleNo
all_dayNo
calendarNoCalendar name or id; default calendar if omitted
event_idYes
locationNo
attendeesNoEmail addresses
time_zoneNoIANA zone for a timed event, e.g. America/Chicago
descriptionNo
duration_minutesNoDefault 60
send_invitationsNoEmail invitations to attendees. Only when the user asked for it.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the behavioral burden. It usefully discloses that this is a partial update ('only the fields to change') rather than a full replacement, but says nothing about permissions, reversibility, attendee notification side effects, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is front-loaded with the purpose and then gives the key calling instruction; no words are wasted. Its brevity is appropriate, though it contributes to the missing behavioral detail noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter mutation with no annotations and no output schema, the description covers the core invocation but omits side effects and permissions. It is minimally adequate when combined with the 58% schema descriptions, but not fully complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 58%, so several parameters are undocumented in the schema. The description adds the partial-update rule for optional fields and names event_id, but does not explain semantics for title, all_day, location, description, or event_id beyond what is obvious.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific mutation ('Change') on a specific resource ('an existing event'), and 'existing' distinguishes it from create_calendar_event. An agent can identify this as an update operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the precondition ('existing event') and the invocation pattern ('give event_id and only the fields to change'), making partial updates clear. It does not name alternatives such as create_calendar_event for new events or find_calendar_events for locating an event, so it falls short of a full when-to-use guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.2.0
    • First observedcreate_calendar_event
    • First observedfind_calendar_events
    • First observedlist_calendars
    • First observedupdate_calendar_event

TDQS

A3.9/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing calendars, finding events, creating events, and updating events. There is little risk of confusing list_calendars with event search, or create_calendar_event with update_calendar_event.

Naming Consistency5/5

All tool names use a consistent snake_case verb_noun pattern: list_calendars, find_calendar_events, create_calendar_event, update_calendar_event. The convention is predictable across the entire set.

Tool Count5/5

Four tools is a well-scoped set for a focused calendar MCP server, with each tool covering a distinct operation. It stays lean without feeling arbitrary.

Completeness3/5

The surface covers listing calendars, finding events, creating events, and updating events, but lacks a delete_event operation and lacks calendar management operations. These are notable lifecycle gaps, though the existing tools support core read/write workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers