Announcing CIMD support for MCP Client registration
Learn more

Google Contacts MCP or Google Contacts API? A Decision Framework for AI Agents

Varun Krishnan
Senior Content Marketer

TL;DR

  • Google Contacts runs entirely on the People API. Google ships two paths for agents: the People API MCP (Model Context Protocol) server, currently in Developer Preview, and the People API itself. They are not close to equivalent in capability.
  • The People API MCP server exposes three read-only tools: search personal contacts, search the Workspace directory, and get the signed-in user's profile. It cannot create, update, delete, group, or batch anything. Every write lives in the People API.
  • Both paths authenticate with OAuth 2.0 and act as the authorizing user. Only the People API adds a service-account path with domain-wide delegation for headless, background runs; the MCP server requires an interactive per-user OAuth flow every time.
  • In a multi-tenant B2B agent, every user carries their own Google credential. That is N tokens to store, refresh, and revoke, and neither path does any of that for you.
  • Scalekit's Google Contacts connector wraps the full People API as 24 per-user scoped tools on a token vault, so you get complete contact management rather than three read-only tools, with the OAuth flow, refresh, and audit trail handled for you.

Your agent needs to read and write a user's Google Contacts. It has to resolve "email Sarah from security" to a real address, add a new lead to the right group, or clean up duplicates after an import. Google now gives you two ways in: a People API MCP server in Developer Preview, and the People API you may already know. They sound interchangeable. They are not. The tool coverage, the auth model, and what you carry in production all differ, and for contact writes specifically, one of those differences is a hard wall. Here is how to choose.

What each path actually is

Google Contacts has no standalone API of its own anymore; it is served entirely by the People API. Both the MCP server and the direct integration read and write the same underlying data, so the real question is which interface your agent should hold.

The Google Contacts MCP server

Google's People API MCP server is a remote, Google-hosted endpoint at https://people.googleapis.com/mcp/v1, reachable over HTTP with OAuth 2.0. It ships through the Google Workspace Developer Preview Program, so treat it as pre-GA and subject to change. It exposes a single toolset of three tools, all read-only: search_contacts, search_directory_people, and get_user_profile. It inherits the same permissions and governance as the signing-in user, and Google explicitly recommends screening prompts for injection because the host can read account data. Setup and endpoint details are in Google's People API MCP server documentation.

The Google People API

The People API is the full REST surface for Google Contacts, and it replaced the legacy Contacts API when Google turned that down in January 2022. It covers the entire contact lifecycle: create, read, update, and delete contacts; batch operations; contact groups and membership; "Other Contacts" reads plus copy-to-My-Contacts; directory list and search; and photo management. It authenticates with OAuth 2.0 for per-user delegation and, on Google Workspace, with a service account using domain-wide delegation. The reference lives in Google's People API documentation.

Comparing them where it matters for agents

The two paths overlap only on reads, and even there the API reaches further. For any agent that changes contact data, the comparison is short. For agents that only look people up, the MCP server is a genuinely convenient shortcut.

What your agent can actually do

The MCP server handles three lookup jobs. The People API handles those plus everything operational.

Capability
People API MCP server (Developer Preview)
Google People API
Search personal contacts
Yes (search_contacts)
Yes
Search Workspace directory
Yes (search_directory_people)
Yes
Get signed-in user profile
Yes (get_user_profile)
Yes
List full contact roster
No
Yes, with pagination and sync tokens
Create contact
No
Yes
Update contact
No
Yes
Delete contact
No
Yes
Batch create, update, delete
No
Yes, up to 200 per create or update and 500 per delete
Contact groups and membership
No
Yes
Other Contacts read and copy
No
Yes
Contact photo update and delete
No
Yes
List directory, not just search
No
Yes

Where the read-only ceiling sits

The MCP server is built for the "resolve a person before acting" step: find Sarah's email before drafting a message, confirm a directory colleague before scheduling, read the current user's profile. That is a real and common agent sub-task, and three tools is enough for it.

Everything past lookup is absent: no create, no update, no delete, no groups, no batch, no photo, no incremental sync. This is not a roadmap gap to design around. The Developer Preview server is a read surface today, and any write path has to run through the People API.

The auth path each one puts you on

Both paths run on OAuth 2.0 and both act as the authorizing user, so the agent can never exceed what that user can do. The difference shows up the moment there is no user sitting in front of the agent.

