calendar-mcp
Provides tools for managing Google Calendar, including listing calendars, creating events, finding events with filters, updating and deleting events, adding attendees, checking attendee status, querying free/busy information, scheduling mutual meetings, and analyzing calendar busyness.
Enables OAuth 2.0 authentication through Google Cloud Platform, allowing secure access to Google Calendar API with proper credentials and authorization.
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., "@calendar-mcpschedule a meeting with Alex tomorrow at 2pm about the project"
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.
calendar-mcp
An MCP server that gives an LLM client read and write access to your Google Calendar. It runs as a single process — stdio by default, streamable HTTP optionally — and exposes 23 tools with structured output: listing and searching calendars and events, creating, updating, moving, RSVPing to and deleting events, free/busy queries, busyness analysis, recurring-event projection, and finding a mutual slot and booking it. On top of that it has a scheduling brain that knows your working hours: finding and booking focus time, detecting double-bookings across several accounts at once, proposing better times for a meeting, and auditing where your week actually went. Authentication is Google OAuth 2.0 (Desktop app flow); tokens are cached locally, per account, and refreshed automatically.
Quick start
1. Create Google OAuth credentials. In the Google Cloud console, enable the Google Calendar API, then create an OAuth client ID of type Desktop app. Copy the client ID and secret. (Details in Google Cloud setup.)
2. Set them in your environment, or in a .env file in the directory you run from (see example.env):
GOOGLE_CLIENT_ID='...'
GOOGLE_CLIENT_SECRET='...'3. Sign in once, then add the server to your client:
uvx calendar-mcp-server authThis opens a browser and saves a token in the config directory (see Accounts); if you already have a .gcp-saved-tokens.json or set TOKEN_FILE_PATH, that file is used instead. Verify it with calendar-mcp check. Add more Google accounts with calendar-mcp auth --account work. After that the server runs non-interactively — it never opens a browser on its own unless you set CALENDAR_MCP_ALLOW_BROWSER_AUTH=1.
The PyPI distribution is
calendar-mcp-server. It installs two identical console scripts,calendar-mcpandcalendar-mcp-server, souvx calendar-mcp-serverand a localcalendar-mcpare the same command.
Related MCP server: Google Calendar MCP Server
Client configuration
Claude Code
claude mcp add calendar \
--env GOOGLE_CLIENT_ID=... \
--env GOOGLE_CLIENT_SECRET=... \
-- uvx calendar-mcp-serverClaude Desktop — claude_desktop_config.json:
{
"mcpServers": {
"calendar": {
"command": "uvx",
"args": ["calendar-mcp-server"],
"env": {
"GOOGLE_CLIENT_ID": "...",
"GOOGLE_CLIENT_SECRET": "...",
"TOKEN_FILE_PATH": "/absolute/path/to/.gcp-saved-tokens.json"
}
}
}
}Cursor — .cursor/mcp.json (project) or ~/.cursor/mcp.json (global): same mcpServers block as above.
Any other client that speaks the standard mcpServers JSON takes the same entry. TOKEN_FILE_PATH is optional now that tokens default to the OS config directory, which does not depend on the working directory the client picks — but if you do set it, make it an absolute path.
Remote / HTTP mode
calendar-mcp --transport http --host 127.0.0.1 --port 8000The MCP endpoint is then http://127.0.0.1:8000/mcp (change the path with --path).
There is no authentication layer on the HTTP transport yet. Anyone who can reach the endpoint gets full access to the calendar the saved token belongs to. Bind it to loopback, or expose it only behind a trusted reverse proxy that authenticates, or on a private network such as a tailnet. Do not put it on a public interface.
Tools
Read-only tools never change anything. "Writes" tools create or modify events;
delete_event is the only one that destroys data.
Calendars and events
Tool | Description | |
| read | List the calendars the user can see, with IDs and timezones. |
| read | Search a calendar for events, expanding recurring series into instances. |
| read | Report who accepted, declined or has not answered an invitation. |
| read | Busy intervals for one or more calendars, without event details. |
| read | Per-day event count and total scheduled minutes over a range. |
| read | Compute future occurrences from recurrence rules. |
| writes | Create a new secondary calendar. |
| writes | Create an event with explicit start/end times and optional attendees. |
| writes | Create an event from a plain-English phrase, parsed by Google. |
| writes | Change fields on an event; omitted fields are left untouched. |
| writes | Reschedule an event, and/or move it to another calendar. |
| writes | Invite one or more people to an existing event. |
| writes | Set your own RSVP ( |
| writes | Find the first slot where everyone is free, then book it. |
| destroys | Permanently delete an event. Asks the client to confirm via elicitation when supported. |
Scheduling brain — these read your saved preferences (working hours, lunch, buffer, minimum focus block).
Tool | Description | |
| read | Uninterrupted blocks in a window that could be used for deep work, longest first. |
| read | Double-bookings and too-tight transitions, across every signed-in account at once. |
| read | Where the time went: meeting hours, by size, domain, recurrence and person. |
| writes (opt-in) | Ranked better times for an existing meeting. Suggests only, unless |
| writes | Book the best free blocks as focus time. |
Local configuration — no Google call, no account argument.
Tool | Description | |
| read | The accounts you have signed in, and which is the default. |
| read | Working hours, lunch, buffer, minimum focus block, focus calendar. |
| writes | Update and save those preferences. Local file only. |
Every calendar tool takes an optional trailing account argument (detect_conflicts
takes accounts, a list, because checking several at once is the point). All times
are ISO 8601 strings — a naive timestamp is interpreted in the target calendar's own
timezone.
Scheduling brain
The five scheduling tools share one idea: your calendar is not the same as your availability. They start from your working hours, subtract lunch, subtract what is already booked, and subtract the buffer you want around meetings — then reason about what is left.
Prompts that exercise them:
"Find me six hours of focus time next week and block it out — show me the times first."
"Is anything double-booked between my work and personal calendars this week?"
"My Thursday is back-to-back. Suggest better times for the design review."
"Where did my time go last month? Who am I spending it with?"
"I need a 90-minute deep work block before Friday. Is there one?"
find_focus_time reports what exists; block_focus_time defends it by creating
events (busy, reminders off, nobody notified), trimming the last block so it books
exactly the hours you asked for rather than a whole afternoon. detect_conflicts
separates genuine overlaps from tight transitions that merely break your buffer,
and ignores events you declined, events marked free, and (by default) all-day
entries. suggest_reschedule keeps the meeting's duration, ranks candidate slots by
fewest attendee conflicts and prefers the event's current day, and moves nothing
unless you pass apply: true.
Time audit
time_audit answers "how much of my week is meetings?" in one pass, grouped by
day or week:
2026-08-01 .. 2026-09-01, Europe/Berlin, grouped by week
Meetings: 41.5 h across 63 meetings
Working hours: 152.0 h available (lunch removed)
In working hours: 38.0 h -> 25% of the week
Busiest week: 2026-W34, 14.0 h
Heaviest day: 2026-08-20, 6.5 h
By size: 1:1 18.0 h | small 15.5 h | large 8.0 h
By recurrence: recurring 26.0 h | one-off 15.5 h
Top people: a.schmidt@example.com 9.0 h | j.lee@example.com 7.5 hDeclined meetings, events marked free and all-day entries are left out by default;
include_declined and include_all_day bring them back.
Safety
delete_eventis the only destructive tool. It asks the client to confirm through MCP elicitation when the client supports it, and proceeds normally when it does not.block_focus_timetakesdry_run. Run it withdry_run: trueto see the exact blocks it would book before anything is written.suggest_rescheduledoes not move anything by default.applyisfalseand has to be set explicitly, once the user has agreed to a time.Everything else that writes is additive — creating or editing an event — and
update_eventleaves fields you omit untouched.list_accounts,get_preferencesandset_preferencesnever touch Google. They read and write local files in the config directory.
Accounts
You can sign in more than one Google account and pick between them per call.
calendar-mcp auth # the default account
calendar-mcp auth --account work # a second, named account
calendar-mcp accounts # list them, with token paths and sign-in stateEvery calendar tool takes an optional account argument naming one of these
("what's on my work calendar tomorrow?"). Omit it and the server uses the
default: CALENDAR_MCP_DEFAULT_ACCOUNT if set, otherwise the account named
default, otherwise the only account you have signed in. list_accounts
returns the same list the CLI prints, so the model can discover the names
itself.
Account names must match [A-Za-z0-9][A-Za-z0-9_-]{0,63}.
Where things live. Tokens and preferences are stored in the OS user config
directory — %LOCALAPPDATA%\calendar-mcp on Windows, ~/.config/calendar-mcp
on Linux, ~/Library/Application Support/calendar-mcp on macOS — with one
token file per account under accounts/. Override the whole directory with
CALENDAR_MCP_CONFIG_DIR.
Back-compat. TOKEN_FILE_PATH still works and now means the default
account's token. If it is set, or if a .gcp-saved-tokens.json exists in the
working directory, that file is used for the default account and nothing
moves. Named accounts always live in the config directory.
Preferences
The server remembers how you like your week to be shaped, so the scheduling
tools do not have to guess. Read them with get_preferences and change them
with set_preferences ("I start at 8 and I want 15 minutes between meetings").
Preferences are global — they describe you, not one account — and are stored as
preferences.json in the config directory.
Field | Default | Meaning |
| unset | IANA zone the working hours are expressed in, e.g. |
| Mon–Fri 09:00–17:00 | Per weekday ( |
|
| Gap to leave either side of a meeting when proposing times. |
|
| Shortest free stretch that still counts as usable focus time. |
| unset | A daily break carved out of the working hours. |
|
| Calendar that focus blocks are booked on. |
{
"timezone": "Europe/Berlin",
"working_hours": {
"mon": [["09:00", "12:00"], ["13:00", "18:00"]],
"tue": [["09:00", "17:00"]],
"wed": [["09:00", "17:00"]],
"thu": [["09:00", "17:00"]],
"fri": [["09:00", "15:00"]],
"sat": [],
"sun": []
},
"buffer_minutes": 15,
"min_focus_block_minutes": 90,
"lunch": ["12:30", "13:15"],
"focus_calendar_id": "primary"
}set_preferences merges: only the arguments you pass change, and the merged
result is validated before it is written, so a rejected change leaves the saved
file untouched. The one exception is working_hours, which is a whole-schedule
replacement — weekdays you leave out of the dict become non-working days. Pass
clear_lunch: true to remove a lunch break.
Configuration
Variable | Default | Purpose |
| — | OAuth client ID (required). |
| — | OAuth client secret (required). |
|
| Where the default account's OAuth token is cached. |
| OS user config dir | Directory holding per-account tokens ( |
|
| Account used when a tool's |
|
| Scope requested. Use |
|
| Local port for the OAuth callback during |
| unset | Set to |
| unset | Mirror the stderr log to this file. |
|
|
|
|
| Default for |
|
| Default for |
A .env file in the working directory is loaded on startup. Logs never go to stdout — stdout is the MCP protocol channel in stdio mode.
Commands
calendar-mcp [--transport {stdio,http}] [--host H] [--port P] [--path /mcp] [--log-level L]
calendar-mcp serve ... # explicit form of the default
calendar-mcp auth [--account NAME] [--no-browser]
calendar-mcp accounts # list known accounts; exit 1 if none is signed in
calendar-mcp check [--account NAME] # token status + calendar list; exit 1 if no valid token
calendar-mcp --versionpython -m calendar_mcp accepts the same arguments.
Google Cloud setup
Create or select a project and enable the Google Calendar API.
APIs & Services → Credentials → Create credentials → OAuth client ID → Application type: Desktop app. Copy the client ID and secret. There is no JSON download to keep.
A Desktop app client has no "Authorized redirect URIs" field — Google permits
http://localhoston any port for this client type, which is what the local callback onOAUTH_CALLBACK_PORTuses. Nothing to configure there.On the OAuth consent screen: User Type External, fill in the app name and contact emails, add the
https://www.googleapis.com/auth/calendarscope, and add your own Google account as a test user. Without that last step the sign-in is rejected.
Development
git clone https://github.com/deciduus/calendar-mcp
cd calendar-mcp
uv venv
uv pip install -e ".[dev]"
pytestLayout: calendar_mcp/server.py (the MCPServer, shared helpers and the credential provider), tools/ (one module per tool area — the tool functions themselves), calendar_actions.py (Google API calls), analysis.py, timeutil.py (pure interval maths), accounts.py (multi-account token paths), preferences.py (the saved schedule), models.py (pydantic input/output models), auth.py (OAuth), cli.py (the calendar-mcp command). scripts/smoke_stdio.py spawns a real stdio server and checks the handshake and tool list.
Upgrading from 1.0
Nothing breaks. All 15 original tools keep their names and their existing
parameters; each simply gained an optional trailing account. Your existing
TOKEN_FILE_PATH keeps working, and now names the default account's token.
What is new: multiple accounts, saved scheduling preferences, and eight new
tools (find_focus_time, block_focus_time, detect_conflicts,
suggest_reschedule, time_audit, list_accounts, get_preferences,
set_preferences).
Upgrading from 0.x
Package and command renamed. The distribution is now
calendar-mcp-serverand installscalendar-mcp(and an identicalcalendar-mcp-serveralias). Point your client atuvx calendar-mcp-serverinstead ofpython /path/to/run_server.py.run_server.pystill works — it is now a thin shim over the CLI — but it is deprecated and will be removed in a future release.The FastAPI/uvicorn HTTP API is gone. There are no REST endpoints, no
/health, and no separate stdio bridge process; the server is one process on the MCP SDK. If you want HTTP, it is now MCP streamable HTTP at/mcp.Authentication no longer happens implicitly. Run
calendar-mcp authonce; the server will not open a browser unlessCALENDAR_MCP_ALLOW_BROWSER_AUTH=1.Tool names are unchanged, so existing prompts keep working. Results are now structured output rather than JSON stuffed into text.
Three new tools:
move_event,respond_to_event, andproject_recurring_events(the last previously existed only as internal logic).Removed env vars:
RELOAD,MCP_API_HOST.HOST/PORTnow apply to the MCP HTTP transport.
License
This project is dual-licensed to support both open-source collaboration and sustainable development:
GNU Affero General Public License v3.0 (AGPL-3.0):
This software is free to use, modify, and distribute under the terms of the AGPLv3 license.
Key conditions include that derivative works (including modifications used over a network) must also be licensed under AGPLv3 and their source code made available.
This license is suitable for open-source projects or internal use where AGPLv3 compliance is feasible.
See the LICENSE file for the full text.
Commercial License:
If the terms of the AGPLv3 are not suitable for your specific use case (e.g., integrating this software into a proprietary, closed-source commercial product or service without complying with AGPLv3's source-sharing requirements), a separate commercial license is available.
Please contact deciduusleaf@gmail.com for inquiries regarding commercial licensing options.
By using, modifying, or distributing this software, you agree to be bound by the terms of either the AGPLv3 or a separately negotiated commercial license.
mcp-name: io.github.deciduus/calendar-mcp
Available Tools
23 toolsadd_attendeeAdd attendeesAIdempotent
Invite one or more people to an existing event.
Existing attendees are kept; the new addresses are appended.
Args:
event_id: The event to invite people to (from find_events).
attendee_emails: Email addresses to invite.
calendar_id: Calendar the event lives on.
send_notifications: Whether Google emails the attendees. Default true.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| event_id | Yes | ||
| calendar_id | No | primary | |
| attendee_emails | Yes | ||
| send_notifications | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral detail beyond the annotations: "Existing attendees are kept; the new addresses are appended." It also explains the meaning of send_notifications. While annotations already indicate idempotency and non-destructiveness, the append behavior is useful extra context that helps an agent predict side effects.
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?
The description is compact, front-loaded with the core purpose, and then structured as a clean Args list. Each line adds value: behavioral semantics, parameter meanings, defaults, and source hints. There is no filler or repetition.
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 the tool's moderate complexity (5 params, 2 required) and the availability of an output schema, the description is complete. It covers the operation, side-effect behavior, parameter sourcing, default behavior for notifications, and account selection. No critical information needed to invoke the tool 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 0%, but the description compensates by explaining all five parameters: event_id, attendee_emails, calendar_id, send_notifications, and account. It adds practical guidance such as where to obtain event_id and when to omit account. This fully covers the gap left by 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?
The description opens with a specific verb-resource pair: "Invite one or more people to an existing event." This clearly distinguishes it from event creation, movement, deletion, and response tools among the siblings. The title and description align, and the scope is immediately recognizable.
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 clearly states this tool is for adding attendees to an existing event, which implies a use case distinct from create_event or quick_add_event. It also gives practical guidance like using event_id from find_events and omitting account for the default. However, it does not explicitly name alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_busynessAnalyze calendar loadARead-onlyIdempotent
Summarise how loaded each day is: event count and total scheduled minutes.
Use this to answer "how busy is my week" without listing every event.
Args: time_min: Start of the window, ISO 8601. time_max: End of the window, ISO 8601. calendar_id: Calendar to analyse. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_id | No | primary |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | Per-day totals, in date order. |
| time_max | Yes | End of the analysed window, ISO 8601. |
| time_min | Yes | Start of the analysed window, ISO 8601. |
| calendar_id | Yes | Calendar that was analysed. |
| total_events | No | Sum of event_count across all days. |
| total_duration_minutes | No | Sum of total_duration_minutes across all days. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and openWorldHint=true, covering the safety profile. The description adds value beyond that by disclosing the aggregation behavior (grouping by day, counting events, summing minutes). No contradiction with annotations.
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?
The description is compact and well-ordered: purpose sentence, usage sentence, then parameter list. No redundant filler, though the parameter block is somewhat verbose for what the schema already encodes.
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 an output schema present, return-value explanation is unnecessary. The description covers purpose, use case, and all parameters, and the annotations carry the safety profile. Slightly more detail on aggregation granularity could help, but nothing essential 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 0%, so the description fully compensates by documenting all four parameters (time_min, time_max, calendar_id, account) in the Args section, including the note that account defaults to the default and references the 'calendar-mcp accounts' command for discovery.
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 states a specific verb and resource ('Summarise how loaded each day is') with concrete output details (event count, total scheduled minutes). It also differentiates from siblings by noting it answers the busyness question 'without listing every event', which distinguishes it from find_events.
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 a clear trigger condition: 'Use this to answer "how busy is my week" without listing every event.' This communicates the intended use case well, though it stops short of naming explicit alternatives or stating when NOT to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
block_focus_timeBook focus timeA
Book the best free blocks in a window as focus time, until the hours add up.
Takes the blocks find_focus_time would report, longest first, and creates
an event on each until hours_needed is covered. The last block is trimmed
to what is still needed rather than swallowing a whole afternoon. Events are
created busy, with reminders off and without notifying anyone.
Run it with dry_run first when the user has not yet agreed to the times.
Args:
time_min: Start of the window to book inside, ISO 8601.
time_max: End of the window, ISO 8601.
hours_needed: How many focus hours to book.
title: Title for the blocks. Default 'Focus time'.
calendar_id: Calendar to book on. Omit for the user's configured
focus_calendar_id (see get_preferences).
check_calendar_ids: Calendars whose events count as busy. Omit for every
calendar the account has selected.
description: Optional note to put in each block.
dry_run: True to report the blocks that would be booked without writing
anything to the calendar.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Focus time | |
| account | No | ||
| dry_run | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_id | No | ||
| description | No | ||
| hours_needed | Yes | ||
| check_calendar_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of blocks. |
| events | No | The blocks, earliest first. |
| dry_run | No | True when nothing was written to the calendar. |
| message | No | One-line human-readable summary. |
| time_max | Yes | End of the searched window, ISO 8601. |
| time_min | Yes | Start of the searched window, ISO 8601. |
| timezone | Yes | Timezone the blocks are expressed in. |
| satisfied | No | True when hours_booked covers hours_needed. |
| calendar_id | Yes | Calendar the blocks were booked on. |
| hours_booked | No | Focus hours actually covered by these blocks. |
| hours_needed | No | Focus hours the caller asked for. |
| total_free_hours | No | Focus hours that were available in the window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, so the mutation behavior is somewhat disclosed. The description adds valuable detail: events are created busy, reminders off, no notifications, last block is trimmed to avoid over-booking, and dry_run avoids writing. This is meaningful behavioral context beyond annotations.
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?
The description is compact and front-loaded: the main behavior is stated in the first sentence, then algorithms, then side effects, then usage instruction, then parameter explanations. Every sentence adds information and there is no 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?
Given 9 parameters, no schema-level descriptions, and an output schema, the description covers the core behavior and parameter semantics well. It doesn't describe the return value structure, but an output schema exists. It also leaves some details unstated, e.g., exact event timing or default calendar resolution, but references `get_preferences` for that. This is sufficient for an agent to select and invoke the tool correctly.
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 0%, so the description must compensate. It explains behaviorally what `time_min`, `time_max`, `hours_needed` mean, the meaning of `dry_run`, the effect of `calendar_id` omission, and `check_calendar_ids` as busy-blockers. It doesn't give exact format examples for ISO 8601 (though the schema type is string), but it adds enough meaning for most parameters.
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 states a specific verb+resource: it books focus time by turning the best free blocks into calendar events. It also names the sibling tool `find_focus_time` as the source of the blocks, which differentiates it from other calendar creation tools like `create_event` or `quick_add_event`. The behavior is concretely described (longest first, trimming last block).
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 explicitly tells the agent to run it with `dry_run` first when the user has not yet agreed to the times, and explains the relationship to `find_focus_time`. It also clarifies calendar defaults via `get_preferences` and account defaults via 'calendar-mcp accounts'. This gives clear when-to-use guidance and names related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_attendee_statusCheck attendee RSVPsARead-onlyIdempotent
Report who has accepted, declined or not yet answered an event invitation.
Args:
event_id: The event to inspect (from find_events).
calendar_id: Calendar the event lives on.
attendee_emails: Restrict the report to these addresses. Omit for all.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| event_id | Yes | ||
| calendar_id | No | primary | |
| attendee_emails | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of attendees reported. |
| event_id | Yes | Event that was checked. |
| attendees | No | Attendees and their current RSVP state. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, and idempotentHint, which cover the primary behavioral traits. The description adds no additional context about side effects or edge cases (e.g., what happens if the event is not found). Given the annotations, the bar is lower, so a baseline score of 3 is appropriate since no extra credit is earned.
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?
The description is concise and well-structured. It leads with the main purpose in a single sentence, followed by a clear list of arguments. There is no unnecessary information, and the format is easy to parse.
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?
The tool description, combined with the presence of an output schema, covers the essential aspects: purpose, parameters, and expected output. Minor details like error handling or output format are not explicitly stated, but these are likely covered by the output schema. Overall, it is sufficiently complete for an agent to invoke the tool correctly.
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?
The description provides meaningful explanations for all four parameters directly in the Args section. Each parameter (event_id, calendar_id, attendee_emails, account) is described with its purpose and source, which compensates for the schema's complete lack of descriptions. This fully clarifies the parameters' roles.
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 clearly states the function: reporting attendee statuses (accepted, declined, not yet answered). It is specific about the resource (event invitation) and the action (report). However, it does not explicitly differentiate from sibling tools like 'respond_to_event' or 'add_attendee', though the purpose 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 provides no explicit guidance on when to use this tool versus alternatives. It does not mention scenarios such as 'use when you need to check RSVP status' or 'do not use for modifying attendee responses'. The purpose implies a read-only use case, but the lack of explicit when-to-use instructions limits its usefulness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_calendarCreate a calendarA
Create a new secondary calendar owned by the user.
Args: summary: Name for the new calendar, e.g. 'Client work'. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| summary | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Calendar ID. Pass this as calendar_id to other tools. |
| primary | No | True for the user's main calendar (also addressable as 'primary'). |
| summary | No | Calendar name. |
| time_zone | No | IANA timezone of the calendar, e.g. 'Europe/Berlin'. |
| access_role | No | The user's role: 'owner', 'writer', 'reader', 'freeBusyReader'. |
| description | No | Calendar description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with annotations: readOnlyHint=false matches the 'Create' action. It adds modest context beyond annotations by specifying the calendar is 'secondary' and 'owned by the user,' but it does not disclose side effects, duplicate-name behavior, or permission requirements. With annotations already covering the read-only/destructive profile, this is adequate but not rich.
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?
The description is tight: one front-loaded purpose sentence plus a compact Args section with examples. Every sentence earns its place, and the docstring-style format is scannable. Slight deduction for the cryptic 'calendar-mcp accounts' reference, which assumes prior knowledge of another command.
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 low-complexity 2-parameter create tool with an output schema and annotations present, the description is largely complete: purpose, both parameter semantics, and default behavior are covered. The main gap is the absence of usage-routing guidance relative to siblings, but this is minor given how simple and well-typed the operation is.
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 0%, so the description carries the full burden, and it delivers: summary is given a concrete example ('Client work') and account is explained by source ('calendar-mcp accounts') plus default behavior. Both parameters receive meaning the raw schema lacks, making this a strong compensation for the coverage gap.
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 states a specific verb (create), resource (secondary calendar), and ownership (owned by the user), which is meaningfully more specific than the title. It implicitly differentiates from siblings like create_event by targeting a calendar resource rather than an event, though it never names a sibling explicitly.
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 context is implied via 'secondary calendar' — signaling this is not for the user's primary calendar — but there is no explicit when-to-use/when-not-to-use guidance and no mention of alternatives among the 21 siblings. The account parameter does add operational guidance ('Account name from calendar-mcp accounts; omit for the default').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_eventCreate an eventA
Create an event with explicit start and end times, and optional attendees.
For a one-line natural-language description ("coffee with Sam tomorrow at 3")
prefer quick_add_event.
Args: calendar_id: Calendar to create the event on. summary: Event title. Required. start_time: Start, ISO 8601 with a UTC offset (e.g. '2026-03-14T15:00:00-04:00'). Without an offset it is read in the calendar's own timezone. end_time: End, ISO 8601, same convention as start_time. description: Longer notes for the event body. location: Free-text location or meeting link. attendee_emails: People to invite. They receive an invitation email unless send_notifications is false. send_notifications: Whether Google emails the attendees. Default true. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| summary | No | ||
| end_time | No | ||
| location | No | ||
| start_time | No | ||
| calendar_id | No | primary | |
| description | No | ||
| attendee_emails | No | ||
| send_notifications | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses timezone interpretation ('Without an offset it is read in the calendar's own timezone'), side-effect emailing ('They receive an invitation email unless send_notifications is false'), and account selection. No contradiction with readOnlyHint=false or destructiveHint=false.
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 core purpose and sibling routing, followed by a tidy Args block where every line adds non-obvious detail. No filler or repetition of schema-only 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 9-parameter creation tool with no schema descriptions, it covers all parameters, timezone semantics, notification side effects, and account resolution; an output schema exists to describe return values. The description is fully capable of guiding correct invocation.
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 0%, so the description carries the full burden and succeeds: every one of the 9 parameters is explained with real meaning, a required marker on summary, ISO format guidance, and defaults for send_notifications/account. It adds value the bare schema cannot.
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 opens with 'Create an event with explicit start and end times, and optional attendees' — a specific verb, resource, and key behavior. It also names quick_add_event as the alternative for natural-language one-liners, so an agent can distinguish the two creation paths.
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?
Explicitly states when to prefer quick_add_event ('For a one-line natural-language description... prefer quick_add_event') and implies this tool is for structured, explicit-time creation. This is direct routing guidance rather than leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_eventDelete an eventADestructiveIdempotent
Permanently delete an event. This cannot be undone.
Clients that support elicitation are asked to confirm first; if the user
declines, nothing is deleted and deleted comes back false.
Args:
event_id: The event to delete (from find_events).
calendar_id: Calendar the event lives on.
send_notifications: Whether Google emails the attendees that it was
cancelled. Default true.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| event_id | Yes | ||
| calendar_id | No | primary | |
| send_notifications | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | True when the event was removed. |
| message | No | One-line human-readable summary of what happened. |
| event_id | Yes | ID of the deleted event. |
| calendar_id | Yes | Calendar the event was on. |
| confirmed_by_user | No | True/False when the client answered a confirmation prompt; null when the client does not support elicitation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint), the description discloses irreversible deletion, confirmation elicitation behavior, and the 'deleted' false outcome when declined. This gives the agent important behavioral expectations not present in the structured metadata.
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?
The description is tightly written: the irreversible-destruction warning is front-loaded, the elicitation caveat is a single sentence, and the parameter list is scannable. Every sentence adds 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 the annotations, output schema, and sibling list, the description covers purpose, side effects, confirmation behavior, notification defaults, and account selection. No critical information for calling this tool 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 0%, but the Args section documents all four parameters with meaning: event_id originates from find_events, calendar_id defaults to primary, send_notifications controls attendee emails and defaults true, and account is sourced from calendar-mcp accounts. This compensates fully for the schema gap.
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 opens with a specific verb and resource: 'Permanently delete an event.' It clearly distinguishes this from siblings like update_event and move_event, and the permanence warning adds specificity beyond the title.
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 intended context is clear: use this when an event should be permanently removed, with calendar_id and account specifying target. It does not explicitly name alternatives or exclusion conditions, but the resource scope is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_conflictsDetect calendar conflictsARead-onlyIdempotent
Find double-booked events in a window, across every signed-in account.
Reports two things. conflicts are genuine overlaps -- the user cannot be
in both places. tight transitions do not overlap but leave less than the
buffer from get_preferences, which is what makes a day feel impossible.
Events the user declined, events marked free, cancelled events and (unless
include_all_day is set) all-day events are ignored, because none of them
actually occupy the user.
Args: time_min: Start of the window to check, ISO 8601. time_max: End of the window to check, ISO 8601. accounts: Account names to check. Omit for every signed-in account, which is the point of the tool -- a work meeting clashing with a personal one is invisible from either calendar alone. calendar_ids: Restrict to these calendars (in every account checked). Omit for each account's selected calendars. include_all_day: True to let all-day events clash with timed ones. max_events_per_calendar: Safety limit per calendar. Default 250.
| Name | Required | Description | Default |
|---|---|---|---|
| accounts | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_ids | No | ||
| include_all_day | No | ||
| max_events_per_calendar | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| tight | No | Back-to-back pairs that violate the buffer, earliest first. |
| message | No | One-line human-readable summary. |
| skipped | No | Calendars or accounts that could not be read in full, with the reason. |
| accounts | No | Accounts that were read. |
| time_max | Yes | End of the checked window, ISO 8601. |
| time_min | Yes | Start of the checked window, ISO 8601. |
| timezone | Yes | Timezone the times are expressed in. |
| conflicts | No | Overlapping pairs, earliest first. |
| event_count | No | Events considered after filtering. |
| tight_count | No | Number of too-tight transitions. |
| calendar_ids | No | Calendars that were read, as 'account:calendar_id'. |
| buffer_minutes | No | Buffer the tight transitions were judged against. |
| conflict_count | No | Number of overlapping pairs. |
| include_all_day | No | Whether all-day events were considered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only and idempotent behavior. Description adds further behavioral detail by explaining which event types are excluded and the cross-account nature. No contradictions.
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?
Well-structured with clear sections, but slightly repetitive (the 'which is the point of the tool' phrase appears twice) and some redundancy in parameter explanations. Overall clear and not overly verbose.
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?
Covers input parameters and behavior thoroughly, but does not describe the output format beyond 'reports two things'. Since no output schema is provided, an agent may need more details on how conflicts and tight events are returned.
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 has zero parameter descriptions, but the Args section in the description provides meaningful explanations for every parameter, including defaults and the purpose of accounts/calendar_ids filtering.
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 ('find') and resource ('double-booked events') with scope ('across every signed-in account'). Clearly differentiates from generic search tools like find_events.
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?
Explains the tool's role and what it reports (conflicts vs. tight), and what events are ignored. Does not explicitly state when to prefer it over alternatives like query_free_busy, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_eventsFind eventsARead-onlyIdempotent
Search a calendar for events, expanding recurring series into instances.
Use this before any tool that needs an event_id. Narrow the window with
time_min/time_max rather than raising max_results.
Args: calendar_id: Calendar to search. 'primary' is the user's own calendar. time_min: Inclusive start of the window, ISO 8601 with a UTC offset. Without an offset it is read in the calendar's own timezone. time_max: Exclusive end of the window, ISO 8601. query: Free-text search over title, description, location and attendees. max_results: Maximum events to return (default 50). account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| account | No | ||
| time_max | No | ||
| time_min | No | ||
| calendar_id | No | primary | |
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of events returned. |
| events | No | The matching events, earliest first. |
| time_zone | No | IANA timezone of the calendar that was searched. |
| calendar_id | Yes | Calendar that was searched. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and openWorld warnings, and the description adds substantial behavior beyond these: recurrence expansion, inclusive/exclusive window semantics, timezone fallback behavior, and query scope over title, description, location, and attendees. This gives the agent accurate expectations about how results are produced without contradicting the annotations.
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?
The description is front-loaded with purpose and usage guidance, followed by a compact Args block. Every sentence contributes necessary information; there is no fluff or repetition of schema defaults in ways that waste tokens. The timezone note and inclusive/exclusive distinctions are high-value details.
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 the tool's moderate complexity — six optional parameters, recurrence expansion, timezone semantics — the description covers everything needed to call it correctly: calendar selection, query fields, narrowing strategy, and account handling. Since an output schema exists, omitting return-value details is acceptable, and no critical behavioral gap remains.
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 0%, so the description carries the full burden, and it delivers: each of the six parameters is explained with meaningful details such as 'primary' meaning the user's calendar, time_min inclusivity with ISO 8601 and timezone handling, time_max exclusivity, query fields searched, max_results default, and account selection. This fully compensates for the bare 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?
The first sentence states a specific verb ('Search'), a clear resource ('a calendar for events'), and a distinctive behavior ('expanding recurring series into instances'). The 'Use this before any tool that needs an event_id' line further anchors its role as the lookup tool among many event-related siblings.
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 explicitly says when to use this tool ('before any tool that needs an event_id') and gives a concrete usage tip ('Narrow the window with time_min/time_max rather than raising max_results'). It does not name specific sibling alternatives or state explicit 'do not use when...' conditions, but the primary selection context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_focus_timeFind focus timeARead-onlyIdempotent
Find the uninterrupted blocks in a window that could be used for deep work.
Searches inside the user's working hours (get_preferences), removes lunch,
everything already booked on their calendars, and the buffer they like
around meetings, then reports what is left -- longest block first, because
that is the one worth protecting. Blocks shorter than
min_focus_block_minutes are not reported at all.
Read-only: use block_focus_time to actually defend the time.
Args: time_min: Start of the window to search, ISO 8601. Without a UTC offset it is read in the calendar's own timezone. time_max: End of the window to search, ISO 8601. hours_needed: How many focus hours the user is trying to find. Used to report whether the window can supply them; pass 0 to just look. calendar_ids: Calendars whose events count as busy. Omit for every calendar the account has selected. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_ids | No | ||
| hours_needed | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of blocks returned. |
| blocks | No | Usable blocks, longest first, then earliest. |
| message | No | One-line human-readable summary. |
| time_max | Yes | End of the searched window, ISO 8601. |
| time_min | Yes | Start of the searched window, ISO 8601. |
| timezone | Yes | Timezone the blocks are expressed in. |
| satisfiable | No | True when total_free_hours covers hours_needed. |
| calendar_ids | No | Calendars whose busy time was subtracted. |
| hours_needed | No | Focus hours the caller asked for. |
| buffer_minutes | No | Gap left around each meeting, from preferences.buffer_minutes. |
| total_free_hours | No | Total focus hours available in the window. |
| min_block_minutes | No | Shortest stretch counted, from preferences.min_focus_block_minutes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description explicitly states 'Read-only' and explains the algorithm (working hours, lunch, existing items, buffer, longest block first). This adds detail beyond the annotations. However, the reference to `min_focus_block_minutes` (a non-existent parameter) creates a minor inconsistency in the behavioral description, preventing a perfect score.
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?
The description is well-structured with an introductory sentence, a detailed explanation, a read-only note, and a clean 'Args' section. It is not overly verbose, but the inclusion of the `min_focus_block_minutes` parameter (which is not part of the schema) introduces an unnecessary and confusing element that could have been omitted.
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?
The description provides context about the tool's behavior (longest block first, minimum block length) and the intended use case (finding deep work time). Since an output schema is available, it does not need to fully detail the return structure. The description is mostly complete, but the missing output format details and the `min_focus_block_minutes` inconsistency keep it from being fully comprehensive.
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?
The 'Args' section in the description provides clear, specific explanations for all five parameters: `time_min`, `time_max`, `hours_needed`, `calendar_ids`, and `account`. This goes well beyond the bare schema (which has no descriptions) and fully clarifies the meaning and expected format of each parameter.
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 clearly states the tool's purpose: it finds uninterrupted time blocks for deep work within a given window, considering working hours, lunch, existing events, and buffer. It also explicitly distinguishes itself as a read-only analysis tool, directing users to `block_focus_time` for actually blocking time. This makes the purpose specific and 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 some usage guidance by noting that it is read-only and that `block_focus_time` is the appropriate tool for actually defending time. However, it does not explicitly compare against other similar tools like `find_events` or `query_free_busy`, nor does it state when to prefer this tool over those. The mention of `min_focus_block_minutes` (which is not a parameter in the schema) adds slight confusion but does not significantly impair usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_preferencesGet scheduling preferencesARead-onlyIdempotent
Read the user's scheduling preferences: working hours, lunch, buffers, focus.
Consult this before proposing meeting times or hunting for focus blocks, rather than assuming a nine-to-five. Never configured returns the defaults (Mon-Fri 09:00-17:00, no lunch break, no buffer), which is a reasonable guess but worth confirming with the user before you rely on it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| lunch | No | Daily lunch break as ['HH:MM', 'HH:MM'], carved out of the working hours. Omit for no lunch break. |
| timezone | No | IANA timezone the working hours are expressed in, e.g. 'Europe/Berlin'. Omit to use the calendar's own timezone. |
| working_hours | No | Per-weekday working spans, keyed 'mon'..'sun', each a list of ['HH:MM', 'HH:MM'] pairs. An empty list means the day is off. |
| buffer_minutes | No | Minimum gap to leave before and after each meeting when scheduling. |
| focus_calendar_id | No | Calendar that focus blocks are booked on. |
| min_focus_block_minutes | No | Shortest free stretch that still counts as usable focus time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=true, idempotentHint=true), the description discloses an important behavioral trait: if never configured, it returns defaults (Mon-Fri 09:00-17:00, no lunch, no buffer) and notes these are only a guess that should be confirmed with the user. This adds significant context an agent needs to interpret results correctly.
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?
The description is compact and well structured: it leads with the operation and resource, then gives when-to-use guidance, then explains the default-value behavior. Every sentence contributes useful, non-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?
For a parameterless, read-only tool with an output schema and readOnly/idempotent annotations, the description is complete. It tells the agent why and when to call it, what data to expect, and how to handle the unconfigured default case. No critical guidance 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?
The tool has zero parameters, so there is no parameter meaning to add. The description still helps by listing the data fields returned (working hours, lunch, buffers, focus), giving the agent a clear sense of what it will receive despite the empty 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?
The description uses a specific verb ('Read') and a clear resource ('the user's scheduling preferences'), and enumerates the exact fields returned: working hours, lunch, buffers, and focus. This naturally differentiates it from sibling tools like set_preferences, which writes rather than reads.
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 explicit guidance on when to use the tool: 'Consult this before proposing meeting times or hunting for focus blocks, rather than assuming a nine-to-five.' It does not explicitly name alternatives or when not to use it, but the usage context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accountsList signed-in accountsARead-onlyIdempotent
List the Google accounts calendar-mcp can use, and which is the default.
Every other tool takes an optional account argument naming one of these.
An account whose valid is false needs calendar-mcp auth --account <name>
run once in a terminal before its calendars can be read.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of known accounts. |
| accounts | No | Known accounts, the default one first. |
| config_dir | Yes | Directory holding the account tokens and preferences. |
| default_account | Yes | Account used when 'account' is omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, lowering the burden. The description adds useful behavioral context beyond that: it reveals the existence of a `valid` flag and the auth workflow required for invalid accounts. It also clarifies the default-account concept. No contradictions or misleading statements.
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?
The description is compact, front-loaded with the main purpose, and uses three short sentences to cover purpose, cross-tool relevance, and the auth caveat. Every sentence adds necessary information without redundancy or 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?
Given the output schema exists and the annotations cover safety and idempotency, the description supplies the missing cross-tool context and validity/auth semantics. Nothing required to call or interpret the tool correctly is missing, making it complete for this straightforward list operation.
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?
The tool has zero parameters, so the schema already fully covers the input contract. Per the 0-param baseline of 4, no additional parameter documentation is needed, and the description appropriately focuses on output-related context instead.
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 ('List') and a specific resource ('the Google accounts calendar-mcp can use') plus the additional distinction of which is default. This clearly separates it from the event/calendar-oriented sibling tools, none of which deal with account enumeration.
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 statement that every other tool takes an optional `account` argument naming one of these makes the practical use case clear: run this to discover valid account names for subsequent tool calls. It does not explicitly say 'use when you need the default account' or exclude alternatives, but the context is strong and there is no sibling tool serving the same function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_calendarsList calendarsARead-onlyIdempotent
List the calendars the signed-in user can see, with their IDs and timezones.
Start here whenever the user mentions a calendar other than their own: the
id values returned are what every other tool's calendar_id expects.
Args: min_access_role: Only return calendars where the user has at least this role: 'freeBusyReader', 'reader', 'writer' or 'owner'. Omit for all. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| min_access_role | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of calendars returned. |
| calendars | No | The user's calendars. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declaratively cover read-only and idempotence, so the description does not need to restate those. It adds useful scoping behavior ('user can see', role-based filtering) beyond the schema, but does not discuss additional behavioral concerns like auth or rate limits; this matches the lower bar for annotation-covered tools.
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?
The description is compact, front-loaded with the primary purpose, and the parameter list is structured and free of fluff. Each sentence contributes meaningful content, though the text is slightly verbose with two separate ID-related mentions.
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 two optional-parameter list for which the description covers purpose, parameter defaults, allowed values, and usage conditions, with an output schema available. No information needed to correctly invoke the tool for the common discovery workflow 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?
With 0% schema coverage, the description fully compensates: it explains each parameter's meaning, gives allowed roles for 'min_access_role', describes the 'at least' semantics, and tells how to obtain or omit 'account'. This is enough to call the tool correctly in every scenario.
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?
First sentence uses a specific verb and resource: 'List the calendars the signed-in user can see,' and it specifies key output fields ('IDs and timezones'). The 'Start here...' guidance ties it to other tools and distinguishes it from sibling operations.
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 'Start here whenever the user mentions a calendar other than their own' provides an explicit when-to-use condition, and the note that returned IDs feed other tools' calendar_id helps coordination. It does not explicitly list when-not-to-use conditions or alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_eventMove or reschedule an eventAIdempotent
Reschedule an event, and/or move it to a different calendar.
Supplying only new_start keeps the event's original duration -- this is the
right tool for "push my 2pm back an hour". Supplying
destination_calendar_id transfers the event between calendars.
Args:
event_id: The event to move (from find_events).
calendar_id: Calendar the event currently lives on.
new_start: New start, ISO 8601. Duration is preserved if new_end is omitted.
new_end: New end, ISO 8601. Optional when new_start is given.
destination_calendar_id: Calendar to transfer the event to.
send_notifications: Whether Google emails the attendees. Default true.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| new_end | No | ||
| event_id | Yes | ||
| new_start | No | ||
| calendar_id | No | primary | |
| send_notifications | No | ||
| destination_calendar_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description adds meaningful behavioral detail: duration is preserved when new_end is omitted, send_notifications controls attendee emails with default true, and account selection is contextual. It doesn't discuss side effects like whether the original event is removed, but it doesn't contradict the annotations.
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?
The description is well structured and front-loaded: the core purpose comes first, then a compact behavioral example, then a tight Args list. Every sentence earns its place without redundant 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?
Given the 7-parameter complexity, existing output schema, and annotations, the description is complete enough for an agent to select and invoke the tool correctly. It covers all parameters, key behavior, default notification behavior, and the account selection mechanism.
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?
With 0% schema description coverage, the description fully compensates by explaining all seven parameters in plain terms, including the 'duration is preserved' nuance and the meaning of destination_calendar_id. This is far more useful than the raw schema titles alone.
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 clearly states a specific action ('Reschedule an event, and/or move it to a different calendar') tied to a concrete resource. The 'right tool for push my 2pm back an hour' example makes the tool's distinct role easy to grasp relative to broader calendar mutation tools.
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?
It gives explicit usage conditions: supplying only new_start preserves duration, and supplying destination_calendar_id transfers calendars. It also tells users where event_id should come from (find_events). However, it never explicitly names alternatives like update_event or states when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_recurring_eventsProject recurring eventsARead-onlyIdempotent
Compute future occurrences of recurring events from their recurrence rules.
Unlike find_events, this expands the RRULEs locally, so it reaches past the
horizon Google materialises instances for -- useful for "when do my birthdays
/ standups land next year".
Args: time_min: Start of the projection window, ISO 8601. time_max: End of the projection window, ISO 8601. calendar_id: Calendar whose recurring events should be projected. event_query: Only project recurring events matching this text, e.g. 'Birthday'. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_id | No | primary | |
| event_query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of projected occurrences. |
| time_max | Yes | End of the projection window, ISO 8601. |
| time_min | Yes | Start of the projection window, ISO 8601. |
| calendar_id | Yes | Calendar that was projected. |
| occurrences | No | Computed occurrences, earliest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the base safety profile is covered. The description adds valuable behavioral context beyond annotations: it expands RRULEs locally rather than relying on Google-materialized instances, which explains a non-obvious implementation trait that affects results and performance. No contradiction with annotations.
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?
The description is tight and well-organized: a one-sentence purpose, a differentiating note with a use case, then a clean Args list. No filler or repetition of schema defaults; every sentence adds information needed for correct invocation.
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 five parameters, zero schema descriptions, and an output schema present, the description provides everything an agent needs: purpose, usage guidance, behavioral expectations, and complete parameter semantics. It does not need to describe return values because the output schema exists. Nothing critical 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 0%, so the description carries the full burden of parameter explanation. It does so thoroughly: time_min and time_max are defined as the projection window with ISO 8601 format, calendar_id is the calendar to project, event_query is explained with an example, and account references where to obtain account names and notes the default. This far exceeds the bare 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?
The description opens with a specific, action-oriented statement: 'Compute future occurrences of recurring events from their recurrence rules.' It clearly identifies the resource (recurring events) and the operation (compute future occurrences), and it explicitly contrasts itself with the sibling find_events, making differentiation immediate.
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 explicitly names the alternative tool find_events and explains the precise condition for choosing this tool: it expands RRULEs locally and reaches past the horizon Google materializes instances for. It also gives a concrete use case ('when do my birthdays / standups land next year'), so an agent knows exactly when to invoke this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_free_busyQuery free/busyARead-onlyIdempotent
Get busy intervals for one or more calendars, without revealing event details.
Works for other people's calendars addressed by email, which is how you check whether someone is free before proposing a time.
Args: calendar_ids: Calendar IDs or attendee email addresses to check. time_min: Start of the window, ISO 8601 with a UTC offset. time_max: End of the window, ISO 8601 with a UTC offset. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| time_max | Yes | End of the queried window, ISO 8601. |
| time_min | Yes | Start of the queried window, ISO 8601. |
| calendars | No | Per-calendar busy intervals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Aligned with readOnlyHint and idempotentHint by describing a read-only retrieval, and adds that it omits event details. No contradiction with annotations.
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 concise sentences plus an args list, with no redundant wording or unnecessary detail.
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?
Covers the essential aspects given the annotations and output schema; could mention ordering constraints for time_min/time_max, but this is not critical for invocation.
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?
The description clarifies calendar_ids accepts email addresses and specifies ISO 8601 with UTC offset for time bounds. Response format is not described, but the output schema covers that.
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 the specific verb 'Get' and the resource 'busy intervals for one or more calendars,' and explicitly notes it does not reveal event details, distinguishing it from event-fetching sibling tools.
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 a clear use case ('check whether someone is free before proposing a time') and notes that it works with email addresses, but does not explicitly contrast with alternatives like find_events or find_focus_time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quick_add_eventQuick-add an eventA
Create an event from a plain-English phrase, parsed by Google.
Google interprets the date, time and title itself, in the calendar's own timezone. Check the returned start/end and tell the user what was booked -- the parser guesses, and does not handle attendees or descriptions.
Args: text: The phrase to parse, e.g. 'Dentist Thursday 9am' or 'Team sync every Monday at 10 for 30 minutes'. calendar_id: Calendar to create the event on. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| account | No | ||
| calendar_id | No | primary |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only false and open-world true; the description adds meaningful behavioral context: Google performs the parsing, the calendar's own timezone is used, the parser guesses and may be wrong, attendees/descriptions are unsupported, and the agent should verify the returned start/end. No contradiction with annotations.
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 blocks with no fluff: the core purpose is front-loaded, behavioral caveats follow, and the Args section is clean. 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?
The tool is simple (3 params, 1 required), and the description covers all parameters, timezone behavior, parser limitations, and the need to verify the returned time. With an output schema present, the description is complete enough for an agent to call and interpret this tool correctly.
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 0%, so the description carries the full parameter burden. It explains text with concrete examples, calendar_id as the target calendar, and account as a named account from 'calendar-mcp accounts' with an omit-for-default instruction. This adds real meaning beyond the bare 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?
The first sentence states a specific verb ('Create'), a resource ('an event'), and the distinctive mechanism ('parsed by Google'). It also differentiates from sibling create_event by noting that attendees and descriptions are not handled, so an agent can tell them apart 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?
The description makes the intended use case explicit: turning plain-English phrases into events, with the caveat that the parser guesses and does not support attendees or descriptions. It also gives account-selection guidance via 'calendar-mcp accounts', though it does not explicitly name the structured alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
respond_to_eventRSVP to an eventAIdempotent
Set the user's own RSVP on an invitation they have received.
Only works on events the user is an attendee of; it does not change anyone else's response.
Args:
event_id: The invitation to answer (from find_events).
response_status: 'accepted', 'declined', 'tentative' or 'needsAction'.
calendar_id: Calendar the invitation lives on.
comment: Optional note sent to the organizer with the RSVP.
send_notifications: Whether Google emails the organizer. Default true.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| comment | No | ||
| event_id | Yes | ||
| calendar_id | No | primary | |
| response_status | Yes | ||
| send_notifications | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover idempotency and non-destructiveness, and the description adds meaningful behavioral context: the RSVP is scoped to the user, the comment is sent to the organizer, and send_notifications controls whether Google emails the organizer. It effectively discloses side effects without contradicting the annotations.
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?
The description is compact and front-loaded: it opens with the core action and scope, then provides a tight Args list covering every parameter. No sentence is wasted, and the layout is easy for an agent to parse.
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 tool with 6 parameters, no schema descriptions, and 2 required parameters, the description is complete. It covers all parameters, defaults, constraints, and behavioral boundaries; the output schema handles return values, so nothing critical 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 0%, so the description carries the full burden and does so excellently. It explains each parameter's meaning, gives the allowed values for response_status, notes defaults, and even points to provenance for event_id and account.
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 states a specific verb ('Set') and a precise resource ('the user's own RSVP on an invitation'), making the action unambiguous. It explicitly scopes behavior to the user's own response and distinguishes itself from any sibling that might modify others' responses.
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 clearly states when the tool is applicable: only on events the user is an attendee of. It also tells the agent what it does not do ('does not change anyone else's response'), which implies when not to use it, though it does not name a specific sibling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_mutualFind a mutual slot and scheduleA
Find the first slot where everyone is free, then book the meeting there.
Reads each attendee's free/busy inside the window, picks the earliest gap
that fits duration_minutes, and creates the event with all of them invited.
Fails with an error if no common slot exists -- widen the window or shorten
the meeting and try again.
By default the search obeys the user's own settings from get_preferences:
their working hours per weekday (so nothing lands on a day off), their lunch
break, and the buffer they want around meetings. working_hours_start and
working_hours_end narrow that further; they never widen it.
Args: attendee_calendar_ids: Attendee email addresses whose availability matters. time_min: Earliest the meeting may start, ISO 8601 with a UTC offset. time_max: Latest the meeting may end, ISO 8601 with a UTC offset. duration_minutes: Length of the meeting in minutes. summary: Title for the meeting. description: Optional agenda or notes. location: Optional location or meeting link. organizer_calendar_id: Calendar the meeting is created on. working_hours_start: Optional daily earliest start, 'HH:MM' local to the calendar, e.g. '09:00'. working_hours_end: Optional daily latest end, 'HH:MM', e.g. '17:00'. send_notifications: Whether Google emails the attendees. Default true. respect_preferences: Obey the user's saved working hours, lunch and buffer. Set false to search the whole window instead. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| summary | Yes | ||
| location | No | ||
| time_max | Yes | ||
| time_min | Yes | ||
| description | No | ||
| duration_minutes | Yes | ||
| working_hours_end | No | ||
| send_notifications | No | ||
| respect_preferences | No | ||
| working_hours_start | No | ||
| attendee_calendar_ids | Yes | ||
| organizer_calendar_id | No | primary |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is a write operation (readOnlyHint=false), but the description adds valuable behavioral detail: it reads free/busy, creates an event inviting everyone, fails when no slot exists, respects saved preferences, and lets working_hours_start/end only narrow the window. This goes well beyond the structured annotations.
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?
The description is front-loaded with a one-sentence summary, then a compact behavioral paragraph, then a structured Args list. Every sentence earns its place, and the length is justified by the number of parameters and the nuanced preference behavior.
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 the tool's complexity (availability search plus booking), the description covers the algorithm, inputs, defaults, failure mode, and edge-case behavior. An output schema exists, so the lack of return-value detail is acceptable, and nothing critical is missing for an agent to invoke the tool correctly.
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 0%, so the description carries the full burden of explaining all 13 parameters. It does so thoroughly: ISO 8601 format for time bounds, plain-language meaning for each parameter, defaults, units for duration, and subtle semantics like 'narrow that further; they never widen it' and 'Set false to search the whole window instead.'
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 states a specific verb+resource: find a free slot for everyone and book the meeting there. It also clearly explains the algorithm (reads availability, picks earliest gap, creates event) and thereby distinguishes itself from sibling tools like find_focus_time, create_event, and query_free_busy.
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 clear context for when to use the tool: when you need to find a mutual slot and schedule a meeting in one step. It also provides failure guidance and notes preference options, but it does not explicitly name alternatives or state when-not-to-use this tool versus a specific sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_preferencesSet scheduling preferencesAIdempotent
Update the user's scheduling preferences and save them. Returns the merged result.
Only the arguments you pass change; everything else keeps its current value, so a single correction ("I actually start at 8") does not have to restate the whole schedule. The merged result is validated before it is written, so a rejected change leaves the saved preferences untouched.
Args:
timezone: IANA timezone the working hours are expressed in, e.g.
'Europe/Berlin'. Must be a real zone name.
working_hours: Whole-schedule replacement, keyed by weekday
('mon'..'sun'), each value a list of ['HH:MM', 'HH:MM'] pairs. Days
you omit become non-working, so pass every working day at once, e.g.
{"mon": [["09:00", "12:00"], ["13:00", "18:00"]], "fri": [["09:00", "15:00"]]}.
buffer_minutes: Minimum gap to leave before and after each meeting when
proposing times. 0 disables it.
min_focus_block_minutes: Shortest free stretch that still counts as
usable focus time.
lunch: Daily lunch break as ['HH:MM', 'HH:MM'], carved out of the
working hours.
focus_calendar_id: Calendar that focus blocks are booked on; 'primary'
for the user's own.
clear_lunch: Set true to remove an existing lunch break (pass this
instead of lunch when the user says they no longer want one).
| Name | Required | Description | Default |
|---|---|---|---|
| lunch | No | ||
| timezone | No | ||
| clear_lunch | No | ||
| working_hours | No | ||
| buffer_minutes | No | ||
| focus_calendar_id | No | ||
| min_focus_block_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| lunch | No | Daily lunch break as ['HH:MM', 'HH:MM'], carved out of the working hours. Omit for no lunch break. |
| timezone | No | IANA timezone the working hours are expressed in, e.g. 'Europe/Berlin'. Omit to use the calendar's own timezone. |
| working_hours | No | Per-weekday working spans, keyed 'mon'..'sun', each a list of ['HH:MM', 'HH:MM'] pairs. An empty list means the day is off. |
| buffer_minutes | No | Minimum gap to leave before and after each meeting when scheduling. |
| focus_calendar_id | No | Calendar that focus blocks are booked on. |
| min_focus_block_minutes | No | Shortest free stretch that still counts as usable focus time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: only passed arguments change, the merged result is validated before writing, rejected changes leave saved preferences untouched, and the tool returns the merged result. This gives an agent an accurate model of side effects and failure 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?
The description is substantial but every sentence earns its place. It front-loads merged-result and validation behavior before detailing each parameter, and the examples are directly relevant to avoiding common mistakes.
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 7-parameter tool with no required fields and nuanced update semantics, the description is complete. It covers all parameters, partial-update behavior, validation atomicity, and format expectations. Since an output schema exists, the stated return value is a bonus rather than a requirement.
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 0%, so the description must fully document parameters. It does: all seven parameters are explained with meaning, formats, examples, and important caveats such as working_hours being a whole-schedule replacement and clear_lunch being the way to remove a lunch break.
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 states a specific verb and resource: 'Update the user's scheduling preferences and save them.' This clearly distinguishes the tool from event-manipulation siblings and from get_preferences, which reads rather than writes.
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 makes the tool's usage context clear: it is for updating saved scheduling preferences, with partial-update semantics that make single corrections easy. It does not explicitly name alternatives or exclusion criteria, but the resource and sibling set make the right invocation context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_rescheduleSuggest better times for an eventAIdempotent
Propose better times for an existing meeting, ranked, keeping its length.
Reads the event, then looks for slots of the same duration inside the user's working hours where the organiser is free, and ranks them: fewest attendee conflicts first, the event's current day next, then earliest. Slots that sit closer to another meeting than the user's buffer allows are penalised, not hidden.
Read-only by default -- it suggests, the user decides. Set apply to move
the event to the top suggestion once they have agreed to it.
Args:
event_id: The event to reschedule (from find_events).
calendar_id: Calendar the event lives on.
search_days: How many days ahead to search. Default 7, maximum 60.
max_suggestions: How many times to propose. Default 5, maximum 20.
search_from: Start searching from this time, ISO 8601. Defaults to now.
apply: True to actually move the event to the best suggestion. Only set
this when the user has agreed to the time.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| apply | No | ||
| account | No | ||
| event_id | Yes | ||
| calendar_id | No | primary | |
| search_days | No | ||
| search_from | No | ||
| max_suggestions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of suggestions returned. |
| applied | No | True when the event was actually moved. |
| message | No | One-line human-readable summary. |
| summary | No | Event title. |
| event_id | Yes | Event the suggestions are for. |
| timezone | Yes | Timezone the suggestions are expressed in. |
| attendees | No | Attendee calendars whose availability was checked. |
| calendar_id | Yes | Calendar the event lives on. |
| current_end | No | Current end, ISO 8601. |
| suggestions | No | Proposed times, best first. |
| applied_event | No | The event after the move; null unless 'applied' is true. |
| current_start | No | Where the event sits now, ISO 8601. |
| search_time_max | Yes | End of the searched window, ISO 8601. |
| search_time_min | Yes | Start of the searched window, ISO 8601. |
| duration_minutes | No | Length of the event, preserved by every suggestion. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations by disclosing the ranking logic, the buffer penalty behavior, and the conditional side effect: 'Read-only by default' with `apply` performing the actual move. It also distinguishes between suggesting and acting, which is exactly the behavioral nuance an agent needs.
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?
The description is organized into a summary, a behavior explanation, a side-effect warning, and a clear Args block. Every sentence contributes meaningful information without repetition or filler, making it easy for an agent to parse quickly.
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 7-parameter scheduling tool, the description covers algorithm, ranking criteria, working-hours behavior, side-effect conditions, defaults, and parameter semantics. Since an output schema exists, return values do not need to be described. No critical usage context appears to be 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 0%, and the description fully compensates by explaining every parameter's purpose, defaults, and constraints. It even provides cross-tool context like 'from `find_events`' and account sourcing from 'calendar-mcp accounts', which is far more useful than the bare 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?
The first sentence states a specific verb and resource: 'Propose better times for an existing meeting, ranked, keeping its length.' This clearly separates it from tools like move_event, find_focus_time, or update_event. The description also clarifies that it reads and suggests rather than directly mutates, making the tool's role unmistakable.
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 explains when to use the tool: for an existing meeting, searching within working hours, and only applying the change after the user agrees. It does not explicitly name sibling alternatives or state when NOT to use it, but it gives strong contextual guidance and warns about setting `apply`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time_auditAudit where time wentARead-onlyIdempotent
Report where the user's time went: meeting hours, who with, and what focus time is left.
Answers "how much of my week is meetings?", "who am I spending my time with?" and "where did my focus time go?" in one pass. Working hours, lunch, buffer and the minimum focus block come from the saved preferences (see get_preferences), so the percentages reflect this user's actual day.
Declined meetings, events marked 'free', and all-day entries are excluded by default; the 'excluded' field says how many were skipped.
Args: time_min: Start of the window to audit, ISO 8601. time_max: End of the window to audit, ISO 8601. calendar_ids: Calendars to include. Defaults to ['primary']. group_by: Break the window down by 'day' or by ISO 'week'. include_all_day: Count all-day events as meeting time. include_declined: Count meetings the user declined. account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| group_by | No | week | |
| time_max | Yes | ||
| time_min | Yes | ||
| calendar_ids | No | ||
| include_all_day | No | ||
| include_declined | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| by_size | No | Meeting time by headcount: 'solo', '1:1', 'small' (<=4), 'large'. |
| periods | No | Per-day or per-week breakdown, earliest first. |
| excluded | No | What was skipped and why. |
| group_by | No | Period grouping used: 'day' or 'week'. |
| insights | No | Three to five plain-English takeaways. |
| time_max | Yes | Exclusive end of the audited window, ISO 8601. |
| time_min | Yes | Inclusive start of the audited window, ISO 8601. |
| timezone | Yes | Timezone the days, weeks and working hours are expressed in. |
| by_domain | No | Meeting time by attendee email domain. A meeting with two domains counts in both. |
| top_people | No | People the user shared the most meeting hours with, most first. |
| calendar_ids | No | Calendars the events came from. |
| by_recurrence | No | Meeting time split into 'recurring' and 'one-off'. |
| busiest_period | No | The heaviest entry of 'periods'. None when nothing was booked. |
| focus_block_count | No | Number of such blocks. |
| back_to_back_count | No | Runs of three or more meetings with no usable gap. |
| back_to_back_hours | No | Total wall-clock hours those runs cover. |
| longest_meeting_day | No | The single heaviest day, regardless of group_by. None when nothing was booked. |
| total_meeting_count | No | Meetings counted. |
| total_meeting_hours | No | Total meeting hours in the window; overlaps counted twice. |
| largest_focus_blocks | No | The five longest free blocks, longest first. |
| focus_hours_available | No | Unbooked working hours in blocks at least min_focus_block_minutes long. |
| back_to_back_stretches | No | The individual back-to-back runs, earliest first. |
| share_of_working_hours | No | Fraction of the working hours spent in meetings, 0..1. |
| working_hours_available | No | Working hours in the window, lunch removed. |
| meeting_hours_in_working_hours | No | Meeting hours inside the working hours, overlaps merged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and open-world, and the description adds useful behavior beyond that: declined meetings, 'free' events, and all-day entries are excluded by default, with an 'excluded' field reporting skipped counts. It also discloses that results depend on saved working hours, lunch, buffer, and focus-block preferences, which is meaningful context an agent could not infer from the schema or annotations.
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?
The purpose is front-loaded in the first sentence, followed by concrete example questions, preference context, exclusion behavior, and a complete Args list with no filler. Each sentence contributes necessary information for selecting and invoking the tool correctly.
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?
The description is complete for a read-only audit tool with an output schema: it covers the full parameter surface, defaults, exclusions, preference dependencies, and the questions the tool answers. Return-value details are already handled by the output schema, so nothing essential 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 0%, so the description carries the full burden, and it succeeds: every parameter has a plain-language explanation, including ISO 8601 format, the ['primary'] default for calendar_ids, group_by semantics ('day' or ISO 'week'), and the meaning of the two include flags plus account. This is exactly what an agent needs to construct a correct call.
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 opens with a specific verb and resource ('Report where the user's time went') and spells out the exact questions the tool answers, so an agent immediately knows what it does. It also sets this apart from sibling reporting tools by emphasizing the 'one pass' aggregation of meetings, attendees, and focus time.
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 clearly identifies the use case ('how much of my week is meetings?', 'who am I spending time with?', 'where did my focus time go?') and explains how preferences affect results, referencing get_preferences. However, it does not explicitly mention alternative tools like analyze_busyness, query_free_busy, or find_focus_time or state when not to use this tool, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_eventUpdate an eventAIdempotent
Change fields on an existing event. Omitted fields are left untouched.
To reschedule while keeping the duration, use move_event instead: changing
only start_time here leaves the old end time in place.
Args:
calendar_id: Calendar the event lives on.
event_id: The event to update (from find_events). Required.
summary: New title.
start_time: New start, ISO 8601.
end_time: New end, ISO 8601.
description: New description.
location: New location.
send_notifications: Whether Google emails the attendees. Default true.
account: Account name from 'calendar-mcp accounts'; omit for the default.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| summary | No | ||
| end_time | No | ||
| event_id | No | ||
| location | No | ||
| start_time | No | ||
| calendar_id | No | primary | |
| description | No | ||
| send_notifications | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| event | Yes | The event after the operation. |
| message | No | One-line human-readable summary of what happened. |
| calendar_id | Yes | Calendar the event lives on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish mutability and idempotency, and the description adds meaningful operational behavior beyond them: omitted fields are preserved, updating only start_time alters duration, and send_notifications controls attendee emails with a default of true. It does not contradict the annotations, though it does not discuss how to explicitly clear a field.
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?
The key behavioral rule and sibling distinction are front-loaded in two tight sentences, followed by a compact Args block that maps directly to the schema. There is no filler or redundancy.
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 nine parameters and zero schema descriptions, the description is remarkably complete: all args are covered, defaults are stated, the move_event alternative is handled, and the attendee-notification side effect is disclosed. The only minor gap is that clearing a field is not explicitly addressed, and calendar_id's primary default is left to the schema.
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 0%, so the description carries the full burden and succeeds. Every one of the nine parameters is explained with field purpose, provenance, format, or default, and it even flags event_id as semantically required despite the schema's default string.
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 starts with a specific verb and resource: 'Change fields on an existing event' and immediately adds the crucial distinguishing semantic 'Omitted fields are left untouched.' This clearly separates it from create_event, delete_event, and especially move_event.
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 explicitly tells the agent when not to use this tool: to reschedule while keeping duration, use move_event instead, and explains why changing only start_time here leaves the old end time in place. It also instructs where to source event_id and account, giving clear invocation context.
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.
23 tool updates
v1.1.0- First observed
add_attendee - First observed
analyze_busyness - First observed
block_focus_time - First observed
check_attendee_status - First observed
create_calendar - First observed
create_event - First observed
delete_event - First observed
detect_conflicts - First observed
find_events - First observed
find_focus_time - First observed
get_preferences - First observed
list_accounts - First observed
list_calendars - First observed
move_event - First observed
project_recurring_events - First observed
query_free_busy - First observed
quick_add_event - First observed
respond_to_event - First observed
schedule_mutual - First observed
set_preferences - First observed
suggest_reschedule - First observed
time_audit - First observed
update_event
TDQS
Scored across 23 tools
Most tools are clearly distinct, and the descriptions carefully separate pairs like quick_add_event vs create_event and update_event vs move_event. A few scheduling/availability tools (find_focus_time, block_focus_time, schedule_mutual, suggest_reschedule) are dense and could be confused, but the read/write and propose/book roles are clearly explained.
The majority follow a clean snake_case verb-noun pattern such as list_calendars, create_event, and delete_event. Minor deviations like time_audit, respond_to_event, quick_add_event, and schedule_mutual break the pattern slightly but do not make the set unpredictable.
23 tools falls in the heavy 16-25 range, which feels like more surface than an agent needs to navigate comfortably. The calendar domain is broad enough to justify most tools, but several scheduling and analytics tools could potentially be consolidated.
Event lifecycle coverage is strong: create, search, update, move, delete, attendees, RSVP, and recurring-event projection are all present. Minor gaps include no calendar update/delete, no attendee removal, and no single-event getter, but these are workable around with existing tools.
Maintenance
Related MCP Connectors
Hosted Google Calendar MCP server for AI agents. No self-hosting or Google Cloud setup.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A MCP server that works with Google Calendar to manage event listing, reading, and updates.
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
Related MCP Servers
- AlicenseAqualityAmaintenanceA Model Context Protocol server that integrates Google Calendar with Claude Desktop, enabling users to manage calendar events (view, create, update, delete) through natural language.5109 npm59MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables natural language interaction with Google Calendar, allowing users to view, create, update, and delete calendar events through context-aware operations.88 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server for Google Calendar integration in Claude Desktop, enabling AI assistants to manage Google Calendar events through natural language interactions.6 npm1ISC
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server for Google Calendar integration with Claude Desktop. Create, update, delete, and manage calendar events with batch operations and enterprise-grade retry mechanisms.1MIT