Skip to main content
Glama
A1-x-Tech

A1 Google Contacts MCP

Google Contacts MCP

English | Русский

npm CI Glama License: MIT

A1 Google Contacts MCP lets an AI app manage your Google address book in plain language. Find a contact, create or update one, organize contacts with labels, run batch imports and clean-ups, and turn auto-saved "Other contacts" into real ones.

It uses the Google People API — the API behind Google Contacts — with your Google account. It guards every update against concurrent edits, keeps reads compact with explicit field masks and makes the limits of the People API explicit instead of implying that every contacts task is possible.

  • 19 tools. List, search and read contacts, create, update and delete them one at a time or in batches, manage contact groups and membership, and reach "Other contacts".

  • Updates don't clobber. Every update is etag-guarded: if a contact changed elsewhere since it was read, the write fails instead of silently overwriting the concurrent edit.

  • Deletes are real. The People API has no trash; deleting a contact or group is permanent, and the server marks those tools destructive so your AI app can ask first.

  • Minimal Google scopes. It uses contacts for read/write — contacts.readonly is enough for a read-only setup — plus contacts.other.readonly only for "Other contacts", without broad account access.

Start with a read-only question:

Find everyone from Acme in my contacts and show their emails and phone numbers.

Connect the server · Explore use cases · Open technical documentation


See it work in a minute

You: Show my contact card for Jane Doe — email, phone and company.

Assistant: Finds the contact and shows the requested fields. Nothing changes.

You: Change her phone number to +1 415 555 0100 and add her to the "Clients" label.

Assistant: Shows the contact and the proposed change, then asks for confirmation before writing.

You: Confirm.

Assistant: Applies the etag-guarded update and the label. If the contact changed elsewhere in the meantime, the write fails instead of overwriting it.

Related MCP server: MCP Google Contacts Server

Contents

Quick start

You need Node.js 20+, a Google account and OAuth credentials from a Google Cloud project with the People API enabled.

  1. Prepare Google OAuth access.

  2. Add the server to your AI app.

  3. Ask the read-only question above.

In the app: open Settings → MCP servers, select Add server, choose STDIO, enter the command npx -y mcp-google-contacts@latest and environment variables GOOGLE_CONTACTS_CLIENT_ID, GOOGLE_CONTACTS_CLIENT_SECRET, GOOGLE_CONTACTS_REFRESH_TOKEN, then select Save and Restart.

From the command line:

codex mcp add google-contacts \
  --env GOOGLE_CONTACTS_CLIENT_ID=your_client_id \
  --env GOOGLE_CONTACTS_CLIENT_SECRET=your_client_secret \
  --env GOOGLE_CONTACTS_REFRESH_TOKEN=your_refresh_token \
  -- npx -y mcp-google-contacts@latest
codex mcp list

Codex MCP documentation

claude mcp add \
  --env GOOGLE_CONTACTS_CLIENT_ID=your_client_id \
  --env GOOGLE_CONTACTS_CLIENT_SECRET=your_client_secret \
  --env GOOGLE_CONTACTS_REFRESH_TOKEN=your_refresh_token \
  --transport stdio --scope user google-contacts \
  -- npx -y mcp-google-contacts@latest
claude mcp list

Claude Code MCP documentation

The current official path is Settings → Extensions. For a custom desktop extension, open Advanced settings → Extension Developer → Install Extension…, select a .mcpb file and follow the prompts.

This repository currently publishes an npm stdio package and does not contain a .mcpb bundle. For Claude Desktop builds that still support local configuration, use the following JSON stdio configuration as a fallback:

{
  "mcpServers": {
    "google-contacts": {
      "command": "npx",
      "args": ["-y", "mcp-google-contacts@latest"],
      "env": {
        "GOOGLE_CONTACTS_CLIENT_ID": "your_client_id",
        "GOOGLE_CONTACTS_CLIENT_SECRET": "your_client_secret",
        "GOOGLE_CONTACTS_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

In those builds, save it to ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows.

Claude Desktop MCP documentation

Add this to ~/.cursor/mcp.json on macOS/Linux or %USERPROFILE%\.cursor\mcp.json on Windows:

{
  "mcpServers": {
    "google-contacts": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "mcp-google-contacts@latest"],
      "env": {
        "GOOGLE_CONTACTS_CLIENT_ID": "your_client_id",
        "GOOGLE_CONTACTS_CLIENT_SECRET": "your_client_secret",
        "GOOGLE_CONTACTS_REFRESH_TOKEN": "your_refresh_token"
      }
    }
  }
}

Cursor MCP documentation

Run MCP: Open User Configuration and add:

{
  "servers": {
    "google-contacts": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "mcp-google-contacts@latest"],
      "env": {
        "GOOGLE_CONTACTS_CLIENT_ID": "${input:contacts_client_id}",
        "GOOGLE_CONTACTS_CLIENT_SECRET": "${input:contacts_client_secret}",
        "GOOGLE_CONTACTS_REFRESH_TOKEN": "${input:contacts_refresh_token}"
      }
    }
  },
  "inputs": [
    { "type": "promptString", "id": "contacts_client_id", "description": "Google OAuth client ID" },
    { "type": "promptString", "id": "contacts_client_secret", "description": "Google OAuth client secret", "password": true },
    { "type": "promptString", "id": "contacts_refresh_token", "description": "Google OAuth refresh token", "password": true }
  ]
}

Check it with MCP: List Servers.

VS Code MCP documentation

What you can ask it to do

Find and inspect contacts

  • Find everyone from Acme and show their emails and phone numbers.

  • Show who is in the "Clients" label.

  • List the contacts that changed since the last sync.

Keep the address book up to date

  • Create a contact for Jane Doe with her email, phone and company.

  • Update a contact's phone number or job title.

  • Import fifty people in one batch, or delete outdated contacts in one call.

Organize with labels

  • Create a "Clients" label and add these contacts to it.

  • Rename a label, or move a contact from one label to another.

  • Delete a label without deleting its contacts — or with them, but only when asked explicitly.

Work with "Other contacts"

  • Show the addresses Google saved automatically that are not in my contacts.

  • Copy one of them into My Contacts as a real contact.

How a contact changes

  1. Every contact, group and Other contact has a full resource name (people/c..., contactGroups/..., otherContacts/...); tools address records by it, exactly as the API returns it.

  2. Reads return only the fields named in the field mask (default: names, emails, phones, organizations, group memberships). An absent field may simply be outside the mask, not empty.

  3. An update replaces each provided field group as a whole and is guarded by an etag: if the contact changed elsewhere since it was read, the write fails instead of overwriting the concurrent edit.

  4. Deletes are permanent. The People API has no trash and no undo.

