Google Advanced Protection blocks most OAuth apps cold. This guide explains what GAP is, why it breaks calendar integrations, and how to solve it with service accounts.
If you use Google Advanced Protection and have tried to connect an AI agent to your calendar, you have probably seen this error:
Error 400: policy_enforced Access blocked: This app's request is not allowed for your account. If you think this should work, contact the app developer.This is not a misconfiguration. It is Google Advanced Protection doing exactly what it is designed to do: blocking OAuth apps that have not been explicitly approved for high-security accounts.
This post explains what GAP is, why it blocks calendar integrations, and how CalendarMCP solves it with service accounts — and how you can connect a GAP-protected calendar alongside other Google accounts under a single CalendarMCP API key, so your agent can read and write across all of them from one connection.
Google Advanced Protection (GAP) is a high-security mode for Google accounts. It is designed for people who face elevated risk: journalists, activists, executives, politicians, and anyone who is a likely target for targeted account attacks.
When GAP is enabled on your account, Google enforces several restrictions beyond what normal accounts have:
The OAuth restriction is the one that matters for calendar integrations.
Most calendar MCP tools, including the popular self-hosted options, use standard OAuth 2.0. Your browser redirects to Google, you approve the app, Google issues a refresh token, and the app uses that token to call the Calendar API on your behalf.
With GAP enabled, Google will reject that OAuth flow if the app is not on an approved list. Being "published" on Google's consent screen verification is not enough. GAP requires apps to go through a more restrictive process, and most third-party calendar tools have not done that, and cannot realistically do it.
This means every self-hosted solution (nspady/google-calendar-mcp and similar) is blocked at step one. You cannot get past the authorization screen.
Service accounts are a different authentication mechanism. Instead of asking you to authorize an OAuth app, a service account is a separate Google identity (with its own email address like calendar-agent@your-project.iam.gserviceaccount.com) that you grant calendar access to directly.
This sidesteps GAP entirely. You are not authorizing an app to access your account. You are sharing your calendar with another Google identity, the same way you would share a calendar with a coworker.
GAP has no mechanism to block calendar sharing. It can only block OAuth app authorization.
CalendarMCP has a service account setup flow specifically for Advanced Protection users. You can use it as your primary account, or — if you also have non-GAP Google accounts you want your agent to reach — as an additional connection under an existing CalendarMCP account. One API key multiplexes all of them. Here is how it works:
calendarmcp@chromosome-474619.iam.gserviceaccount.com.cmcp_... API key. If you’re already signed in, the new connection is added to your existing key — nothing to change in your MCP client configuration. Both cases show up on the dashboard under Connected Google accounts with per-calendar Read/Write controls.Here is the calendar sharing step in more detail:
Important
Do not share using "Make changes and manage sharing". That grants more access than needed. "Make changes to events" is sufficient.
Service accounts work well for most calendar operations, but there are a few things worth knowing:
If you have a work account that supports OAuth and a personal GAP account, the ideal setup is: sign up for CalendarMCP with OAuth on the work account, then add the GAP calendar as a service-account connection from your dashboard. Both calendars now live under one API key. Your agent can list_events across both in one call, and the per-calendar Read/Write matrix lets you lock the GAP calendar to read-only while keeping the work calendar read+write — all without minting a second key.
Once you have completed setup and have your API key, the connection is identical to the OAuth flow:
# Claude Code
claude mcp add calendar https://calendarmcp.ai/api/mcp \
--header "Authorization: Bearer cmcp_your_api_key"
# Test it
claude "What's on my calendar tomorrow?"The service account approach is the only way to give AI agents reliable Google Calendar access when Advanced Protection is enabled. If you have GAP on and have been stuck on this, the service account setup flow is the path forward.
Connect your Google Calendar to Claude and any MCP client in about two minutes.
Connect Google Calendar