The empty cell in Google's MCP catalog

Google ships 35+ official MCP servers. Exactly zero of them can autonomously send a message to someone outside a Google domain.

I read every page in Google's published MCP catalog and graded each server on one column: can the agent use this to put text in front of a specific human? BigQuery, Spanner, GKE, Cloud Run, Pub/Sub, Maps, Drive, all none. Calendar gives an internal invite. Gmail has create_draft but no autonomous send. Chat ships two tools, both read-only.

That gap is not a bug in Google's strategy. It is the natural shape of a cloud-first MCP layer. The fix, if your agent has to reach a real customer in Brazil, India, MENA, or anywhere WhatsApp is the default chat app, is a second MCP child that drives the WhatsApp desktop app on macOS through accessibility APIs and verifies the bubble landed in the chat.

M
Matthew Diakonov
11 min read

The catalog, scored by outbound-to-human capability

One row per server published in Google's MCP documentation as of April 2026. The grading column answers a single question: if the agent holds this tool surface, can it autonomously deliver a message to a specific person? "None" means the server has no notion of an outbound human channel at all. "Google only" means it can reach Google-domain users via Google's own notification plumbing. "Draft only" means it can compose but not send. The "send to human" column is empty across every Google server.

ServerOutbound to a human
BigQuerynone
Bigtablenone
AlloyDB / Cloud SQL / Spannernone
Firestorenone
Compute Engine (GCE)none
GKEnone
Cloud Runnone
Cloud Storagenone
Pub/Subnone
Cloud Logging / Monitoring / Tracenone
Google Maps Toolsnone
Workspace: Drivenone
Workspace: Calendargoogle only
Workspace: People APInone
Workspace: Chatnone
Workspace: Gmaildraft only
WhatsApp (third-party, macOS)send to human

Sources: developers.google.com/workspace/guides/configure-mcp-servers (Workspace tool counts), docs.cloud.google.com/mcp/supported-products (Cloud catalog), cloud.google.com/blog/products/ai-machine-learning/announcing-official-mcp-support-for-google-services.

Why the empty column is the natural shape

Google's MCP strategy is, correctly, a cloud-first one. The servers expose what the cloud itself owns: warehouse rows, container workloads, Kubernetes objects, blob buckets, log streams, calendars, email metadata. None of those primitives are outbound channels. They are state. The agent reasons over the state, runs jobs, and writes state back. The reader at the end of the loop is a developer or an analyst, not a customer.

The two corners that brush up against human delivery are Gmail and Calendar. Both are real channels, but both terminate at the customer's email address. For the segment of agents whose users live on email, that is enough. For the segment whose users live on WhatsApp (most of Latin America, most of South Asia, most of MENA, increasingly most of Southeast Asia), email is a write-only audit log. The customer never opens it. The Gmail draft sits unread, the calendar invite goes into a mailbox the customer hasn't looked at since 2022, and the agent's loop does not actually close.

What the catalog needs, for that segment, is a cell that says "this server can deliver to the place the customer actually reads." That cell is empty in Google's catalog because Google does not own a consumer chat app with global penetration. Allo, Hangouts, Duo, Spaces are all gone or organizational. WhatsApp belongs to Meta. The cell stays empty until somebody outside Google ships a server.

One host, several Google children, one WhatsApp child

The MCP host (Claude Code, Cursor, Claude Desktop) does not care whether a server speaks HTTP+OAuth to googleapis.com or stdio to a local binary. Each entry in the config becomes its own connection. The agent sees the union of all tool surfaces and chains across them in a single turn.

agent loop spans Google MCP and WhatsApp MCP in one turn

search_threads
list_events
list_recent_files
host (Claude / Cursor)
whatsapp_search
whatsapp_send_message
create_draft

Google's servers handle the read-side context (email threads, calendars, files). WhatsApp MCP handles delivery. The agent does the integration; neither side knows about the other.

The merged config: Google over OAuth, WhatsApp over stdio