Search covers a cache that can lag recent writes by a few seconds and returns at most 30 results. "Other contacts" — addresses Google saves automatically — can only be read or copied into My Contacts, not edited in place. Contact photos have no dedicated tool; raw_request reaches those endpoints.

What can change

Operation

What happens

Confirmation boundary

Read, search or batch-read contacts and groups

Reads contact data

No change

Create a contact, a group or a batch of contacts

Adds records

Changes Google Contacts

Update a contact or rename a group

Replaces the provided field groups, etag-guarded

Changes a contact

Change label membership

Adds or removes a label on chosen contacts

Changes contacts

Copy an Other contact

Adds a real contact to My Contacts

Changes Google Contacts

Delete a contact, a group or a batch

Removes records permanently; deleting a group deletes its member contacts only when explicitly requested

Destructive

Raw API request

Can call API methods without a dedicated tool

Potentially destructive

The AI client controls confirmation prompts. The server marks reads, writes and destructive tools so the client can distinguish an inspection from a live change.

Getting access

Google Contacts requires OAuth 2.0; an API key is not enough.

  1. Create or select a Google Cloud project and enable People API.

  2. Configure the OAuth consent screen and create a Desktop app OAuth client.

  3. Authorize the Google account whose contacts you want to manage. The OAuth 2.0 Playground can obtain the refresh token when Use your own OAuth credentials is enabled.

  4. Request the minimal scopes for what you use:

    https://www.googleapis.com/auth/contacts
    https://www.googleapis.com/auth/contacts.other.readonly

contacts covers reading and writing contacts and groups; for a read-only setup contacts.readonly alone is enough. contacts.other.readonly is needed only by the "Other contacts" tools. A 403 on a single tool usually means the refresh token was minted without the scope that tool needs — re-consent with the missing scope added.

Testing-mode OAuth refresh tokens can expire after seven days. Publish the OAuth app, or use an Internal app in a Workspace domain, when you need long-lived access. Treat the client secret and refresh token as passwords.

Configuration

Variable

Required

Description

GOOGLE_CONTACTS_CLIENT_ID

Yes*

OAuth client ID.

GOOGLE_CONTACTS_CLIENT_SECRET

Yes*

OAuth client secret.

GOOGLE_CONTACTS_REFRESH_TOKEN

Yes*

OAuth refresh token.

GOOGLE_CONTACTS_ACCESS_TOKEN

Yes*

Short-lived alternative to the OAuth trio (~1 h).

GOOGLE_CONTACTS_API_BASE

No

Google People API base URL override.

GOOGLE_CONTACTS_TIMEOUT_MS

No

Per-request timeout; default 60000 ms.

GOOGLE_CONTACTS_MAX_RETRIES

No

Temporary-error retries; default 3.

* Provide either the OAuth trio or an access token. With no credentials at all the server still starts and completes the MCP handshake; the first tool call then names the exact variables to set.

Data, limits and background work

  • Requests go to Google. The local server refreshes Google OAuth tokens and calls the People API at people.googleapis.com. Its anonymous telemetry contains an installation ID, package version, AI client and platform versions, and tool names — never OAuth tokens, contact data, tool arguments or prompts. Set ASKADS_TELEMETRY=0 to opt out.

  • Google quotas are per-user and low. The default People API quota allows roughly 90 reads and 90 writes per user per minute, so the batch tools beat loops of single calls; mutating batches must run one at a time. On 429 the server backs off and retries; reads also retry after network and 5xx errors, while writes are not replayed after an uncertain failure.

  • There is no background polling. The server runs only when called. list_contacts supports sync tokens, so an AI app with scheduled tasks can periodically fetch only what changed; a sync token expires after about seven days, after which a full re-list is needed.

Technical documentation

Support

Found a bug or need a scenario? Create an issue or write in Telegram.

Available Tools

19 tools
batch_create_contactsCreate many contacts at onceA

Creates up to 200 contacts in one call (People API people:batchCreateContacts). Each entry takes the same normalized fields as create_contact (name parts, emails[], phones[], addresses[], organization, birthday, notes, urls[]) and needs at least one. Returns createdPeople[] with each new resourceName. The call is atomic — a validation error anywhere creates nothing — but after an AMBIGUOUS failure (timeout/5xx; never auto-retried) the batch may still have committed: check via list_contacts before re-sending, or every contact gets created twice (the API has no duplicate detection). Send mutate batches sequentially, never in parallel — that is also how the per-user write quota stretches furthest.

ParametersJSON Schema
NameRequiredDescriptionDefault
contactsYesThe contacts to create (1..200), each with the create_contact field set.
read_maskNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=false), the description discloses critical behaviors: atomicity for validation errors, the risk that an ambiguous timeout/5xx may still commit, absence of duplicate detection, no auto-retry, and the requirement to verify via list_contacts. This is exactly the non-obvious behavior an agent needs before invoking a batch write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: what the call does/scales to, the return shape, atomicity and ambiguity handling, and the sequential-send/quota guidance. The most decision-relevant facts are front-loaded and no schema content is repeated verbatim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex batch-write tool with no output schema, the description is complete: it names the return array and resourceName, explains failure semantics and retry safety, addresses duplicate creation, and covers quota/concurrency. An agent has enough to invoke it correctly and to recover from the API's ambiguous failure mode.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds value by saying the entries use the same normalized fields as create_contact and that each entry needs at least one field, which the schema does not explicitly require for the item objects. This helps agents compose valid contacts parameter values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb ('Creates'), resource ('contacts'), upper bound ('up to 200 in one call'), and the underlying API. It also links entry fields to create_contact, distinguishing this bulk creation tool from single-contact siblings such as create_contact and batch_update_contacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly defines the batch's scope (up to 200 contacts per call) and gives operational directives: re-check via list_contacts after an ambiguous failure and never send mutate batches in parallel. It does not explicitly state 'use create_contact for exactly one contact,' but the 'same normalized fields as create_contact' comparison plus title makes the bulk-vs-single distinction recoverable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_delete_contactsDelete many contacts at onceA
Destructive

Permanently deletes up to 500 contacts in one call (People API people:batchDeleteContacts). There is no undo through this API — list the exact resource names first (batch_get_contacts shows what each one is) and treat the call as final. Returns an empty result on success; atomic per request. After an ambiguous failure (timeout/5xx; never auto-retried) check which contacts still exist via batch_get_contacts instead of re-sending — the deletes may have committed, and a second call then reports NOT_FOUND.

