timetree-mcp
TimeTree MCP lets an MCP assistant read/search TimeTree data, perform confirmation-gated calendar writes, move supported recurring occurrences, and monitor changes.
Read calendars, events by date range/keyword, memos, event comments, labels, members, and virtual members.
Create, update, and delete events, memos, and comments; merge-update label names/colors; all writes require
confirm: true.Preflight and move one supported timed DAILY/WEEKLY occurrence in five IANA timezones, with revision checks, operation IDs, and local journal status.
Query dated occurrences for up to 93 days across a conservative DAILY/WEEKLY/MONTHLY/YEARLY subset, with completeness/uncertainty reporting.
Diagnose local timezone-data availability without authentication or calendar access.
Log in/out, check auth status, and check macOS Keychain presence; credentials are not passed as tool arguments.
Start, stop, and inspect process-local polling monitors that emit MCP notifications for calendar changes.
Use a read-only schedule review prompt and static safe-usage guide in 0.6.0, where supported by the MCP client.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@timetree-mcp Show me my TimeTree events for tomorrow."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TimeTree MCP
TimeTree MCP is an unofficial Model Context Protocol server that accesses TimeTree calendars over HTTPS. It uses the Python direct client by default and does not launch a browser; the browser transport is kept only as a compatibility fallback. Session cookies and CSRF tokens exist only in the MCP process memory.
Important: TimeTree's official Connect App/API has been discontinued. This project uses TimeTree Web's non-public endpoint, which may stop working when the service changes. Please assess the risks yourself and comply with TimeTree's terms and policies.
Features
Read calendars, events, memos, comments, labels, and members.
Create, update, and delete events and memos.
Add, update, and delete event comments.
Update calendar labels using merge mode.
Monitor calendar changes in the background and send MCP notifications.
All write operations require explicitly passing
confirm: true.Credentials are not placed in MCP tool arguments; the authenticated session is kept only in memory.
Related MCP server: Apple Calendar MCP
Requirements
Python 3.10 or later.
A TimeTree account.
macOS is required to use the Keychain helper; other platforms can use environment variables or a password file.
Installation
git clone <repository-url>
cd timetree-mcp
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --editable .The runtime uses only the Python standard library. After installation, the timetree-mcp and timetree-credentials commands are available.
Using the NPM wrapper
The NPM wrapper requires Node.js 18+ and Python 3.10+; it launches the Python MCP server bundled with the package and forwards MCP's stdin/stdout:
npx --yes timetree-mcpIt can also be installed globally:
npm install --global timetree-mcp
timetree-mcpSetting up credentials
Using the Keychain on macOS is recommended. When setting it up, the password is only entered hidden in the terminal; it does not enter shell history, MCP arguments, or source code:
./scripts/setup_timetree_keychain.sh
timetree-credentials statusMCP automatically reads the email/password in the Keychain. status only reports whether they exist and does not return values; clear both Keychain items:
timetree-credentials clearIf you are not using the Keychain, you can also use environment variables:
export TIMETREE_EMAIL='your-email@example.com'
export TIMETREE_PASSWORD='your-password'An even better option is to use a password file with permissions of 600:
chmod 600 /absolute/path/to/timetree-password
export TIMETREE_EMAIL='your-email@example.com'
export TIMETREE_PASSWORD_FILE='/absolute/path/to/timetree-password'Registering with Codex
Replace /absolute/path/to/timetree-mcp with your checkout location. If a timetree server with the same name already exists, remove it and then add it again:
codex mcp remove timetree
codex mcp add timetree \
--env TIMETREE_EMAIL=your-email@example.com \
--env TIMETREE_PASSWORD_FILE=/absolute/path/to/timetree-password \
-- python3 /absolute/path/to/timetree-mcp/src/timetree_mcp/server.pyDo not put the actual password in shell history, MCP tool arguments, the README, or source code.
When registering with the NPM wrapper, change the server command to:
codex mcp add timetree \
--env TIMETREE_EMAIL=your-email@example.com \
--env TIMETREE_PASSWORD_FILE=/absolute/path/to/timetree-password \
-- npx --yes timetree-mcpMCP tools
Login and read
timetree_login,timetree_logout,timetree_statustimetree_keychain_statustimetree_list_calendars,timetree_list_events,timetree_list_memostimetree_list_event_commentstimetree_get_calendar_labels,timetree_get_calendar_members,timetree_get_calendar_virtual_members
Writes
timetree_create_event,timetree_update_event,timetree_delete_eventtimetree_create_memo,timetree_update_memo,timetree_delete_memotimetree_add_event_comment,timetree_update_event_comment,timetree_delete_event_commenttimetree_update_calendar_labels
Time can be passed as an ISO-8601 string or Unix milliseconds; all write tools must explicitly pass confirm: true. Member invitation/removal endpoints are not yet verified, so they are intentionally not included.
If some older calendars' TimeTree sync endpoint returns -425, event queries skip that calendar and report it in the skipped_calendars field, without causing the whole batch of other readable calendars to fail.
Background monitoring
timetree_start_monitor: Starts background polling, with an interval of 30–3600 seconds.timetree_monitor_status: Views monitoring status, last poll, errors, and notification count.timetree_stop_monitor: Stops monitoring.
The first poll only establishes a baseline; afterward, when additions, modifications, or removals are detected, the server sends MCP notifications/message. The monitor is tied to the MCP process and also stops when the client exits.
Project structure
src/timetree_mcp/ Python package 與 MCP server
bin/ NPM wrapper launcher
scripts/ 本機設定輔助腳本
tests/ standard-library unittest 測試
test/ NPM wrapper 測試
.github/workflows/ci.yml Continuous integrationTesting
python3 -m unittest discover -s tests -v
npm testThe legacy ego-browser transport is kept at src/timetree_mcp/browser.py as a compatibility fallback, but the server does not load it by default.
License
This project is licensed under the MIT License.
Available Tools
29 toolstimetree_add_event_commentA
Add a comment to a TimeTree event. Requires confirm=true. Passes TimeTree's silent flag, whose notification effects are unverified; it does not guarantee notification suppression.
Inputs: confirm (required), content (required), event_uuid (required), calendar_id (required), +1 more.
timetree_create_eventB
Create a TimeTree event. Requires confirm=true and writes to the real calendar. The silent argument is unsupported; upstream notifications may occur.
Inputs: title (required), end_at (required), confirm (required), start_at (required), +15 more.
timetree_create_memoC
Create a TimeTree memo. Requires confirm=true.
Inputs: title (required), confirm (required), calendar_id (required), url, +6 more.
timetree_delete_eventADestructiveIdempotent
Delete a TimeTree event. This cannot be undone and requires confirm=true.
Inputs: confirm (required), event_uuid (required), calendar_id (required).
timetree_delete_event_commentCDestructiveIdempotent
Delete a TimeTree event comment. Requires confirm=true.
Inputs: confirm (required), comment_id (required), event_uuid (required), calendar_id (required).
timetree_delete_memoBDestructiveIdempotent
Delete a TimeTree memo. This cannot be undone and requires confirm=true.
Inputs: confirm (required), memo_uuid (required), calendar_id (required).
timetree_get_calendar_labelsCRead-onlyIdempotent
Read all labels for a TimeTree calendar.
Inputs: calendar_id (required).
timetree_get_calendar_membersBRead-onlyIdempotent
Read active members of a TimeTree calendar, optionally including deactivated members.
Inputs: calendar_id (required), include_deactivated.
timetree_get_calendar_virtual_membersBRead-onlyIdempotent
Read virtual members of a TimeTree calendar, optionally including deactivated members.
Inputs: calendar_id (required), include_deactivated.
timetree_get_occurrence_for_editARead-onlyIdempotent
Read and validate one timed DAILY/WEEKLY occurrence in Asia/Taipei, Asia/Tokyo, Asia/Kolkata, America/New_York or Europe/London. Start/end timezones must match. Returns a calendar revision and timezone; unsafe DST/metadata is rejected and unverified parent links mark it uneditable. No calendar writes.
Inputs: event_uuid (required), calendar_id (required), occurrence_start_at (required).
timetree_keychain_statusARead-onlyIdempotent
Report whether the macOS Keychain contains TimeTree email/password items; never returns their values.
Inputs: no named parameters.
timetree_list_calendarsARead-onlyIdempotent
Read the calendars available in the authenticated TimeTree account.
Inputs: no named parameters.
timetree_list_event_commentsCRead-onlyIdempotent
Read comments attached to a TimeTree event.
Inputs: event_uuid (required), calendar_id (required).
timetree_list_eventsCRead-onlyIdempotent
Read TimeTree events overlapping a date range. This tool is read-only.
Inputs: limit, query, end_date, start_date, +1 more.
timetree_list_memosCRead-onlyIdempotent
Read category-2 TimeTree memos from a calendar.
Inputs: calendar_id (required), limit, updated_after.
timetree_list_occurrencesARead-onlyIdempotent
Read dated occurrences overlapping an explicit window of at most 93 days, including a narrow DAILY/WEEKLY/MONTHLY/YEARLY rule subset. Requires a complete selected-calendar snapshot; unsupported rules, unsafe DST, or truncation mark complete=false. Does not establish edit eligibility or prove a time is free.
Inputs: end_at (required), start_at (required), calendar_id (required), limit, +1 more.
timetree_loginA
Login to TimeTree over direct HTTPS using one complete configured credential source: explicit integration settings, environment/password file, or macOS Keychain. Partial explicit settings fail without mixing sources. Do not pass credentials as tool arguments; browser sessions are not imported.
Inputs: no named parameters.
timetree_logoutADestructiveIdempotent
Clear the in-memory TimeTree session cookie and CSRF token.
Inputs: no named parameters.
timetree_monitor_statusARead-onlyIdempotent
Read monitor activity, last successful baseline, incomplete-check errors, and pending notification states. Unknown delivery blocks automatic sending; notifications_sent counts completed transport writes, not client receipts. State is memory-only.
Inputs: no named parameters.
timetree_move_occurrenceADestructive
Move ONLY one preflighted occurrence, preserving duration/metadata. Requires confirm=true, revision and operation_id. TWO NON-ATOMIC writes: create child then exclude original. Partial/uncertain operations remain durably blocked; never retry with a new ID or delete/rollback automatically.
Inputs: confirm (required), event_uuid (required), calendar_id (required), new_start_at (required), +3 more.
timetree_occurrence_operation_statusARead-onlyIdempotent
Read the local occurrence journal by operation_id, including the last dispatch phase and known child UUID. Does not query TimeTree, resume, retry, or unlock an uncertain operation.
Inputs: operation_id (required).
timetree_start_monitorBIdempotent
Start process-local polling of complete calendar snapshots. Changes use MCP notifications/message; transport writes do not prove client receipt. Uncertain notifications remain pending without automatic retry. Baselines and pending state are memory-only.
Inputs: calendar_id, interval_seconds.
timetree_statusARead-onlyIdempotent
Read the current direct HTTPS TimeTree authentication status.
Inputs: no named parameters.
timetree_stop_monitorADestructiveIdempotent
Request stopping the monitor without clearing baselines or pending notifications. Inspect stopping and poll_in_flight: an in-progress read may still be finishing, and restart is refused until it stops.
Inputs: no named parameters.
timetree_timezone_statusARead-onlyIdempotent
Diagnose installed IANA timezone data locally without credentials, calendar reads, or writes. Checks the five supported occurrence zones by default, or one requested IANA zone. Availability does not imply that occurrence tools support the requested zone.
Inputs: timezone.
timetree_update_calendar_labelsADestructive
Merge-update TimeTree label names/colors. Requires confirm=true; omitted labels are preserved.
Inputs: labels (required), confirm (required), calendar_id (required).
timetree_update_eventCDestructive
Update selected fields of a TimeTree event. Requires confirm=true. The silent argument is unsupported; upstream notifications may occur.
Inputs: confirm (required), event_uuid (required), calendar_id (required), url, +16 more.
timetree_update_event_commentBDestructive
Update a TimeTree event comment. Requires confirm=true.
Inputs: confirm (required), content (required), comment_id (required), event_uuid (required), +1 more.
timetree_update_memoCDestructive
Update a TimeTree memo. Requires confirm=true.
Inputs: confirm (required), memo_uuid (required), calendar_id (required), url, +6 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 29 tools
Most families are distinct (events, comments, memos, labels, members, monitors, auth), but the event/occurrence split is ambiguous: timetree_list_events, timetree_list_occurrences, and timetree_get_occurrence_for_edit all read event data over a date window and an agent could easily misselect. The cluster of status tools (status, keychain_status, timezone_status, monitor_status, occurrence_operation_status) is differentiated only by long descriptions, which helps but does not fully disambiguate.
Nearly all tools use a timetree_ prefix plus snake_case verb_noun form (list_calendars, create_event, update_memo, delete_event_comment), which is predictable. The deviation is the noun-only status tools (timetree_status, timetree_keychain_status, timetree_timezone_status, timetree_occurrence_operation_status) that drop the verb, but the pattern remains readable.
At 29 tools the surface is heavy and sits at the upper end of the rubric, though the breadth is largely earned by a wide domain (events, occurrences, comments, memos, labels, members, monitoring, auth). Some thinning is possible—several status/diagnostic tools could be consolidated—but nothing is obviously redundant padding.
Core lifecycle coverage is strong: full CRUD for events, comments, and memos, plus labels update, member reads, occurrence moves, and operation recovery. However, calendar-level create/delete is absent and members are read-only (no invite/remove), leaving notable gaps in calendar administration.
Maintenance
Related MCP Connectors
Read and search Teamup Calendar events and sub-calendars; create, update, delete and undo events.
Read AddEvent calendars, events, RSVPs and subscribers; create and update calendars and events.
Read Talkspirit circles, roles and meetings; write tasks, goals and proposals, with your own rights.
Read teams, spaces, lists and tasks; create, update and comment on tasks and track time.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables calendar management via Infomaniak's API, allowing users to list calendars, search events, and create events.6210 npm8MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to remotely read and edit a single iCloud Calendar account, including events, availability, and invitations, without requiring an Apple device to stay online.26 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables reading and managing Google Calendar data, including listing calendars, viewing and creating events, checking free/busy schedules, and adding events from natural language.34 npmMIT
- AlicenseBqualityBmaintenanceEnables MCP clients to access Dooray account, calendar, project, post, attachment, and messenger APIs, with read-only mode and confirmation-gated write tools.1513 npmMIT