Skip to main content
Glama
deciduus
by deciduus

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 auth

This 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-mcp and calendar-mcp-server, so uvx calendar-mcp-server and a local calendar-mcp are 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-server

Claude Desktopclaude_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 8000

The 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

list_calendars

read

List the calendars the user can see, with IDs and timezones.

find_events

read

Search a calendar for events, expanding recurring series into instances.

check_attendee_status

read

Report who accepted, declined or has not answered an invitation.

query_free_busy

read

Busy intervals for one or more calendars, without event details.

analyze_busyness

read

Per-day event count and total scheduled minutes over a range.

project_recurring_events

read

Compute future occurrences from recurrence rules.

create_calendar

writes

Create a new secondary calendar.

create_event

writes

Create an event with explicit start/end times and optional attendees.

quick_add_event

writes

Create an event from a plain-English phrase, parsed by Google.

update_event

writes

Change fields on an event; omitted fields are left untouched.

move_event

writes

Reschedule an event, and/or move it to another calendar.

add_attendee

writes

Invite one or more people to an existing event.

respond_to_event

writes

Set your own RSVP (accepted/declined/tentative/needsAction).

schedule_mutual

writes

Find the first slot where everyone is free, then book it.

delete_event

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

find_focus_time

read

Uninterrupted blocks in a window that could be used for deep work, longest first.

detect_conflicts

read

Double-bookings and too-tight transitions, across every signed-in account at once.

time_audit

read

Where the time went: meeting hours, by size, domain, recurrence and person.

suggest_reschedule

writes (opt-in)

Ranked better times for an existing meeting. Suggests only, unless apply: true.

block_focus_time

writes

Book the best free blocks as focus time. dry_run: true to preview.

Local configuration — no Google call, no account argument.

Tool

Description

list_accounts

read

The accounts you have signed in, and which is the default.

get_preferences

read

Working hours, lunch, buffer, minimum focus block, focus calendar.

set_preferences

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 h

Declined meetings, events marked free and all-day entries are left out by default; include_declined and include_all_day bring them back.

Safety

  • delete_event is 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_time takes dry_run. Run it with dry_run: true to see the exact blocks it would book before anything is written.

  • suggest_reschedule does not move anything by default. apply is false and 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_event leaves fields you omit untouched.

  • list_accounts, get_preferences and set_preferences never 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 state

Every 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

timezone

unset

IANA zone the working hours are expressed in, e.g. Europe/Berlin.

working_hours

Mon–Fri 09:00–17:00

Per weekday (monsun), a list of ["HH:MM", "HH:MM"] spans.

buffer_minutes

0

Gap to leave either side of a meeting when proposing times.

min_focus_block_minutes

60

Shortest free stretch that still counts as usable focus time.

lunch

unset

A daily break carved out of the working hours.

focus_calendar_id

primary

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

GOOGLE_CLIENT_ID

OAuth client ID (required).

GOOGLE_CLIENT_SECRET

OAuth client secret (required).

TOKEN_FILE_PATH

.gcp-saved-tokens.json

Where the default account's OAuth token is cached.

CALENDAR_MCP_CONFIG_DIR

OS user config dir

Directory holding per-account tokens (accounts/) and preferences.json.

CALENDAR_MCP_DEFAULT_ACCOUNT

default

Account used when a tool's account argument is omitted.

CALENDAR_SCOPES

https://www.googleapis.com/auth/calendar

Scope requested. Use .../auth/calendar.readonly for read-only.

OAUTH_CALLBACK_PORT

8080

Local port for the OAuth callback during calendar-mcp auth.

CALENDAR_MCP_ALLOW_BROWSER_AUTH

unset

Set to 1 to let the server itself open a browser when no token exists. Off by default so a stdio server never hangs.

CALENDAR_MCP_LOG_FILE

unset

Mirror the stderr log to this file.

CALENDAR_MCP_LOG_LEVEL

INFO

DEBUG/INFO/WARNING/ERROR/CRITICAL. Overrides --log-level.

HOST

127.0.0.1