Auth dimension
People API MCP server
Google People API
Protocol
OAuth 2.0 only
OAuth 2.0, plus service account with domain-wide delegation
Consent flow
Interactive per-user OAuth
Interactive per-user OAuth, or admin-authorized delegation on Workspace
Headless or background runs
Not supported
Supported via service account and domain-wide delegation on Workspace
Write access
No
Yes
Typical scopes
contacts.readonly, directory.readonly, userinfo.profile
contacts, contacts.readonly, contacts.other.readonly, directory.readonly

The headless gap the API closes

If your agent runs on a schedule — say a nightly dedupe pass, a CRM-to-Contacts sync, or a bulk import from an onboarding sheet — there is no human to complete a browser consent. The MCP server has no answer for that; it requires an interactive per-user OAuth flow.

The People API does have an answer. A Google Workspace service account with domain-wide delegation authenticates server-to-server, with no user interaction, and acts across the domain's users. That path is Workspace-only; consumer Gmail accounts still require per-user OAuth. For background contact automation in a B2B product, the service-account option is the difference between shipping and not.

What you own in production

On the MCP path, Google manages the endpoint, the tool schemas, and permission enforcement. You still own the OAuth client, per-user token storage, refresh, and revocation, plus injection screening on untrusted input. Because the server is Developer Preview, you also absorb whatever changes when it moves toward general availability.

On the People API path, you own more: OAuth or service-account setup, token lifecycle, retries and error handling, pagination and sync-token bookkeeping, and the tool schemas your model needs. The API is versioned and stable, which is what you want for a deterministic pipeline, but the surface area you maintain is entirely yours.

When to use the MCP server, when to use the API

The choice tracks one axis: read-only lookup versus real contact management.

Use the People API MCP server when:

  • Your agent only needs to resolve or look people up: name to email, directory search, current-user profile, inside an interactive assistant where OAuth consent is natural.
  • You are prototyping a read-only contact feature and want a hosted endpoint without writing schemas.
  • You are inside an MCP host like Claude or Google Antigravity and accept Developer Preview status.

Use the Google People API when:

  • Your agent creates, updates, deletes, or organizes contacts, or manages groups; none of that exists on the MCP server.
  • You need batch operations, incremental sync, photo management, or full directory listing.
  • Your agent runs headless on a schedule and needs service-account or domain-wide delegation auth.
  • You are building a deterministic, versioned pipeline where an unplanned schema change is an incident.

The credential problem that exists on both paths

Both paths hand you a per-user credential and stop there. Neither gives you a vault, rotation logic, or a revocation flow, and that is the part that actually breaks in production.

The N-credential problem

A single OAuth token is fine in a demo. A multi-tenant B2B contacts agent is the opposite of a demo: every user authorizes their own Google account, so you hold one credential per user, times every tenant. That is N tokens to encrypt, refresh before expiry, and revoke the moment someone offboards. Miss the revocation and a token minted months ago still reads a user's contacts long after their account was disabled. The problem is identical whether you chose the MCP server or the API; only the token's shape differs. This is the core challenge covered in secure token management for AI agents at scale.

Where Scalekit fits

Scalekit's Google Contacts connector handles the per-user OAuth flow, encrypted token storage, and automatic refresh, so the MCP-versus-API decision never touches your auth infrastructure. Credentials stay in the vault and never enter your agent runtime. What the user can't do, the agent can't do, because every call resolves to that user's own connected account. The full setup lives in the Google Contacts connector documentation.

Connect Google Contacts with Scalekit in Python

Scalekit wraps the People API as 24 LLM-ready tools, so you skip schema writing, OAuth plumbing, and token handling. The example below uses the Anthropic SDK; the identical connected-account pattern works with LangChain, CrewAI, Google ADK, and Mastra.

Install and configure

Install the SDKs, then set your Scalekit credentials from the dashboard under Developers, then API Credentials.

pip install anthropic scalekit-sdk-python python-dotenv protobuf # .env SCALEKIT_ENVIRONMENT_URL=https://your-env.scalekit.cloud SCALEKIT_CLIENT_ID=skc_... SCALEKIT_CLIENT_SECRET=test_... ANTHROPIC_API_KEY=sk-ant-...

Discover the scoped tools, then run the loop

The sequence is discovery, then scope, then execution. list_scoped_tools returns only the tools the current user's connected account is authorized to call, filtered to the googlecontacts connection. execute_tool then runs the tool the model picks, as that user, using the vaulted token. The connection name in the filter must match the connection you created in the Scalekit dashboard, character for character.

