[BUG] Calendar MCP unusable for any user with Google Contacts birthdays — gcal_list_events returns only 1930s birthdays, not real events

Resolved 💬 1 comment Opened Apr 13, 2026 by efinegold73 Closed May 24, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

Summary

The managed Google Calendar MCP tool gcal_list_events (as surfaced in Cowork / Claude Code via gcal.mcp.claude.com) returns birthday events with their original birth-year start dates (e.g., 1937, 1942, 1951), which flood the results and push real events out of any normal query window. This makes the calendar MCP effectively unusable for any schedule-aware workflow.

Reproduction

  1. Connect the managed Google Calendar MCP in Cowork (or Claude Code with the cloud connector)
  2. Have any birthdays stored in Google Contacts (this is the default for most users)
  3. Call gcal_list_events with timeMin and timeMax covering any window (e.g., next 30 days)
  4. Observe: the response is dominated by birthday events with start.date values from decades ago. Real events in the requested window are missing or truncated past maxResults.

Expected behavior

The tool should return events within the requested time window, with birthday events either excluded or rendered as current-year instances.

Root cause (confirmed)

Two missing parameters on the underlying Google Calendar API events.list call:

  1. eventTypes filter not exposed. Google Calendar API has supported eventTypes=default since September 17, 2024 specifically to exclude birthday events. The MCP tool schema does not expose this parameter.
  1. singleEvents=true and orderBy=startTime appear to not be set. Without singleEvents=true, the API returns base recurring-event objects whose start.date is the original birth year. Setting singleEvents=true expands recurrences into current-year instances that obey the timeMin/timeMax filter.

Proposed fix

Either:

  • Minimum fix: Hardcode eventTypes=default, singleEvents=true, orderBy=startTime in the gcal_list_events implementation. Estimated 2-3 line change.
  • Better fix: Expose eventTypes as an optional parameter (default to default) on the tool schema, so a user can explicitly request birthdays when they want them.

Things I tried as a user before filing

  • Hiding the "Birthdays" calendar in Google Calendar web settings → no effect (birthday events are stored directly on the primary calendar, not a separate calendar)
  • gcal_find_my_free_time → works for busy/free detection but returns no event titles and is blind to all-day events marked as "free" (e.g., travel blocks)
  • Gmail MCP workaround (searching for .ics calendar invite attachments) → Gmail MCP ignores attachment type filters, returns noise
  • Passing calendarId other than primary → parameter is silently ignored, all queries hit primary regardless

Impact

The calendar MCP is the backbone of any schedule-aware AI workflow — daily briefings, "what's on my plate tomorrow," travel prep, meeting-aware task sequencing. Until this is fixed, that entire class of workflow is broken for any user with birthdays in Google Contacts (which is most users).

Environment

  • Cowork mode (Claude desktop)
  • Managed MCP: gcal.mcp.claude.com
  • Claude model: Opus 4.6
  • Date: April 2026

Related

No existing issue found for this specific bug in anthropics/claude-code. Adjacent calendar/MCP issues: #42790 (Gmail MCP loading), #45765 (OAuth MCP connectors in triggers), #44214 (MCP tools in remote triggers). Those are about tool availability; this is about tool correctness.

What Should Happen?

Expected behavior

The tool should return events within the requested time window, with birthday events either excluded or rendered as current-year instances.

Error Messages/Logs

Steps to Reproduce

  1. Connect the managed Google Calendar MCP in Cowork (or Claude Code with the cloud connector)
  2. Have any birthdays stored in Google Contacts (this is the default for most users)
  3. Call gcal_list_events with timeMin and timeMax covering any window (e.g., next 30 days)
  4. Observe: the response is dominated by birthday events with start.date values from decades ago. Real events in the requested window are missing or truncated past maxResults.

Claude Model

Not sure / Multiple models

Is this a regression?

I don't know

Last Working Version

_No response_

Claude Code Version

1.1617.0 (8d6345)

Platform

Anthropic API

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

Summary

The managed Google Calendar MCP tool gcal_list_events (as surfaced in Cowork / Claude Code via gcal.mcp.claude.com) returns birthday events with their original birth-year start dates (e.g., 1937, 1942, 1951), which flood the results and push real events out of any normal query window. This makes the calendar MCP effectively unusable for any schedule-aware workflow.

Reproduction

  1. Connect the managed Google Calendar MCP in Cowork (or Claude Code with the cloud connector)
  2. Have any birthdays stored in Google Contacts (this is the default for most users)
  3. Call gcal_list_events with timeMin and timeMax covering any window (e.g., next 30 days)
  4. Observe: the response is dominated by birthday events with start.date values from decades ago. Real events in the requested window are missing or truncated past maxResults.

Expected behavior

The tool should return events within the requested time window, with birthday events either excluded or rendered as current-year instances.

Root cause (confirmed)

Two missing parameters on the underlying Google Calendar API events.list call:

  1. eventTypes filter not exposed. Google Calendar API has supported eventTypes=default since September 17, 2024 specifically to exclude birthday events. The MCP tool schema does not expose this parameter.
  1. singleEvents=true and orderBy=startTime appear to not be set. Without singleEvents=true, the API returns base recurring-event objects whose start.date is the original birth year. Setting singleEvents=true expands recurrences into current-year instances that obey the timeMin/timeMax filter.

Proposed fix

Either:

  • Minimum fix: Hardcode eventTypes=default, singleEvents=true, orderBy=startTime in the gcal_list_events implementation. Estimated 2-3 line change.
  • Better fix: Expose eventTypes as an optional parameter (default to default) on the tool schema, so a user can explicitly request birthdays when they want them.

Things I tried as a user before filing

  • Hiding the "Birthdays" calendar in Google Calendar web settings → no effect (birthday events are stored directly on the primary calendar, not a separate calendar)
  • gcal_find_my_free_time → works for busy/free detection but returns no event titles and is blind to all-day events marked as "free" (e.g., travel blocks)
  • Gmail MCP workaround (searching for .ics calendar invite attachments) → Gmail MCP ignores attachment type filters, returns noise
  • Passing calendarId other than primary → parameter is silently ignored, all queries hit primary regardless

Impact

The calendar MCP is the backbone of any schedule-aware AI workflow — daily briefings, "what's on my plate tomorrow," travel prep, meeting-aware task sequencing. Until this is fixed, that entire class of workflow is broken for any user with birthdays in Google Contacts (which is most users).

Environment

  • Cowork mode (Claude desktop)
  • Managed MCP: gcal.mcp.claude.com
  • Claude model: Opus 4.6
  • Date: April 2026

Related

No existing issue found for this specific bug in anthropics/claude-code. Adjacent calendar/MCP issues: #42790 (Gmail MCP loading), #45765 (OAuth MCP connectors in triggers), #44214 (MCP tools in remote triggers). Those are about tool availability; this is about tool correctness.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