The host config below has three children. Two are Google's remote HTTP servers, gated by OAuth scopes. The third is a local Swift binary installed via npm install -g whatsapp-mcp-macos. Restart the host and the agent sees all three tool surfaces at once.

~/.claude.json (excerpt, mixed transports)

The OAuth flow is initiated the first time the host connects. For Claude.ai or Claude Desktop, this requires a paid plan. The WhatsApp half has no auth flow; it requires only that the WhatsApp app is installed (App Store) and that the host process has been granted Accessibility permission in System Settings > Privacy & Security > Accessibility.

One full agent loop, end to end

Concrete shape: the agent reads the customer's last email thread, sees that the customer has not replied in a week, picks them up on WhatsApp, sends a follow-up, verifies the bubble appeared, and writes the result back into a Gmail draft so the operator has a paper trail.

1

1. Workspace MCP gathers context

The agent uses Gmail MCP (search_threads, get_thread) and Calendar MCP (list_events) to assemble what it knows about the customer. Both surfaces are read-rich: Gmail ships search and listing, Calendar ships event detail and suggested times. This part of the loop is what Google's MCP catalog does best.

2

2. Workspace MCP runs out of outbound surface

Gmail MCP can draft, not send. Calendar MCP can create an event, but the recipient sees a Google calendar invite, not a message in their thread. Chat MCP only reads. If the customer is not in a Google org and is not living in their inbox, the Workspace tools cannot deliver anything to them.

3

3. WhatsApp MCP picks up delivery

The same host config wires a third stdio child: whatsapp-mcp. The agent calls whatsapp_search with the contact name, gets back an indexed list of matching chats, and picks the index it wants. Same JSON-RPC shape as every other MCP child.

4

4. The send is verified against the chat itself

whatsapp_send_message pastes the message into the compose field via Cmd+V, presses Return, sleeps 1.0 second, and re-walks the WhatsApp accessibility tree. It looks for an AXGenericElement whose description begins with the literal prefix 'Your message, ' and matches the text it just typed. Found means verified:true. Not found means verified:false plus the last bubble it could see.

5

5. The agent reads back the loop

If you also wired Gmail MCP, the agent can write the result back into the original email thread with create_draft, leaving a paper trail of which channel the customer was actually reached on. The Google half owns the audit log, the WhatsApp half owns the delivery.

anchor fact

Google's Chat MCP ships exactly two tools. Both are read-only.

Per the published Workspace MCP configuration page, the Chat MCP surface is search_conversations and list_messages. There is no create_message, no post_to_space, no send. The Chat REST API supports posting, but the MCP layer above it does not expose it. The agent that reads a Chat space cannot reply through the same MCP server.

For comparison, WhatsApp MCP's send path is Sources/WhatsAppMCP/main.swift line 920 onward: paste, press Return, sleep 1.0s, re-walk the AX tree, and look for an AXGenericElement whose description begins with the literal prefix Your message, (line 930). Found means verified:true. That one prefix scan is the single observation Google's MCP servers cannot produce, because none of them can issue the send that would make the bubble exist in the first place.

The verification, in source

Worth showing because most discussions of MCP message delivery describe verification as a black box. Here it is plain Swift, eight lines, against the AX tree.

Sources/WhatsAppMCP/main.swift, line 920

If the prefix scan finds a match, the JSON response carries verified:true. If not, the response still says success:true (Cmd+V plus Return was issued) but flips verified to false and includes the last bubble it could find in a warning field. The agent then has enough to retry, escalate, or surface the failure to the operator. None of the Google servers exposes anything in this shape because none of them is observing a rendered chat in the first place.

Google Workspace MCP delivery vs WhatsApp MCP delivery

Same agent, two outbound surfaces, very different reach and shape.