ParametersJSON Schema
NameRequiredDescriptionDefault
resource_namesYesThe contacts to delete permanently (1..500 people/<id> resource names).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=false, and the description meaningfully expands on these: no undo, permanent deletion, empty result on success, atomicity per request, never auto-retried, and the NOT_FOUND outcome on a re-send after a committed delete. This substantially clarifies runtime behavior beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, each earning its place: the first states scope and permanence, the second gives the required precondition and finality, and the third explains failure recovery. It is front-loaded with the core behavior and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one parameter, no output schema, and destructive/idempotent behavior, the description covers all important operational aspects: batch limit, preconditions, return value, atomicity, retry guidance, and post-failure verification. Nothing an agent needs to safely invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with the resource_names property already fully documented including format, pattern, min/max, examples, and exact source. The description adds the contextual note to enumerate resource names first, but does not need to repeat param semantics because the schema is comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Permanently deletes'), the resource ('contacts'), the exact scale ('up to 500 contacts in one call'), and maps to the underlying API ('People API people:batchDeleteContacts'). It is clearly distinguished from the sibling delete_contact by the batch scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: list resource names first, use batch_get_contacts to confirm identities, and treat the call as final. It also prescribes exactly how to handle ambiguous failures—checking existing contacts instead of re-sending—which is strong usage guidance beyond a generic alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_get_contactsGet many contacts at onceA
Read-onlyIdempotent

Fetches up to 200 contacts in one call (People API people:batchGet) — far cheaper against the tight per-user quota than a get_contact loop. Returns responses[], one per requested resource name IN THE SAME ORDER, each { requestedResourceName, status, person }; a missing contact gets a NOT_FOUND status in its own entry instead of failing the whole call, so check per-entry status. person_fields works exactly like in get_contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
person_fieldsNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.
resource_namesYesThe contacts to fetch (1..200 people/<id> resource names).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses ordering guarantees, per-entry response shape, NOT_FOUND handling instead of whole-call failure, and the requirement to check per-entry status. This is exactly the operational detail an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences deliver the core behavior, quota rationale, response format, and per-entry error handling without filler. The most decision-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema present, the description supplies a complete mental model of the return value, error semantics, ordering, and field behavior. An agent can invoke it confidently without inspecting other tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, and the description adds useful parametric context: person_fields behaves exactly as in get_contact and responses are returned in the same order as requested resource_names. These are meaningful additions beyond the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Fetches up to 200 contacts in one call'), identifies the underlying People API operation, and clearly distinguishes batch_get_contacts from the get_contact loop. The title and description together make its scope obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly frames the tool as the cheaper alternative to a get_contact loop under tight per-user quota, giving an agent a clear selection rule for batch retrieval. The comparison to get_contact is the needed routing guidance relative to siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

batch_update_contactsUpdate many contacts at onceA
DestructiveIdempotent

Updates up to 200 contacts in one call (People API people:batchUpdateContacts). Each entry names a contact (resource_name, optional etag — missing etags are auto-fetched in ONE extra batchGet read) plus the same normalized fields as update_contact. CAUTION — the API applies ONE shared update mask to the whole batch, computed here as the union of every entry's provided field groups: a group that one entry provides and another omits is CLEARED on the omitting entry. Safest is to give every entry the same set of fields; each provided group replaces its stored group as a whole, exactly like update_contact. Atomic per request; a stale etag fails the whole batch with 400 — re-read and retry deliberately, never blindly.

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesYesThe updates (1..200) — give every entry the same set of contact fields (shared mask).
read_maskNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses critical behavior: the shared update-mask union, the clearing of omitted field groups, auto-fetching missing etags with an extra batchGet, atomicity per request, and whole-batch failure on stale etags. This is exactly the kind of non-obvious behavior an agent needs to avoid dangerous mistakes. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries load-bearing information. It front-loads the core capability, then uses a CAUTION marker to highlight the dangerous shared-mask behavior, and closes with a concrete failure/recovery rule. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the limit, the etag semantics, the destructive clearing behavior, atomicity, the 400 failure mode, and a deliberate retry strategy. Given the annotations and rich schema, nothing essential for correct invocation is missing. The lack of an output schema is not a significant gap because the primary risks are all disclosed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema documents each field, the description adds essential batch-level semantics: the update mask is shared across entries, a field group omitted by one entry but provided by another is cleared, and each provided group replaces its stored group as a whole. It also clarifies the optional etag behavior and the safe pattern of giving every entry the same fields. This significantly exceeds schema-only information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states exactly what the tool does: "Updates up to 200 contacts in one call" and identifies the underlying API. It clearly distinguishes itself from the singular update_contact by emphasizing batch scope and by referencing "the same normalized fields as update_contact." The verb, resource, and scale are all explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this when updating many contacts at once, up to 200. It references update_contact for field semantics, which helps an agent understand the relationship, but it does not explicitly state "for a single contact, use update_contact" or list exclusions. The usage is strongly implied but not fully spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copy_other_contactCopy an Other contact into My ContactsA

Copies an 'Other contact' (from list_other_contacts) into the user's saved contacts — the only write that exists for Other contacts. copy_mask picks which fields carry over (names, emailAddresses, phoneNumbers; default all three). Returns the NEW saved person — use its resourceName ('people/c...') for further edits; the original otherContacts entry remains. Copying the same entry twice creates duplicate saved contacts. Requires BOTH the contacts and contacts.other.readonly OAuth scopes.

ParametersJSON Schema
NameRequiredDescriptionDefault
copy_maskNoFields to copy into the new saved contact (default all three).
read_maskNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.
resource_nameYesThe Other-contact's full resource name, e.g. "otherContacts/c123" — from list_other_contacts.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it explains that the operation returns the new saved person, that the original otherContacts entry remains, that duplicate executions create duplicates, and that two OAuth scopes are required. These are critical behavioral details not present in the boolean hints alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the core operation, field-selection behavior, return-value guidance, side effects, duplicate risk, and scopes are packed into a compact but information-dense description. The key action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the input source, the mask semantics, the return value's resourceName, the non-destructive nature, the idempotency caveat, and required permissions. Agents have enough context to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions already explain defaults and allowed values. The description adds marginal value by restating the copy_mask default and the resource_name source, but it does not explain read_mask beyond what the schema provides, so it meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Copies'), a precise source ('Other contact'), and a destination ('user's saved contacts'), and explicitly identifies this as 'the only write that exists for Other contacts.' This clearly distinguishes it from siblings like list_other_contacts and create_contact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Directly tells the agent when to use this tool by declaring it is the only write operation for Other contacts, and gives the source via 'from list_other_contacts.' It also describes the copy_mask selection fields and duplicate behavior, providing actionable when-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_contactCreate a contactA

