Skip to main content
Glama
ReinforceZwei

trilium-calendar-mcp

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
MCP_HOSTNoHTTP binding host0.0.0.0
MCP_PATHNoHTTP binding path/mcp
MCP_PORTNoHTTP binding port8102
LOG_LEVELNoLog verbosity (logs go to stderr)INFO
TRILIUM_URLYesTrilium base URL (no /etapi suffix)
MCP_TRANSPORTNoTransport: stdio, streamable-http (alias http) or ssestdio
TRILIUM_TIMEOUTNoPer-request timeout (seconds)30
TRILIUM_TIMEZONENoTimezone used to interpret naive datetimesAsia/Shanghai
MCP_ALLOWED_HOSTSNoOptional host:port allowlist; enables the DNS-rebinding check for binds where it is otherwise off
TRILIUM_CALENDARSYesCalendars to expose — comma-separated note ids, optionally named with :alias
TRILIUM_CA_BUNDLENoCustom CA bundle path
TRILIUM_VERIFY_SSLNoSet false for a self-signed instancetrue
MCP_ALLOWED_ORIGINSNoOptional Origin allowlist to accompany MCP_ALLOWED_HOSTS
TRILIUM_ETAPI_TOKENYesETAPI token (Trilium → Options → ETAPI)
TRILIUM_SEARCH_LIMITNoMax notes fetched per calendar scan5000

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

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
calendar_list_calendarsA

List the calendars this server exposes.

Returns each calendar's name (use this as calendar_name in other tools), its Trilium note_id, note title, timezone, colour and the current number of events. Start here: calendar names are how the user refers to calendars (e.g. "Gaming"), and they are what the other tools accept.

calendar_list_eventsA

List events, optionally filtered by date range and text.

Args: calendar_name: Calendar to read; omit to use the default calendar. start_date: Earliest day to return, YYYY-MM-DD (events overlapping the range are included). end_date: Latest day to return, YYYY-MM-DD. limit: Maximum number of events to return (0 = no limit). title_contains: Only events whose title contains this text. categories: Comma-separated categories; matches events carrying any of them. location_contains: Only events whose location contains this text. include_descriptions: Fetch event bodies (one extra request per event). search_all_calendars: Search every configured calendar instead of one.

calendar_get_eventA

Get one event by its uid, including its description.

Args: calendar_name: Calendar to look in; omit to search all calendars. event_uid: The event's uid (from calendar_list_events).

calendar_create_eventA

Create a calendar event.

Args: title: Event title. start_datetime: YYYY-MM-DD for an all-day event, or an ISO datetime such as 2026-07-08T11:00:00 (naive = calendar timezone) / 2026-07-08T03:00:00Z (converted to calendar timezone). calendar_name: Calendar to create in; omit for the default calendar. end_datetime: ISO datetime end, or for all-day events the LAST day (inclusive). Empty = same day / no end. all_day: Force an all-day event (times are ignored). description: Plain text; line breaks are preserved. location: Free text location. categories: Comma-separated categories/tags. timezone: IANA timezone used to interpret naive datetimes. color: Colour name or hex. recurrence_rule: RRULE body, with or without the RRULE: prefix. recurrence_end_date: YYYY-MM-DD that bounds the series (writes UNTIL). recurring: Set False to force a non-recurring event. event_uid: Reuse an existing uid (updates that event instead of creating a duplicate) — use it to make retries idempotent. status, priority, privacy, attendees, url, reminder_minutes, reminder_email, reminders: accepted for compatibility but NOT stored by Trilium; they are echoed back in ignored_fields.

calendar_update_eventA

Update an existing event. Only the arguments you pass are changed.

The returned event reflects what is now stored: if you do not pass description, the response carries the existing body (not an empty string), so you do not need to re-fetch to confirm it survived.

Args: event_uid: Uid of the event to update. calendar_name: Calendar holding the event; omit to search all calendars. (other arguments as in calendar_create_event; end_datetime="" clears the end, location="" clears the location, recurrence_rule="" or recurring=False removes the recurrence.)

calendar_delete_eventB

Delete an event by uid. Deleting an unknown uid succeeds (safe retries).

Args: event_uid: Uid of the event to delete. calendar_name: Calendar holding the event; omit to search all calendars.

calendar_get_upcoming_eventsB

List events starting between today and N days ahead.

Args: calendar_name: Calendar to read; omit for all calendars. days_ahead: How many days ahead to include (today counts as day 0). limit: Maximum number of events to return.

calendar_upsert_eventsA

Create or update many events at once, keyed on uid (or on key).

Use this for bulk work (a release calendar for a whole season). Each entry is created if its identity is new and updated if it already exists, so re-running the same list updates in place instead of duplicating. Identity comes from event_uid/uid, or from key: a short stable slug ("wuwa-3.7-banner-1") that is hashed into a uid, so a scheduled agent can re-publish its list without storing uids.

Args: events: List of event objects. Each accepts the arguments of calendar_create_event (title, start_datetime, end_datetime, all_day, description, location, categories, color, recurrence_rule) plus the identity fields event_uid/uid or key. calendar_name may be set per entry to spread the list across calendars. Entries with no identity always create new events. calendar_name: Default calendar for entries that do not name one.

calendar_delete_eventsA

Delete many events by uid in one call.

Args: event_uids: Uids to delete; unknown uids are reported, not an error. calendar_name: Calendar to delete from; omit to search all calendars.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

Most tools have clearly distinct actions (list, get, create, update, delete, upcoming, bulk upsert/delete). Slight overlap exists between calendar_get_upcoming_events and calendar_list_events with a date range, and between calendar_create_event's event_uid idempotency and calendar_upsert_events, but descriptions clarify the intended distinctions.

Naming Consistency5/5

All nine tools follow a consistent calendar_verb_noun pattern with snake_case throughout. Verb choices (list, get, create, update, delete, upsert) are predictable and parallel, including the plural bulk variants.

Tool Count5/5

Nine tools is well-scoped for a calendar server, covering single-event CRUD plus bulk operations and an upcoming shortcut without redundancy. Each tool earns its place.

Completeness5/5

Full CRUD lifecycle is covered (list, get, create, update, delete) plus bulk upsert/delete, upcoming events, and recurrence support. No obvious calendar operations are missing.

Maintenance

ActivityMaintained
ResponsivenessNo issues