FeatureGoogle Workspace MCP (Gmail / Calendar)WhatsApp MCP (macOS, AX-driven)
Tools that originate a message to a non-Google user0 in the official Workspace MCP catalog1 (whatsapp_send_message), with delivery verification
Authentication shapeOAuth 2.0 against googleapis.com, scope-gated per serviceLocal stdio child, no auth, gated by macOS Accessibility permission
Where the agent runsAnywhere with internet (HTTP transport)On the same Mac as the WhatsApp app (Catalyst, App Store install)
Reach in markets where most chat happens off-emailOnly the customer's email address. WhatsApp, SMS, iMessage all unreachable.Real WhatsApp inbox, the same number the customer already messages on
Cost per outbound messageFree for Gmail (rate-limited), but only reaches email-active usersFree, sends through your existing personal or business WhatsApp account
Delivery confirmationGmail's API returns 200 on accepted-for-delivery, no read stateAX-tree re-read returns verified:true when the bubble is visible in the chat

When Google's catalog is enough on its own

For an agent operating inside a Google org, against G Suite users, where everyone reads email and lives on Calendar, the Workspace MCP surface (Gmail plus Calendar plus Drive plus Chat plus People) is plenty. The empty cell I'm describing only matters once the audience extends to people who are not on Google. If your user base is a US-based SaaS team, you probably do not need this page.

For an agent serving a small operator in Brazil, India, Mexico, the UAE, or Indonesia, the email channel is effectively closed. Those customers reply on WhatsApp, full stop. The Gmail draft is a paper trail, not a delivery primitive. In that segment, the Google MCP servers handle the reasoning and the audit log; WhatsApp MCP handles the only channel the customer actually reads.

That is the entire pairing. The Google servers are not wrong; they are aimed at a different user. Adding one local stdio child fills the cell that the cloud-first catalog can't fill from the cloud.

Wiring Google Workspace MCP into a flow that has to reach a non-Google user?

30 minutes on the merged config, the OAuth shape on Google's side, the AX-tree verification on the WhatsApp side, and the cases where you genuinely don't need WhatsApp at all.

Frequently asked questions

Does Google ship an official MCP server that can send a message to anyone, anywhere?

Not for arbitrary recipients. The official catalog covers BigQuery, Cloud SQL, AlloyDB, Spanner, Firestore, Bigtable, GCE, GKE, Cloud Run, Cloud Storage, Pub/Sub, Logging, Monitoring, Maps, and Workspace (Drive, Calendar, Chat, People, Gmail). The only servers in that list whose surface includes a tool that puts text in front of a person are Gmail (create_draft, plus label/thread management) and Calendar (create_event, which can email a non-Google guest as a side effect). There is no SMS MCP, no Voice MCP, no consumer-messenger MCP. If your customer is on WhatsApp and not actively reading email, no published Google MCP server can deliver to them.

Is Google Chat MCP really read-only?

Per the published Workspace MCP configuration page (developers.google.com/workspace/guides/configure-mcp-servers), Chat ships exactly two tools: search_conversations and list_messages. There is no create_message, no post_to_space, no send. The Chat REST API supports those operations, but they are not yet exposed through the MCP layer. So an agent that wants to post into a Google Chat space has to use the REST API directly with a service account; it cannot do it through the published Chat MCP.

Why is Gmail MCP create_draft not a real outbound channel?

Two reasons. First, create_draft saves a message to the user's drafts folder; it does not send. The user (or another tool) still has to issue the send. The MCP surface as published does not include send_message, only the draft create plus label/search/thread plumbing. Second, Gmail is not where most of the customer base for a Brazilian gym, an Indian tutor, or an Egyptian e-commerce shop actually reads anything. Even if the agent could send autonomously, the recipient would not see the email for hours or days. The empty cell on the catalog table is real.

How does WhatsApp MCP for macOS fit alongside the Google MCP servers?

Identically to any other MCP child. The host (Claude Code, Cursor, Claude Desktop) reads a config that names servers and how to launch them; remote Google servers are HTTP entries with OAuth, the local WhatsApp server is a stdio entry that runs the whatsapp-mcp binary. The host forks the stdio child, opens HTTP connections to the remote ones, and presents the union of all tool surfaces to the agent. The agent then chains create_draft (Gmail) plus whatsapp_search plus whatsapp_send_message in a single turn.

