diff --git a/src/assets/docs/agent-connectors/googlecontacts/add-credentials.png b/src/assets/docs/agent-connectors/googlecontacts/add-credentials.png
new file mode 100644
index 000000000..9f5263792
Binary files /dev/null and b/src/assets/docs/agent-connectors/googlecontacts/add-credentials.png differ
diff --git a/src/assets/docs/agent-connectors/googlecontacts/add-redirect-uri.png b/src/assets/docs/agent-connectors/googlecontacts/add-redirect-uri.png
new file mode 100644
index 000000000..7c507614b
Binary files /dev/null and b/src/assets/docs/agent-connectors/googlecontacts/add-redirect-uri.png differ
diff --git a/src/assets/docs/agent-connectors/googlecontacts/enable-people-api.png b/src/assets/docs/agent-connectors/googlecontacts/enable-people-api.png
new file mode 100644
index 000000000..74d212648
Binary files /dev/null and b/src/assets/docs/agent-connectors/googlecontacts/enable-people-api.png differ
diff --git a/src/assets/docs/agent-connectors/googlecontacts/oauth-web-app.png b/src/assets/docs/agent-connectors/googlecontacts/oauth-web-app.png
new file mode 100644
index 000000000..f6326fbf7
Binary files /dev/null and b/src/assets/docs/agent-connectors/googlecontacts/oauth-web-app.png differ
diff --git a/src/assets/docs/agent-connectors/googlecontacts/use-own-credentials-redirect-uri.png b/src/assets/docs/agent-connectors/googlecontacts/use-own-credentials-redirect-uri.png
new file mode 100644
index 000000000..9dadd507e
Binary files /dev/null and b/src/assets/docs/agent-connectors/googlecontacts/use-own-credentials-redirect-uri.png differ
diff --git a/src/components/templates/agent-connectors/_setup-googlecontacts.mdx b/src/components/templates/agent-connectors/_setup-googlecontacts.mdx
new file mode 100644
index 000000000..e7f0a95b6
--- /dev/null
+++ b/src/components/templates/agent-connectors/_setup-googlecontacts.mdx
@@ -0,0 +1,79 @@
+import { Steps, Aside, Tabs, TabItem } from '@astrojs/starlight/components'
+
+Register your Scalekit environment with the Google Contacts connector so Scalekit handles the OAuth 2.0 flow and token lifecycle for you. The connection name you create is used to identify and invoke the connection in your code.
+
+
+
+
+1. ## Set up auth redirects
+
+ - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**. Find **Google Contacts** and click **Create**. Click **Use your own credentials** and copy the redirect URI — it looks like `https:///sso/v1/oauth//callback`.
+
+ 
+
+ - Navigate to [Google Cloud Console](https://console.cloud.google.com/projectselector2/home/dashboard) → **APIs & Services** → **Credentials**. Select **+ Create Credentials**, then **OAuth client ID**. Choose **Web application** from the Application type menu.
+
+ 
+
+ - Under **Authorized redirect URIs**, click **+ Add URI**, paste the redirect URI, and click **Create**.
+
+ 
+
+2. ## Enable the People API
+
+ - In [Google Cloud Console](https://console.cloud.google.com/projectselector2/home/dashboard), go to **APIs & Services** → **Library**. Search for **People API** and click **Enable**.
+
+ 
+
+3. ## Get client credentials
+
+ - Google provides your **Client ID** and **Client Secret** after you create the OAuth client ID in step 1. Copy both values from the credentials detail panel.
+
+4. ## Add credentials in Scalekit
+
+ - In [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** and open the connection you created.
+
+ - Enter your Google **Client ID** and **Client Secret**, then click **Save**.
+
+ 
+
+5. ## Connect a user account
+
+ Your users must authorize access to their Google Contacts. Generate an authorization link and direct them through the OAuth flow.
+
+ **Via dashboard (for testing)**
+
+ - Open the connection and click the **Connected Accounts** tab → **Add Account**.
+ - Fill in **Your User's ID** (e.g. `user_123`) and follow the Google OAuth prompt.
+
+ **Via API (for production)**
+
+
+
+ ```typescript
+ const { link } = await scalekit.actions.getAuthorizationLink({
+ connectionName: 'googlecontacts',
+ identifier: 'user_123',
+ });
+ // Redirect your user to `link` — they complete OAuth on Google's side
+ console.log('Authorize Google Contacts:', link);
+ ```
+
+
+ ```python
+ link_response = scalekit_client.actions.get_authorization_link(
+ connection_name="googlecontacts",
+ identifier="user_123"
+ )
+ # Redirect your user to link_response.link
+ print("Authorize Google Contacts:", link_response.link)
+ ```
+
+
+
+
+
diff --git a/src/components/templates/agent-connectors/_usage-googlecontacts.mdx b/src/components/templates/agent-connectors/_usage-googlecontacts.mdx
new file mode 100644
index 000000000..0f146d792
--- /dev/null
+++ b/src/components/templates/agent-connectors/_usage-googlecontacts.mdx
@@ -0,0 +1,165 @@
+import { Tabs, TabItem, Aside } from '@astrojs/starlight/components'
+
+Once a connected account is set up, make API calls through the Scalekit proxy or call Google Contacts tools directly via `execute_tool`.
+
+## Proxy API calls
+
+
+
+ ```typescript
+ import { ScalekitClient } from '@scalekit-sdk/node';
+
+ const scalekit = new ScalekitClient(
+ process.env.SCALEKIT_ENV_URL,
+ process.env.SCALEKIT_CLIENT_ID,
+ process.env.SCALEKIT_CLIENT_SECRET
+ );
+ const actions = scalekit.actions;
+
+ // List contacts
+ const result = await actions.request({
+ connectionName: 'googlecontacts',
+ identifier: 'user_123',
+ path: '/v1/people/me/connections',
+ method: 'GET',
+ query: { personFields: 'names,emailAddresses,phoneNumbers' },
+ });
+ console.log(result);
+ ```
+
+
+ ```python
+ import scalekit.client, os
+ from dotenv import load_dotenv
+ load_dotenv()
+
+ scalekit_client = scalekit.client.ScalekitClient(
+ client_id=os.getenv("SCALEKIT_CLIENT_ID"),
+ client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
+ env_url=os.getenv("SCALEKIT_ENV_URL"),
+ )
+ actions = scalekit_client.actions
+
+ # List contacts
+ result = actions.request(
+ connection_name="googlecontacts",
+ identifier="user_123",
+ path="/v1/people/me/connections",
+ method="GET",
+ query={"personFields": "names,emailAddresses,phoneNumbers"},
+ )
+ print(result)
+ ```
+
+
+
+## Execute tools
+
+Use `execute_tool` to call Google Contacts tools directly from your agent.
+
+### List contacts
+
+```python
+connected_account = scalekit_client.connect.get_or_create_connected_account(
+ connection_name="googlecontacts",
+ identifier="user_123"
+).connected_account
+
+contacts = actions.execute_tool(
+ tool_name="googlecontacts_contacts_list",
+ connected_account_id=connected_account.id,
+ tool_input={
+ "person_fields": "names,emailAddresses,phoneNumbers",
+ "page_size": 10,
+ }
+)
+```
+
+### Create a contact
+
+```python
+new_contact = actions.execute_tool(
+ tool_name="googlecontacts_contact_create",
+ connected_account_id=connected_account.id,
+ tool_input={
+ "given_name": "Jane",
+ "family_name": "Doe",
+ "email": "jane.doe@example.com",
+ "phone": "+1234567890",
+ "person_fields": "names,emailAddresses,phoneNumbers",
+ }
+)
+person_id = new_contact["resourceName"].split("/")[1]
+```
+
+### Search contacts
+
+```python
+results = actions.execute_tool(
+ tool_name="googlecontacts_contacts_search",
+ connected_account_id=connected_account.id,
+ tool_input={
+ "query": "Jane",
+ "read_mask": "names,emailAddresses",
+ }
+)
+```
+
+### Create a group and add a member
+
+```python
+group = actions.execute_tool(
+ tool_name="googlecontacts_group_create",
+ connected_account_id=connected_account.id,
+ tool_input={"name": "VIP Customers"}
+)
+group_id = group["resourceName"].split("/")[1]
+
+actions.execute_tool(
+ tool_name="googlecontacts_group_members_modify",
+ connected_account_id=connected_account.id,
+ tool_input={
+ "group_id": group_id,
+ "resource_names_to_add": [f"people/{person_id}"],
+ }
+)
+```
+
+
+
+### Update a contact
+
+`googlecontacts_contact_update` and `googlecontacts_group_update` require a current `etag`. Google uses the etag as optimistic concurrency control — if the resource was modified since you last read it, the update is rejected to prevent silent overwrites.
+
+In agentic workflows, your agent will typically call `googlecontacts_contact_get` first to read the current state of the contact, and the etag from that response is passed directly into the update call.
+
+```python
+# 1. Get contact — etag is included in the response
+contact = actions.execute_tool(
+ tool_name="googlecontacts_contact_get",
+ connected_account_id=connected_account.id,
+ tool_input={
+ "person_id": "c8901234567",
+ "person_fields": "names,emailAddresses",
+ }
+)
+
+# 2. Pass the etag from the get response into the update
+actions.execute_tool(
+ tool_name="googlecontacts_contact_update",
+ connected_account_id=connected_account.id,
+ tool_input={
+ "person_id": "c8901234567",
+ "etag": contact["etag"],
+ "update_person_fields": "names",
+ "given_name": "Jane",
+ "family_name": "Smith",
+ }
+)
+```
+
+
diff --git a/src/components/templates/agent-connectors/index.ts b/src/components/templates/agent-connectors/index.ts
index 47042b4cd..e5568fb0f 100644
--- a/src/components/templates/agent-connectors/index.ts
+++ b/src/components/templates/agent-connectors/index.ts
@@ -30,6 +30,7 @@ export { default as SetupGoogleFormsSection } from './_setup-google-forms.mdx'
export { default as SetupGoogleMeetsSection } from './_setup-google-meets.mdx'
export { default as SetupGoogleSheetsSection } from './_setup-google-sheets.mdx'
export { default as SetupGooglecalendarSection } from './_setup-googlecalendar.mdx'
+export { default as SetupGooglecontactsSection } from './_setup-googlecontacts.mdx'
export { default as SetupGoogleslidesSection } from './_setup-googleslides.mdx'
export { default as SetupHarvestapiSection } from './_setup-harvestapi.mdx'
export { default as SetupHeyreachSection } from './_setup-heyreach.mdx'
@@ -92,6 +93,7 @@ export { default as UsageGmailSection } from './_usage-gmail.mdx'
export { default as UsageGongSection } from './_usage-gong.mdx'
export { default as UsageGoogleAdsSection } from './_usage-google_ads.mdx'
export { default as UsageGooglecalendarSection } from './_usage-googlecalendar.mdx'
+export { default as UsageGooglecontactsSection } from './_usage-googlecontacts.mdx'
export { default as UsageGoogledocsSection } from './_usage-googledocs.mdx'
export { default as UsageGoogledriveSection } from './_usage-googledrive.mdx'
export { default as UsageGoogleformsSection } from './_usage-googleforms.mdx'
diff --git a/src/content/docs/agentkit/connectors/googlecontacts.mdx b/src/content/docs/agentkit/connectors/googlecontacts.mdx
new file mode 100644
index 000000000..ecc950785
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/googlecontacts.mdx
@@ -0,0 +1,65 @@
+---
+title: Google Contacts
+tableOfContents: true
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/googlecontacts.svg
+connectorAuthType: OAuth 2.0
+connectorCategories: [productivity]
+head:
+ - tag: style
+ content: |
+ .sl-markdown-content h2 {
+ font-size: var(--sl-text-xl);
+ }
+---
+
+import ToolList from '@/components/ToolList.astro'
+import { tools } from '@/data/agent-connectors/googlecontacts'
+import { SetupGooglecontactsSection } from '@components/templates'
+import { UsageGooglecontactsSection } from '@components/templates'
+
+## What you can do
+
+Connect this agent connector to let your agent:
+
+- **Manage contacts** — create, read, update, and delete contacts; batch create, update, and delete up to 200–500 contacts in a single request
+- **Search contacts** — search across names, emails, and phone numbers in the main contacts list or "Other contacts"
+- **Handle contact groups** — create, update, delete, and modify membership of contact groups
+- **Work with other contacts** — list and search auto-generated contacts from email history, and copy them into the main contacts list
+- **Access directory** — list and search people in a Google Workspace domain directory (requires Workspace account)
+- **Manage photos** — upload or remove contact profile photos
+
+## Authentication
+
+This connector uses **OAuth 2.0**. Scalekit acts as the OAuth client: it redirects your user to Google, obtains an access token, and automatically refreshes it before it expires. Your agent code never handles tokens directly — you only pass a `connectionName` and a user `identifier`.
+
+You supply your Google **OAuth app credentials** (Client ID + Secret) once per environment in the Scalekit dashboard.
+
+
+Set up the connector
+
+
+
+
+
+
+Code examples
+
+
+
+
+
+## Getting resource IDs
+
+Most tools require IDs that must be fetched from the API — never guess or hard-code them.
+
+| Resource | Tool to get ID | Field in response |
+|----------|---------------|-------------------|
+| Person ID | `googlecontacts_contacts_list` | `connections[].resourceName` (part after `people/`) |
+| Contact etag | `googlecontacts_contact_get` | `etag` |
+| Group ID | `googlecontacts_groups_list` | `contactGroups[].resourceName` (part after `contactGroups/`) |
+| Group etag | `googlecontacts_group_get` | `etag` |
+| Other contact person ID | `googlecontacts_other_contacts_list` | `otherContacts[].resourceName` (part after `people/`) |
+
+## Tool list
+
+
diff --git a/src/data/agent-connectors/googlecontacts.ts b/src/data/agent-connectors/googlecontacts.ts
new file mode 100644
index 000000000..76a513a7d
--- /dev/null
+++ b/src/data/agent-connectors/googlecontacts.ts
@@ -0,0 +1,628 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'googlecontacts_contacts_list',
+ description:
+ "List all contacts in the authenticated user's Google Contacts account with optional filtering and pagination.",
+ params: [
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: true,
+ description:
+ 'Comma-separated fields to return (e.g. names,emailAddresses,phoneNumbers,organizations)',
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of contacts to return (default 100, max 1000)',
+ },
+ {
+ name: 'page_token',
+ type: 'string',
+ required: false,
+ description: 'Token for fetching the next page of results',
+ },
+ {
+ name: 'sort_order',
+ type: 'string',
+ required: false,
+ description: 'Sort order: LAST_MODIFIED_ASCENDING or LAST_MODIFIED_DESCENDING',
+ },
+ {
+ name: 'sync_token',
+ type: 'string',
+ required: false,
+ description: 'Sync token from a previous response for incremental sync',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contact_get',
+ description: 'Retrieve a single contact by their resource name (person ID).',
+ params: [
+ {
+ name: 'person_id',
+ type: 'string',
+ required: true,
+ description: 'The person ID (part after "people/"). Get from googlecontacts_contacts_list.',
+ },
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: true,
+ description: 'Comma-separated fields to return (e.g. names,emailAddresses,phoneNumbers)',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contact_create',
+ description: "Create a new contact in the authenticated user's Google Contacts account.",
+ params: [
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: true,
+ description: 'Fields to return in the response (e.g. names,emailAddresses)',
+ },
+ { name: 'given_name', type: 'string', required: false, description: "Contact's first name" },
+ { name: 'family_name', type: 'string', required: false, description: "Contact's last name" },
+ { name: 'email', type: 'string', required: false, description: "Contact's email address" },
+ {
+ name: 'email_type',
+ type: 'string',
+ required: false,
+ description: 'Email type: home, work, other',
+ },
+ { name: 'phone', type: 'string', required: false, description: "Contact's phone number" },
+ {
+ name: 'phone_type',
+ type: 'string',
+ required: false,
+ description: 'Phone type: home, work, mobile, other',
+ },
+ {
+ name: 'organization',
+ type: 'string',
+ required: false,
+ description: "Contact's organization/company name",
+ },
+ { name: 'job_title', type: 'string', required: false, description: "Contact's job title" },
+ {
+ name: 'notes',
+ type: 'string',
+ required: false,
+ description: 'Freeform notes about the contact',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contact_update',
+ description: "Update an existing contact. Requires the contact's etag for optimistic locking.",
+ params: [
+ {
+ name: 'person_id',
+ type: 'string',
+ required: true,
+ description: 'The person ID. Get from googlecontacts_contacts_list.',
+ },
+ {
+ name: 'update_person_fields',
+ type: 'string',
+ required: true,
+ description: 'Comma-separated fields to update (e.g. names,emailAddresses,phoneNumbers)',
+ },
+ {
+ name: 'etag',
+ type: 'string',
+ required: false,
+ description:
+ 'Current etag for optimistic concurrency. Get from googlecontacts_contact_get.',
+ },
+ { name: 'given_name', type: 'string', required: false, description: 'Updated first name' },
+ { name: 'family_name', type: 'string', required: false, description: 'Updated last name' },
+ { name: 'email', type: 'string', required: false, description: 'Updated email address' },
+ {
+ name: 'email_type',
+ type: 'string',
+ required: false,
+ description: 'Email type: home, work, other',
+ },
+ { name: 'phone', type: 'string', required: false, description: 'Updated phone number' },
+ {
+ name: 'phone_type',
+ type: 'string',
+ required: false,
+ description: 'Phone type: home, work, mobile, other',
+ },
+ {
+ name: 'organization',
+ type: 'string',
+ required: false,
+ description: 'Updated organization name',
+ },
+ { name: 'job_title', type: 'string', required: false, description: 'Updated job title' },
+ { name: 'notes', type: 'string', required: false, description: 'Updated notes' },
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return in the response',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contact_delete',
+ description: 'Permanently delete a contact from Google Contacts.',
+ params: [
+ {
+ name: 'person_id',
+ type: 'string',
+ required: true,
+ description: 'The person ID to delete. Get from googlecontacts_contacts_list.',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contacts_search',
+ description: 'Search contacts by name, email, phone number, or other fields.',
+ params: [
+ { name: 'query', type: 'string', required: true, description: 'Search query string' },
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Comma-separated fields to return (e.g. names,emailAddresses)',
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of results (max 30)',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contacts_batch_create',
+ description: 'Create up to 200 new contacts in a single request.',
+ params: [
+ {
+ name: 'contacts',
+ type: 'string',
+ required: true,
+ description:
+ 'JSON-encoded array of contact person objects, each with a "names" array. E.g. `[{"names":[{"givenName":"Jane","familyName":"Doe"}]}]`',
+ },
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to return for each created contact (e.g. names,emailAddresses)',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contacts_batch_update',
+ description: 'Update up to 200 contacts in a single request.',
+ params: [
+ {
+ name: 'contacts',
+ type: 'string',
+ required: true,
+ description:
+ 'JSON-encoded object map of `{resourceName: {etag, names, ...}}`. Keys are full resource names like "people/c123".',
+ },
+ {
+ name: 'update_mask',
+ type: 'string',
+ required: true,
+ description: 'Comma-separated fields to update (e.g. names,emailAddresses)',
+ },
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to return for each updated contact',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contacts_batch_delete',
+ description: 'Permanently delete up to 500 contacts in a single request.',
+ params: [
+ {
+ name: 'resource_names',
+ type: 'string',
+ required: true,
+ description:
+ 'A contact resource name to delete in the format "people/". Get from googlecontacts_contacts_list.',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contact_update_photo',
+ description: "Upload or replace a contact's profile photo.",
+ params: [
+ {
+ name: 'person_id',
+ type: 'string',
+ required: true,
+ description: 'The person ID. Get from googlecontacts_contacts_list.',
+ },
+ {
+ name: 'photo_bytes',
+ type: 'string',
+ required: true,
+ description: 'Base64-encoded image data for the profile photo',
+ },
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return in the response',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_contact_delete_photo',
+ description: "Remove a contact's profile photo.",
+ params: [
+ {
+ name: 'person_id',
+ type: 'string',
+ required: true,
+ description: 'The person ID. Get from googlecontacts_contacts_list.',
+ },
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return in the response',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_groups_list',
+ description: 'List all contact groups (both user-created and system groups) in the account.',
+ params: [
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of groups to return',
+ },
+ {
+ name: 'page_token',
+ type: 'string',
+ required: false,
+ description: 'Token for the next page of results',
+ },
+ {
+ name: 'group_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return for each group (e.g. name,memberCount,groupType)',
+ },
+ {
+ name: 'sync_token',
+ type: 'string',
+ required: false,
+ description: 'Sync token for incremental sync',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_group_get',
+ description: 'Retrieve a single contact group by its ID.',
+ params: [
+ {
+ name: 'group_id',
+ type: 'string',
+ required: true,
+ description:
+ 'The contact group ID (part after "contactGroups/"). Get from googlecontacts_groups_list.',
+ },
+ {
+ name: 'group_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return for the group',
+ },
+ {
+ name: 'max_members',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of member resource names to return',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_group_create',
+ description: 'Create a new contact group.',
+ params: [
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: 'Display name for the new group',
+ },
+ {
+ name: 'read_group_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return in the response',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_group_update',
+ description: "Update a contact group's name.",
+ params: [
+ {
+ name: 'group_id',
+ type: 'string',
+ required: true,
+ description: 'The contact group ID. Get from googlecontacts_groups_list.',
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: 'New display name for the group',
+ },
+ {
+ name: 'etag',
+ type: 'string',
+ required: false,
+ description: 'Current etag for optimistic concurrency. Get from googlecontacts_group_get.',
+ },
+ {
+ name: 'update_group_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to update',
+ },
+ {
+ name: 'read_group_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return in the response',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_group_delete',
+ description:
+ 'Delete a contact group. System groups (myContacts, starred, etc.) cannot be deleted.',
+ params: [
+ {
+ name: 'group_id',
+ type: 'string',
+ required: true,
+ description: 'The contact group ID. Get from googlecontacts_groups_list.',
+ },
+ {
+ name: 'delete_contacts',
+ type: 'boolean',
+ required: false,
+ description: 'If true, also delete all contacts in the group',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_group_members_modify',
+ description: 'Add or remove contacts from a contact group.',
+ params: [
+ {
+ name: 'group_id',
+ type: 'string',
+ required: true,
+ description: 'The contact group ID. Get from googlecontacts_groups_list.',
+ },
+ {
+ name: 'resource_names_to_add',
+ type: 'array',
+ required: false,
+ description: 'Array of contact resource names to add (e.g. ["people/c123"])',
+ },
+ {
+ name: 'resource_names_to_remove',
+ type: 'array',
+ required: false,
+ description: 'Array of contact resource names to remove',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_groups_batch_get',
+ description: 'Retrieve a contact group by its resource name.',
+ params: [
+ {
+ name: 'resource_names',
+ type: 'string',
+ required: true,
+ description:
+ 'A contact group resource name in the format "contactGroups/" (e.g. contactGroups/myContacts). Get from googlecontacts_groups_list.',
+ },
+ {
+ name: 'group_fields',
+ type: 'string',
+ required: false,
+ description: 'Fields to return for the group',
+ },
+ {
+ name: 'max_members',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of group members to return',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_people_batch_get',
+ description: 'Retrieve a contact by their resource name.',
+ params: [
+ {
+ name: 'resource_names',
+ type: 'string',
+ required: true,
+ description:
+ 'A contact resource name in the format "people/" (e.g. people/c123456789). Get from googlecontacts_contacts_list.',
+ },
+ {
+ name: 'person_fields',
+ type: 'string',
+ required: true,
+ description: 'Comma-separated fields to return (e.g. names,emailAddresses,phoneNumbers)',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_other_contacts_list',
+ description:
+ 'List contacts in the "Other contacts" section — contacts auto-generated from email history that the user hasn\'t explicitly added.',
+ params: [
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to return (e.g. names,emailAddresses,phoneNumbers)',
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of contacts to return',
+ },
+ {
+ name: 'page_token',
+ type: 'string',
+ required: false,
+ description: 'Token for the next page',
+ },
+ {
+ name: 'sync_token',
+ type: 'string',
+ required: false,
+ description: 'Sync token for incremental sync',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_other_contacts_search',
+ description: 'Search contacts in the "Other contacts" section.',
+ params: [
+ { name: 'query', type: 'string', required: true, description: 'Search query string' },
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to return (e.g. names,emailAddresses)',
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of results (max 30)',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_other_contact_copy',
+ description: 'Copy an "Other contact" to the user\'s main contacts list.',
+ params: [
+ {
+ name: 'person_id',
+ type: 'string',
+ required: true,
+ description:
+ 'The person ID of the other contact. Get from googlecontacts_other_contacts_list.',
+ },
+ {
+ name: 'copy_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to copy (e.g. names,emailAddresses,phoneNumbers)',
+ },
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: false,
+ description: 'Fields to return in the created contact',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_directory_list',
+ description:
+ 'List people in the Google Workspace domain directory. Requires a Google Workspace account.',
+ params: [
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to return (e.g. names,emailAddresses,phoneNumbers)',
+ },
+ {
+ name: 'sources',
+ type: 'string',
+ required: true,
+ description:
+ 'Directory source type: DIRECTORY_SOURCE_TYPE_DOMAIN_CONTACT or DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE',
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of people to return',
+ },
+ {
+ name: 'page_token',
+ type: 'string',
+ required: false,
+ description: 'Token for the next page',
+ },
+ {
+ name: 'sync_token',
+ type: 'string',
+ required: false,
+ description: 'Sync token for incremental sync',
+ },
+ ],
+ },
+ {
+ name: 'googlecontacts_directory_search',
+ description:
+ 'Search people in the Google Workspace domain directory. Requires a Google Workspace account.',
+ params: [
+ { name: 'query', type: 'string', required: true, description: 'Search query string' },
+ {
+ name: 'read_mask',
+ type: 'string',
+ required: true,
+ description: 'Fields to return (e.g. names,emailAddresses)',
+ },
+ {
+ name: 'sources',
+ type: 'string',
+ required: true,
+ description:
+ 'Directory source: DIRECTORY_SOURCE_TYPE_DOMAIN_CONTACT or DIRECTORY_SOURCE_TYPE_DOMAIN_PROFILE',
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: 'Maximum number of results',
+ },
+ {
+ name: 'page_token',
+ type: 'string',
+ required: false,
+ description: 'Token for the next page',
+ },
+ ],
+ },
+]