<!-- Generated by `just docs` from catalog/toolkits/intercom.yaml, catalog/expansions/intercom.yaml, catalog/evals/scorecard.json. Edit the source, not this file. -->

# Intercom

Customer messaging. Handle chat conversations and tickets, look up and edit contacts and companies, and publish help articles.

| Property | Value |
| --- | --- |
| Slug | `intercom` |
| Definition version | `0.1.0` |
| Base URL | `https://api.intercom.io` |
| Auth schemes | `oauth2`, `api_key` |
| Action tools | 40 |
| By class | 17 read, 19 write, 4 destructive |
| Triggers | 0 |
| Provider rate limit | not declared, so outbound calls are unpaced |

## Measured routing accuracy

79 golden cases replayed through the router over the whole index: measured over corpus `ea4f12ad2948` (65 toolkits, 2283 tools indexed and 13 declared uncallable), 40 cases written by hand and 39 cases from the paraphrase pass. A case counts as top-1 when its gold tool ranked first and top-8 when it reached the slate at all.

| Measure | Cases | Share |
| --- | --- | --- |
| top-1 | 44/79 | 55.7% |
| top-8 | 72/79 | 91.1% |

The sweep is offline: the reranker is a deterministic identity fake that returns candidates in the order retrieval produced them, so top-1 measures retrieval order rather than a reranked slate. `just eval-live` measures the same cases through the live reranker.

## Authentication

Connect an entity with `ConnectionsService.InitiateConnection`, naming this toolkit's slug. Credentials stay in the connections vault; callers hold connected-account ids only.

### `oauth2`

| Property | Value |
| --- | --- |
| Authorization URL | `https://app.intercom.com/oauth` |
| Token URL | `https://api.intercom.io/auth/eagle/token` |
| Default scopes | `default` |
| Refresh tokens | yes, the refresh daemon renews ahead of expiry |

### `api_key`

| Property | Value |
| --- | --- |
| Placement | `header` |
| Name | `Authorization` |
| Rendered as | `Bearer {key}` |

Submit the key with `ConnectionsService` rather than putting it in a request; it is sealed at rest and never returned.

## Tools

40 action tools. The catalog-wide slug is `intercom.<tool>`, which is what `search_tools` returns and `call_tool` takes.

### `intercom.create_contact`

Create a new Intercom contact: a user or lead who messages or uses your product. Use when the user wants to add a customer to Intercom's directory, not to a separate CRM's sales pipeline. Needs an email; phone, name, and role (user or lead) are optional.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /contacts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `email` | string | **yes** | Contact's email address, e.g. "jane@example.com". |
| `external_id` | string | no | Your own system's unique id for this person. |
| `name` | string | no | Contact's full name. |
| `phone` | string | no | Contact's phone number, e.g. "+15551234567". |
| `role` | string | no | "user" for a signed-up customer or "lead" for someone who has not signed up. Defaults to "lead". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | integer |  |
| `email` | string |  |
| `external_id` | string |  |
| `id` | string |  |
| `name` | string |  |
| `phone` | string |  |
| `role` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "add a new customer to intercom", "register this person in our customer directory", "put this lead into intercom", "start tracking this user in intercom".

### `intercom.get_contact`

Get a single Intercom contact's full record by its contact id: email, phone, name, role, and timestamps. Use when the user names a specific contact; for looking someone up by email use search_contacts instead.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /contacts/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | integer |  |
| `email` | string |  |
| `external_id` | string |  |
| `id` | string |  |
| `last_seen_at` | integer |  |
| `name` | string |  |
| `phone` | string |  |
| `role` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "pull up this customer's intercom profile", "what does intercom have on file for this person", "show me this user's details in intercom", "check a customer's record in intercom".

### `intercom.update_contact`

Update fields on an existing Intercom contact: email, phone, name, or role. Use when the user wants to edit or correct a customer's details in Intercom, not create a new contact.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /contacts/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id. |
| `email` | string | no | New email address. |
| `name` | string | no | New full name. |
| `phone` | string | no | New phone number. |
| `role` | string | no | "user" or "lead". |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `email` | string |  |
| `id` | string |  |
| `name` | string |  |
| `phone` | string |  |
| `role` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "fix this customer's phone number in intercom", "change someone's role from lead to user", "edit a customer's details in intercom", "correct info on a customer record".

### `intercom.delete_contact`