Creates a new contact in the account's Google Contacts and returns the created Person (resourceName, etag and the person_fields mask — use the resourceName for every later call). Provide any subset of the normalized fields: name parts, nickname, emails[], phones[], addresses[], organization, birthday, notes, urls[]; at least one is required. The API has NO duplicate detection — creating the same contact twice yields two contacts, so after an ambiguous failure (timeout/5xx; never auto-retried) check via search/list before re-sending. A just-created contact appears in list_contacts/get_contact immediately but reaches the search_contacts index with a delay. Contact photos need raw_request (updateContactPhoto).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlsNoWebsites. On update this list replaces ALL existing urls; [] clears them.
notesNoFree-text notes (the "Notes" field in Google Contacts). On update "" clears it.
emailsNoEmail addresses. On update this list replaces ALL existing emails; [] clears them.
phonesNoPhone numbers. On update this list replaces ALL existing phones; [] clears them.
prefixNoHonorific prefix, e.g. "Dr.".
suffixNoHonorific suffix, e.g. "Jr.".
birthdayNoBirthday: "YYYY-MM-DD", or "MM-DD" for a year-less birthday. On update "" clears it.
nicknameNoNickname. On update "" clears it.
addressesNoPostal addresses. On update this list replaces ALL existing addresses; [] clears them.
given_nameNoFirst name.
family_nameNoLast name.
middle_nameNoMiddle name.
organizationNoEmployer info. On update it replaces the existing organizations; {} clears them.
person_fieldsNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-readOnly, non-idempotent, non-destructive, and open-world. The description enhances this by detailing the lack of duplicate detection, the never auto-retry policy, the eventual consistency for search indexing, and the photo limitation. These behavioral details go beyond what annotations convey and help the agent anticipate side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries operational value. It is front-loaded with the purpose and return object, then systematically covers required fields, failure handling, indexing delay, and photos. Slightly long but not padded; could be trimmed without loss, but structure is sound.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 14 parameters (nested objects) and no output schema, the description covers all essential operational aspects: return values, required-field rule, duplicate risk, failure strategy, indexing behavior, and photo limitation. It fully equips an agent to call correctly and handle edge cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful constraints not in the schema: 'at least one is required' and the default person_fields mask, plus the clarification that an absent field may be unmasked. This goes beyond simple restatement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Creates a new contact in the account's Google Contacts and returns the created Person' — a specific verb and resource, clearly distinguishing it from update_contact, list_contacts, and sibling tools. It names the return object and its fields, leaving no ambiguity about the tool's intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: states the requirement of at least one field, warns against auto-retry on ambiguous failures, instructs to verify via search/list before re-sending, and notes the indexing delay for search_contacts. It also names the photo-related alternative (raw_request with updateContactPhoto), providing clear routing among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_contact_groupCreate a contact groupA

Creates a new user contact group (label) and returns it (resourceName contactGroups/, name, etag). Group names must be unique — creating a duplicate name fails with 409 CONFLICT rather than making a second group. Put contacts into the new group with modify_group_members.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe group's display name (must be unique among the user's groups).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important non-obvious behavior: duplicate names fail with 409 CONFLICT instead of creating a second group, and the response includes resourceName, name, and etag. This adds value beyond the annotations by explaining idempotency failure, uniqueness enforcement, and return payload.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with every sentence contributing useful information. It states the action, the return format, the uniqueness constraint, and the next logical step in three sentences without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter creation tool with no output schema, the description is complete: it covers what is created, the return value, an important error behavior, and the follow-up tool. An agent has enough information to call this tool correctly and understand the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the name parameter's uniqueness is already documented in the schema. The description reinforces the uniqueness rule and adds the specific 409 failure mode, but it does not need to add more since the schema already captures the parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it creates a new user contact group (label) and returns it. It also clarifies the resource identifier format, which distinguishes it from sibling tools like create_contact and list_contact_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when this tool is appropriate: when a new contact group is needed. It also provides a pointer to modify_group_members for populating the group, giving useful workflow context. It does not explicitly exclude alternatives such as create_contact, but the purpose is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_contactDelete a contactA
Destructive

Permanently deletes one contact from the account's Google Contacts. There is no undo through this API (the Google Contacts UI keeps its own 30-day trash, but nothing here reads or restores it) — verify the resource_name with get_contact before deleting. Returns an empty result on success. After an ambiguous failure (timeout/5xx; never auto-retried) check with get_contact before re-sending: the delete may already have happened, and a second attempt then fails with 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
resource_nameYesThe contact's full resource name, e.g. "people/c1234567890" — exactly as returned by list_contacts, search_contacts or create_contact.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing permanence, no API-level undo, the Google Contacts 30-day trash caveat, empty success return, and the non-idempotent failure mode where a retry after a timeout may hit 404. This fully aligns with destructiveHint=true and idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: irreversibility, verification step, return behavior, and failure handling. The core action is front-loaded, and the added detail is dense rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive single-parameter tool with no output schema, the description covers return value, preconditions, irreversibility, and recovery from ambiguous failures. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with resource_name already fully described including pattern, example, and how to obtain it. The description adds verification guidance but no new parameter semantics, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Permanently deletes one contact from the account's Google Contacts.' The phrase 'one contact' distinguishes it from the batch sibling while the resource 'contact' distinguishes it from delete_contact_group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear procedural guidance: verify resource_name with get_contact before deleting, and check with get_contact after ambiguous failures before retrying. It does not explicitly name alternatives like batch_delete_contacts, but the 'one contact' scoping makes the primary use clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_contact_groupDelete a contact groupA
Destructive

Permanently deletes a user contact group (label). By default the member contacts SURVIVE — they only lose the label; delete_contacts=true also PERMANENTLY DELETES every contact in the group, so use it only when that is explicitly wanted (check the roster first via get_contact_group with max_members). System groups cannot be deleted. Returns an empty result on success; there is no undo through this API.

