[BUG] Calendar MCP unusable for any user with Google Contacts birthdays — gcal_list_events returns only 1930s birthdays, not real events
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
- Connect the managed Google Calendar MCP in Cowork (or Claude Code with the cloud connector)
- Have any birthdays stored in Google Contacts (this is the default for most users)
- Call
gcal_list_eventswithtimeMinandtimeMaxcovering any window (e.g., next 30 days) - Observe: the response is dominated by birthday events with
start.datevalues from decades ago. Real events in the requested window are missing or truncated pastmaxResults.
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:
eventTypesfilter not exposed. Google Calendar API has supportedeventTypes=defaultsince September 17, 2024 specifically to exclude birthday events. The MCP tool schema does not expose this parameter.
singleEvents=trueandorderBy=startTimeappear to not be set. WithoutsingleEvents=true, the API returns base recurring-event objects whosestart.dateis the original birth year. SettingsingleEvents=trueexpands recurrences into current-year instances that obey thetimeMin/timeMaxfilter.
Proposed fix
Either:
- Minimum fix: Hardcode
eventTypes=default,singleEvents=true,orderBy=startTimein thegcal_list_eventsimplementation. Estimated 2-3 line change. - Better fix: Expose
eventTypesas an optional parameter (default todefault) 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
.icscalendar invite attachments) → Gmail MCP ignores attachment type filters, returns noise - Passing
calendarIdother thanprimary→ 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
- Connect the managed Google Calendar MCP in Cowork (or Claude Code with the cloud connector)
- Have any birthdays stored in Google Contacts (this is the default for most users)
- Call
gcal_list_eventswithtimeMinandtimeMaxcovering any window (e.g., next 30 days) - Observe: the response is dominated by birthday events with
start.datevalues from decades ago. Real events in the requested window are missing or truncated pastmaxResults.
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
- Connect the managed Google Calendar MCP in Cowork (or Claude Code with the cloud connector)
- Have any birthdays stored in Google Contacts (this is the default for most users)
- Call
gcal_list_eventswithtimeMinandtimeMaxcovering any window (e.g., next 30 days) - Observe: the response is dominated by birthday events with
start.datevalues from decades ago. Real events in the requested window are missing or truncated pastmaxResults.
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:
eventTypesfilter not exposed. Google Calendar API has supportedeventTypes=defaultsince September 17, 2024 specifically to exclude birthday events. The MCP tool schema does not expose this parameter.
singleEvents=trueandorderBy=startTimeappear to not be set. WithoutsingleEvents=true, the API returns base recurring-event objects whosestart.dateis the original birth year. SettingsingleEvents=trueexpands recurrences into current-year instances that obey thetimeMin/timeMaxfilter.
Proposed fix
Either:
- Minimum fix: Hardcode
eventTypes=default,singleEvents=true,orderBy=startTimein thegcal_list_eventsimplementation. Estimated 2-3 line change. - Better fix: Expose
eventTypesas an optional parameter (default todefault) 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
.icscalendar invite attachments) → Gmail MCP ignores attachment type filters, returns noise - Passing
calendarIdother thanprimary→ 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.
This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