
MewCP Google People MCP
from AStheTECH
Hosted, Stateless & Multitenant Google People MCP server enables AI assistants to access, manage, and organize contacts and profile information through Google People API.
Search, manage, and organize your Google Contacts with AI.
A Model Context Protocol (MCP) server that exposes Google People API for reading, creating, updating, and deleting contacts and contact groups.
Overview
The Google People MCP Server provides full Google Contacts management capabilities:
- Create, read, update, delete, and search personal contacts
- Manage contact groups โ list, create, update, or delete them
- Access and promote "Other Contacts" auto-saved by Google services
Perfect for:
- Looking up contact details and email addresses via AI assistants
- Automating contact list maintenance and group organization
- Copying frequently-interacted contacts from "Other Contacts" into your main list
Tools
get_person โ Get a person from Google Contacts
Fetches a contact by resource name, returning only the fields specified.
Inputs:
- `resource_name` (string, required) โ Resource name of the person (e.g. "people/me" or "people/c12345")
- `person_fields` (string, required) โ Comma-separated list of fields to return (e.g. "names,emailAddresses,phoneNumbers")Output:
{
"resourceName": "people/c12345",
"names": [{ "displayName": "Jane Doe" }],
"emailAddresses": [{ "value": "jane@example.com" }]
}list_connections โ List connections from Google Contacts
Returns a paginated list of the authenticated user's contacts.
Inputs:
- `resource_name` (string, required) โ Resource name of the person to list connections for (use "people/me" for the authenticated user)
- `person_fields` (string, required) โ Comma-separated list of fields to return (e.g. "names,emailAddresses")
- `page_size` (integer, optional) โ Maximum number of connections to return
- `page_token` (string, optional) โ Page token from a previous list request for paginationOutput:
{
"connections": [{ "resourceName": "people/c12345", "names": [...] }],
"nextPageToken": "...",
"totalItems": 42
}create_contact โ Create a contact in Google Contacts
Creates a new contact from a JSON person object.
Inputs:
- `person` (string, required) โ JSON string representing the person to create (e.g. '{"names":[{"givenName":"Jane","familyName":"Doe"}],"emailAddresses":[{"value":"jane@example.com"}]}')Output:
{
"resourceName": "people/c12345",
"names": [{ "displayName": "Jane Doe" }]
}update_contact โ Update a contact in Google Contacts
Updates specific fields of an existing contact.
Inputs:
- `resource_name` (string, required) โ Resource name of the contact to update (e.g. "people/c12345")
- `update_person_fields` (string, required) โ Comma-separated list of fields being updated (e.g. "names,emailAddresses")
- `person` (string, required) โ JSON string with the updated person dataOutput:
{
"resourceName": "people/c12345",
"names": [{ "displayName": "Jane Smith" }]
}delete_contact โ Delete a contact from Google Contacts
Permanently deletes a contact by resource name.
Inputs:
- `resource_name` (string, required) โ Resource name of the contact to delete (e.g. "people/c12345")Output:
{}search_contacts โ Search for contacts in Google Contacts
Searches across the user's contacts using a text query.
Inputs:
- `query` (string, required) โ Text to search for (matches names, emails, phone numbers, etc.)
- `read_mask` (string, required) โ Comma-separated list of fields to return in results (e.g. "names,emailAddresses")Output:
{
"results": [
{ "person": { "resourceName": "people/c12345", "names": [...] } }
]
}list_contact_groups โ List contact groups in Google Contacts
Returns all contact groups belonging to the authenticated user.
Inputs:
- `page_size` (integer, optional) โ Maximum number of groups to return
- `page_token` (string, optional) โ Page token from a previous list request for paginationOutput:
{
"contactGroups": [{ "resourceName": "contactGroups/myContacts", "name": "myContacts" }],
"nextPageToken": "..."
}get_contact_group โ Get a contact group from Google Contacts
Fetches a single contact group by resource name.
Inputs:
- `resource_name` (string, required) โ Resource name of the contact group (e.g. "contactGroups/abc123")Output:
{
"resourceName": "contactGroups/abc123",
"name": "Coworkers",
"memberCount": 5
}create_contact_group โ Create a contact group in Google Contacts
Creates a new contact group from a JSON contact group object.
Inputs:
- `contact_group` (string, required) โ JSON string representing the group to create (e.g. '{"contactGroup":{"name":"Team"}}')Output:
{
"resourceName": "contactGroups/abc123",
"name": "Team"
}update_contact_group โ Update a contact group in Google Contacts
Updates the name or metadata of an existing contact group.
Inputs:
- `resource_name` (string, required) โ Resource name of the group to update (e.g. "contactGroups/abc123")
- `contact_group` (string, required) โ JSON string with the updated contact group dataOutput:
{
"resourceName": "contactGroups/abc123",
"name": "Updated Team"
}delete_contact_group โ Delete a contact group from Google Contacts
Permanently deletes a contact group by resource name.
Inputs:
- `resource_name` (string, required) โ Resource name of the group to delete (e.g. "contactGroups/abc123")Output:
{}batch_get_contact_groups โ Get multiple contact groups at once
Fetches details for multiple contact groups in a single request.
Inputs:
- `resource_names` (string, required) โ Comma-separated list of contact group resource names (e.g. "contactGroups/abc,contactGroups/def")Output:
{
"responses": [
{ "contactGroup": { "resourceName": "contactGroups/abc", "name": "Team" } }
]
}list_other_contacts โ List other contacts in Google Contacts
Returns "Other Contacts" โ people automatically saved by Google from interactions (emails, calls, etc.).
Inputs:
- `read_mask` (string, required) โ Comma-separated list of fields to return (e.g. "names,emailAddresses")
- `page_size` (integer, optional) โ Maximum number of contacts to return
- `page_token` (string, optional) โ Page token from a previous list request for paginationOutput:
{
"otherContacts": [{ "resourceName": "otherContacts/c99999", "names": [...] }],
"nextPageToken": "..."
}search_other_contacts โ Search other contacts in Google Contacts
Searches the "Other Contacts" list using a text query.
Inputs:
- `query` (string, required) โ Text to search for
- `read_mask` (string, required) โ Comma-separated list of fields to return in resultsOutput:
{
"results": [
{ "person": { "resourceName": "otherContacts/c99999", "names": [...] } }
]
}copy_other_contact_to_my_contacts_group โ Copy an other contact to My Contacts
Promotes a contact from "Other Contacts" into the user's main "My Contacts" group.
Inputs:
- `resource_name` (string, required) โ Resource name of the other contact to copy (e.g. "otherContacts/c99999")
- `copy_mask` (string, required) โ Comma-separated list of fields to copy (e.g. "names,emailAddresses,phoneNumbers")Output:
{
"resourceName": "people/c12345",
"names": [{ "displayName": "Jane Doe" }]
}API Parameters Reference
Common Parameters
resource_nameโ Identifies a specific person or group. Formats:"people/me"โ the authenticated user"people/c{id}"โ a specific contact"contactGroups/{id}"โ a contact group"otherContacts/c{id}"โ an other contact
page_sizeโ Caps the number of items returned per request. If omitted the API applies its own default limit.page_tokenโ Opaque token returned in a previous response'snextPageTokenfield. Pass it to retrieve the next page of results.
Field Mask Formats
person_fields / read_mask โ comma-separated, no spaces:
names,emailAddresses,phoneNumbers,addresses,organizations,birthdays,photosupdate_person_fields โ must list every field you are changing:
names,emailAddressescopy_mask โ fields to carry over when promoting an other contact:
names,emailAddresses,phoneNumbersPerson JSON structure example:
{
"names": [{ "givenName": "Jane", "familyName": "Doe" }],
"emailAddresses": [{ "value": "jane@example.com" }],
"phoneNumbers": [{ "value": "+1-555-0100" }]
}This tool doesn't publish a standard install command โ the repository README on GitHub covers its setup.
Troubleshooting
Missing or Invalid Headers
- Cause: OAuth token not provided in request headers or incorrect format
- Solution:
- Verify
Authorization: Bearer YOUR_API_KEYandX-Mewcp-Credential-Id: CREDENTIAL-IDheaders are present - Check your credential is active in your MewCP account
- Verify
Insufficient Credits
- Cause: API calls have exceeded your request limits
- Solution:
- Check credit usage in your Curious Layer dashboard
- Upgrade to a paid plan or add credits for higher limits
- Contact support for credit adjustments
Credential Not Connected
- Cause: No Google account linked to your MewCP credential
- Solution:
- Go to Credentials in your MewCP dashboard
- Connect your Google account via OAuth
- Retry the request with the correct
X-Mewcp-Credential-Idheader
Malformed Request Payload
- Cause: JSON payload is invalid or missing required fields
- Solution:
- Validate JSON syntax before sending (especially
personandcontact_groupparameters) - Ensure all required tool parameters are included
- Check parameter types match expected values
- Validate JSON syntax before sending (especially
Server Not Found
- Cause: Incorrect server name in the API endpoint
- Solution:
- Verify endpoint format:
{server-name}/mcp/{tool-name} - Use correct server name from documentation
- Check available servers in your Curious Layer account
- Verify endpoint format:
Google People API Error
- Cause: Upstream Google People API returned an error
- Solution:
- Check Google Workspace service status at Google Status Dashboard
- Verify your Google account has the required Contacts permissions (scope:
contacts,contacts.readonly) - Review the error message for specific details
Resources
- Google People API Documentation โ Official API reference
- Google People API Reference โ Complete endpoint reference
- FastMCP Docs โ FastMCP specification
- FastMCP Credentials โ FastMCP Credentials package for credential handling