ParametersJSON Schema
NameRequiredDescriptionDefault
resource_nameYesThe group's full resource name, e.g. "contactGroups/12abc34d567" — from list_contact_groups.
delete_contactsNoAlso permanently delete every member contact (default false — contacts just lose the label).

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already signal destructive=true, non-readonly, and non-idempotent, and the description substantially enriches that: contacts survive by default, delete_contacts=true permanently deletes all members, there is no undo, and the return is an empty result. This fully discloses the destructive consequences.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences with the primary action front-loaded, followed by the crucial caveat and a practical pre-check. Every sentence earns its place, and the high-risk warning is placed immediately after the parameter mention.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no output schema, the description covers return behavior, irreversibility, system-group restrictions, member survival semantics, and how to verify the roster before mass deletion. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters well. The description adds a warning layer around delete_contacts and the default survival behavior, which is useful, but it does not introduce new meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a precise verb-resource pairing: 'Permanently deletes a user contact group (label).' It further distinguishes group deletion from member deletion, clarifies that it applies to user groups, and notes that system groups cannot be deleted, which separates it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when the dangerous delete_contacts=true option should be used ('only when that is explicitly wanted') and provides a safer alternative action: check the roster first via get_contact_group. It also gives a firm exclusion: 'System groups cannot be deleted.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactGet a contactA
Read-onlyIdempotent

