# How to integrate Intercom MCP with Mastra AI

```json
{
  "title": "How to integrate Intercom MCP with Mastra AI",
  "toolkit": "Intercom",
  "toolkit_slug": "intercom",
  "framework": "Mastra AI",
  "framework_slug": "mastra-ai",
  "url": "https://composio.dev/toolkits/intercom/framework/mastra-ai",
  "markdown_url": "https://composio.dev/toolkits/intercom/framework/mastra-ai.md",
  "updated_at": "2026-05-12T10:16:06.641Z"
}
```

## Introduction

This guide walks you through connecting Intercom to Mastra AI using the Composio tool router. By the end, you'll have a working Intercom agent that can add tag 'vip' to contact john doe, assign open conversation #123 to support team, create note for contact emily about refund through natural language commands.
This guide will help you understand how to give your Mastra AI agent real control over a Intercom account through Composio's Intercom MCP server.
Before we dive in, let's take a quick look at the key ideas and tools involved.

## Also integrate Intercom with

- [ChatGPT](https://composio.dev/toolkits/intercom/framework/chatgpt)
- [Antigravity](https://composio.dev/toolkits/intercom/framework/antigravity)
- [OpenAI Agents SDK](https://composio.dev/toolkits/intercom/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/intercom/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/intercom/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/intercom/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/intercom/framework/codex)
- [Cursor](https://composio.dev/toolkits/intercom/framework/cursor)
- [VS Code](https://composio.dev/toolkits/intercom/framework/vscode)
- [OpenCode](https://composio.dev/toolkits/intercom/framework/opencode)
- [OpenClaw](https://composio.dev/toolkits/intercom/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/intercom/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/intercom/framework/cli)
- [Google ADK](https://composio.dev/toolkits/intercom/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/intercom/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/intercom/framework/ai-sdk)
- [LlamaIndex](https://composio.dev/toolkits/intercom/framework/llama-index)
- [CrewAI](https://composio.dev/toolkits/intercom/framework/crew-ai)

## TL;DR

Here's what you'll learn:
- Set up your environment so Mastra, OpenAI, and Composio work together
- Create a Tool Router session in Composio that exposes Intercom tools
- Connect Mastra's MCP client to the Composio generated MCP URL
- Fetch Intercom tool definitions and attach them as a toolset
- Build a Mastra agent that can reason, call tools, and return structured results
- Run an interactive CLI where you can chat with your Intercom agent

## What is Mastra AI?

Mastra AI is a TypeScript framework for building AI agents with tool support. It provides a clean API for creating agents that can use external services through MCP.
Key features include:
- MCP Client: Built-in support for Model Context Protocol servers
- Toolsets: Organize tools into logical groups
- Step Callbacks: Monitor and debug agent execution
- OpenAI Integration: Works with OpenAI models via @ai-sdk/openai

## What is the Intercom MCP server, and what's possible with it?

The Intercom MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Intercom account. It provides structured and secure access to your customer engagement platform, so your agent can perform actions like managing conversations, tagging contacts, creating articles, and updating company records on your behalf.
- Conversation management and assignment: Let your agent assign conversations to teams or admins, create new conversations, and close them when resolved, streamlining your support workflow.
- Contact tagging and note creation: Effortlessly tag contacts with relevant labels or add detailed notes for context, making customer follow-ups more organized and actionable.
- Automated company and contact updates: Enable your agent to attach contacts to companies, create or update company records, and keep your Intercom data clean and up to date.
- Article and collection creation: Let your agent publish new articles or create help center collections to expand your self-serve support resources without manual effort.
- Subscription and message preferences management: Allow your agent to add or manage subscriptions for contacts, helping you personalize communication and respect user preferences automatically.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `INTERCOM_ADD_SUBSCRIPTION_TO_A_CONTACT` | Add subscription to a contact | You can add a specific subscription to a contact. In Intercom, we have two different subscription types based on user consent - opt-out and opt-in: 1.Attaching a contact to an opt-out subscription type will opt that user out from receiving messages related to that subscription type. 2.Attaching a contact to an opt-in subscription type will opt that user in to receiving messages related to that subscription type. This will return a subscription type model for the subscription type that was added to the contact. |
| `INTERCOM_ADD_TAG_TO_CONTACT` | Add tag to contact | Tool to add a tag to a contact in Intercom. Use when you need to attach or add a specific tag to a contact for categorization or tracking purposes. |
| `INTERCOM_ARCHIVE_CONTACT` | Archive contact | Tool to archive a single contact in Intercom. Use when you need to archive a contact by their ID. |
| `INTERCOM_ASSIGN_CONVERSATION` | Assign conversation | Assigns a conversation to a specific admin or team in Intercom. Mutates live conversation state; confirm intent before bulk-assigning multiple conversations. |
| `INTERCOM_ATTACH_CONTACT_TO_COMPANY` | Attach contact to company | Tool to attach a contact to a company in Intercom. Use when you need to associate a contact with a company. |
| `INTERCOM_ATTACH_CONTACT_TO_CONVERSATION` | Attach contact to conversation | Tool to attach a contact participant to a conversation on behalf of admin or contact. Use when you need to add a new participant to an existing conversation. |
| `INTERCOM_ATTACH_TAG_TO_CONVERSATION` | Attach tag to conversation | Tool to add a tag to a specific conversation in Intercom. Use when you need to attach or tag a conversation. |
| `INTERCOM_ATTACH_TAG_TO_TICKET` | Attach tag to ticket | Tool to add a tag to a ticket in Intercom. Use when you need to attach or add a specific tag to a ticket for categorization or tracking purposes. |
| `INTERCOM_BLOCK_CONTACT` | Block contact | Tool to block a single contact in Intercom. Use when you need to block a contact, which will also archive their conversations. |
| `INTERCOM_CANCEL_DATA_EXPORT` | Cancel data export | Tool to cancel an active content data export job. Use when you need to terminate an ongoing export and update its status to 'canceled'. |
| `INTERCOM_CLOSE_CONVERSATION` | Close conversation | Closes a conversation in Intercom, marking it as resolved. Requires explicit user confirmation before calling; closing is irreversible without a separate reopen action. Send any reply via INTERCOM_REPLY_TO_CONVERSATION before calling this tool — parallel execution on the same conversation causes conflicts. |
| `INTERCOM_CREATE_A_COLLECTION` | Create a collection | You can create a new collection by making a POST request to `https://api.intercom.io/help_center/collections.` |
| `INTERCOM_CREATE_AN_ARTICLE` | Create an article | You can create a new article by making a POST request to `https://api.intercom.io/articles`. |
| `INTERCOM_CREATE_A_NOTE` | Create a note | You can add a note to a single contact. |
| `INTERCOM_CREATE_CONTACT` | Create contact | Tool to create a new contact in Intercom workspace. Use when you need to add a user or lead to Intercom. At least one identifier (email, external_id, or role) must be provided. |
| `INTERCOM_CREATE_CONTENT_IMPORT_SOURCE` | Create content import source | Tool to create a new content import source for the Fin Content Library. Use when you need to create a container for External Pages to be ingested into Intercom's AI content system. |
| `INTERCOM_CREATE_CONVERSATION` | Create conversation | Creates a new conversation in Intercom. Requires exactly one of from_user_id or from_contact_id — both are schema-optional but at least one must be provided. |
| `INTERCOM_CREATE_DATA_ATTRIBUTE` | Create data attribute | Tool to create a custom data attribute for contacts or companies. Use when you need to define a new attribute to track additional information beyond standard fields. |
| `INTERCOM_CREATE_DATA_EVENT` | Create data event | Tool to submit a data event to Intercom to track user activities. Use when you need to notify Intercom of user actions and changes. Events are detected as duplicates using workspace ID, contact identifier, event name, and timestamp. |
| `INTERCOM_CREATE_DATA_EXPORT` | Create data export | Tool to initiate an async data export job for message content. Use when you need to export messages created within a specific timeframe. Only one active job per workspace is allowed; exceeding this limit triggers a 429 error. Jobs expire two days after completion. |
| `INTERCOM_CREATE_EXTERNAL_PAGE` | Create external page | Tool to create an external page in Fin Content Library or update an existing page by external ID. Use when you need to ingest new content or update existing content for AI-generated answers. Supports upsert behavior: if a page with the same source_id and external_id exists, it will be updated instead of creating a new one. |
| `INTERCOM_CREATE_HELP_CENTER_SECTION` | Create help center section | Tool to create a new help center section within a collection. Use when you need to add a new section to organize articles in the help center hierarchy (Help Center → Collections → Sections → Articles). Supports multilingual content via translated_content parameter. |
| `INTERCOM_CREATE_INTERNAL_ARTICLE` | Create internal article | Tool to create a new internal article for team knowledge sharing. Use when you need to add new internal documentation or knowledge base articles for team members. |
| `INTERCOM_CREATE_OR_UPDATE_A_COMPANY` | Create or update a company | You can create or update a company. Companies will be only visible in Intercom when there is at least one associated user. Companies are looked up via `company_id` in a `POST` request, if not found via `company_id`, the new company will be created, if found, that company will be updated. {% admonition type="attention" name="Using `company_id`" %} You can set a unique `company_id` value when creating a company. However, it is not possible to update `company_id`. Be sure to set a unique value once upon creation of the company. {% /admonition %} |
| `INTERCOM_CREATE_TAG` | Create or update tag | Tool to create or update a tag, and optionally tag/untag companies or tag contacts. Use when you need to create a new tag, update an existing tag, or apply/remove tags to/from companies or users. |
| `INTERCOM_CREATE_TICKET` | Create ticket | Tool to create a ticket in Intercom to track customer requests and issues. Use when you need to create a new support ticket with specified type, contacts, and attributes. |
| `INTERCOM_CREATE_TICKET_TYPE` | Create a ticket type | Tool to create a new ticket type that defines the data structure for tracking customer requests. Use when you need to establish a new category of tickets with specific fields and states. |
| `INTERCOM_CREATE_TICKET_TYPE_ATTRIBUTE` | Create ticket type attribute | Tool to create a new attribute for a ticket type in Intercom. Use when you need to add custom attributes to ticket types for data collection. |
| `INTERCOM_DATA_EVENT_SUMMARIES` | Create event summaries | Tool to create event summaries for a user to track event occurrences. Use when you need to bulk update event counts for a user. |
| `INTERCOM_DELETE_A_COLLECTION` | Delete a collection | You can delete a single collection by making a DELETE request to `https://api.intercom.io/collections/`. |
| `INTERCOM_DELETE_A_COMPANY` | Delete a company | You can delete a single company. |
| `INTERCOM_DELETE_AN_ARTICLE` | Delete an article | You can delete a single article by making a DELETE request to `https://api.intercom.io/articles/`. |
| `INTERCOM_DELETE_A_TAG_DELETE_TAG` | Delete a tag | Tool to delete a tag from Intercom workspace. Use when you need to permanently remove a tag that is no longer needed. |
| `INTERCOM_DELETE_A_VISITOR` | Delete a visitor | Tool to delete a visitor from the Intercom workspace. Use when you need to permanently remove a visitor record. |
| `INTERCOM_DELETE_CONTACT` | Delete a contact | Tool to delete a contact from the Intercom workspace. Use when you need to permanently remove a contact record. |
| `INTERCOM_DELETE_CONTENT_IMPORT_SOURCE` | Delete content import source | Tool to delete a content import source and all its external pages. Use when you need to remove a content import source from Intercom. This operation is permanent and cannot be undone. |
| `INTERCOM_DELETE_EXTERNAL_PAGE` | Delete external page | Tool to delete an external page from content library and AI answers. Use when you need to remove an external page from Intercom's AI knowledge base. |
| `INTERCOM_DELETE_INTERNAL_ARTICLE` | Delete internal article | Tool to delete a single internal article by ID. Use when you need to permanently remove an internal article from Intercom. |
| `INTERCOM_DELETE_TICKET` | Delete ticket | Tool to delete a ticket from the Intercom system. Use when you need to permanently remove a ticket. |
| `INTERCOM_DETACH_A_CONTACT` | Detach a contact from tag | Tool to remove a tag from a specific contact in Intercom. Use when you need to detach or untag a contact. |
| `INTERCOM_DETACH_CONTACT_FROM_COMPANY` | Detach contact from company | Tool to detach a contact from a company in Intercom. Use when you need to remove a company association from a contact. |
| `INTERCOM_DETACH_TAG_FROM_CONVERSATION` | Detach tag from conversation | Tool to remove a tag from a specific conversation in Intercom. Use when you need to detach or untag a conversation. |
| `INTERCOM_DETACH_TAG_FROM_TICKET` | Detach tag from ticket | Tool to remove a tag from a ticket in Intercom. Use when you need to detach or remove a specific tag from a ticket. |
| `INTERCOM_DOWNLOAD_DATA_EXPORT` | Download data export | Tool to download content data export from Intercom. Use when you need to retrieve exported message data from a completed data export job. The data is returned as a gzipped CSV file stream. |
| `INTERCOM_ENQUEUE_CREATE_TICKET` | Enqueue create ticket | Tool to enqueue ticket creation for asynchronous processing. Use when you need to create a ticket in Intercom. The system attempts validation on inputs before tasks are enqueued. |
| `INTERCOM_FIND_TAG` | Find a tag | Tool to retrieve details for a specific tag by its ID. Use when you need to get information about a particular tag in the workspace. |
| `INTERCOM_GET_A_CONTACT` | Get a contact | You can fetch the details of a single contact. |
| `INTERCOM_GET_CONTENT_IMPORT_SOURCE` | Get content import source | Tool to retrieve a content import source by its ID. Use when you need to fetch details about a specific content import source from Intercom's AI features. |
| `INTERCOM_GET_CONVERSATION` | Get conversation | Retrieves a specific conversation by ID with all messages and details. Key response caveats: `conversation_parts` are paginated — walk all cursors for complete transcripts. Fields `title`, `subject`, `source.body`, `conversation_parts.body`, `statistics`, and some contact properties can be null. System/workflow events appear in `conversation_parts` with null `body` or `author`; `first_admin_reply_at` may be null despite actual replies — use `last_admin_reply_at` for SLA calculations. Attachment URLs in `conversation_parts` are short-lived — download promptly. The `state` field and `open` boolean can diverge — re-fetch to verify state before assign/reply/close actions. Timestamps are Unix epoch seconds UTC. Use this tool (not INTERCOM_SEARCH_CONVERSATIONS) when full message context is required. |
| `INTERCOM_GET_COUNTS` | Get entity counts | Tool to retrieve summary counts for Intercom app entities including companies, users, leads, tags, segments, and conversations. Use when you need to get statistics about the total number of entities in the workspace or conversation counts. |
| `INTERCOM_GET_CUSTOM_OBJECT_INSTANCE_BY_EXTERNAL_ID` | Get custom object instance by external ID | Tool to retrieve a custom object instance by its external_id. Use when you need to fetch a specific custom object instance from Intercom using an identifier from your external system rather than Intercom's internal ID. |
| `INTERCOM_GET_EXTERNAL_PAGE` | Get external page | Tool to retrieve an external page from Fin Content Library by ID. Use when you need to fetch details of a specific external page including its content, metadata, and AI availability settings. |
| `INTERCOM_GET_TICKET` | Get ticket | Tool to retrieve a ticket from Intercom. Use when you need to fetch comprehensive details about a specific ticket including state, type, attributes, and contacts. |
| `INTERCOM_GET_TICKET_TYPE` | Get a ticket type | Tool to retrieve details for a specific ticket type by its ID. Use when you need to get complete information about a ticket type including its attributes and states. |
| `INTERCOM_IDENTIFY_AN_ADMIN` | Identify an admin | You can view the currently authorised admin along with the embedded app object (a "workspace" in legacy terminology). > 🚧 Single Sign On > > If you are building a custom "Log in with Intercom" flow for your site, and you call the `/me` endpoint to identify the logged-in user, you should not accept any sign-ins from users with unverified email addresses as it poses a potential impersonation security risk. |
| `INTERCOM_JOBS_STATUS` | Retrieve job status | Tool to retrieve the status of job execution. Use when checking progress and outcome of asynchronous operations like data imports or exports. |
| `INTERCOM_LIST_ALL_ACTIVITY_LOGS` | List all activity logs | You can get a log of activities by all admins in an app. |
| `INTERCOM_LIST_ALL_ADMINS` | List all admins | You can fetch a list of admins for a given workspace. |
| `INTERCOM_LIST_ALL_ARTICLES` | List all articles | You can fetch a list of all articles by making a GET request to `https://api.intercom.io/articles`. > 📘 How are the articles sorted and ordered? > > Articles will be returned in descending order on the `updated_at` attribute. This means if you need to iterate through results then we'll show the most recently updated articles first. |
| `INTERCOM_LIST_ALL_COLLECTIONS` | List all collections | You can fetch a list of all collections by making a GET request to `https://api.intercom.io/help_center/collections`. Collections will be returned in descending order on the `updated_at` attribute. This means if you need to iterate through results then we'll show the most recently updated collections first. |
| `INTERCOM_LIST_ALL_COMPANIES` | List all companies | You can list companies. The company list is sorted by the `last_request_at` field and by default is ordered descending, most recently requested first. Note that the API does not include companies who have no associated users in list responses. When using the Companies endpoint and the pages object to iterate through the returned companies, there is a limit of 10,000 Companies that can be returned. If you need to list or iterate on more than 10,000 Companies, please use the [Scroll API](https://developers.intercom.com/reference#iterating-over-all-companies). {% admonition type="warning" name="Pagination" %} You can use pagination to limit the number of results returned. The default is `20` results per page. See the [pagination section](https://developers.intercom.com/docs/build-an-integration/learn-more/rest-apis/pagination/#pagination-for-list-apis) for more details on how to use the `starting_after` param. {% /admonition %} |
| `INTERCOM_LIST_ALL_HELP_CENTERS` | List all help centers | You can list all Help Centers by making a GET request to `https://api.intercom.io/help_center/help_centers`. |
| `INTERCOM_LIST_ALL_MACROS` | List all macros | Tool to fetch a list of all macros (saved replies) in your workspace for use in automating responses. The macros are returned in descending order by updated_at. Use when you need to retrieve available macros or sync macro data. |
| `INTERCOM_LIST_ALL_NOTES` | List all notes | You can fetch a list of notes that are associated to a contact. |
| `INTERCOM_LIST_ATTACHED_COMPANIES_FOR_CONTACT` | List attached companies for contact | You can fetch a list of companies that are associated to a contact. |
| `INTERCOM_LIST_ATTACHED_CONTACTS` | List attached contacts | You can fetch a list of all contacts that belong to a company. |
| `INTERCOM_LIST_ATTACHED_SEGMENTS_FOR_COMPANIES` | List attached segments for companies | You can fetch a list of all segments that belong to a company. |
| `INTERCOM_LIST_ATTACHED_SEGMENTS_FOR_CONTACT` | List attached segments for contact | You can fetch a list of segments that are associated to a contact. |
| `INTERCOM_LIST_AWAY_STATUS_REASONS` | List away status reasons | Tool to retrieve all away status reasons for a workspace including deleted ones. Use when you need to list available away status options for team members. |
| `INTERCOM_LIST_CALLS` | List calls | Tool to list all phone calls from Intercom with pagination support. Use when you need to retrieve call records, view call history, or iterate through calls. |
| `INTERCOM_LIST_CALLS_WITH_TRANSCRIPTS` | List calls with transcripts | Tool to retrieve calls by conversation IDs with transcripts when available. Use when you need to get call records with their transcripts for specific conversations. Maximum 20 conversation IDs per request. |
| `INTERCOM_LIST_COMPANY_NOTES` | List company notes | Tool to list all notes associated with a specific company. Use when you need to retrieve all notes that have been added to a company record. |
| `INTERCOM_LIST_CONTACTS` | List all contacts | Tool to list all contacts (users or leads) in your Intercom workspace with pagination support. Use when you need to retrieve multiple contacts or iterate through all contacts in the workspace. |
| `INTERCOM_LIST_CONTENT_IMPORT_SOURCES` | List content import sources | Tool to retrieve all content import sources for the workspace. Use when you need to list all content sources for Fin Content Library. |
| `INTERCOM_LIST_CONVERSATIONS` | List conversations | Lists all conversations from Intercom with pagination support. This endpoint does not support filtering by state, assignee, or other attributes - use INTERCOM_SEARCH_CONVERSATIONS for filtering. Paginate by reading pages.next.starting_after from each response and passing it as starting_after until pages.next is absent. Response fields including title, source.body, conversation_parts.body, and statistics may be null; guard before string operations. |
| `INTERCOM_LIST_DATA_ATTRIBUTES` | List data attributes | Tool to list all data attributes for contacts, companies, and conversations. Use when you need to retrieve metadata about available data attributes. |
| `INTERCOM_LIST_DATA_EVENTS` | List data events | Tool to retrieve a log of data events belonging to a customer. Use when you need to list events for a specific user. Note: Only events less than 90 days old can be listed. |
| `INTERCOM_LIST_EXTERNAL_PAGES` | List external pages | Tool to list all external pages from Fin Content Library. Use when you need to retrieve external pages used for AI-generated answers in Intercom. |
| `INTERCOM_LIST_HELP_CENTER_SECTIONS` | List help center sections | Tool to fetch a list of all help center sections in descending order by updated_at. Use when you need to retrieve sections from the help center hierarchy (Help Center → Collections → Sections → Articles). |
| `INTERCOM_LIST_INTERNAL_ARTICLES` | List internal articles | Fetches one page of internal articles from Intercom. Uses Intercom's cursor-based pagination via `starting_after`. ONE Intercom API call is made per invocation; pagination is caller-driven via the `starting_after` request parameter and the `next_starting_after` field in the response. |
| `INTERCOM_LIST_NEWS_ITEMS` | List all news items | Tool to fetch a list of all news items from Intercom. Use when you need to retrieve news items posted in the workspace. |
| `INTERCOM_LIST_SEGMENTS` | List all segments | Tool to retrieve all segments defined within a workspace for filtering and categorizing contacts. Use when you need to get a list of all available segments or check segment counts. |
| `INTERCOM_LIST_SUBSCRIPTIONS_FOR_A_CONTACT` | List subscriptions for a contact | You can fetch a list of subscription types that are attached to a contact. These can be subscriptions that a user has 'opted-in' to or has 'opted-out' from, depending on the subscription type. This will return a list of Subscription Type objects that the contact is associated with. The data property will show a combined list of: 1.Opt-out subscription types that the user has opted-out from. 2.Opt-in subscription types that the user has opted-in to receiving. |
| `INTERCOM_LIST_SUBSCRIPTION_TYPES` | List subscription types | Tool to list all subscription types available in the workspace. Use when you need to retrieve subscription configuration details including state, translations, consent type, and supported content types. |
| `INTERCOM_LIST_TAGS` | List all tags | Tool to fetch all tags for the workspace. Use when you need to retrieve all available tags that can be applied to contacts, companies, and conversations. |
| `INTERCOM_LIST_TAGS_ATTACHED_TO_A_CONTACT` | List tags attached to a contact | You can fetch a list of all tags that are attached to a specific contact. |
| `INTERCOM_LIST_TEAMS` | List all teams | Tool to retrieve all teams within a workspace. Use when you need to get a list of all available teams, their members, or assignment configurations. |
| `INTERCOM_LIST_TICKET_STATES` | List all ticket states | Tool to fetch all ticket states for the workspace. Use when you need to retrieve all configured ticket states, including both active and archived ones. |
| `INTERCOM_LIST_TICKET_TYPES` | List all ticket types | Tool to retrieve all ticket types for the workspace. Use when you need to get all available ticket type configurations including attributes and states. |
| `INTERCOM_MERGE_A_LEAD_AND_A_USER` | Merge a lead and a user | You can merge a contact with a `role` of `lead` into a contact with a `role` of `user`. |
| `INTERCOM_REGISTER_FIN_VOICE_CALL` | Register Fin Voice call | Tool to register a Fin Voice call with Intercom. Use when you need to create a record of an external voice call in Intercom, enabling AI-powered call analysis and customer interaction tracking. |
| `INTERCOM_REMOVE_SUBSCRIPTION_FROM_A_CONTACT` | Remove subscription from a contact | You can remove a specific subscription from a contact. This will return a subscription type model for the subscription type that was removed from the contact. |
| `INTERCOM_REMOVE_TAG_FROM_A_CONTACT` | Remove tag from a contact | You can remove tag from a specific contact. This will return a tag object for the tag that was removed from the contact. |
| `INTERCOM_REOPEN_CONVERSATION` | Reopen conversation | Reopens a closed conversation in Intercom. Only operates correctly on conversations in a closed state; verify state via INTERCOM_GET_CONVERSATION before calling, as using on open or snoozed conversations may produce unexpected results. |
| `INTERCOM_REPLY_TICKET` | Reply to ticket | Tool to reply to a ticket with a message from admin or contact, or with a note for admins. Use when you need to add a response or comment to an existing ticket. |
| `INTERCOM_REPLY_TO_CONVERSATION` | Reply to conversation | Sends a reply to an existing conversation in Intercom. Always send reply before closing a conversation — never parallelize with INTERCOM_CLOSE_CONVERSATION on the same conversation. Verify conversation state via INTERCOM_GET_CONVERSATION before replying, as open/snoozed/closed states may diverge from cached values. |
| `INTERCOM_RETRIEVE_A_COLLECTION` | Retrieve a collection | You can fetch the details of a single collection by making a GET request to `https://api.intercom.io/help_center/collections/`. |
| `INTERCOM_RETRIEVE_A_COMPANY_BY_ID` | Retrieve a company by id | You can fetch a single company. |
| `INTERCOM_RETRIEVE_A_HELP_CENTER` | Retrieve a help center | You can fetch the details of a single Help Center by making a GET request to `https://api.intercom.io/help_center/help_center/`. |
| `INTERCOM_RETRIEVE_A_JOB_STATUS` | Retrieve job status | Tool to retrieve the status of a data export job. Use when checking the progress of an export job by providing the job identifier. |
| `INTERCOM_RETRIEVE_A_MACRO` | Retrieve a macro | Tool to fetch a single macro (saved reply) by its ID. The macro will only be returned if it is visible to the authenticated user based on its visibility settings. |
| `INTERCOM_RETRIEVE_AN_ADMIN` | Retrieve an admin | You can retrieve the details of a single admin. |
| `INTERCOM_RETRIEVE_AN_ARTICLE` | Retrieve an article | You can fetch the details of a single article by making a GET request to `https://api.intercom.io/articles/`. |
| `INTERCOM_RETRIEVE_A_SEGMENT` | Retrieve a segment | Tool to retrieve details for a single segment by its ID. Use when you need to get information about a specific segment including its name, type, and optionally the count of items. |
| `INTERCOM_RETRIEVE_COMPANIES` | Retrieve companies | You can fetch a single company by passing in `company_id` or `name`. `https://api.intercom.io/companies?name={name}` `https://api.intercom.io/companies?company_id={company_id}` You can fetch all companies and filter by `segment_id` or `tag_id` as a query parameter. `https://api.intercom.io/companies?tag_id={tag_id}` `https://api.intercom.io/companies?segment_id={segment_id}` |
| `INTERCOM_RETRIEVE_INTERNAL_ARTICLE` | Retrieve internal article | Tool to retrieve an internal article by ID from Intercom. Use when you need to fetch details of a specific internal article including its title, body content, and metadata. |
| `INTERCOM_RETRIEVE_NOTE` | Retrieve note | Tool to retrieve details of a single note by its identifier. Use when you need to fetch the complete information about a specific note. |
| `INTERCOM_RETRIEVE_TEAM` | Retrieve a team | Tool to retrieve detailed information about a specific team by ID. Use when you need to get team details including members and assignment configuration. |
| `INTERCOM_RETRIEVE_VISITOR_WITH_USER_ID` | Retrieve visitor with user ID | Tool to retrieve a specific visitor's details using their user_id. Use when you need to fetch comprehensive visitor information including profile data, location, and activity metrics. |
| `INTERCOM_SCROLL_OVER_ALL_COMPANIES` | Scroll over all companies | The `list all companies` functionality does not work well for huge datasets, and can result in errors and performance problems when paging deeply. The Scroll API provides an efficient mechanism for iterating over all companies in a dataset. - Each app can only have 1 scroll open at a time. You'll get an error message if you try to have more than one open per app. You can get the first page of companies by simply sending a GET request to the scroll endpoint. For subsequent requests you will need to use the scroll parameter from the response type="danger" name="Scroll network timeouts". Since scroll is often used on large datasets network errors such as timeouts can be encountered. When this occurs you will see a HTTP 500 error with the following message: "Request failed due to an internal network error. Please restart the scroll operation." If this happens, you will need to restart your scroll query. |
| `INTERCOM_SEARCH_CONTACTS` | Search contacts | Tool to search for contacts using query filters with operators. Use when finding contacts by role, email, name, or attributes. Response entries may include null or non-dictionary values; guard against missing/null fields before accessing nested properties. A contact may have multiple emails or contact_ids; deduplicate when aggregating across searches. |
| `INTERCOM_SEARCH_CONVERSATIONS` | Search conversations | Searches for conversations using query string with support for filtering and sorting |
| `INTERCOM_SEARCH_FOR_ARTICLES` | Search for articles | You can search for articles by making a GET request to `https://api.intercom.io/articles/search`. |
| `INTERCOM_SEARCH_INTERNAL_ARTICLES` | Search internal articles | Searches one page of internal articles in Intercom. Uses Intercom's cursor-based pagination via `starting_after`. ONE Intercom API call is made per invocation; pagination is caller-driven via the `starting_after` request parameter and the `next_starting_after` field in the response. Optionally filtered by `folder_id`. |
| `INTERCOM_SEARCH_TICKETS` | Search tickets | Tool to search tickets in Intercom by filtering attribute values. Use when you need to find tickets matching specific criteria like state, creation date, assignment, or custom attributes. |
| `INTERCOM_SET_ADMIN_TO_AWAY` | Set admin to away | Tool to set an admin to away status in Intercom. Use when you need to mark an admin as away, optionally with a specific reason and reassignment behavior. |
| `INTERCOM_SET_AN_ADMIN_TO_AWAY` | Set an admin to away | You can set an Admin as away for the Inbox. |
| `INTERCOM_SHOW_CALL` | Show call | Tool to retrieve a single call by ID from Intercom. Use when you need to get detailed information about a specific phone call. |
| `INTERCOM_SHOW_CALL_TRANSCRIPT` | Show call transcript | Tool to get call transcript by call ID. Use when you need to retrieve the transcript text from a recorded call. |
| `INTERCOM_SHOW_CONTACT_BY_EXTERNAL_ID` | Show contact by external ID | Tool to retrieve a contact by their external ID. Use when you need to fetch contact details using an identifier from your external system rather than Intercom's internal ID. Only supports users, not leads. |
| `INTERCOM_UNARCHIVE_CONTACT` | Unarchive contact | Tool to unarchive a previously archived contact in Intercom. Use when you need to restore an archived contact by their ID. |
| `INTERCOM_UPDATE_A_COLLECTION` | Update a collection | You can update the details of a single collection by making a PUT request to `https://api.intercom.io/collections/`. |
| `INTERCOM_UPDATE_A_COMPANY` | Update a company | You can update a single company using the Intercom provisioned `id`. {% admonition type="attention" name="Using `company_id`" %} When updating a company it is not possible to update `company_id`. This can only be set once upon creation of the company. {% /admonition %} |
| `INTERCOM_UPDATE_A_CONTACT` | Update a contact | You can update an existing contact (ie. user or lead). |
| `INTERCOM_UPDATE_AN_ARTICLE` | Update an article | You can update the details of a single article by making a PUT request to `https://api.intercom.io/articles/`. |
| `INTERCOM_UPDATE_CONTACT` | Update contact | Tool to update an existing contact in Intercom. Use when you need to modify contact information such as name, email, custom attributes, or other properties. |
| `INTERCOM_UPDATE_CONTENT_IMPORT_SOURCE` | Update content import source | Tool to update an existing content import source in Fin Content Library. Use when you need to modify the URL, sync behavior, or status of an existing content import source. |
| `INTERCOM_UPDATE_DATA_ATTRIBUTE` | Update data attribute | Tool to update an existing data attribute in Intercom. Use when you need to modify a data attribute's description, archive status, or messenger writability. Note: Changing a data attribute's type via the API is restricted and must be done through the UI. |
| `INTERCOM_UPDATE_EXTERNAL_PAGE` | Update external page | Tool to update an existing external page in Fin Content Library. Use when you need to modify the content, metadata, or availability settings of an external page. Only pages created through the API can be updated. |
| `INTERCOM_UPDATE_INTERNAL_ARTICLE` | Update internal article | Tool to update an internal article with new title, body, author or owner information. Use when you need to modify an existing internal article in Intercom. |
| `INTERCOM_UPDATE_TICKET` | Update ticket | Tool to update an existing ticket in Intercom. Use when you need to modify ticket attributes, state, assignment, or other properties. |
| `INTERCOM_UPDATE_TICKET_TYPE` | Update a ticket type | Tool to update an existing ticket type in the workspace. Use when you need to modify a ticket type's name, description, category, icon, or archive status. |
| `INTERCOM_UPDATE_TICKET_TYPE_ATTRIBUTE` | Update ticket type attribute | Tool to update an existing attribute for a ticket type. Use when you need to modify properties like description, visibility, or requirements for a ticket type attribute. |

## Supported Triggers

None listed.

## Creating MCP Server - Stand-alone vs Composio SDK

The Intercom MCP server is an implementation of the Model Context Protocol that connects your AI agent to Intercom. It provides structured and secure access so your agent can perform Intercom operations on your behalf through a secure, permission-based interface.
With Composio's managed implementation, you don't have to create your own developer app. For production, if you're building an end product, we recommend using your own credentials. The managed server helps you prototype fast and go from 0-1 faster.

## Step-by-step Guide

### 1. Prerequisites

Before starting, make sure you have:
- Node.js 18 or higher
- A Composio account with an active API key
- An OpenAI API key
- Basic familiarity with TypeScript

### 1. Getting API Keys for OpenAI and Composio

OpenAI API Key
- Go to the [OpenAI dashboard](https://platform.openai.com/settings/organization/api-keys) and create an API key.
- You need credits or a connected billing setup to use the models.
- Store the key somewhere safe.
Composio API Key
- Log in to the [Composio dashboard](https://dashboard.composio.dev?utm_source=toolkits&utm_medium=framework_docs).
- Go to Settings and copy your API key.
- This key lets your Mastra agent talk to Composio and reach Intercom through MCP.

### 2. Install dependencies

Install the required packages.
What's happening:
- @composio/core is the Composio SDK for creating MCP sessions
- @mastra/core provides the Agent class
- @mastra/mcp is Mastra's MCP client
- @ai-sdk/openai is the model wrapper for OpenAI
- dotenv loads environment variables from .env
```bash
npm install @composio/core @mastra/core @mastra/mcp @ai-sdk/openai dotenv
```

### 3. Set up environment variables

Create a .env file in your project root.
What's happening:
- COMPOSIO_API_KEY authenticates your requests to Composio
- COMPOSIO_USER_ID tells Composio which user this session belongs to
- OPENAI_API_KEY lets the Mastra agent call OpenAI models
```bash
COMPOSIO_API_KEY=your_composio_api_key_here
COMPOSIO_USER_ID=your_user_id_here
OPENAI_API_KEY=your_openai_api_key_here
```

### 4. Import libraries and validate environment

What's happening:
- dotenv/config auto loads your .env so process.env.* is available
- openai gives you a Mastra compatible model wrapper
- Agent is the Mastra agent that will call tools and produce answers
- MCPClient connects Mastra to your Composio MCP server
- Composio is used to create a Tool Router session
```typescript
import "dotenv/config";
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { Composio } from "@composio/core";
import * as readline from "readline";

import type { AiMessageType } from "@mastra/core/agent";

const openaiAPIKey = process.env.OPENAI_API_KEY;
const composioAPIKey = process.env.COMPOSIO_API_KEY;
const composioUserID = process.env.COMPOSIO_USER_ID;

if (!openaiAPIKey) throw new Error("OPENAI_API_KEY is not set");
if (!composioAPIKey) throw new Error("COMPOSIO_API_KEY is not set");
if (!composioUserID) throw new Error("COMPOSIO_USER_ID is not set");

const composio = new Composio({
  apiKey: composioAPIKey as string,
});
```

### 5. Create a Tool Router session for Intercom

What's happening:
- create spins up a short-lived MCP HTTP endpoint for this user
- The toolkits array contains "intercom" for Intercom access
- session.mcp.url is the MCP URL that Mastra's MCPClient will connect to
```typescript
async function main() {
  const session = await composio.create(
    composioUserID as string,
    {
      toolkits: ["intercom"],
    },
  );

  const composioMCPUrl = session.mcp.url;
  console.log("Intercom MCP URL:", composioMCPUrl);
```

### 6. Configure Mastra MCP client and fetch tools

What's happening:
- MCPClient takes an id for this client and a list of MCP servers
- The headers property includes the x-api-key for authentication
- getTools fetches the tool definitions exposed by the Intercom toolkit
```typescript
const mcpClient = new MCPClient({
    id: composioUserID as string,
    servers: {
      nasdaq: {
        url: new URL(composioMCPUrl),
        requestInit: {
          headers: session.mcp.headers,
        },
      },
    },
    timeout: 30_000,
  });

console.log("Fetching MCP tools from Composio...");
const composioTools = await mcpClient.getTools();
console.log("Number of tools:", Object.keys(composioTools).length);
```

### 7. Create the Mastra agent

What's happening:
- Agent is the core Mastra agent
- name is just an identifier for logging and debugging
- instructions guide the agent to use tools instead of only answering in natural language
- model uses openai("gpt-5") to configure the underlying LLM
```typescript
const agent = new Agent({
    name: "intercom-mastra-agent",
    instructions: "You are an AI agent with Intercom tools via Composio.",
    model: "openai/gpt-5",
  });
```

### 8. Set up interactive chat interface

What's happening:
- messages keeps the full conversation history in Mastra's expected format
- agent.generate runs the agent with conversation history and Intercom toolsets
- maxSteps limits how many tool calls the agent can take in a single run
- onStepFinish is a hook that prints intermediate steps for debugging
```typescript
let messages: AiMessageType[] = [];

console.log("Chat started! Type 'exit' or 'quit' to end.\n");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  prompt: "> ",
});

rl.prompt();

rl.on("line", async (userInput: string) => {
  const trimmedInput = userInput.trim();

  if (["exit", "quit", "bye"].includes(trimmedInput.toLowerCase())) {
    console.log("\nGoodbye!");
    rl.close();
    process.exit(0);
  }

  if (!trimmedInput) {
    rl.prompt();
    return;
  }

  messages.push({
    id: crypto.randomUUID(),
    role: "user",
    content: trimmedInput,
  });

  console.log("\nAgent is thinking...\n");

  try {
    const response = await agent.generate(messages, {
      toolsets: {
        intercom: composioTools,
      },
      maxSteps: 8,
    });

    const { text } = response;

    if (text && text.trim().length > 0) {
      console.log(`Agent: ${text}\n`);
        messages.push({
          id: crypto.randomUUID(),
          role: "assistant",
          content: text,
        });
      }
    } catch (error) {
      console.error("\nError:", error);
    }

    rl.prompt();
  });

  rl.on("close", async () => {
    console.log("\nSession ended.");
    await mcpClient.disconnect();
    process.exit(0);
  });
}

main().catch((err) => {
  console.error("Fatal error:", err);
  process.exit(1);
});
```

## Complete Code

```typescript
import "dotenv/config";
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { Composio } from "@composio/core";
import * as readline from "readline";

import type { AiMessageType } from "@mastra/core/agent";

const openaiAPIKey = process.env.OPENAI_API_KEY;
const composioAPIKey = process.env.COMPOSIO_API_KEY;
const composioUserID = process.env.COMPOSIO_USER_ID;

if (!openaiAPIKey) throw new Error("OPENAI_API_KEY is not set");
if (!composioAPIKey) throw new Error("COMPOSIO_API_KEY is not set");
if (!composioUserID) throw new Error("COMPOSIO_USER_ID is not set");

const composio = new Composio({ apiKey: composioAPIKey as string });

async function main() {
  const session = await composio.create(composioUserID as string, {
    toolkits: ["intercom"],
  });

  const composioMCPUrl = session.mcp.url;

  const mcpClient = new MCPClient({
    id: composioUserID as string,
    servers: {
      intercom: {
        url: new URL(composioMCPUrl),
        requestInit: {
          headers: session.mcp.headers,
        },
      },
    },
    timeout: 30_000,
  });

  const composioTools = await mcpClient.getTools();

  const agent = new Agent({
    name: "intercom-mastra-agent",
    instructions: "You are an AI agent with Intercom tools via Composio.",
    model: "openai/gpt-5",
  });

  let messages: AiMessageType[] = [];

  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: "> ",
  });

  rl.prompt();

  rl.on("line", async (input: string) => {
    const trimmed = input.trim();
    if (["exit", "quit"].includes(trimmed.toLowerCase())) {
      rl.close();
      return;
    }

    messages.push({ id: crypto.randomUUID(), role: "user", content: trimmed });

    const { text } = await agent.generate(messages, {
      toolsets: { intercom: composioTools },
      maxSteps: 8,
    });

    if (text) {
      console.log(`Agent: ${text}\n`);
      messages.push({ id: crypto.randomUUID(), role: "assistant", content: text });
    }

    rl.prompt();
  });

  rl.on("close", async () => {
    await mcpClient.disconnect();
    process.exit(0);
  });
}

main();
```

## Conclusion

You've built a Mastra AI agent that can interact with Intercom through Composio's Tool Router.
You can extend this further by:
- Adding other toolkits like Gmail, Slack, or GitHub
- Building a web-based chat interface around this agent
- Using multiple MCP endpoints to enable cross-app workflows

## How to build Intercom MCP Agent with another framework

- [ChatGPT](https://composio.dev/toolkits/intercom/framework/chatgpt)
- [Antigravity](https://composio.dev/toolkits/intercom/framework/antigravity)
- [OpenAI Agents SDK](https://composio.dev/toolkits/intercom/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/intercom/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/intercom/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/intercom/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/intercom/framework/codex)
- [Cursor](https://composio.dev/toolkits/intercom/framework/cursor)
- [VS Code](https://composio.dev/toolkits/intercom/framework/vscode)
- [OpenCode](https://composio.dev/toolkits/intercom/framework/opencode)
- [OpenClaw](https://composio.dev/toolkits/intercom/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/intercom/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/intercom/framework/cli)
- [Google ADK](https://composio.dev/toolkits/intercom/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/intercom/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/intercom/framework/ai-sdk)
- [LlamaIndex](https://composio.dev/toolkits/intercom/framework/llama-index)
- [CrewAI](https://composio.dev/toolkits/intercom/framework/crew-ai)

## Related Toolkits

- [Aeroleads](https://composio.dev/toolkits/aeroleads) - Aeroleads is a B2B lead generation platform for finding business emails and phone numbers. Grow your sales pipeline faster with powerful prospecting tools.
- [Autobound](https://composio.dev/toolkits/autobound) - Autobound is an AI-powered sales engagement platform that crafts hyper-personalized outreach and insights. It helps sales teams boost response rates and close more deals through tailored content and recommendations.
- [Better proposals](https://composio.dev/toolkits/better_proposals) - Better Proposals is a web-based tool for crafting and sending professional proposals. It helps teams impress clients and close deals faster with slick, easy-to-use templates.
- [Bidsketch](https://composio.dev/toolkits/bidsketch) - Bidsketch is a proposal software that helps businesses create professional proposals quickly and efficiently. It streamlines the proposal process, saving time while boosting client win rates.
- [Bolna](https://composio.dev/toolkits/bolna) - Bolna is an AI platform for building conversational voice agents. It helps businesses automate support and streamline interactions through natural, voice-powered conversations.
- [Botsonic](https://composio.dev/toolkits/botsonic) - Botsonic is a no-code AI chatbot builder for easily creating and deploying chatbots to your website. It empowers businesses to offer conversational experiences without writing code.
- [Botstar](https://composio.dev/toolkits/botstar) - BotStar is a comprehensive chatbot platform for designing, developing, and training chatbots visually on Messenger and websites. It helps businesses automate conversations and customer interactions without coding.
- [Callerapi](https://composio.dev/toolkits/callerapi) - CallerAPI is a white-label caller identification platform for branded caller ID and fraud prevention. It helps businesses boost customer trust while stopping spam, fraud, and robocalls.
- [Callingly](https://composio.dev/toolkits/callingly) - Callingly is a lead response management platform that automates immediate call and text follow-ups with new leads. It helps sales teams boost response speed and close more deals by connecting seamlessly with CRMs and lead sources.
- [Callpage](https://composio.dev/toolkits/callpage) - Callpage is a lead capture platform that lets businesses instantly connect with website visitors via callback. It boosts lead generation and increases your sales conversion rates.
- [Clearout](https://composio.dev/toolkits/clearout) - Clearout is an AI-powered service for verifying, finding, and enriching email addresses. It boosts deliverability and helps you discover high-quality leads effortlessly.
- [Clientary](https://composio.dev/toolkits/clientary) - Clientary is a platform for managing clients, invoices, projects, proposals, and more. It streamlines client work and saves you serious admin time.
- [Convolo ai](https://composio.dev/toolkits/convolo_ai) - Convolo ai is an AI-powered communications platform for sales teams. It accelerates lead response and improves conversion rates by automating calls and integrating workflows.
- [Delighted](https://composio.dev/toolkits/delighted) - Delighted is a customer feedback platform based on the Net Promoter System®. It helps you quickly gather, track, and act on customer sentiment.
- [Docsbot ai](https://composio.dev/toolkits/docsbot_ai) - Docsbot ai is a platform that lets you build custom AI chatbots trained on your documentation. It automates customer support and content generation, saving time and improving response quality.
- [Emelia](https://composio.dev/toolkits/emelia) - Emelia is an all-in-one B2B prospecting platform for cold-email, LinkedIn outreach, and prospect research. It streamlines outbound campaigns so you can find, engage, and warm up leads faster.
- [Findymail](https://composio.dev/toolkits/findymail) - Findymail is a B2B data provider offering verified email and phone contacts for sales prospecting. Enhance outreach with automated exports, email verification, and CRM enrichment.
- [Freshdesk](https://composio.dev/toolkits/freshdesk) - Freshdesk is customer support software with ticketing and automation tools. It helps teams streamline helpdesk operations for faster, better customer support.
- [Fullenrich](https://composio.dev/toolkits/fullenrich) - FullEnrich is a B2B contact enrichment platform that aggregates emails and phone numbers from 15+ data vendors. Instantly find and verify lead contact data to boost your outreach.
- [Gatherup](https://composio.dev/toolkits/gatherup) - GatherUp is a customer feedback and online review management platform. It helps businesses boost their reputation by streamlining how they collect and manage customer feedback.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Intercom MCP?

With a standalone Intercom MCP server, the agents and LLMs can only access a fixed set of Intercom tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Intercom and many other apps based on the task at hand, all through a single MCP endpoint.

### Can I use Tool Router MCP with Mastra AI?

Yes, you can. Mastra AI fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Intercom tools.

### Can I manage the permissions and scopes for Intercom while using Tool Router?

Yes, absolutely. You can configure which Intercom scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

### How safe is my data with Composio Tool Router?

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Intercom data and credentials are handled as safely as possible.

---
[See all toolkits](https://composio.dev/toolkits) · [Composio docs](https://docs.composio.dev/llms.txt)