import os import anthropic import scalekit.client from dotenv import find_dotenv, load_dotenv from google.protobuf.json_format import MessageToDict load_dotenv(find_dotenv()) scalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), ) actions = scalekit_client.actions claude = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY")) CONNECTION = "googlecontacts" IDENTIFIER = "user_123" # resolve from your authenticated session in production # 1. Ensure the user has an active Google Contacts connection account = actions.get_or_create_connected_account( connection_name=CONNECTION, identifier=IDENTIFIER, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION, identifier=IDENTIFIER ) print("Authorize Google Contacts:", link.link) input("Press Enter after authorizing...") # 2. Discovery to scope: only the tools this user's account is authorized to call scoped_response, _ = actions.tools.list_scoped_tools( identifier=IDENTIFIER, filter={"connection_names": [CONNECTION]}, page_size=100, ) tools = [ { "name": MessageToDict(t.tool).get("definition", {}).get("name"), "description": MessageToDict(t.tool).get("definition", {}).get("description", ""), "input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}), } for t in scoped_response.tools ] # 3. Execution: the standard Anthropic tool-use loop messages = [{ "role": "user", "content": "Find everyone with an acme.com email in my contacts and add them to a 'Partners' group.", }] while True: response = claude.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=tools, messages=messages, ) if response.stop_reason == "end_turn": print(response.content[0].text) break tool_results = [] for block in response.content: if block.type == "tool_use": try: result = actions.execute_tool( tool_name=block.name, identifier=IDENTIFIER, tool_input=block.input, ) content = str(result.data) except Exception as error: content = f"Error: {error}" tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": content, }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

The same pattern across frameworks

Swap the connection name and the prompt, and the same code drives any connector. The AgentKit framework examples cover LangChain, CrewAI, Google ADK, Mastra, and Vercel AI, each on the same connected-account model, so the auth and tool-calling shape does not change when you switch runtimes.

Why the Scalekit path wins for Google Contacts agents

Going through Scalekit is not just convenience; it changes what your agent can do and how safely it does it.

Full contact management, not three read-only tools

Google's official MCP server gives you three read-only tools in Developer Preview. Scalekit's connector gives you the full People API surface as per-user scoped tools you can call today: create, update, delete, groups, batch, other-contacts, and directory. You are not choosing between reads and writes; you get the whole surface, scoped to each user.

Per-user scope and downstream auth logs

Every tool call runs as the authorizing user and lands in an audit log with full attribution: who authorized it, which agent ran it, which tool executed, and the result. That log is queryable and exportable to your SIEM, which is what turns "the agent updated a contact" into an accountable action rather than a shared service-account entry. Understanding audit trails for agent auth in B2B SaaS is key to what downstream observability captures.

Virtual MCP for multi-tool, multi-tenant agents

Most real contacts agents are not contacts-only; they read a calendar, check Gmail, and update a CRM in the same run. A standard MCP server exposes every tool it has, which bloats context and widens blast radius. Scalekit Virtual MCP Servers invert that: you declare which connections and which tools a role may see, and you get one static endpoint. Per-user isolation comes from a short-lived session token minted before each run and scoped to that user's connected accounts. One server definition serves everyone; the endpoint is static, the identity is not. That is the model for multi-tool, multi-tenant agents without standing up a server per user.

Which one to build against

If your agent only resolves and looks people up, and you are comfortable on a Developer Preview surface, the People API MCP server is a fast read-only shortcut. If your agent creates, updates, groups, or syncs contacts, or runs headless, build against the People API; the MCP server has no write path at all. Most production contacts agents need writes, which makes the API the default and the MCP server a narrow read helper on top of it. Either way, the credential management is the same problem, and that is the part worth solving with infrastructure rather than rebuilding per connector. Understanding credential ownership across agent tool-calling patterns can help you make the right architectural call. Browse the Scalekit Google Contacts connector or compare plans on the pricing page.

Build with the people building this

If you are wiring a Google Contacts agent and want a second pair of eyes on the auth model, join the Scalekit Slack community or talk to an engineer for direct help. For patterns to start from, see the CRM agent, meeting prep agent, and sales call prep agent templates. For a deeper look at how token refresh works for AI agents in production, the linked guide covers the full lifecycle.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Agent
Auth Quickstart

Acquire enterprise customers with
zero upfront cost.

Every feature unlocked. No hidden fees.