TimeTree MCP Server
Summary: The TimeTree MCP server lets an AI assistant read and manage your TimeTree calendars, events, memos, comments, labels, members, and holidays.
List calendars to find calendar IDs and participants.
Read events with filters by date range, keyword, label, and memo inclusion; recurring events expand into occurrences.
Track recently updated events, including deleted ones.
Create, update, and delete events, supporting all-day events, locations, notes, labels, checklists, attendees, virtual attendees, alerts, timezones, URLs, and RRULE recurrences.
Manage memos: list, create, update, and delete them.
Manage event comments: add, list, update, and delete comments.
Read and update calendar labels (names and colors).
Get calendar members and virtual members, optionally including deactivated ones.
Fetch public holidays for up to 5 countries across up to 2 years.
View recent activity showing who changed what in a calendar.
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 Serverlist my calendars"
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.
Unofficial and for personal use. Not affiliated with TimeTree, Inc. It uses the TimeTree web app's undocumented endpoints, which can change at any time. SeeDISCLAIMER.md.
Ask your AI assistant things like:
"Summarize our family calendar this week. Any conflicts?"
"When was the last dentist appointment?"
"Add a dinner on Saturday at 7 pm to the Family calendar."
"Turn this trip plan into events and a packing memo."
"Who changed the calendar today, and what did they change?"
What it does
Reads your calendars. Events with date, keyword, and label filters. Recurring events are expanded into their actual dates.
Changes them when you ask. Create, update, and delete events, memos, and comments, and rename or recolor labels.
Keeps you up to date. See what changed since a given time, and who made recent changes.
Knows the context. Calendar members and public holidays by country.
Runs on your computer. Your email and password are sent only to TimeTree. The session stays in memory.
Related MCP server: Chronos MCP
Install
Claude Desktop (macOS, Windows): one-click extension
Download
timetree-mcp-<version>.mcpbfrom the latest release.Open the file. Claude Desktop shows an install dialog.
Enter your TimeTree email and password, then enable the extension.
No Git, Node.js install, or config file editing is needed. The extension runs on the Node.js that comes with Claude Desktop on macOS and Windows.
Claude Code, Codex, Cursor, and other clients
Requires Node.js 22 or later and Git.
Ask your coding agent. Paste this into Claude Code, Codex, or a similar agent:
Clone
https://github.com/ehs208/TimeTree-MCP, enter the cloned directory, runnpm ci && npm run build, then configure my MCP client with a server namedtimetreethat runsnode /absolute/path/to/TimeTree-MCP/dist/index.js(use the real cloned path). StoreTIMETREE_EMAILandTIMETREE_PASSWORDonly in the MCP client environment configuration, and never hardcode or print secrets.
Or run the installer. It clones, builds, and prints a config example for each client:
curl -fsSL https://raw.githubusercontent.com/ehs208/TimeTree-MCP/main/TimeTree-MCP-install.sh | bashgit clone https://github.com/ehs208/TimeTree-MCP.git
cd TimeTree-MCP
npm ci
npm run buildThen add the server to your MCP client. Example for Claude Desktop on macOS (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"timetree": {
"command": "node",
"args": ["/absolute/path/to/TimeTree-MCP/dist/index.js"],
"env": {
"TIMETREE_EMAIL": "your-email@example.com",
"TIMETREE_PASSWORD": "your-password"
}
}
}
}If a GUI client cannot find node, use the absolute path from command -v node as command.
Setup for each client (Claude Code, Codex, Cursor, Windsurf, VS Code, Antigravity, and more): docs/MCP_CLIENTS.md
This project is not published to npm. Install it from a GitHub release or a clone of this repository.
Updating
When a newer version is out, the server adds a one-time notice to a tool response, so your assistant can tell you. Set TIMETREE_UPDATE_CHECK=false in the MCP env to turn this off.
Claude Desktop extension: download the new
.mcpbfrom the latest release and open it.Git clone: run
git pull origin main && npm ci && npm run buildin the folder, then restart your MCP client.
Details: docs/UPDATING.md. Changes: CHANGELOG.md.
Tools
Area | Tools |
Calendars |
|
Events |
|
Memos |
|
Comments |
|
Labels and members |
|
Other |
|
Parameters and examples: COMMANDS.md
create_calendar requires a name (1–20 characters) and an explicit purpose. It does not invite members. Timeouts and server errors are not retried.
If the creation response cannot be validated, check existing calendars before trying again.
Privacy and security
Your email and password are stored only in your MCP client configuration, or in Claude Desktop's extension settings. They are sent only to TimeTree.
Session cookies and CSRF tokens stay in memory and are never written to disk.
Logs mask passwords, cookies, and tokens.
On startup, the server makes one request to GitHub to check for a newer version. No credentials or calendar data are sent.
Troubleshooting
"Missing required environment variables": set TIMETREE_EMAIL and TIMETREE_PASSWORD in your MCP configuration. For the Claude Desktop extension, open its settings and enter them again.
Sign-in fails: check that you can sign in on the TimeTree web app with the same email and password. The server signs in with email and password only.
No calendars or events: make sure the account has calendars, and check the client's MCP logs. TimeTree may have changed its web API; please open an issue.
How it works
The server signs in to the TimeTree web app with your email and password, then calls the same endpoints the web app uses. It signs in again when the session expires, limits requests to 10 per second with retries on HTTP 429, and reads every page of large calendars.
Write requests need a CSRF token, which the server reads from the TimeTree web page after signing in.
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md.
Credits
API insights from TimeTree-Exporter by @eoleedi.
License
MIT. See LICENSE. Not affiliated with TimeTree, Inc. See DISCLAIMER.md.
Available Tools
20 toolsadd_event_commentC
Add a comment to a TimeTree event using the verified event activity endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| silent | No | Whether to avoid push notifications when supported (default: true) | |
| content | Yes | Comment content | |
| event_uuid | Yes | The event UUID to comment on | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It hints at a 'verified' endpoint (suggesting auth) and the schema notes the silent/push-notification default, but the description itself never states permissions required, mutation side effects, or what happens on invalid event_uuid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tightly front-loaded sentence with no padding. The only slack is the endpoint reference, which does not help an agent decide or invoke.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a mutation tool with no annotations and no output schema; the description does not cover permissions, whether the comment can be edited later (via update_event_comment), or failure modes. For a write operation it is too thin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (including the silent default and the calendar_id sourcing note) are already documented in the schema. The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resource (comment on a TimeTree event), which distinguishes it from the sibling read/update/delete comment tools by name alone. The trailing 'using the verified event activity endpoint' is implementation detail rather than purpose, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus update_event_comment or delete_event_comment, and no mention of prerequisites such as needing a valid event_uuid from get_events. Usage context is only implied by the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventA
Create a new event in a TimeTree calendar. Requires CSRF token (automatically managed). Returns the created event with UUID. Label colors (label_id 1-10): 1=Emerald green, 2=Modern cyan, 3=Deep sky blue, 4=Pastel brown, 5=Midnight black, 6=Apple red, 7=French rose, 8=Coral pink, 9=Bright orange, 10=Soft violet. Supports checklist, attendees, virtual attendees, alerts, RRULE recurrence strings, and category override.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Related URL | |
| note | No | Event notes/description | |
| title | Yes | Event title (required) | |
| alerts | No | Notification offsets in minutes before the event, e.g. [5, 30] | |
| end_at | Yes | Event end time as Unix timestamp in milliseconds. For all-day events, TimeTree uses an inclusive end date. | |
| all_day | No | Whether this is an all-day event (default: false). TimeTree uses inclusive end dates for all-day events. | |
| category | No | Event category (default: 1; memos use category=2) | |
| label_id | No | Color label ID (1-10). 1=Emerald, 2=Cyan, 3=Blue, 4=Brown, 5=Black, 6=Red, 7=Rose, 8=Pink, 9=Orange, 10=Violet | |
| location | No | Event location | |
| start_at | Yes | Event start time as Unix timestamp in milliseconds. For all-day events, use midnight of the start date. | |
| attendees | No | Calendar user IDs attending this event | |
| checklist | No | Checklist items to attach to the event | |
| file_uuids | No | Attached file UUIDs if already uploaded | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| recurrences | No | RRULE strings, e.g. ["RRULE:FREQ=DAILY;COUNT=2"] | |
| end_timezone | No | End timezone (default: UTC) | |
| start_timezone | No | Start timezone (default: UTC). Examples: "Asia/Seoul", "America/New_York" | |
| virtual_user_attendees | No | Virtual member IDs/names attending this event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose useful traits: the CSRF token is automatically managed and the call returns the created event with a UUID. However, it omits permissions required, whether attendees are notified, and error behavior for an 18-param mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the CSRF/return facts are front-loaded effectively, but the full ten-color label enumeration duplicates the schema's own label_id description and bloats the text without adding meaning. The middle 'Supports...' sentence is a bare parameter recital.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter mutation with no annotations and no output schema, the description covers the essentials: it states the return value, the auth handling, and the feature scope. Only permissions and side effects (attendee notifications) are missing, which keeps it just short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 18 parameters, including the label_id color mapping. The description's feature list (checklist, attendees, alerts, RRULE, category override) and the color legend largely restate what the schema provides, adding little semantic value beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new event in a TimeTree calendar'), which immediately distinguishes it from siblings like update_event, delete_event, and create_memo. An agent can route to this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'create' — there is no explicit guidance on when to prefer this over update_event or create_memo, and no stated prerequisites beyond the CSRF note. The CSRF mention adds a precondition but no alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_memoC
Create a TimeTree memo in a calendar using the verified category=2 event payload.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional related URL | |
| date | No | Optional memo date in YYYY-MM-DD; defaults to today UTC | |
| note | No | Memo body text | |
| title | Yes | Memo title | |
| label_id | No | Color label ID (1-10) | |
| location | No | Optional memo location | |
| checklist | No | Checklist items for the memo | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| virtual_user_attendees | No | Virtual member IDs/names related to the memo |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It implies a write ('Create') but discloses nothing about permissions, what a memo is relative to an event, reversibility, or side effects. The 'category=2 event payload' phrase is internal jargon that hints at an implementation detail rather than telling the agent anything actionable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence, so structurally efficient. The back half ('using the verified category=2 event payload') spends words on confusing internal terminology that does not earn its place for an agent deciding to call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a nine-parameter mutation tool with no annotations and no output schema, so the description must shoulder most of the contextual load. It omits permissions, return behavior, and how memos relate to events, leaving significant gaps for an agent to fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are documented in the schema itself and the baseline is 3. The description adds no additional parameter meaning, but none is needed given the schema's completeness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Create a TimeTree memo in a calendar'), which is better than a tautology. However, it offers no differentiation from the sibling create_event or the memo family (update_memo/delete_memo/list_memos), and the trailing 'category=2 event payload' phrase muddies rather than clarifies the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no indication of when to create a memo versus an event, no prerequisites, and no reference to alternatives such as create_event or update_memo. Usage must be entirely inferred from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventA
Delete an event from a TimeTree calendar. This action cannot be undone. Requires CSRF token (automatically managed).
| Name | Required | Description | Default |
|---|---|---|---|
| event_uuid | Yes | The UUID of the event to delete (from get_events) | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
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 the most critical trait for a destructive tool: the action cannot be undone. It also notes the CSRF token requirement is automatically managed, removing a potential stumbling block. It stops short of covering permission requirements or behavior when the event does not exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the operation, immediately followed by the irreversibility warning and then the CSRF note. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter delete with no output schema, the description covers the operation, its irreversibility, and the auth mechanism. Minor gaps remain around permission requirements and error/not-found behavior, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented with provenance (get_events, list_calendars), so the baseline of 3 applies. The description adds no further parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (event from a TimeTree calendar), which cleanly distinguishes it from delete_memo and delete_event_comment in the sibling list. An agent can identify the operation without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the destructive verb and the referenced siblings, but there is no explicit when-to-use guidance, no conditions for choosing delete_event over e.g. update_event, and no note about prerequisites beyond the CSRF mention.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_event_commentC
Delete a TimeTree event comment by comment/activity ID.
| Name | Required | Description | Default |
|---|---|---|---|
| comment_id | Yes | The comment/activity ID | |
| event_uuid | Yes | The event UUID | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does not say whether deletion is permanent, whether it requires ownership/permissions, or whether the comment_id and 'activity ID' are interchangeable identifiers — the only hint is the ambiguous 'comment/activity ID' phrasing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence, front-loaded with verb and resource, no filler. It is appropriately sized but arguably too terse for a destructive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A destructive three-parameter mutation with no annotations and no output schema needs more: irreversibility, permission requirements, and how to discover the comment_id are all absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented, including the calendar_id sourcing note. The description's 'comment/activity ID' adds nothing beyond the schema's own 'The comment/activity ID' text, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (TimeTree event comment) and identifies the selector (comment/activity ID). It is clearly distinguishable from add_event_comment and update_event_comment, though it does not note that the calendar and event context are also required.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus update_event_comment or how to obtain a valid comment ID (e.g., via list_event_comments). The agent must infer the workflow entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoB
Delete a TimeTree memo. This action cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| memo_uuid | Yes | The memo UUID (same as event UUID) | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the single most important trait for a destructive tool – 'This action cannot be undone' – but says nothing about required permissions, whether deletion cascades to associated data, or what the response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the destructive warning is front-loaded immediately after the purpose statement. Nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, fully-documented tool with no output schema, the description covers purpose and the critical irreversible consequence. Only minor gaps remain, such as auth requirements or whether confirmation is expected before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both calendar_id and memo_uuid are already documented in the schema, including the note that memo UUID equals event UUID. The description adds nothing beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Delete') and resource ('TimeTree memo'), which cleanly separates it from delete_event and delete_event_comment in the sibling list. It does not explicitly contrast with update_memo or the event-deletion tools, but the resource noun is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context, no prerequisites, and no guidance on choosing between this and update_memo or the event-deletion siblings. The only implicit signal is that the action is irreversible, which hints at caution but is not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_labelsB
Get TimeTree calendar labels (IDs, names, colors, ordering).
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. 'Get' implies a read operation, and the field list (IDs, names, colors, ordering) usefully discloses the shape of the result. However, it says nothing about auth requirements, failure modes, or empty-label behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that packs the verb, resource, and return fields with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool, the description is nearly sufficient: it names the returned fields in lieu of an output schema. The only gap is the absence of usage guidance against the sibling update tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the calendar_id parameter is thoroughly documented in the schema, including the note about numeric strings. The description adds no parameter detail beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (TimeTree calendar labels) and enumerates the returned fields (IDs, names, colors, ordering). It is clearly distinguishable from the sibling update_calendar_labels by the read verb, though it does not explicitly name that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use context, no prerequisites, and no mention of the alternative update_calendar_labels. It relies entirely on the reader inferring usage from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_membersC
Get TimeTree calendar members from the verified v2 users endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| include_deactivated | No | Include deactivated members (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Get' weakly implies a read operation, but nothing is said about permissions, pagination, deactivated-member handling, or the meaning of 'verified v2 users endpoint' — a significant gap for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The closing clause about the 'verified v2 users endpoint' is jargon that does not help the agent select or call the tool, costing a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should indicate what a 'member' record contains (IDs, names, roles, activation state) and how results relate to include_deactivated. None of that is covered, leaving the tool under-specified for a read call an agent must interpret.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are fully documented in the schema (calendar_id source, include_deactivated default). The description adds no syntax, format, or edge-case detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('calendar members'), so the agent knows exactly what it fetches. It stops short of distinguishing itself from the sibling get_calendar_virtual_members, and the trailing 'verified v2 users endpoint' is implementation detail rather than differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no reference to the closely named alternative get_calendar_virtual_members. The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_calendar_virtual_membersC
Get TimeTree virtual members for a calendar from the verified virtual_users endpoint.
| Name | Required | Description | Default |
|---|---|---|---|
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| include_deactivated | No | Include deactivated virtual members (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It implies a read via 'Get' but says nothing about permissions, whether the operation is safe/idempotent, what a 'virtual member' is, or what the response contains. The phrase 'verified virtual_users endpoint' is internal jargon that adds no actionable behavior for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the resource front-loaded. It is slightly under-specified rather than padded, and the trailing 'verified virtual_users endpoint' clause is low-value jargon.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A simple two-parameter read tool with no output schema and full schema coverage needs only modest description. The purpose is conveyed, but the definition fails to clarify the domain concept of 'virtual members' or how this differs from plain calendar members, leaving a real comprehension gap for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both calendar_id and include_deactivated are already documented in the schema (including the default for include_deactivated). The description adds no parameter meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('TimeTree virtual members for a calendar'), which is meaningful. However, it never differentiates itself from the sibling get_calendar_members, so an agent cannot tell from the description alone whether 'virtual members' is a subset or a distinct concept.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of the obvious alternative get_calendar_members. The only usage signal is an implicit one from the verb 'Get'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventsA
Get events from a specific TimeTree calendar, sorted by start time. Automatically handles pagination. Supports filtering by start time range, keyword, label, and whether to include memos. When start_before is set, recurring events are expanded into their occurrences within the range (occurrences share the series uuid; editing one edits the whole series). Returns event details including title, start/end times, location, notes, label color, and more. Label colors (label_id 1-10): 1=Emerald green, 2=Modern cyan, 3=Deep sky blue, 4=Pastel brown, 5=Midnight black, 6=Apple red, 7=French rose, 8=Coral pink, 9=Bright orange, 10=Soft violet.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional limit on number of events to return. | |
| query | No | Optional case-insensitive keyword matched against title, note, and location. | |
| label_id | No | Optional label ID (1-10) filter. | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| start_after | No | Optional Unix timestamp in milliseconds. Only return events starting after this time. If user provides a date like "2026-02-01", convert it to Unix timestamp (e.g., 1769904000000). | |
| start_before | No | Optional Unix timestamp in milliseconds. Only return events starting before this time. | |
| include_memos | No | Whether to include memos (category=2). Defaults to true. | |
| expand_recurring | No | When start_before is set, return each recurring occurrence in the range instead of only the series start. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses automatic pagination handling, the default that memos are included, default recurring expansion, and critically that expanded occurrences share a series uuid so editing one edits the whole series — a side effect an agent must know before acting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then filter/legend detail; almost every sentence earns its place. The label color enumeration is long but is information not present in the schema, so it is defensible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter read tool with no output schema and no annotations, the description covers return fields, defaults, pagination, and recurring semantics, so an agent can call it correctly. It is only slightly short on any ranking/limit interaction with pagination.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new meaning the schema lacks: the label_id 1-10 color mapping and the recurring-expansion behavior tied to start_before. It leaves the limit/pagination interaction unspecified, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get events from a specific TimeTree calendar') plus ordering semantics ('sorted by start time'), which is more than a tautology. It does not, however, distinguish itself from the sibling get_updated_events, so an agent cannot tell which listing endpoint to prefer from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description enumerates the available filters (time range, keyword, label, memos) which implies when the tool is useful, but it never states when to use it versus get_updated_events or list_memos, nor any prerequisites. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_holidaysA
Get public holidays and memorial days for one or more countries in a date range (up to 2 years). Useful for scheduling around days off. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | Yes | Last date to include (YYYY-MM-DD, UTC) | |
| start_date | Yes | First date to include (YYYY-MM-DD, UTC) | |
| country_iso | Yes | ISO 3166-1 alpha-2 country codes, e.g. ["KR"] or ["KR", "JP"] (max 5) | |
| days_off_only | No | Only return days off, excluding observances that are working days (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden. It usefully discloses the read-only nature and the maximum 2-year window, which are real operational constraints. However, it says nothing about auth requirements, rate limits, pagination, or how results are aggregated/deduplicated across multiple countries, leaving meaningful gaps for a multi-country query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and scope, then a usage cue, then the safety trait. No redundancy or filler; every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no output schema and no annotations, the description covers purpose, range limit, and read-only status but stops short of clarifying the return shape (e.g., grouped per country, holiday type fields) or permission needs. Adequate but with clear omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents format (YYYY-MM-DD, UTC), ISO codes, the max-5 limit, and the days_off_only default; baseline is 3. The description adds only the 2-year range cap and the observance-vs-day-off concept, which is marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (Get) and resource (public holidays and memorial days) with explicit scope: one or more countries within a bounded date range. This is clearly distinguishable from siblings like get_events or list_calendars, which return user calendar items rather than national holidays.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Useful for scheduling around days off' hints at the intended use case but never states when to choose this tool over get_events or how the two relate. No exclusions, prerequisites, or alternative-routing guidance are given, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_activityA
Get recently changed events and memos in a calendar, newest first, with who changed what (created, title/date/label/note/location/reminder/URL/checklist updated, deleted). TimeTree keeps only the last few activities per event. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of events to return (1-100, default 20) | |
| since | No | Only return activity after this Unix timestamp in milliseconds | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does reasonably well: it declares the tool is 'Read-only', states the ordering ('newest first'), and discloses a meaningful limitation ('TimeTree keeps only the last few activities per event'). It stops short of noting auth requirements, rate limits, or what the returned shape looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense, front-loaded sentence that leads with purpose, then change types, then the retention caveat, closing with 'Read-only.' No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must characterize returns; it does name the actors and change categories but not the response structure or pagination. Combined with the read-only and retention notes, it is sufficient for a correct call but not fully exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, since, and calendar_id are already fully documented in the schema. The description adds no parameter-specific meaning (e.g., how 'since' interacts with the retention window), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('Get') and resource ('recently changed events and memos in a calendar') and enumerates the change types covered (created, title/date/label/... updated, deleted), so an agent knows it is an activity/audit feed. It does not, however, explicitly distinguish itself from the similar-looking sibling get_updated_events, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative guidance. The closest siblings (get_updated_events, get_events) are never mentioned, so an agent must guess which retrieval tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_updated_eventsA
Get events from a specific TimeTree calendar that were updated after a specified time. Useful for finding recently modified events. Deleted events are included with deleted: true. Returns event details including title, start/end times, location, notes, label color, and more. Label colors (label_id 1-10): 1=Emerald green, 2=Modern cyan, 3=Deep sky blue, 4=Pastel brown, 5=Midnight black, 6=Apple red, 7=French rose, 8=Coral pink, 9=Bright orange, 10=Soft violet.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional limit on number of events to return. | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| updated_after | Yes | Unix timestamp in milliseconds. Only return events updated after this time. If user provides a date like "2026-02-01", convert it to Unix timestamp (e.g., 1769904000000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose one important behavioral trait: deleted events are returned with deleted: true. It also enumerates returned fields. However, it says nothing about permissions/auth, result ordering, pagination, or how limit defaults, all relevant for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by the deleted-event caveat and the returned-field summary. The trailing label-color enumeration is a long tail, but since there is no output schema it plausibly helps interpret returned label_id values rather than being pure padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of listing returned fields and the deleted:true marker, which is exactly what an agent needs. It is only missing result ordering and limit/pagination behavior for a filtered list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so calendar_id, updated_after, and limit are already documented with format guidance including the ms-timestamp conversion example. The description adds no parameter-level detail beyond what the schema provides; the label-color mapping is reference data, not parameter semantics. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: events from a specified calendar updated after a given time. The 'recently modified' framing implicitly distinguishes it from get_events, but it never names that sibling explicitly, so the differentiation must be inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Useful for finding recently modified events' implies the use case but gives no explicit when-to-use/when-not guidance and never mentions the obvious alternatives (get_events, get_recent_activity). The condition that selects this tool over a plain event listing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsA
List all active TimeTree calendars for the authenticated user. Returns calendar ID, name, alias code, and participating users. Use this to identify which calendar to query when the user mentions a specific person (e.g., "events with [name]").
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, and description does not disclose behavioral traits like auth requirements, rate limits, or return format beyond listing fields. Basic read operation implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters and no output schema, description covers return fields and a practical use case, fully adequate for a simple list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. Description adds no extra parameter meaning, but baseline for 0 parameters is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'list all active TimeTree calendars' with specific verb and resource, and it distinguishes from sibling tools by focusing on calendars rather than events or memos.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context on when to use (identify calendar when user mentions a person), though lacks explicit when-not-to-use or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_event_commentsA
List comments for a TimeTree event. Filters activity feed entries to comment activities only.
| Name | Required | Description | Default |
|---|---|---|---|
| event_uuid | Yes | The event UUID | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does add real behavioral context by disclosing that results are derived from the activity feed and narrowed to comment activities, but it says nothing about ordering, pagination, or required permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with zero filler; the core purpose comes first and the filtering semantics follow. Nothing reads as padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read with a fully documented schema, the definition is adequate but not complete: it omits return ordering, whether replies/threading are included, and pagination behavior, and there are no annotations to fill those gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (event_uuid and calendar_id) with useful notes like 'numeric string; numbers are also accepted'. The description adds no parameter-level detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('List comments for a TimeTree event') that immediately identifies the operation. It does not explicitly differentiate from related siblings like get_recent_activity or add_event_comment, though the second sentence hints at that relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: by saying it 'filters activity feed entries to comment activities only', it suggests use when you want comments rather than the full feed. There is no explicit when-to-use vs. get_recent_activity, no prerequisites, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_memosB
List TimeTree memos in a calendar. Memos are category=2 all-day events.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Optional limit on number of memos returned | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| updated_after | No | Only return memos updated after this Unix timestamp in milliseconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the whole burden. It usefully discloses that memos are category=2 all-day events, which is real domain context, but says nothing about permissions, ordering, pagination, or return shape for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the purpose comes first and the clarifying definition of memos follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-parameter list tool with no output schema and no annotations, the description covers purpose and the memo/event relationship adequately, but leaves list behavior such as ordering and paging unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (limit, calendar_id, updated_after) are already documented in the schema. The description adds no parameter-level detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (memos) scoped to a calendar, and the second sentence adds a real definition: memos are category=2 all-day events. That distinguishes it from generic event tools, though it never names get_events as the sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no alternatives mentioned. An agent must infer from the name that this lists memos rather than events, with no condition that selects one over the other.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_calendar_labelsA
Update TimeTree calendar label names/colors. The tool first reads existing labels and merges supplied labels so omitted labels are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | Yes | Labels to update/merge. Omitted labels are preserved. | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
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 a genuinely non-obvious trait: it reads existing labels first and merges, preserving omitted ones. That tells the agent this is a partial, non-destructive update. It still omits auth requirements, error behavior for invalid label IDs, and idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The core action is front-loaded and the behavioral caveat follows immediately, with every clause earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the critical non-obvious behavior (merge/preserve semantics) and the resource acted upon. It could add permission or failure-mode context, but nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so `id`, `name`, `color`, and `calendar_id` are already documented in the schema. The description's merge note about omitted labels adds context but no per-parameter syntax beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Update TimeTree calendar label names/colors.' An agent can tell this mutates labels, distinct from the read-only sibling get_calendar_labels. Sibling differentiation is implicit rather than stated by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (call it to change label names/colors) but the description never states when to use this over get_calendar_labels or what prerequisites exist. The merge behavior hints at context but no explicit when/when-not guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventA
Update an existing event in a TimeTree calendar. Only provide the fields you want to change. Requires CSRF token (automatically managed). Returns the updated event. Supports checklist, attendees, virtual attendees, alerts, RRULE recurrence strings, and category override.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | New related URL; use an empty string to remove it | |
| note | No | New event notes | |
| title | No | New event title | |
| alerts | No | Replace notification offsets in minutes; use [] to clear | |
| end_at | No | New end time as Unix timestamp in milliseconds | |
| all_day | No | Whether this is an all-day event | |
| category | No | New event category | |
| label_id | No | New color label ID (1-10) | |
| location | No | New event location | |
| start_at | No | New start time as Unix timestamp in milliseconds | |
| attendees | No | Replace calendar user attendee IDs | |
| checklist | No | Replace event checklist items. Use [] to clear checklist. | |
| event_uuid | Yes | The UUID of the event to update (from get_events) | |
| file_uuids | No | Replace attached file UUIDs | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| recurrences | No | Replace recurrence RRULE strings | |
| end_timezone | No | New end timezone | |
| start_timezone | No | New start timezone (e.g., "Asia/Seoul") | |
| virtual_user_attendees | No | Replace virtual member attendees. Use [] to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully adds that a CSRF token is required (auto-managed) and that the updated event is returned, but it omits the destructive trait that the array fields replace existing values (only stated in the schema) and says nothing about permissions or irreversibility of the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core operation and usage constraint. The trailing feature list is partly redundant with a fully-covered schema, but it is brief enough to earn its place as a scannable summary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter mutation tool with no annotations and no output schema, the description covers the operation, partial-update semantics, auth requirement, and return value. The main gap is not flagging that array parameters destructively replace existing values, though the schema does document that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 19 parameters including replacement/clear semantics. The description only groups the supported feature areas (checklist, attendees, alerts, RRULE, category) without adding format or constraint detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Update an existing event in a TimeTree calendar") and the partial-update scope ("only provide the fields you want to change"), which cleanly separates it from the create_event/delete_event siblings. An agent can identify the 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The partial-update instruction tells the agent how to invoke it correctly (send only changed fields), and the mention of supported features frames the scope of use. It stops short of naming alternatives or when-not-to-use conditions (e.g., versus update_event_comment or create_event), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_event_commentC
Update a TimeTree event comment by comment/activity ID.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | New comment content | |
| comment_id | Yes | The comment/activity ID | |
| event_uuid | Yes | The event UUID | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a mutation but says nothing about permissions, whether the update is full replacement or partial, whether the previous content is preserved, or what happens on an invalid comment_id. For a write tool with zero annotation coverage this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that identifies the operation and the identifying key with no filler. It is efficient, though it is arguably too terse to be maximally useful for a 4-parameter mutation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and four required parameters, the definition is thin: it omits permission requirements, partial-vs-full update semantics, error behavior, and any reference to the companion comment tools. What exists is accurate but far from sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (calendar_id, event_uuid, comment_id, content) are already documented in the schema, establishing a baseline of 3. The description restates that comment_id is the comment/activity ID but adds no syntax, format, or validation detail beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (Update) and resource (TimeTree event comment) and identifies the keying mechanism (comment/activity ID), which is enough to distinguish it from add_event_comment, list_event_comments and delete_event_comment by action. However, it never explicitly contrasts itself with those siblings, so it falls short of the 5 level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no mention of the obvious alternatives (add_event_comment to create, delete_event_comment to remove). The agent must infer the edit-vs-create-vs-delete distinction purely from the verb, which the sibling set already supplies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_memoA
Update a TimeTree memo. Only provide the fields you want to change.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | New related URL; use an empty string to remove it | |
| note | No | New memo body text | |
| title | No | New memo title | |
| label_id | No | New color label ID (1-10) | |
| location | No | New memo location | |
| checklist | No | Replace checklist items; use [] to clear | |
| memo_uuid | Yes | The memo UUID (same as event UUID) | |
| calendar_id | Yes | The calendar ID from list_calendars (numeric string; numbers are also accepted) | |
| virtual_user_attendees | No | Replace virtual member attendees; use [] to clear |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses patch semantics (unmentioned fields are untouched), but says nothing about permissions, whether edits notify members, or that array fields like checklist/virtual_user_attendees are replaced wholesale rather than merged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, no filler, with the core action front-loaded and the partial-update rule immediately following. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter mutation with no annotations and no output schema, the description is minimal but the schema compensates for the parameter detail. Missing are the mutation's side effects and any indication of what a successful update returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters including the empty-string/[] removal conventions are already documented in the schema. The description adds no field-level meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (TimeTree memo), which cleanly separates it from the update_event and update_event_comment siblings. It stops short of naming those alternatives, so it is clear but not fully differentiated in prose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Only provide the fields you want to change' is a real usage instruction that tells the agent this is a partial update, but there is no guidance on prerequisites (an existing memo must already exist) or when to prefer create_memo/delete_memo over this tool.
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.
19 tool updates
v0.4.0- Changed
add_event_comment2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
create_event2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID to create the event in (use list_calendars to get valid IDs)"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
create_memo2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID to create the memo in"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
delete_event2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
delete_event_comment2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
delete_memo2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
get_calendar_labels2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
get_calendar_members2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
get_calendar_virtual_members2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
get_events6 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID to fetch events from"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - added
Input schema / properties / expand_recurringAdded value: +{ + "description": "When start_before is set, return each recurring occurrence in the range instead of only the series start. Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / include_memosAdded value: +{ + "description": "Whether to include memos (category=2). Defaults to true.", + "type": "boolean" +} - added
Input schema / properties / label_idAdded value: +{ + "description": "Optional label ID (1-10) filter.", + "type": "number" +} - added
Input schema / properties / queryAdded value: +{ + "description": "Optional case-insensitive keyword matched against title, note, and location.", + "type": "string" +} - added
Input schema / properties / start_beforeAdded value: +{ + "description": "Optional Unix timestamp in milliseconds. Only return events starting before this time.", + "type": "number" +}
- Added
get_holidays - Added
get_recent_activity - Changed
get_updated_events1 field changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID to fetch updated events from"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)"
- Changed
list_event_comments2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
list_memos2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID to list memos from"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
update_calendar_labels2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
update_event3 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string" - changed
Input schema / properties / url / descriptionPrevious value: -"New related URL"New value: +"New related URL; use an empty string to remove it"
- Changed
update_event_comment2 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string"
- Changed
update_memo3 fields changed- changed
Input schema / properties / calendar_id / descriptionPrevious value: -"The calendar ID"New value: +"The calendar ID from list_calendars (numeric string; numbers are also accepted)" - changed
Input schema / properties / calendar_id / typePrevious value: -"number"New value: +"string" - changed
Input schema / properties / url / descriptionPrevious value: -"New related URL"New value: +"New related URL; use an empty string to remove it"
18 tool updates
v0.3.0- First observed
add_event_comment - First observed
create_event - First observed
create_memo - First observed
delete_event - First observed
delete_event_comment - First observed
delete_memo - First observed
get_calendar_labels - First observed
get_calendar_members - First observed
get_calendar_virtual_members - First observed
get_events - First observed
get_updated_events - First observed
list_calendars - First observed
list_event_comments - First observed
list_memos - First observed
update_calendar_labels - First observed
update_event - First observed
update_event_comment - First observed
update_memo
TDQS
Scored across 20 tools
Tools are mostly clearly distinct: calendar listing, event CRUD, memo CRUD, comment CRUD, labels, members, holidays, and activity. Some overlap exists between get_events/get_updated_events and get_recent_activity, as all retrieve event changes/updates, which could confuse agents choosing the right tool for recent modifications.
All tool names follow a consistent verb_noun snake_case pattern (list_calendars, get_events, create_event, update_event, delete_event, etc.). Prefixes like add_/list_ for comments are consistent with the overall style.
With 20 tools, the server covers a broad domain but is somewhat heavy. Several tools are specialized (virtual members, holidays, recent activity) and could be consolidated, making it borderline for a typical MCP server.
The toolset provides comprehensive CRUD for events, memos, and comments, plus calendars, labels, members, and additional read-only utilities. All core workflows for a calendar service are covered with no obvious gaps.
Maintenance
Related MCP Connectors
A MCP server that works with Google Calendar to manage event listing, reading, and updates.
MCP server providing attendance data queries via the CloudTime API.
MCP server for Cronofy — read calendars, events and free/busy, and create, update or delete events.
timesheet.io MCP server - manage timers, projects, tasks and reports
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server that integrates with the Tweek API to manage calendars, tasks, and custom colors. It enables users to perform full task CRUD operations, list accessible calendars, and fetch color preferences through secure authentication.1MIT
- AlicenseBqualityDmaintenanceA comprehensive MCP server for CalDAV calendar management, supporting multi-account CRUD operations, recurring events, tasks, journals, and advanced search.2730MIT
- AlicenseAqualityBmaintenanceMCP server for Apple Calendar and CalDAV providers. Enables listing, creating, updating, deleting events, and checking free/busy status with per-calendar write protection.6MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for the Teamup Calendar API, enabling event management, calendar listing, and available slot search.-