What does verified delivery actually mean for the WhatsApp half?

After whatsapp_send_message presses Return, the WhatsApp MCP child sleeps 1.0 second and re-traverses the WhatsApp app's accessibility tree (Sources/WhatsAppMCP/main.swift, line 924). It collects every AXGenericElement, looks for one whose description begins with the literal string 'Your message, ', strips the timestamp suffix with a regex, and compares the resulting text against what the agent asked to send. If it matches, the JSON response carries verified:true. If not, the response still carries success:true (because Cmd+V plus Return was issued) but flips verified to false and includes the last bubble it found in a warning field. This is observation of the rendered chat, not a delivery webhook.

Does pairing Google MCP with WhatsApp MCP need any special infrastructure?

No server, no proxy, no glue service. The MCP host is the only integrator. You add the WhatsApp entry to the same JSON file that already lists your Google entries, restart the host, and the agent sees both tool surfaces at once. The cross-server chain (call Gmail, then call WhatsApp) is just two tool calls in the same turn from the agent's perspective. The state shared between them is whatever the agent puts into the prompt, not anything the servers know about each other.

Is the Google Workspace MCP a remote OAuth surface or a local one?

Remote. Each Google MCP server is hosted at a googleapis.com endpoint and authenticated via OAuth 2.0. Configuration differs slightly by client: Gemini CLI uses Desktop-app OAuth credentials in settings.json; Claude needs Web-application credentials with redirect URI https://claude.ai/api/mcp/auth_callback; other clients need HTTP transport with OAuth 2.0 support. To use Google's remote MCP servers from Claude.ai or Claude Desktop, you need an Enterprise, Pro, Max, or Team plan. WhatsApp MCP imposes none of this; it is local stdio with macOS Accessibility as the only gate.

Can the agent run Workspace MCP and WhatsApp MCP from the same prompt?

Yes, that is the entire point of the host model. A single tools/list call returns the union of every server's tool surface; the host routes each tools/call to the child that owns the named tool. From the agent's perspective there is no boundary between the Google half and the WhatsApp half, just a longer list of tools. The trade-off is that two of the children speak HTTP+OAuth to googleapis.com and one speaks stdio to a local Swift process, but the host abstracts that.

What if I want notifications and not chat? Pub/Sub looks like it should work.

Pub/Sub is machine-to-machine. It moves bytes between services. There is no human reader on the other end of a Pub/Sub topic unless you build the consumer side (a worker that reads the topic and pushes to email, push, or chat). The published Pub/Sub MCP exposes topic CRUD and publish, but the consumer of those messages has to be wired separately. For a real human-to-human notification you want either Gmail (if email is the channel) or a non-Google MCP that talks to the actual chat surface the human uses.

Can I do this without Workspace MCP at all and just use WhatsApp MCP?

Yes. WhatsApp MCP runs standalone with a single config entry and grants you 11 tools (search, open, send, read, list, navigate, scroll, status, start, quit, get_active_chat). For a flow that is purely WhatsApp-side (replies, follow-ups, reminders), the Google half is not needed. The pairing only matters when the agent is doing some Google-side reasoning (parsing email threads, scheduling on a calendar, looking up Drive files) and then needs to surface the result to a human who lives on WhatsApp.

Are there cases where this catalog grows and the empty cell goes away?

Possibly. The published Google MCP catalog is growing fast (Cloud Run, Cloud Storage, Resource Manager, Pub/Sub, Dataplex were all listed as in flight as of early 2026). Workspace's Chat MCP could plausibly add a send_message in a future release, which would close the in-Workspace loop, though it still would not reach a non-Google user. Gmail could plausibly add an autonomous send_message, which would close the email-side loop. Neither of those would extend Google's MCP into WhatsApp, SMS, iMessage, Telegram, or any consumer surface outside Google's perimeter. That cell stays empty until either Google or a third party publishes a server for the corresponding app. WhatsApp MCP for macOS is the third-party answer for one of those cells.