Fetches one contact by resource name ("people/c...", or "people/me" for the signed-in user's own profile) with an explicit field mask. Returns a Person with resourceName, etag and the requested person_fields (default names, emailAddresses, phoneNumbers, organizations, memberships). The etag in the result is what update_contact needs to change this contact safely; memberships list the contact's groups as contactGroups/ resource names.

ParametersJSON Schema
NameRequiredDescriptionDefault
person_fieldsNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.
resource_nameYesThe contact's full resource name, e.g. "people/c1234567890" — exactly as returned by list_contacts, search_contacts or create_contact.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is its behavioral contract: the etag is what update_contact needs for safe optimistic updates, memberships surface as contactGroups/<id> resource names, and the return shape (resourceName, etag, requested person_fields) is disclosed. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no filler: sentence 1 states the operation and its two valid inputs, sentence 2 specifies the return envelope and defaults, sentence 3 ties the output to downstream tool contracts (update_contact etag, group memberships). Every sentence earns its place and the main verb is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly carries the burden of explaining the return value (Person with resourceName, etag, person_fields) and the field-mask default behavior. The openWorldHint and schema caveat cover unknown-fields behavior. The only notable omission is error behavior for unknown or malformed resource names, which is a minor gap for a read tool whose safety profile is fully annotated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: resource_name has a pattern plus a provenance hint, and person_fields has a full enum, minItems, and the critical 'absent field may be unmasked, not empty' caveat. The tool description only restates the default field list (names, emailAddresses, phoneNumbers, organizations, memberships), which the schema already captures. This lands at the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+method combination: 'Fetches one contact by resource name', and clarifies the two accepted forms ('people/c...' or 'people/me'). The single-contact scope distinguishes it from list_contacts, batch_get_contacts, and search_contacts without needing to open any sibling schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes clear usage context: use when you have a specific resource name, including the special 'people/me' self-profile case. The schema's resource_name description reinforces this by stating the name must come 'exactly as returned by list_contacts, search_contacts or create_contact', and the etag note points forward to update_contact. However, there is no explicit exclusion such as 'for multiple contacts use batch_get_contacts instead', so routing guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contact_groupGet a contact groupA
Read-onlyIdempotent

Fetches one contact group by resource name: name, groupType, memberCount and etag — plus, when max_members > 0, memberResourceNames[] with up to that many member contacts as people/ resource names (the only way the API returns a group's members; feed them to batch_get_contacts for details). The etag is what update_contact_group uses to rename safely.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_membersNoHow many member resource names to include (0 or omitted = none, just the group).
group_fieldsNoGroup fields to return (default metadata, groupType, memberCount, name).
resource_nameYesThe group's full resource name, e.g. "contactGroups/12abc34d567" — from list_contact_groups.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, it discloses the conditional behavior of max_members, the format of memberResourceNames as people/<id> resource names, and the significance of the etag for safe renames. This is useful operational detail that annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two well-structured sentences pack in return fields, member behavior, cross-tool routing, and etag semantics without redundancy. The most important action and resource appear first, and every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations and fully described schema, the description adds the missing behavioral and workflow context: what members look like, how to get their details, and how the etag is used downstream. No critical gap remains for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning by explaining that max_members controls whether members are included and by sourcing resource_name from list_contact_groups. It also ties the etag to update_contact_group, which is not evident from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: "Fetches one contact group by resource name," then concretely enumerates the fields returned. It also distinguishes itself from sibling tools by calling out that this is the only way to get group members and that the etag feeds update_contact_group.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: use this tool to fetch a single group and especially to obtain member resource names, since that is the only way the API returns them. It points to batch_get_contacts and update_contact_group as follow-up tools, though it does not explicitly state when to prefer list_contact_groups over this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contact_groupsList contact groupsA
Read-onlyIdempotent

Lists the account's contact groups (labels): contactGroups[] with resourceName (contactGroups/), name, groupType and memberCount, plus nextPageToken and totalItems. Two kinds come back: USER_CONTACT_GROUP (labels the user created — the only kind that can be renamed or deleted) and SYSTEM_CONTACT_GROUP (built-ins like contactGroups/myContacts and contactGroups/starred — fixed). group_fields defaults to metadata, groupType, memberCount, name; add memberCount explicitly if you narrow it and still want sizes. page_size up to 1000; sync_token works like in list_contacts (410 = expired, re-list in full).

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoGroups per page (1..1000, default 30).
page_tokenNonextPageToken from the previous page.
sync_tokenNoSync token from a previous listing — only changes since then.
group_fieldsNoGroup fields to return (default metadata, groupType, memberCount, name).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and idempotentHint annotations, the description discloses important behavior: the return envelope, the distinction between user-created and system-fixed groups, default group_fields behavior, page_size limits, and sync_token expiration semantics (410). This gives an agent a strong model of what will happen.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences cover return format, group taxonomy, field defaults, pagination, and sync behavior without fluff. Key information is front-loaded (what is returned), and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully compensates by enumerating the response fields and edge cases. It covers pagination, sync tokens, group types, and field customization, leaving little for an agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description adds substantial value beyond the schema. It explains the default group_fields, warns that memberCount must be explicitly included if narrowing fields, and clarifies page_size limits and sync_token expiration behavior. This is more than the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists the account's contact groups and specifies the exact response fields (contactGroups[], resourceName, name, groupType, memberCount, nextPageToken, totalItems). It also distinguishes the two group kinds (USER_CONTACT_GROUP vs SYSTEM_CONTACT_GROUP), which sets it apart from related siblings like get_contact_group or list_contacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The verb 'Lists' makes the primary use case obvious, and the description adds useful context about when you would care about member counts or sync tokens. It references list_contacts for sync_token behavior but does not explicitly state when to choose this tool over siblings like get_contact_group or list_contacts, so it falls short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contactsList contactsA
Read-onlyIdempotent

Lists the account's saved contacts (People API people/me/connections): connections[] of Person objects with resourceName, etag and the requested person_fields (default names, emailAddresses, phoneNumbers, organizations, memberships — an absent field may be unmasked, not empty), plus nextPageToken, totalItems and (when requested) nextSyncToken. page_size up to 1000 (default 100); paginate with page_token. For incremental polling set request_sync_token=true on a full listing, store nextSyncToken, and pass it as sync_token next time to get only changed/deleted people (deleted ones carry metadata.deleted=true); an expired token (~7 days) fails with HTTP 410 EXPIRED_SYNC_TOKEN — re-list without sync_token. Covers only the user's own saved contacts — not the Workspace directory and not auto-saved addresses (see list_other_contacts).

ParametersJSON Schema
NameRequiredDescriptionDefault
page_sizeNoContacts per page (1..1000, default 100).
page_tokenNonextPageToken from the previous page.
sort_orderNoSort order (default LAST_MODIFIED_ASCENDING). Ignored when sync_token is set.
sync_tokenNoSync token from a previous listing — returns only people changed since then.
person_fieldsNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.
request_sync_tokenNoAsk for a nextSyncToken on the last page (for later incremental syncs).

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive, and the description adds substantial behavioral context: absent person_fields may be unmasked rather than empty, deleted people carry metadata.deleted=true, sync tokens expire after ~7 days with HTTP 410, and pagination behavior is described. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but appropriately sized for a complex listing tool with no output schema. It is front-loaded with the core purpose, then covers pagination, incremental sync, error behavior, and exclusions without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description fully explains the return structure: connections[], resourceName, etag, person_fields, nextPageToken, totalItems, and nextSyncToken. It also covers pagination, sync token usage, expiration errors, and scope exclusions, making it complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents each parameter. The description still adds meaningful semantics beyond the schema, such as default person_fields, absent-field masking behavior, sync token expiry, and pagination flow. It does not add new detail for sort_order, but the schema already covers that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Lists the account's saved contacts (People API people/me/connections)'. It also distinguishes itself from siblings by explicitly excluding the Workspace directory and auto-saved addresses, pointing to list_other_contacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly defines when this tool is appropriate: for the user's own saved contacts, and explicitly says it is not for the Workspace directory or auto-saved addresses, naming the sibling alternative. It also explains when to use incremental sync via sync_token and request_sync_token.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_other_contactsList or search Other contactsA
Read-onlyIdempotent

Lists 'Other contacts' — addresses Google auto-saved from the user's email interactions; they are NOT in the saved contact list and never appear in list_contacts/search_contacts. Give query to search them instead of listing (prefix match, max 30 results, no pagination — the warmup request is sent automatically before the session's first search); without query it lists with page_token pagination (page_size up to 1000) and optional sync tokens (request_sync_token/sync_token; expired ones fail with 410 — re-list in full). Only names, emailAddresses, phoneNumbers, photos and metadata exist here. Other contacts are read-only: to edit one, first make it a real contact with copy_other_contact. Requires the contacts.other.readonly OAuth scope — a 403 means the refresh token was minted without it.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoSearch text; when set, page_token and sync tokens are invalid.
page_sizeNoPage size when listing (1..1000, default 100); max matches when searching (1..30).
read_maskNoFields to return (default names, emailAddresses, phoneNumbers) — Other contacts have no more.
page_tokenNonextPageToken from the previous page (listing only).
sync_tokenNoReturn only changes since this token (listing only).
request_sync_tokenNoAsk for a nextSyncToken (listing only).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description reinforces them ('Other contacts are read-only') while adding substantial behavior beyond the annotations: the automatic warmup request before the first search, prefix-match search capped at 30 with no pagination, sync-token 410 failure semantics, and the OAuth scope requirement with the 403 diagnostic. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence is functional — the core definition and sibling distinction are front-loaded, followed by modes, field set, edit path, and auth. It is a single long paragraph that could be structured with clearer separation between the search and list modes, but there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-mode tool with pagination, sync tokens, auth requirements, and no output schema, the description is complete: it covers the returnable field set, error semantics (410, 403), the automatic warmup, scope requirements, and the editing pathway. An agent has everything needed to invoke and interpret this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine cross-parameter meaning: setting query invalidates page_token and sync tokens, search caps at 30 results while listing allows up to 1000, and read_mask default fields are stated. The description explains interactions and error semantics the per-property schema cannot express, though each individual parameter is already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Lists Other contacts') and immediately defines what Other contacts are: addresses Google auto-saved from email interactions. It explicitly distinguishes the tool from siblings by stating Other contacts are NOT in the saved contact list and never appear in list_contacts/search_contacts. An agent can tell exactly what this tool does and how it differs from its nearest siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit: the description names list_contacts/search_contacts as the tools that will NOT return these contacts, and names copy_other_contact as the required path for editing. It also spells out the two invocation modes — search with a query vs. paginated listing with tokens — and warns that expired sync tokens fail with 410, directing re-listing in full. This leaves no ambiguity about when to call this tool and how.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

modify_group_membersAdd or remove group membersA
DestructiveIdempotent

Adds and/or removes contacts in a contact group (label) in one call — at least one of add/remove is required, together up to ~1000 names. Contacts are addressed by their people/ resource names. The HTTP 200 response is NOT a full success receipt — read it: notFoundResourceNames lists contacts that do not exist (their changes were skipped) and canNotRemoveLastContactGroupResourceNames lists contacts that could not leave their last group. Removing a contact from a group never deletes the contact, and re-running the same call converges. Contacts cannot be removed from contactGroups/myContacts this way.

ParametersJSON Schema
NameRequiredDescriptionDefault
addNoContacts to add to the group.
removeNoContacts to remove from the group.
resource_nameYesThe group's full resource name, e.g. "contactGroups/12abc34d567" — from list_contact_groups.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by explaining that HTTP 200 is not a full success receipt and that notFoundResourceNames and canNotRemoveLastContactGroupResourceNames identify skipped changes. It also discloses convergence on re-run and the non-deletion guarantee, which is especially valuable given destructiveHint is true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the core action and then packs each sentence with non-redundant information: batch capability, resource-name addressing, response caveats, idempotency, and the myContacts exclusion. There is no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must and does carry the burden of explaining the response semantics and edge cases. It covers partial failures, skipped contacts, the last-group protection, convergence, and non-destructiveness, making the tool's behavior predictable even without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds critical semantics the schema does not: at least one of add/remove must be provided, the combined limit is about 1000 names, and resource names follow people/<id> format contextually. It also adds the behavioral caveat about the myContacts group, which is parameter-relevant for remove.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the exact operation: adding and/or removing contacts in a contact group (label) in one call. It clearly distinguishes this from group-metadata operations like update_contact_group by focusing on membership changes, and even notes the myContacts exception.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the tool's purpose and the conditions for use clear: at least one of add/remove is required, and up to ~1000 names can be processed. It also gives an explicit when-not case by stating contacts cannot be removed from contactGroups/myContacts this way, and clarifies that removing a contact is not deletion, which helps route deletion intent to delete_contact.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

raw_requestRaw Google People API callA
Destructive

Escape hatch to call any Google People API v1 path directly, for requests the typed tools don't cover — e.g. contact photos (PATCH "v1/people/:updateContactPhoto" with {"photoBytes":""} or DELETE "v1/people/:deleteContactPhoto"), "Other contacts" (GET "v1/otherContacts?readMask=..." — needs the contacts.other.readonly scope on the token), or extra query parameters like sources. The path may carry a query string; repeated parameters are written inline ("v1/people:batchGet?resourceNames=people/a&resourceNames=people/b&personFields=names"). The Bearer token is added automatically; the method defaults to GET. Writes are never retried after ambiguous failures.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoJSON request body (POST/PUT/PATCH only).
pathYesAPI path relative to https://people.googleapis.com, e.g. "v1/people/c123?personFields=names".
methodNoHTTP method. Defaults to GET.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the Bearer token is added automatically, the method defaults to GET, query strings and repeated parameters are supported inline, and writes are never retried after ambiguous failures. These are meaningful behavioral facts that neither the annotations nor the input schema provide, and they are consistent with destructiveHint=true and idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Despite its length, the description is dense and every sentence earns its place: it states purpose, gives concrete endpoint examples, clarifies auth/defaults, and adds a retry caveat. The purpose is front-loaded and the examples are directly actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an arbitrary raw API tool, the description covers path construction, query-string handling, body usage, default method, auth token behavior, and write retry behavior. No output schema exists, but the raw response is implied by the tool name and title; nothing essential for invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all three parameters. The description adds extra value by explaining path query-string syntax, inline repeated parameters, and giving realistic path/body examples for PATCH and DELETE. This goes beyond the schema's basic descriptions without being redundant.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('call any Google People API v1 path directly') on a specific resource, and explicitly frames the tool as an escape hatch for requests the typed tools don't cover. This makes it clearly distinguishable from the sibling typed tools such as get_contact or list_contacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It says exactly when to use it: when the typed tools don't cover a request, with concrete examples such as PATCH/DELETE contact photos, GET otherContacts with readMask, and extra query parameters like sources. The alternatives are the typed sibling tools, and the condition for choosing this tool is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_contactsSearch contactsA
Read-onlyIdempotent

Searches the account's saved contacts by prefix match on names, nicknames, emails, phones and organizations (People API people:searchContacts). Returns results[] of { person } with the requested read_mask fields. Max 30 results, no pagination — this is a quick lookup, not an export; use list_contacts to enumerate everything. The search index lags writes by seconds to minutes: a contact created or updated moments ago may be missing here even though list_contacts and get_contact already see it (the documented cache-warmup request is sent automatically before the session's first search, but the lag is server-side). Searches only the user's own saved contacts.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesThe search text, e.g. a name prefix ("Ann"), email or phone fragment.
page_sizeNoMax results (1..30, API cap; default 10).
read_maskNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds substantial non-obvious behavior beyond the annotations: max 30 results with no pagination, server-side index lag of seconds to minutes, the automatic cache-warmup request, and the scope restriction to own saved contacts. These are exactly the behavioral traits an agent cannot infer from schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: purpose and scope, return shape, result limits with sibling routing, and the index-lag caveat. The most decision-relevant facts are front-loaded. The cache-warmup parenthetical is detailed but preempts a predictable agent question about missing fresh contacts, so no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only quick-lookup tool with no output schema, the description is complete: it covers return shape (results[] of { person } with read_mask fields), hard limits (max 30, no pagination), freshness caveats (index lag, warmup), scope (own contacts only), and the alternative for enumeration. No critical information an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents query, page_size bounds, defaults, and the read_mask enum with its absent-field caveat. The description adds genuine value by specifying which fields the query prefix-matches (names, nicknames, emails, phones, organizations), which the schema's query description does not enumerate. This helps an agent construct effective queries but is a modest increment over an already-complete schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('searches'), a precise resource ('the account's saved contacts'), and the matching semantics ('prefix match on names, nicknames, emails, phones and organizations'). It differentiates from siblings by scope ('Searches only the user's own saved contacts') and explicitly frames itself as a quick lookup rather than an enumeration, so an agent can distinguish it from list_contacts, get_contact, and list_other_contacts without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly names the alternative and the condition that selects it: 'use list_contacts to enumerate everything.' It also gives when-not-to-use guidance by disclosing the search-index lag, telling the agent that contacts just created/updated may be invisible here even though list_contacts and get_contact already see them. This effectively routes the agent to the correct sibling based on recency of writes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_contactUpdate a contactA
DestructiveIdempotent

Updates an existing contact and returns the updated Person. Only the provided fields are touched (updatePersonFields is computed automatically), but each provided field group is REPLACED AS A WHOLE: passing emails replaces all emails ([] clears them), passing any name part rewrites the whole name, and scalar fields clear on an empty value ("" for nickname/notes/birthday, {} for organization) — fetch current values with get_contact first and send complete groups, or data is silently dropped. Updates are etag-guarded: pass the etag from get_contact to fail cleanly (HTTP 400) if someone edited the contact meanwhile, or omit it and the current etag is fetched automatically (one extra read; last-write-wins). At least one contact field is required.

ParametersJSON Schema
NameRequiredDescriptionDefault
etagNoThe contact's etag from get_contact — omit to auto-fetch the current one.
urlsNoWebsites. On update this list replaces ALL existing urls; [] clears them.
notesNoFree-text notes (the "Notes" field in Google Contacts). On update "" clears it.
emailsNoEmail addresses. On update this list replaces ALL existing emails; [] clears them.
phonesNoPhone numbers. On update this list replaces ALL existing phones; [] clears them.
prefixNoHonorific prefix, e.g. "Dr.".
suffixNoHonorific suffix, e.g. "Jr.".
birthdayNoBirthday: "YYYY-MM-DD", or "MM-DD" for a year-less birthday. On update "" clears it.
nicknameNoNickname. On update "" clears it.
addressesNoPostal addresses. On update this list replaces ALL existing addresses; [] clears them.
given_nameNoFirst name.
family_nameNoLast name.
middle_nameNoMiddle name.
organizationNoEmployer info. On update it replaces the existing organizations; {} clears them.
person_fieldsNoPerson fields to return (default names, emailAddresses, phoneNumbers, organizations, memberships). Only masked fields come back — an absent field may be unmasked, not empty.
resource_nameYesThe contact's full resource name, e.g. "people/c1234567890" — exactly as returned by list_contacts, search_contacts or create_contact.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructiveHint=true, openWorldHint=true) by disclosing replace-as-a-whole semantics, empty-value clearing conventions, silent data loss risk, etag-conflict behavior (HTTP 400), and last-write-wins fallback. This is exactly the behavioral nuance needed to avoid destructive mistakes in an update operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the core purpose and packs essential warnings into dense, purposeful clauses. Three sentences carry a lot of critical information, and while the parenthetical density makes it somewhat hard to parse, every sentence earns its place given the tool's destructive potential.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 16-parameter, nested-object mutation with no output schema, the description covers the essential decision points: prerequisite fetching, complete-group requirements, etag strategy, and the minimum-field constraint. Combined with the rich per-parameter schema descriptions, an agent has enough information to invoke this tool correctly and avoid silent data loss.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already cover each parameter at 100%, but the description adds a unifying semantic layer: group replacement rules, empty-value clearing, and the critical 'At least one contact field is required' constraint that is not evident from the schema's required array (which only lists resource_name). The etag behavior is also clarified beyond the schema note with failure mode details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Updates an existing contact and returns the updated Person.' This clearly distinguishes it from sibling tools like get_contact, create_contact, delete_contact, and batch_update_contacts by focusing on single-contact modification. The title and description align perfectly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to fetch current values with get_contact first and send complete groups, or data is silently dropped — a concrete when-to-use rule with a referenced alternative. It also explains the two etag strategies (pass from get_contact or auto-fetch). It doesn't explicitly contrast with batch_update_contacts for multi-contact updates, but the single-vs-batch distinction is inferable from the tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_contact_groupRename a contact groupA
DestructiveIdempotent

Renames a user contact group (the only mutable group attribute). Etag-guarded like contact updates: pass etag from get_contact_group to fail cleanly on a concurrent edit, or omit it and the current etag is fetched automatically (one extra read). System groups (contactGroups/myContacts, starred, ...) cannot be renamed; the new name must stay unique (409 CONFLICT otherwise). Returns the updated group.

ParametersJSON Schema
NameRequiredDescriptionDefault
etagNoThe group's etag from get_contact_group — omit to auto-fetch the current one.
nameYesThe new display name.
resource_nameYesThe group's full resource name, e.g. "contactGroups/12abc34d567" — from list_contact_groups.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is a mutation (readOnlyHint=false, destructiveHint=true). The description adds valuable behavioral detail: etag-based concurrency handling with auto-fetch fallback, rejection of system groups, and uniqueness enforcement causing 409. It also states the return value. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences: the first states the core action and scope, the second explains etag behavior, the third covers limitations and the result. No redundant phrases; all sentences carry essential information. Front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation with concurrency, system-group restrictions, and uniqueness constraints, the description covers all critical aspects: behavior, edtag options, failure modes (409), and return value. No output schema exists, but the return is stated. Minor gaps like other error codes (e.g., 404) are acceptable given the specificity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 3 parameters with descriptions, including the etag 'omit to auto-fetch' note. The description repeats this etag guidance but adds no new parametric meaning. Since schema coverage is 100%, the baseline of 3 is appropriate; the description does not compensate beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Renames a user contact group'. It also states the scope ('the only mutable group attribute'), which clearly distinguishes it from create/delete/modify operations. While no sibling is named, the uniqueness of the action is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool: it's for renaming, and it explicitly warns that system groups cannot be renamed, implying alternative handling. It also explains the etag strategy (pass to avoid concurrent overwrites, omit for auto-fetch) and uniqueness constraint. It does not explicitly contrast with create/delete tools, but the purpose is obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 19 tool updatesv0.1.0
    • First observedbatch_create_contacts
    • First observedbatch_delete_contacts
    • First observedbatch_get_contacts
    • First observedbatch_update_contacts
    • First observedcopy_other_contact
    • First observedcreate_contact
    • First observedcreate_contact_group
    • First observeddelete_contact
    • First observeddelete_contact_group
    • First observedget_contact
    • First observedget_contact_group
    • First observedlist_contact_groups
    • First observedlist_contacts
    • First observedlist_other_contacts
    • First observedmodify_group_members
    • First observedraw_request
    • First observedsearch_contacts
    • First observedupdate_contact
    • First observedupdate_contact_group

TDQS

A4.4/5.0

Scored across 19 tools

Disambiguation5/5

Every tool targets a distinct resource and action: contact CRUD, group CRUD, member management, and other-contacts handling are clearly separated. Batch variants are explicitly prefixed with batch_, and raw_request is framed as an escape hatch rather than a competing operation.

Naming Consistency4/5

The vast majority follow a consistent verb_noun pattern: list_contacts, create_contact, update_contact_group, batch_delete_contacts. raw_request is the lone naming outlier, but it is clearly an escape-hatch utility and does not create real confusion.

Tool Count4/5

Nineteen tools is above the ideal 3-15 range, but the number is justified by splitting single and batch operations plus covering groups and other contacts. It feels slightly heavy rather than bloated, and each typed tool has a distinguishable purpose.

Completeness4/5

Contacts, contact groups, member management, search, list, and batch operations are all covered. Minor gaps remain: contact photos are only reachable through raw_request, and other-contacts are intentionally limited to list/copy, but there are no dead ends for the core domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to access and search Google Contacts through per-user OAuth authentication on serverless AWS Lambda. Provides read-only access to personal contacts with zero data storage and real-time API queries.
    60 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables comprehensive management of Google Calendar, Contacts, and Gmail through AI systems. Supports full CRUD operations including creating/updating/deleting events, managing contacts, sending emails, organizing with labels, and batch operations with OAuth2 authentication.
    106 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Gives AI assistants access to Google Contacts, supporting listing, searching, creating, updating, and deleting contacts, as well as searching Google Workspace directories.
    MIT