Permanently delete a contact from Intercom, removing their conversation history and custom attributes. Use when the user wants to wipe, purge, or erase a customer record entirely, not merely unsubscribe or archive them. Cannot be undone.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /contacts/{{params.contact_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |
| `id` | string |  |

Also retrieved by: "wipe this customer from intercom for good", "purge someone's intercom record entirely", "erase a customer's history permanently", "get rid of this person's data in intercom".

### `intercom.search_contacts`

Find Intercom contacts by an exact match on one field: email, phone, name, or external id. Use when the user describes a customer rather than naming a known contact id, for example finding someone by their email address.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `POST /contacts/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `field` | string | **yes** | Field to match: "email", "phone", "name", "external_id", or "role". |
| `value` | string | **yes** | Value to match exactly against the chosen field. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].email` | string |  |
| `data[].id` | string |  |
| `data[].name` | string |  |
| `data[].phone` | string |  |
| `data[].role` | string |  |
| `total_count` | integer |  |

Also retrieved by: "find a customer by their email in intercom", "look up who this phone number belongs to", "hunt down someone's intercom profile", "locate a user by their external id".

### `intercom.list_contacts`

List Intercom contacts a page at a time, newest first. Use when the user wants to browse or export the whole customer directory rather than find one specific person.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /contacts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `per_page` | integer | no | Page size, default 50. |
| `starting_after` | string | no | Pagination cursor from a previous response's pages.next. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].email` | string |  |
| `data[].id` | string |  |
| `data[].name` | string |  |
| `data[].role` | string |  |
| `pages` | object |  |
| `pages.next` | object |  |
| `pages.next.starting_after` | string |  |
| `total_count` | integer |  |

Also retrieved by: "show me every customer in intercom", "browse the whole customer directory", "export all our intercom contacts", "see everyone we've ever messaged".

### `intercom.merge_contacts`

Merge a duplicate Intercom contact into a primary one, folding the duplicate's conversation history into the survivor and deleting the duplicate. Use when the user says two contacts are the same person. Irreversible.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `POST /contacts/merge`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `duplicate_contact_id` | string | **yes** | Contact id to merge away and delete. |
| `primary_contact_id` | string | **yes** | Contact id to keep. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `email` | string |  |
| `id` | string |  |
| `name` | string |  |

Also retrieved by: "combine two duplicate customers into one", "fold this duplicate profile into the main one", "treat these two intercom entries as the same person", "collapse two customer records together".

### `intercom.create_or_update_company`

Create a new company in Intercom, or update it if a company with the same company id already exists. Use to record the organization a contact belongs to, alongside its plan, size, or website, not to add an individual person (use create_contact for that).

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /companies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | string | **yes** | Your own system's unique id for this company. |
| `industry` | string | no | Company's industry. |
| `name` | string | **yes** | Company name. |
| `size` | integer | no | Number of employees. |
| `website` | string | no | Company website URL. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `company_id` | string |  |
| `created_at` | integer |  |
| `id` | string |  |
| `industry` | string |  |
| `name` | string |  |
| `size` | integer |  |
| `updated_at` | integer |  |
| `website` | string |  |

Also retrieved by: "add the customer's organization to intercom", "record what company this user works for", "set up an account record for this business", "log this organization in intercom".

### `intercom.get_company`

Get a single Intercom company's record by its company id: name, website, industry, size, and timestamps. Use when the user names a specific company rather than asking to browse all of them.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /companies/{{params.company_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | string | **yes** | Intercom company id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `company_id` | string |  |
| `created_at` | integer |  |
| `id` | string |  |
| `industry` | string |  |
| `name` | string |  |
| `size` | integer |  |
| `updated_at` | integer |  |
| `website` | string |  |

Also retrieved by: "pull up this organization's intercom record", "what plan is this account on", "show me a company's details in intercom", "check an organization's profile".

### `intercom.list_companies`

List every company in Intercom's directory a page at a time. Use when the user wants to browse or export all customer organizations rather than look up one company by name or id.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /companies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `per_page` | integer | no | Page size, default 50. |
| `starting_after` | string | no | Pagination cursor from a previous response's pages.next. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].company_id` | string |  |
| `data[].id` | string |  |
| `data[].name` | string |  |
| `data[].website` | string |  |
| `pages` | object |  |
| `pages.next` | object |  |
| `pages.next.starting_after` | string |  |
| `total_count` | integer |  |

Also retrieved by: "show me every account in intercom", "browse all the organizations we track", "export the company directory", "see every business linked to our customers".

### `intercom.delete_company`

Permanently delete a company from Intercom. Its contacts are not deleted, only detached from it. Use when the user wants to remove an organization from the directory entirely. Cannot be undone.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /companies/{{params.company_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | string | **yes** | Intercom company id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |
| `id` | string |  |

Also retrieved by: "remove this organization from intercom entirely", "wipe out a company record for good", "purge an account from our directory".

### `intercom.attach_contact_to_company`

Attach an existing Intercom contact to a company, linking the person to the organization they belong to. Use when the user wants to associate a customer with a company record, not to create either one.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /contacts/{{params.contact_id}}/companies`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `company_id` | string | **yes** | Intercom company id to attach. |
| `contact_id` | string | **yes** | Intercom contact id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `company_id` | string |  |
| `id` | string |  |
| `name` | string |  |

Also retrieved by: "link this customer to their employer", "associate a user with their organization", "connect a contact to their company account".

### `intercom.list_conversations`

List Intercom conversations from the support inbox a page at a time, newest first. Use to browse recent chats rather than look up one conversation by id or search for one by state.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /conversations`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `per_page` | integer | no | Page size, default 20. |
| `starting_after` | string | no | Pagination cursor from a previous response's pages.next. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `conversations` | array of object |  |
| `conversations[].created_at` | integer |  |
| `conversations[].id` | string |  |
| `conversations[].open` | boolean |  |
| `conversations[].state` | string |  |
| `conversations[].updated_at` | integer |  |
| `pages` | object |  |
| `pages.next` | object |  |
| `pages.next.starting_after` | string |  |
| `total_count` | integer |  |

Also retrieved by: "show me recent chats in the inbox", "what's come into the support inbox lately", "browse the latest customer conversations", "pull up the chat queue".

### `intercom.get_conversation`

Get a single Intercom conversation by its id: its state, priority, assignee, tags, and the full back-and-forth of messages. Use when the user names a specific chat or support thread.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /conversations/{{params.conversation_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `conversation_id` | string | **yes** | Intercom conversation id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `admin_assignee_id` | string |  |
| `contacts` | object |  |
| `contacts.data` | array of object |  |
| `contacts.data[].id` | string |  |
| `created_at` | integer |  |
| `id` | string |  |
| `open` | boolean |  |
| `priority` | string |  |
| `source` | object |  |
| `source.body` | string |  |
| `source.type` | string |  |
| `state` | string |  |
| `tags` | object |  |
| `tags.data` | array of object |  |
| `tags.data[].id` | string |  |
| `tags.data[].name` | string |  |
| `team_assignee_id` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "open up this support thread", "show me the full back and forth on this chat", "pull up a specific conversation by id".

### `intercom.search_conversations`

Find Intercom conversations by an exact match on one field, such as state (open, closed, snoozed) or the assigned admin. Use when the user wants conversations matching a condition rather than one specific conversation by id.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `POST /conversations/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `field` | string | **yes** | Field to match, e.g. "state", "admin_assignee_id", "team_assignee_id", or "priority". |
| `value` | string | **yes** | Value to match exactly against the chosen field. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `conversations` | array of object |  |
| `conversations[].id` | string |  |
| `conversations[].open` | boolean |  |
| `conversations[].priority` | string |  |
| `conversations[].state` | string |  |
| `total_count` | integer |  |

Also retrieved by: "find every open conversation", "show me chats assigned to a particular teammate", "filter conversations by their status", "which threads are still snoozed".

### `intercom.create_conversation`

Start a new Intercom conversation from a contact, posting their first message into the support inbox. Use when the user wants to open a new chat or support thread on behalf of a customer, not reply inside an existing one.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /conversations`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `body` | string | **yes** | The opening message text. |
| `contact_id` | string | **yes** | Intercom contact id the conversation starts from. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | integer |  |
| `id` | string |  |
| `open` | boolean |  |
| `state` | string |  |

Also retrieved by: "start a new chat with this customer", "open a support thread on this user's behalf", "kick off a conversation from a contact".

### `intercom.reply_to_conversation`

Send an admin's reply into an existing Intercom conversation. Use when the user wants to answer, respond to, or follow up in a chat or support thread that is already open, not start a new one.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /conversations/{{params.conversation_id}}/reply`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | **yes** | Intercom admin id the reply is sent as. |
| `body` | string | **yes** | Reply message text. |
| `conversation_id` | string | **yes** | Intercom conversation id to reply in. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `state` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "answer this customer in the chat", "send a response in this support thread", "follow up on an open conversation", "write back to the customer".

### `intercom.close_conversation`

Close an open Intercom conversation, marking the support thread resolved. Use when the user wants to mark a chat done or resolved, not delete it; a closed conversation can be reopened later.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /conversations/{{params.conversation_id}}/parts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | **yes** | Intercom admin id closing the conversation. |
| `conversation_id` | string | **yes** | Intercom conversation id to close. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `open` | boolean |  |
| `state` | string |  |

Also retrieved by: "mark this chat resolved", "wrap up a support conversation", "close out this customer's thread".

### `intercom.snooze_conversation`

Snooze an Intercom conversation until a later time, hiding it from the open inbox until then. Use when the user wants to come back to a chat later rather than close or reply to it now.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /conversations/{{params.conversation_id}}/parts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | **yes** | Intercom admin id snoozing the conversation. |
| `conversation_id` | string | **yes** | Intercom conversation id to snooze. |
| `snoozed_until` | integer | **yes** | Unix timestamp (seconds) to reopen the conversation. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `snoozed_until` | integer |  |
| `state` | string |  |

Also retrieved by: "come back to this chat later", "put this conversation on hold for a while", "remind me about this thread tomorrow".

### `intercom.assign_conversation`

Assign an Intercom conversation to an admin or a team. Use when the user wants to hand a chat off to a specific teammate or team, not reply to it themselves.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /conversations/{{params.conversation_id}}/parts`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | **yes** | Intercom admin id performing the assignment. |
| `assignee_id` | string | **yes** | Admin id or team id to assign the conversation to. |
| `conversation_id` | string | **yes** | Intercom conversation id to assign. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `admin_assignee_id` | string |  |
| `id` | string |  |
| `team_assignee_id` | string |  |

Also retrieved by: "hand this chat off to a teammate", "route this conversation to the right team", "give this thread to someone else to handle".

### `intercom.add_conversation_tag`

Apply an existing tag to an Intercom conversation, for filtering or reporting. Use when the user wants to label or categorize a chat, not a contact or a company (use tag_contact for a customer record).

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /conversations/{{params.conversation_id}}/tags`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | no | Intercom admin id applying the tag. |
| `conversation_id` | string | **yes** | Intercom conversation id. |
| `tag_id` | string | **yes** | Intercom tag id to apply. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `name` | string |  |

Also retrieved by: "label this chat for reporting", "flag this conversation with a category", "mark this thread as a bug report".

### `intercom.create_ticket`

Open a new Intercom ticket for a customer issue: a structured help-desk record with a title, description, and status, separate from a free-form chat conversation. Use when the user wants to file or log a support ticket, not start a chat.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tickets`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id the ticket is opened for. |
| `description` | string | **yes** | Ticket description. |
| `ticket_type_id` | string | **yes** | Intercom ticket type id, e.g. the default customer ticket type. |
| `title` | string | **yes** | Ticket title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | integer |  |
| `id` | string |  |
| `ticket_id` | string |  |
| `ticket_state` | string |  |

Also retrieved by: "file a support ticket for this issue", "open a help desk case for the customer", "log a formal ticket, not just a chat".

### `intercom.get_ticket`

Get a single Intercom ticket by its id: its state, type, and assignee. Use when the user names a specific support ticket rather than asking to search or list tickets.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tickets/{{params.ticket_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `ticket_id` | string | **yes** | Intercom ticket id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `admin_assignee_id` | string |  |
| `created_at` | integer |  |
| `id` | string |  |
| `open` | boolean |  |
| `team_assignee_id` | string |  |
| `ticket_id` | string |  |
| `ticket_state` | string |  |
| `ticket_type_id` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "check the status of this support ticket", "pull up a specific help desk case", "what's the state of this ticket".

### `intercom.update_ticket`

Update an Intercom ticket's state, title, or description. Use when the user wants to change a support ticket's status (for example to "in progress" or "resolved") or edit its details.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /tickets/{{params.ticket_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `description` | string | no | New ticket description. |
| `ticket_id` | string | **yes** | Intercom ticket id to update. |
| `ticket_state` | string | no | New state, e.g. "in_progress" or "resolved". |
| `title` | string | no | New ticket title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `ticket_state` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "mark this ticket resolved", "change the status on a support case", "edit the title on a help desk ticket".

### `intercom.search_tickets`

Find Intercom tickets by an exact match on one field, such as state or ticket type. Use when the user wants tickets matching a condition, for example all open tickets, rather than one specific ticket by id.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `POST /tickets/search`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `field` | string | **yes** | Field to match, e.g. "ticket_state", "ticket_type_id", or "admin_assignee_id". |
| `value` | string | **yes** | Value to match exactly against the chosen field. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `tickets` | array of object |  |
| `tickets[].id` | string |  |
| `tickets[].ticket_state` | string |  |
| `tickets[].ticket_type_id` | string |  |
| `total_count` | integer |  |

Also retrieved by: "show me every open ticket", "find tickets assigned to a given agent", "filter the help desk queue by status".

### `intercom.reply_to_ticket`

Send an admin's reply on an Intercom ticket. Use when the user wants to respond to or follow up on a support ticket, distinct from replying inside a chat conversation.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tickets/{{params.ticket_id}}/reply`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | **yes** | Intercom admin id the reply is sent as. |
| `body` | string | **yes** | Reply message text. |
| `ticket_id` | string | **yes** | Intercom ticket id to reply on. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `ticket_state` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "respond to this support ticket", "send an update on a help desk case", "write back on an open ticket".

### `intercom.create_article`

Publish a new help center article in Intercom, with a title, body, and author. Use when the user wants to write or add a knowledge-base or FAQ article, not send a message to a customer.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /articles`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `author_id` | string | **yes** | Intercom admin id credited as the article's author. |
| `body` | string | **yes** | Article body, as HTML. |
| `state` | string | no | "published" or "draft". Defaults to "draft". |
| `title` | string | **yes** | Article title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `created_at` | integer |  |
| `id` | string |  |
| `state` | string |  |
| `title` | string |  |
| `url` | string |  |

Also retrieved by: "write a new help center article", "publish a knowledge base page", "add an faq entry to the help center".

### `intercom.get_article`

Get a single Intercom help center article by its id: title, body, state, and public url. Use when the user names a specific article rather than asking to browse the whole help center.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /articles/{{params.article_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `article_id` | string | **yes** | Intercom article id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `author_id` | string |  |
| `body` | string |  |
| `created_at` | integer |  |
| `id` | string |  |
| `state` | string |  |
| `title` | string |  |
| `updated_at` | integer |  |
| `url` | string |  |

Also retrieved by: "pull up this help center page", "show me a specific knowledge base article", "what does our faq say about this".

### `intercom.update_article`

Update an existing Intercom help center article's title, body, or publish state. Use when the user wants to edit or revise a knowledge-base article, not write a new one.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `PUT /articles/{{params.article_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `article_id` | string | **yes** | Intercom article id to update. |
| `body` | string | no | New body, as HTML. |
| `state` | string | no | "published" or "draft". |
| `title` | string | no | New title. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `state` | string |  |
| `title` | string |  |
| `updated_at` | integer |  |

Also retrieved by: "revise this help center page", "fix a typo in the knowledge base", "edit an existing faq article".

### `intercom.delete_article`

Permanently delete a help center article from Intercom, taking it off the public help center. Use when the user wants to remove an article entirely, not merely unpublish or draft it. Cannot be undone.

Class `destructive` (held by the mutation gate until the call's own arguments carry `"confirm": true`). No scopes beyond the connection's defaults. Calls `DELETE /articles/{{params.article_id}}`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `article_id` | string | **yes** | Intercom article id to delete. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `deleted` | boolean |  |
| `id` | string |  |

Also retrieved by: "take this article off the help center", "remove a knowledge base page for good", "delete an faq entry permanently".

### `intercom.list_articles`

List every article in Intercom's help center a page at a time. Use when the user wants to browse or export the whole knowledge base rather than look up one article by title or id.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /articles`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `per_page` | integer | no | Page size, default 50. |
| `starting_after` | string | no | Pagination cursor from a previous response's pages.next. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].id` | string |  |
| `data[].state` | string |  |
| `data[].title` | string |  |
| `data[].url` | string |  |
| `pages` | object |  |
| `pages.next` | object |  |
| `pages.next.starting_after` | string |  |
| `total_count` | integer |  |

Also retrieved by: "show me every help center article", "browse the whole knowledge base", "export our published faqs".

### `intercom.create_tag`

Create a new tag in the Intercom workspace, for labeling conversations, contacts, or companies. Use when the user wants a new tag to exist, not apply an existing one (use add_conversation_tag or tag_contact for that).

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /tags`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `name` | string | **yes** | Tag name. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `name` | string |  |

Also retrieved by: "set up a new label for the workspace", "define a new tag we can apply later", "add a category option to intercom".

### `intercom.list_tags`

List every tag defined in the Intercom workspace. Use when the user wants to see what tags exist or pick one to apply, not to tag a specific conversation, contact, or company.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /tags`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].id` | string |  |
| `data[].name` | string |  |

Also retrieved by: "what tags exist in our workspace", "show me every label we can apply", "browse the available categories".

### `intercom.tag_contact`

Apply an existing tag to an Intercom contact, for segmenting or filtering the customer directory. Use when the user wants to label a customer record, not a conversation (use add_conversation_tag for that).

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /contacts/{{params.contact_id}}/tags`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id. |
| `tag_id` | string | **yes** | Intercom tag id to apply. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `id` | string |  |
| `name` | string |  |

Also retrieved by: "label this customer's profile", "flag a contact with a category", "mark this user as vip".

### `intercom.create_contact_note`

Add an internal note to an Intercom contact, visible only to your team, not the customer. Use when the user wants to jot down context about a customer, not send them a message.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /contacts/{{params.contact_id}}/notes`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `admin_id` | string | no | Intercom admin id credited as the note's author. |
| `body` | string | **yes** | Note text. |
| `contact_id` | string | **yes** | Intercom contact id to note. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `body` | string |  |
| `created_at` | integer |  |
| `id` | string |  |

Also retrieved by: "jot down a note about this customer", "leave an internal comment on their profile", "log some context about this user for the team".

### `intercom.list_contact_notes`

List the internal notes your team has written on an Intercom contact. Use when the user wants the history of notes about a customer, not the conversation history with them.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /contacts/{{params.contact_id}}/notes`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id. |

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `data` | array of object |  |
| `data[].body` | string |  |
| `data[].created_at` | integer |  |
| `data[].id` | string |  |

Also retrieved by: "show me the notes we've written about this customer", "pull up the internal history on this person", "what has the team said about this user".

### `intercom.list_admins`

List the teammates (admins) in the Intercom workspace, for picking one to assign a conversation or ticket to. Use when the user asks who is on the support team, not who is a customer.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /admins`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `admins` | array of object |  |
| `admins[].away_mode_enabled` | boolean |  |
| `admins[].email` | string |  |
| `admins[].id` | string |  |
| `admins[].name` | string |  |

Also retrieved by: "who's on the support team", "show me every teammate in the workspace", "list the agents who can be assigned chats".

### `intercom.list_teams`

List the teams in the Intercom workspace, for picking one to assign a conversation or ticket to. Use when the user asks about a support team as a group rather than an individual teammate.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /teams`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `teams` | array of object |  |
| `teams[].admin_ids` | array of string |  |
| `teams[].id` | string |  |
| `teams[].name` | string |  |

Also retrieved by: "what teams exist in our workspace", "show me the support groups we can route to", "list every team available for assignment".

### `intercom.list_segments`

List the customer segments Intercom has computed, such as "active" or "churned" groups of contacts. Use when the user asks about a predefined audience segment, not a single contact search.

Class `read` (reads only). No scopes beyond the connection's defaults. Calls `GET /segments`.

Takes no arguments.

Result fields (the payload is trimmed to these before it reaches the model):

| Field | Type | Notes |
| --- | --- | --- |
| `segments` | array of object |  |
| `segments[].id` | string |  |
| `segments[].name` | string |  |
| `segments[].person_type` | string |  |

Also retrieved by: "what customer segments do we have", "show me the audience groups intercom computed", "list the predefined customer cohorts".

### `intercom.track_event`

Record a custom data event against an Intercom contact, such as "completed onboarding" or "upgraded plan", for behavioral targeting and reporting. Use when the user wants to log a customer action, not send them a message.

Class `write` (writes, no confirmation needed). No scopes beyond the connection's defaults. Calls `POST /events`.

Arguments:

| Argument | Type | Required | Notes |
| --- | --- | --- | --- |
| `contact_id` | string | **yes** | Intercom contact id the event happened to. |
| `created_at` | integer | no | Unix timestamp (seconds) the event occurred. Defaults to now. |
| `event_name` | string | **yes** | Event name, e.g. "invited_teammate". |

Also retrieved by: "log that this customer did something", "record a behavioral event for this user", "track that someone completed onboarding".