Default for --host in HTTP mode.

PORT

8000

Default for --port in HTTP mode.

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 --version

python -m calendar_mcp accepts the same arguments.

Google Cloud setup

  1. Create or select a project and enable the Google Calendar API.

  2. 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.

  3. A Desktop app client has no "Authorized redirect URIs" field — Google permits http://localhost on any port for this client type, which is what the local callback on OAUTH_CALLBACK_PORT uses. Nothing to configure there.

  4. On the OAuth consent screen: User Type External, fill in the app name and contact emails, add the https://www.googleapis.com/auth/calendar scope, 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]"
pytest

Layout: 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-server and installs calendar-mcp (and an identical calendar-mcp-server alias). Point your client at uvx calendar-mcp-server instead of python /path/to/run_server.py.

  • run_server.py still 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 auth once; the server will not open a browser unless CALENDAR_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, and project_recurring_events (the last previously existed only as internal logic).

  • Removed env vars: RELOAD, MCP_API_HOST. HOST/PORT now apply to the MCP HTTP transport.

License

This project is dual-licensed to support both open-source collaboration and sustainable development:

  1. 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.

  2. 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 tools
add_attendeeAdd attendeesA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
event_idYes
calendar_idNoprimary
attendee_emailsYes
send_notificationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 loadA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
time_maxYes
time_minYes
calendar_idNoprimary

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysNoPer-day totals, in date order.
time_maxYesEnd of the analysed window, ISO 8601.
time_minYesStart of the analysed window, ISO 8601.
calendar_idYesCalendar that was analysed.
total_eventsNoSum of event_count across all days.
total_duration_minutesNoSum of total_duration_minutes across all days.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoFocus time
accountNo
dry_runNo
time_maxYes
time_minYes
calendar_idNo
descriptionNo
hours_neededYes
check_calendar_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of blocks.
eventsNoThe blocks, earliest first.
dry_runNoTrue when nothing was written to the calendar.
messageNoOne-line human-readable summary.
time_maxYesEnd of the searched window, ISO 8601.
time_minYesStart of the searched window, ISO 8601.
timezoneYesTimezone the blocks are expressed in.
satisfiedNoTrue when hours_booked covers hours_needed.
calendar_idYesCalendar the blocks were booked on.
hours_bookedNoFocus hours actually covered by these blocks.
hours_neededNoFocus hours the caller asked for.
total_free_hoursNoFocus hours that were available in the window.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 RSVPsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
event_idYes
calendar_idNoprimary
attendee_emailsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of attendees reported.
event_idYesEvent that was checked.
attendeesNoAttendees and their current RSVP state.
calendar_idYesCalendar the event lives on.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
summaryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYesCalendar ID. Pass this as calendar_id to other tools.
primaryNoTrue for the user's main calendar (also addressable as 'primary').
summaryNoCalendar name.
time_zoneNoIANA timezone of the calendar, e.g. 'Europe/Berlin'.
access_roleNoThe user's role: 'owner', 'writer', 'reader', 'freeBusyReader'.
descriptionNoCalendar description.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
summaryNo
end_timeNo
locationNo
start_timeNo
calendar_idNoprimary
descriptionNo
attendee_emailsNo
send_notificationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 eventA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
event_idYes
calendar_idNoprimary
send_notificationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedYesTrue when the event was removed.
messageNoOne-line human-readable summary of what happened.
event_idYesID of the deleted event.
calendar_idYesCalendar the event was on.
confirmed_by_userNoTrue/False when the client answered a confirmation prompt; null when the client does not support elicitation.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 conflictsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountsNo
time_maxYes
time_minYes
calendar_idsNo
include_all_dayNo
max_events_per_calendarNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
tightNoBack-to-back pairs that violate the buffer, earliest first.
messageNoOne-line human-readable summary.
skippedNoCalendars or accounts that could not be read in full, with the reason.
accountsNoAccounts that were read.
time_maxYesEnd of the checked window, ISO 8601.
time_minYesStart of the checked window, ISO 8601.
timezoneYesTimezone the times are expressed in.
conflictsNoOverlapping pairs, earliest first.
event_countNoEvents considered after filtering.
tight_countNoNumber of too-tight transitions.
calendar_idsNoCalendars that were read, as 'account:calendar_id'.
buffer_minutesNoBuffer the tight transitions were judged against.
conflict_countNoNumber of overlapping pairs.
include_all_dayNoWhether all-day events were considered.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
accountNo
time_maxNo
time_minNo
calendar_idNoprimary
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of events returned.
eventsNoThe matching events, earliest first.
time_zoneNoIANA timezone of the calendar that was searched.
calendar_idYesCalendar that was searched.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 timeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
time_maxYes
time_minYes
calendar_idsNo
hours_neededYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of blocks returned.
blocksNoUsable blocks, longest first, then earliest.
messageNoOne-line human-readable summary.
time_maxYesEnd of the searched window, ISO 8601.
time_minYesStart of the searched window, ISO 8601.
timezoneYesTimezone the blocks are expressed in.
satisfiableNoTrue when total_free_hours covers hours_needed.
calendar_idsNoCalendars whose busy time was subtracted.
hours_neededNoFocus hours the caller asked for.
buffer_minutesNoGap left around each meeting, from preferences.buffer_minutes.
total_free_hoursNoTotal focus hours available in the window.
min_block_minutesNoShortest stretch counted, from preferences.min_focus_block_minutes.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 preferencesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
lunchNoDaily lunch break as ['HH:MM', 'HH:MM'], carved out of the working hours. Omit for no lunch break.
timezoneNoIANA timezone the working hours are expressed in, e.g. 'Europe/Berlin'. Omit to use the calendar's own timezone.
working_hoursNoPer-weekday working spans, keyed 'mon'..'sun', each a list of ['HH:MM', 'HH:MM'] pairs. An empty list means the day is off.
buffer_minutesNoMinimum gap to leave before and after each meeting when scheduling.
focus_calendar_idNoCalendar that focus blocks are booked on.
min_focus_block_minutesNoShortest free stretch that still counts as usable focus time.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 accountsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of known accounts.
accountsNoKnown accounts, the default one first.
config_dirYesDirectory holding the account tokens and preferences.
default_accountYesAccount used when 'account' is omitted.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 calendarsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
min_access_roleNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of calendars returned.
calendarsNoThe user's calendars.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
new_endNo
event_idYes
new_startNo
calendar_idNoprimary
send_notificationsNo
destination_calendar_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
time_maxYes
time_minYes
calendar_idNoprimary
event_queryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesNumber of projected occurrences.
time_maxYesEnd of the projection window, ISO 8601.
time_minYesStart of the projection window, ISO 8601.
calendar_idYesCalendar that was projected.
occurrencesNoComputed occurrences, earliest first.

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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/busyA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
time_maxYes
time_minYes
calendar_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
time_maxYesEnd of the queried window, ISO 8601.
time_minYesStart of the queried window, ISO 8601.
calendarsNoPer-calendar busy intervals.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
accountNo
calendar_idNoprimary

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
commentNo
event_idYes
calendar_idNoprimary
response_statusYes
send_notificationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
summaryYes
locationNo
time_maxYes
time_minYes
descriptionNo
duration_minutesYes
working_hours_endNo
send_notificationsNo
respect_preferencesNo
working_hours_startNo
attendee_calendar_idsYes
organizer_calendar_idNoprimary

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 preferencesA
Idempotent

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
lunchNo
timezoneNo
clear_lunchNo
working_hoursNo
buffer_minutesNo
focus_calendar_idNo
min_focus_block_minutesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
lunchNoDaily lunch break as ['HH:MM', 'HH:MM'], carved out of the working hours. Omit for no lunch break.
timezoneNoIANA timezone the working hours are expressed in, e.g. 'Europe/Berlin'. Omit to use the calendar's own timezone.
working_hoursNoPer-weekday working spans, keyed 'mon'..'sun', each a list of ['HH:MM', 'HH:MM'] pairs. An empty list means the day is off.
buffer_minutesNoMinimum gap to leave before and after each meeting when scheduling.
focus_calendar_idNoCalendar that focus blocks are booked on.
min_focus_block_minutesNoShortest free stretch that still counts as usable focus time.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNo
accountNo
event_idYes
calendar_idNoprimary
search_daysNo
search_fromNo
max_suggestionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of suggestions returned.
appliedNoTrue when the event was actually moved.
messageNoOne-line human-readable summary.
summaryNoEvent title.
event_idYesEvent the suggestions are for.
timezoneYesTimezone the suggestions are expressed in.
attendeesNoAttendee calendars whose availability was checked.
calendar_idYesCalendar the event lives on.
current_endNoCurrent end, ISO 8601.
suggestionsNoProposed times, best first.
applied_eventNoThe event after the move; null unless 'applied' is true.
current_startNoWhere the event sits now, ISO 8601.
search_time_maxYesEnd of the searched window, ISO 8601.
search_time_minYesStart of the searched window, ISO 8601.
duration_minutesNoLength of the event, preserved by every suggestion.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 wentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
group_byNoweek
time_maxYes
time_minYes
calendar_idsNo
include_all_dayNo
include_declinedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
by_sizeNoMeeting time by headcount: 'solo', '1:1', 'small' (<=4), 'large'.
periodsNoPer-day or per-week breakdown, earliest first.
excludedNoWhat was skipped and why.
group_byNoPeriod grouping used: 'day' or 'week'.
insightsNoThree to five plain-English takeaways.
time_maxYesExclusive end of the audited window, ISO 8601.
time_minYesInclusive start of the audited window, ISO 8601.
timezoneYesTimezone the days, weeks and working hours are expressed in.
by_domainNoMeeting time by attendee email domain. A meeting with two domains counts in both.
top_peopleNoPeople the user shared the most meeting hours with, most first.
calendar_idsNoCalendars the events came from.
by_recurrenceNoMeeting time split into 'recurring' and 'one-off'.
busiest_periodNoThe heaviest entry of 'periods'. None when nothing was booked.
focus_block_countNoNumber of such blocks.
back_to_back_countNoRuns of three or more meetings with no usable gap.
back_to_back_hoursNoTotal wall-clock hours those runs cover.
longest_meeting_dayNoThe single heaviest day, regardless of group_by. None when nothing was booked.
total_meeting_countNoMeetings counted.
total_meeting_hoursNoTotal meeting hours in the window; overlaps counted twice.
largest_focus_blocksNoThe five longest free blocks, longest first.
focus_hours_availableNoUnbooked working hours in blocks at least min_focus_block_minutes long.
back_to_back_stretchesNoThe individual back-to-back runs, earliest first.
share_of_working_hoursNoFraction of the working hours spent in meetings, 0..1.
working_hours_availableNoWorking hours in the window, lunch removed.
meeting_hours_in_working_hoursNoMeeting hours inside the working hours, overlaps merged.

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 eventA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
summaryNo
end_timeNo
event_idNo
locationNo
start_timeNo
calendar_idNoprimary
descriptionNo
send_notificationsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
eventYesThe event after the operation.
messageNoOne-line human-readable summary of what happened.
calendar_idYesCalendar the event lives on.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 23 tool updatesv1.1.0
    • First observedadd_attendee
    • First observedanalyze_busyness
    • First observedblock_focus_time
    • First observedcheck_attendee_status
    • First observedcreate_calendar
    • First observedcreate_event
    • First observeddelete_event
    • First observeddetect_conflicts
    • First observedfind_events
    • First observedfind_focus_time
    • First observedget_preferences
    • First observedlist_accounts
    • First observedlist_calendars
    • First observedmove_event
    • First observedproject_recurring_events
    • First observedquery_free_busy
    • First observedquick_add_event
    • First observedrespond_to_event
    • First observedschedule_mutual
    • First observedset_preferences
    • First observedsuggest_reschedule
    • First observedtime_audit
    • First observedupdate_event

TDQS

A4/5.0

Scored across 23 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers