Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ICLOUD_USERNAMEYesYour iCloud email address
ICLOUD_MCP_AGENTNoFallback agent name for the activity log
ICLOUD_APP_PASSWORDYesApp-specific password generated at appleid.apple.com
ICLOUD_MCP_DATA_DIRNoDirectory to store the activity log (.activity/activity.jsonl)

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
list_calendarsA

List the names of iCloud calendars that can hold events.

list_eventsA

List events in a calendar between ISO datetimes (or dates) start and end. All-day events are included and flagged with all_day=true.

create_eventA

Create an event. start/end are ISO datetimes; end defaults to start + 1 hour. All-day: pass start as 'YYYY-MM-DD'. end is then the last day (inclusive, also 'YYYY-MM-DD') and defaults to the same day, e.g. start='2026-10-20' is a one-day event. Repeat: repeat='daily'|'weekly'|'monthly'|'yearly' (omit for none), every repeat_interval units. It runs forever unless you give repeat_count (total occurrences) or repeat_until ('YYYY-MM-DD', inclusive), not both. For weekly, repeat_days like ['MO','WE'] picks weekdays (default: the start's weekday). alerts: notify N minutes before the start, e.g. [30, 1440] = 30 minutes and 1 day before. For all-day events the start is midnight, so 900 = 9:00 the day before. warn_conflicts: a timed event is still created, but the result lists any events it overlaps under 'conflicts' (None if the check could not run). url: a link for the event. categories: tags like ['work', 'travel']. status: TENTATIVE, CONFIRMED or CANCELLED. priority: 1 (highest) to 9, or 0 for none.

update_eventA

Update fields of an existing event by uid. Only provided fields change. Use 'YYYY-MM-DD' for start/end to make it all-day (end = last day, inclusive). repeat: daily|weekly|monthly|yearly replaces the repeat rule (see create_event for the other repeat_* options); 'none' removes it; omit to leave it alone. alerts: the complete list of alerts in minutes before start (replaces existing); [] removes all; omit to leave them alone. url / categories / status / priority: '' / [] / 0 clears; omit to leave alone. On a repeating event this changes the whole series.

delete_eventA

Delete an event by uid. For a repeating event this deletes the whole series. The deletion is logged and can be undone with the undo tool.

list_reminder_listsA

List Apple Reminders lists (id, title, item count).

create_listA

Create a new Reminders list (shown at the bottom of your lists in the app). Names must be unique. Returns the new list's id and title; use either as the list argument of the other tools. (No colour or icon yet: the app picks its default.)

rename_listB

Rename a list (name or id). Names must be unique.

delete_listA

Delete a list (name or id). A list that still holds reminders is refused unless delete_reminders=True, which deletes those reminders (and their subtasks) too. Both can be undone with the undo tool.

list_remindersB

List reminders in one list (name or id), or across all lists if empty. Smart views: flagged=True for only flagged (False = only unflagged); priority='high'|'medium'|'low'|'none', or 'any' for every prioritized reminder. When either is set the result is sorted most urgent first (priority, then due).

search_remindersA

Find reminders by words in the title or notes, across all lists (or one list). Every word must appear, in any order, any case. Title matches come first, then by due date. Use before creating something to avoid duplicates, or to find 'that reminder about X'.

create_reminderA

Create a real Apple Reminder in a list (name or id). parent: id of a reminder to nest this under as a subtask (same list, one level deep); prefer the add_subtask tool. urgent: make it an Urgent alarm (needs a due date and time; turn-on only). links: URLs to attach, e.g. ['https://example.com/page']. alarms: extra time alarms, each 'YYYY-MM-DDTHH:MM' (local) or 'due' (at the due time, which needs a timed due date), e.g. ['due', '2026-10-20T08:00']. notify: a reminder with a due TIME gets an alarm at that time, like the app does, because without one it never notifies. Set notify=False for a silent due time. Passing alarms yourself overrides this default. early_minutes / early_hours / early_days / early_weeks / early_months: also notify N of that unit before the due date (needs a due date; the app holds one early reminder, so use one of them). The due time stays the real time; this is the app's "Early Reminder" setting, so for "9 PM with a 15 minute heads-up" pass due 21:00 and early_minutes=15, not an extra alarm. due: '' for none, 'YYYY-MM-DD' for all-day, or an ISO datetime (local time). priority: 0 none, 1 high, 5 medium, 9 low. repeat: '' none, or daily|weekly|monthly|yearly; repeat_interval=every N units; repeat_count=0 means forever. tags: names without '#'. Repeat needs a due date to be meaningful.

update_reminderA

Update a reminder by id. Only provided fields change. due='' clears it. move_to: a list (name or id) to move it to, with its subtasks. parent: id of a reminder to nest it under as a subtask (same list, one level deep); '' makes it a top-level reminder again. early_minutes / early_hours / early_days / early_weeks / early_months: notify N of that unit before due (the app's Early Reminder; one only); 0 clears it. repeat: daily|weekly|monthly|yearly, or 'none' to remove. tags: the complete desired tag set (replaces existing); [] removes all. links: the complete set of attached URLs (replaces existing); [] removes all. alarms: the complete set of time alarms ('YYYY-MM-DDTHH:MM' local, or 'due'); replaces existing time alarms, [] removes them, omit to keep. When you change the due to a time, the alarm at the due time follows it (and is added if missing, so the reminder notifies; notify=False keeps it silent). Location alarms are never touched.

complete_reminderA

Mark a reminder complete (or incomplete with completed=False).

delete_reminderC

Delete a reminder by id.

add_subtaskA

Add a subtask under a reminder. It lives in the parent's list; the app nests one level, so a subtask can't have subtasks. Takes the same due/notes/priority/flagged/ notify options as create_reminder. Returns the new subtask (its 'parent' is set).

bulk_remindersA

Change many reminders at once. SAFE BY DEFAULT: with apply=False (the default) it only previews what would change; call again with apply=True to do it. action: complete | uncomplete | flag | unflag | move | reschedule | set_priority | delete. Choose reminders with ids=[...] (exact), or with filters: list (name or id), flagged, priority ('high'|'medium'|'low'|'none'|'any'), overdue=True, due_from / due_to ('YYYY-MM-DD', inclusive), title_contains. At least one is required, and at most 50 reminders per call. Completed ones are skipped unless include_completed=True. move needs to_list. reschedule needs exactly one of shift_days (+/- days, keeps the time) or new_due ('YYYY-MM-DD' or ISO datetime). set_priority needs set_priority.

create_noteA

Create an Apple Note. The first line becomes the title (shown in title style), the rest is the body. folder: a folder name or id; empty means the default "Notes" folder. Plain text only.

move_noteA

Move a note to another folder (name or id). Moving to "Recently Deleted" is the same as delete_note; moving a trashed note back to a normal folder restores it.

delete_noteA

Move a note to Recently Deleted. It is not erased: Notes keeps it for 30 days and undo restores it.

list_note_foldersA

List the Notes folders (id, name). Includes Recently Deleted.

list_notesA

List the newest notes in a folder (name or id; empty is the default Notes folder): id, title, modified, locked. Titles only; use read_note for the text.

read_noteA

Read the plain text of one note by id. Locked notes are refused. Formatting, checklists and attachments are not included.

icloud_storageA

iCloud storage and plan summary: plan size, used and free space, percent used, a warning when nearly full, and usage by category (photos, backups, ...). Sizes are in GiB, matching what Settings shows. The plan name is inferred from the size because Apple does not report it.

get_eventA

One event's full details by its uid (the id every event tool returns). calendar is optional: leave it out to look in all calendars. Returns the same fields as list_events plus its calendar, repeat rule and alerts.

search_eventsA

Find events by words in the title, notes or location (case-insensitive), without knowing the date, e.g. text='dentist'. calendar: one name (default all). start/end ('YYYY-MM-DD' or ISO datetime) limit the search to that range and list each occurrence of repeating events; without them it looks at every event, hides ones that are already over (include_past=True shows them) and lists a repeating event once. Returns the first limit matches by start time, and the total count.

move_eventA

Move an event to another calendar (same uid, same details). calendar is optional: leave it out to find the event in any calendar. A repeating event moves with its whole series. Can be undone.

duplicate_eventB

Copy an event under a new uid. calendar: where to find it (default: any). to_calendar: where the copy goes (default: the same calendar). start / end: when the copy happens (same formats as update_event; a new start alone keeps the event's length); default: the same time. title: a different title for the copy. A repeating event is copied as a whole series. Can be undone.

list_calendar_detailsB

Every calendar with its colour, what it holds (events or the legacy reminders list), whether you can write to it, and whether it is a read-only subscription (holidays, sports...). Over CalDAV iCloud may not list subscriptions at all; if your account has none exposed, none appear.

set_calendar_colorB

Change an event calendar's colour ('#RRGGBB'). Can be undone.

create_calendarA

Create a new event calendar. Names must be unique. color: optional '#RRGGBB'. Returns its name; use that as the calendar argument of the event tools. Can be undone.

rename_calendarB

Rename an event calendar. Names must be unique. Can be undone.

delete_calendarA

Delete an event calendar. One that still holds events is refused unless delete_events=True, which deletes the events with it (up to 500, so the deletion can be undone: undo recreates the calendar and its events).

activity_logA

What has been changed through this server, newest first: when, which agent, which tool, a plain summary, whether it can still be undone (undoable) and whether it was undone. Use the id with the undo tool. Filter by agent name or tool; only_undoable hides the rest. Changes made directly in the Calendar/Reminders apps are not recorded here.

undoA

Undo a logged change. entry_id: an id from activity_log; batch: undo every change of one bulk operation (newest first); neither: undo the most recent undoable change by anyone. Calendar changes are restored exactly (create, edit and delete). Reminder edits restore the title, notes, due, priority, flag, completion, repeat, tags, links, alarms, list and parent; early-reminder and Urgent settings are not restored. If something changed since, the undo stops with a clear error and leaves the log entry undoable.

find_free_timeA

Find open time across your calendars. Returns the free stretches (each at least duration_minutes long) within working hours, earliest first. start: 'YYYY-MM-DD' (default today); days: how many days from start (max 60). work_start / work_end: 'HH:MM' window per day. weekdays: e.g. ['MO','TU','WE','TH','FR'] (default: every day). buffer_minutes: breathing room kept before and after each event. all_day_blocks: treat all-day events (like 'out of office') as busy; by default they don't block. calendars: limit to these names (default all). Today starts from now.

check_conflictsA

What overlaps a proposed time? start/end are ISO datetimes (end defaults to start + 1 hour), or start as 'YYYY-MM-DD' for a whole day. Looks across all calendars (or the named ones). Returns the overlapping events, each with its calendar; all-day ones are flagged all_day=true.

propose_eventA

Check a calendar event BEFORE creating it, e.g. one an agent read out of an email ("interview confirmed for the 18th at 1pm"). Writes nothing. The agent extracts the title and the exact date/time (start/end as in create_event; resolve "the 18th" to a full date first); this returns the draft plus things to show the user: warnings (date in the past, far in the future, no end given), overlapping events and a possible duplicate (same day, similar title). source: where it came from (e.g. the email subject and sender), kept in the description. Show the draft, and only call create_event with 'create_event_args' once the user agrees. now: override the current time (ISO), for testing.

agendaA

What's on: events from ALL calendars plus due reminders, in one call. start: 'YYYY-MM-DD' (default today); days: how many days from start (1 = just that day, 7 = a week). Returns events sorted by start (with their calendar), reminders due in the range, and overdue = incomplete reminders due before start (only when start is today or earlier; set include_overdue=False to leave them out). Reminders with no due date are not included.

week_summaryA

How booked you are: per day the number of events and hours booked (overlaps counted once), plus total hours, the busiest day, empty days and crowded days (75%+ of working hours booked). start: 'YYYY-MM-DD' (default today); days: 1-60. All-day events don't count unless all_day_blocks.

health_checkA

Check that Calendar (CalDAV) and Reminders/Notes (CloudKit session) are reachable and signed in. Read-only and cheap. Each service reports ok, how long it took, and for an expired Reminders session the exact command that fixes it. Call this first when another tool fails oddly.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

B3.4/5.0

Scored across 41 tools

Disambiguation4/5

Most tools have clearly distinct purposes, but several event-related tools overlap: check_conflicts, propose_event, and create_event's warn_conflicts all surface overlapping events, while find_free_time also addresses availability. list_calendars vs list_calendar_details and complete_reminder vs bulk_reminders are close enough that descriptions carry the disambiguation burden.

Naming Consistency4/5

Almost all tool names use consistent snake_case, and the dominant pattern is verb_noun (create_event, update_reminder, list_notes). A few noun-only names (activity_log, agenda, week_summary, health_check, icloud_storage) and the single-word undo are minor deviations but remain readable and predictable.

Tool Count2/5

41 tools is well above the 3-15 well-scoped range and beyond the 16-25 borderline range, making the surface heavy for an agent to navigate. Although the server spans Calendar, Reminders, Notes, storage, and analytics, several tools could be consolidated (e.g., list_calendars with list_calendar_details, complete_reminder with bulk_reminders, add_subtask with create_reminder's parent option).

Completeness3/5

Calendar and Reminders have near-complete CRUD/lifecycle coverage, including bulk operations and undo. Notes are notably incomplete: there is no update_note to edit note content and no tool to create, rename, or delete note folders, leaving a significant gap for the Notes domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues