# How to integrate Read AI MCP with Hermes

```json
{
  "title": "How to integrate Read AI MCP with Hermes",
  "toolkit": "Read AI MCP",
  "toolkit_slug": "read_ai_mcp",
  "framework": "Hermes",
  "framework_slug": "hermes-agent",
  "url": "https://composio.dev/toolkits/read_ai_mcp/framework/hermes-agent",
  "markdown_url": "https://composio.dev/toolkits/read_ai_mcp/framework/hermes-agent.md",
  "updated_at": "2026-09-06T05:36:24.895Z"
}
```

## Introduction

Hermes is a 24/7 autonomous agent that lives on your computer or server — it remembers what it learns and evolves as your usage grows.
This guide explains the easiest and most robust way to connect your Read AI account to Hermes. You can do this through either Composio Connect CLI or Composio Connect MCP. For personal use we recommend the CLI, but you won't go wrong with MCP either.

## Also integrate Read AI MCP with

- [ChatGPT Work](https://composio.dev/toolkits/read_ai_mcp/framework/chatgpt)
- [Claude Cowork](https://composio.dev/toolkits/read_ai_mcp/framework/claude-cowork)

## TL;DR

### What is Composio Connect?
Composio Connect is a consumer offering that lets anyone plug 1,500+ applications directly into their agent harness — including Hermes. It can:
- Search and load tools from relevant toolkits on-demand, reducing context usage.
- Chain multiple tools to accomplish complex workflows via a remote workbench, without excessive back-and-forth with the LLM.
- Manage app authentication end-to-end with zero manual overhead.

## Connect Read AI MCP to Hermes

### Integrating Read AI with Hermes
### Using Composio Connect CLI
1. Install the Composio CLI
Run the install script directly, or paste https://composio.dev/hermes into your Hermes chat box to have it installed for you.

```bash
curl -fsSL https://composio.dev/install | bash
```

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

The Read AI MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Read AI account. It provides structured and secure access so your agent can perform Read AI operations on your behalf.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `READ_AI_MCP_CREATE_MEETING_AGENT` | Create meeting agent | Send a Read AI meeting agent (bot) to a video conferencing meeting on behalf of the authenticated user. This creates a new Read AI meeting ID and the agent will attempt to join the meeting to record & transcribe it for the user. When to call this tool ---------------------- Call this tool when: - The user explicitly asks for an agent to "join", "record", "capture," "send a bot to", or "take notes on" a specific meeting they identify on their calendar, by providing a meeting link, or specifying a video conferencing platform with a meeting ID and optional password. - The meeting is on a supported platform (Zoom, Google Meet, Microsoft Teams) Do NOT call this tool: - For meetings the user has not explicitly authorized an agent to join. - To join arbitrary or guessed meeting IDs. - If a user wants to record using a desktop or mobile client. Those are available from Read AI's website (https://read.ai) and can be used separately. Parameters ---------- meeting_url : str Meeting URL that can be used to join the meeting. If provided, the meeting_platform and meeting_id will be extracted from the URL and those additional parameters are not required. meeting_platform : str The video conferencing platform for the meeting. Must be one of: - "zoom" (Zoom) - "meet" (Google Meet) - "teams" (Microsoft Teams) If a meeting_url is provided, this parameter is not required. meeting_id : str The platform-specific meeting identifier (e.g. a Zoom meeting number, a Google Meet meeting code like "abc-defg-hij", a Teams meeting ID, etc.). Provide the raw ID as it would appear in the meeting URL. If a meeting_url is provided, this parameter is not required. meeting_password : Optional[str] Optional passcode/password for the meeting, if one is required. Omit if the meeting does not require a password or if a meeting_url is provided. start_time : Optional[datetime] Optional start time to stamp on the created meeting, in ISO 8601 format (e.g. "2026-05-21T15:00:00" or "2026-05-21T15:00:00Z"). If omitted, the meeting is stamped with the current time at creation and an agent is dispatched immediately to join the meeting. If a time in the future is specified, the agent will join the meeting at the specified time. title : Optional[str] Optional human-readable title to stamp on the created meeting (e.g. "Q3 Planning Sync"). If omitted, the meeting is given a generic platform-derived default such as "Zoom Meeting" or "Meet Meeting". Only set this when the user has provided or clearly implied a title; do not invent one. Returns ------- str The ULID for the newly created (or matched existing) Read AI meeting that the the meeting recording agent has been dispatched for. This meeting ID can be passed to other tools such as `get_meeting_by_id` once the meeting has progressed far enough to have data available. Behavior and edge cases ----------------------- - Authentication: - Access token is handled internally; do not supply user IDs or tokens. - If missing or invalid, the tool fails with errors such as: - "Unauthorized: No access token provided" - "Invalid token: No subject in access token claims". - Validation: - `meeting_id` is required and must be non-empty if a meeting_url is not provided. - If the platform / meeting combination is unsupported or the agent cannot be deployed (e.g. mobile/desktop platforms, or missing required platform integrations), the tool will fail with an error. - Idempotency: - This tool is idempotent. If an entry for the same meeting already exists in an active state, the system may return the existing meeting ID instead of creating a new one. - Side effects: - An agent may join the live meeting and a new meeting ID is created in Read AI. Usage examples for agents ------------------------- 1) User: "Have Read AI record my Zoom meeting 1234567890." -> Call: { "meeting_platform": "zoom", "meeting_id": "1234567890" } 2) User: "Send the Read AI bot to my Google Meet abc-defg-hij." -> Call: { "meeting_platform": "meet", "meeting_id": "abc-defg-hij" } 3) User: "Join my Zoom 9876543210 with passcode hunter2." -> Call: { "meeting_platform": "zoom", "meeting_id": "9876543210", "meeting_password": "hunter2" } 4) User: "Join my meeting now: https://meet.google.com/abc-defg-hij" -> Call: { "meeting_url": "https://meet.google.com/abc-defg-hij" } 5) User: "Join my meeting at 2026-05-21T15:00:00Z: https://meet.google.com/abc-defg-hij" -> Call: { "meeting_url": "https://meet.google.com/abc-defg-hij", "start_time": "2026-05-21T15:00:00Z" } 6) User: "Join my Zoom 1234567890 and call it 'Q3 Planning Sync'." -> Call: { "meeting_platform": "zoom", "meeting_id": "1234567890", "title": "Q3 Planning Sync" } |
| `READ_AI_MCP_GET_MEETING_BY_ID` | Get meeting by | Retrieve a single Read AI meeting (owned by or shared with the authenticated user) by its ULID identifier, with optional expansion of rich meeting content. When to call this tool ---------------------- Call this tool only when: - You already have a specific meeting ID (a ULID), and - The user wants information about that *one* meeting, such as: - Metadata (title, times, participants, platform, report URL) - Summary / chapter summaries - Action items / key questions - Topics discussed - Full transcript - Metrics/analytics - A link to download the recording Do NOT call this tool: - To search or browse meetings by title, date, participant, or keywords (use a dedicated list/search tool instead). - When working with multiple meetings at once. - With guessed or fabricated IDs. Only use IDs explicitly provided by the user or returned from another tool. Parameters ---------- id : str The Read AI meeting identifier in ULID format. - 26-character, case-insensitive, base32 ULID string (e.g. "01KA3883FYZSFZXE391Q0FMV39"). - Must come from: - A previous tool (e.g., a meeting list/search tool), or - Explicit user input. - Do not invent, modify, or "fix" IDs. expand : Optional[List[ExpandableEnum]] Optional list specifying which additional sections of the meeting record should be fully populated. Only sections listed here are fetched; all others remain `None`. Request the smallest set that satisfies the user’s need. Each additional expand value can increase latency and resource usage, especially "transcript". Allowed values (strings): - "summary": concise natural-language overview of the meeting. - "chapter_summaries": breakdown into labeled sections/chapters. - "action_items": follow-up tasks and next steps. - "key_questions": important or open questions discussed. - "topics": main themes/subjects covered. - "transcript": detailed spoken content of the meeting, including who spoke and what they said, suitable for verbatim quotes and fine‑grained analysis. - "metrics": high-level analytics (e.g., read_score, sentiment, engagement). - "recording_download": url to download the meeting recording. Output ------ MeetingEvent A single meeting object with: - Base metadata (id, title, start/end times, scheduled times, platform, platform_id, report_url, folders). - `access_level`: the authenticated caller's access level on this meeting, one of "owner", "editor", "viewer_full", or "viewer_recap_only" (or null if it could not be resolved). "editor" or "owner" is required to share the report via the `share_meeting_report` tool. - Owner and participants (with name/email and attendance status). - Expandable fields populated only if requested in `expand`: - `summary`: Optional[str] - `chapter_summaries`: Optional[List[Chapter]] - `action_items`: Optional[List[str]] - `key_questions`: Optional[List[str]] - `topics`: Optional[List[str]] - `transcript`: Optional[Transcript] - `metrics`: Optional[Metrics] - `recording_download`: Optional[RecordingDownload] Behavior and edge cases ----------------------- - Authentication: - Access token is handled internally; do not supply it as a parameter. - If missing or invalid, the tool fails with errors such as: - "Unauthorized: No access token provided" - "Invalid token: No subject in access token claims". - Not found / access issues: - If the ID is invalid or the meeting is not accessible to the user, the tool fails with "Not Found". - If the user's Read AI account does not have sufficient quota to view the meeting, the tool fails with an "Out of quota" error. This is a billing issue and the user can resolve it by upgrading their plan. They can resolve this by visiting "https://app.read.ai/analytics/meetings/{meeting_id}" in their browser, where {meeting_id} is the provided meeting ID. - Idempotency: - Read-only and idempotent. Calling with the same arguments returns the same logical result. Usage examples for agents ------------------------- 1) User: "Give me the summary and action items from meeting 01H9T5X9G5K3M7Y8R0D8AYZ5WQ." -> Call: { "id": "01H9T5X9G5K3M7Y8R0D8AYZ5WQ", "expand": ["summary", "action_items"] } 2) User: "Who said 'We should move this to next quarter' in meeting ?" -> You need detailed speech text: { "id": "", "expand": ["transcript"] } |
| `READ_AI_MCP_LIST_MEETINGS` | List meetings | List Read AI meetings for the authenticated user with optional start-time filters and cursor-based pagination. When to call this tool ---------------------- Call this tool when: - You need to browse or filter a user's meetings by time range. - You need meeting IDs (ULIDs) that can later be used with a "get_meeting_by_id" tool for detailed inspection. - You want a page of recent meetings (optionally with summaries or metrics). Do NOT call this tool: - When you already know the specific meeting ID and only need that single meeting (use the "get_meeting_by_id" tool instead). - To search by title, participant, or arbitrary keywords (use a search tool if available). - To guess or fabricate meeting IDs. Parameters ---------- limit : int, default 10 (max 10) Maximum number of meetings to return in this page. - Must be ≤ 10. - If omitted, defaults to 10. start_datetime_gt : Optional[datetime] Only include meetings whose start time is strictly greater than this value (exclusive lower bound). ISO 8601 string, e.g. "2025-11-01T00:00:00Z". start_datetime_gte : Optional[datetime] Only include meetings whose start time is greater than or equal to this value (inclusive lower bound). ISO 8601 string. - Typically use either `start_datetime_gt` or `start_datetime_gte`, not both. start_datetime_lt : Optional[datetime] Only include meetings whose start time is strictly less than this value (exclusive upper bound). ISO 8601 string. start_datetime_lte : Optional[datetime] Only include meetings whose start time is less than or equal to this value (inclusive upper bound). ISO 8601 string. - Typically use either `start_datetime_lt` or `start_datetime_lte`, not both. - For a closed interval [A, B], use: - `start_datetime_gte = A` - `start_datetime_lte = B` cursor : Optional[str] Cursor for pagination. - First page: omit or pass `null`. - Next page: pass the ID of the last meeting returned in the previous page (`previous_response.data[-1].id`), which acts as a "start after this" pointer. expand : Optional[List[ExpandableEnum]] Optional list specifying which extra sections of *each* meeting should be fully populated. Only sections listed here are fetched; all others remain `None`. Because this is a list endpoint, expansions apply to every meeting in the page and can be expensive. Request only what the user needs. Allowed values (strings), with the same meanings as in `get_meeting_by_id`: - "summary": concise overview of each meeting. - "chapter_summaries": section/chapter breakdown. - "action_items": follow-up tasks per meeting. - "key_questions": important or open questions per meeting. - "topics": main themes/subjects per meeting. - "transcript": full spoken content per meeting. - "metrics": analytics such as read_score, sentiment, engagement. - "recording_download": url to download the meeting recording. Returns ------- ListMeetingResponse A paginated list of meetings with: - `object`: str – always "list". - `url`: str – API-style URL for this collection. - `has_more`: bool – True if there are more meetings beyond this page. - `data`: List[MeetingEvent] – meetings matching the filters, each with: - Core metadata (id, title, start/end times, platform, etc.). - `access_level`: the caller's access level on the meeting ("owner", "editor", "viewer_full", "viewer_recap_only", or null). "editor"/"owner" is required to share the report via `share_meeting_report`. - Owner and participants. - Any expandable fields populated according to `expand`. Behavior and edge cases ----------------------- - Authentication: - Access token is handled internally; do not pass it as a parameter. - If missing or invalid, the tool raises errors such as: - "Unauthorized: No access token provided" - "Invalid token: No subject in access token claims". - Filtering: - All provided filters are combined with logical AND. - Conflicting ranges (e.g., lower bound after upper bound) will typically return an empty result. - Prefer at most one lower-bound parameter (`gt` or `gte`) and one upper- bound parameter (`lt` or `lte`). - Pagination: - `limit` controls the number of meetings per page (max 10). - Use `has_more` plus `cursor` (last meeting's id from `data`) to fetch subsequent pages. - Idempotency: - Read-only and idempotent. Repeating the same call yields the same logical results, except for new meetings created in the underlying system. Usage examples for agents ------------------------- 1) Get the 10 most recent meetings (no filters, first page): -> Call: { "limit": 10 } 2) Get meetings in November 2025, including brief summaries: -> Call: { "limit": 10, "start_datetime_gte": "2025-11-01T00:00:00", "start_datetime_lte": "2025-11-30T23:59:59", "expand": ["summary"] } 3) Page through all recent meetings since 2025-11-01: First page: -> Call: { "limit": 10, "start_datetime_gte": "2025-11-01T00:00:00" } Next page (if has_more is true): -> Call: { "limit": 10, "start_datetime_gte": "2025-11-01T00:00:00", "cursor": "" } 4) Find candidate meetings to inspect in detail later: - First, list meetings with summaries and metrics: { "limit": 5, "expand": ["summary", "metrics"] } - Then, pick a specific meeting ID and call `readai_get_meeting_by_id` with `expand=["transcript"]` if you need the full conversation. |
| `READ_AI_MCP_SHARE_MEETING_REPORT` | Share meeting report | Share a Read AI meeting report with an email address on behalf of the authenticated user. Grants the recipient access to the meeting at a specified access level and (optionally) emails them an invite. When to call this tool ---------------------- Call this tool when: - The user explicitly asks to "share", "send", "give access to", or "invite someone to" a specific meeting report, identified by its ULID. - You have already confirmed (via `get_meeting_by_id` or `list_meetings`) that the user has "editor" or "owner" access to that meeting — only editors and owners are allowed to share. Do NOT call this tool: - To share meetings the user does not have edit access to. If `access_level` from `get_meeting_by_id`/`list_meetings` is "viewer_full" or "viewer_recap_only", the user cannot share and the call will fail. - With guessed or fabricated meeting IDs or email addresses. Only use values explicitly provided by the user or returned from another tool. - To transfer ownership. Ownership cannot be granted through this tool. Parameters ---------- id : str The Read AI meeting identifier in ULID format (26-character, case-insensitive base32). Must come from a previous tool or explicit user input. email : str The email address to share the report with. Must be a valid email address. If the email belongs to an existing Read AI user, access is granted to that user directly; otherwise an email-based access invite is created. access_level : str The access level to grant. One of: - "viewer_recap_only": can view only the recap/summary of the meeting. - "viewer_full": full read access to the meeting report. - "editor": read access plus the ability to edit (and re-share) the report. Defaults to "viewer_full". "owner" is not allowed. message : Optional[str] Optional personal message to include in the invite email. Only relevant when `notify` is true. notify : bool, default true Whether to send the recipient an invite email. Set to false to grant access silently without notifying them. Returns ------- ShareMeetingResponse An object describing the grant: - `id`: the meeting ULID that was shared. - `shared_with_email`: the email the report was shared with. - `access_level`: the access level that was granted. - `notified`: whether an invite email was sent. - `report_url`: a link to the meeting report. Behavior and edge cases ----------------------- - Authentication: - Access token is handled internally; do not supply user IDs or tokens. - Permissions: - The caller must have "editor" or "owner" access to the meeting. If not, the tool fails with a "Forbidden" error. Confirm the caller's `access_level` using `get_meeting_by_id` before calling this tool. - Validation: - An invalid email address will cause the tool to fail. - Granting "owner" (or any non-shareable level) will fail. - Idempotency: - Re-sharing with the same email and access level is safe; the existing grant is updated rather than duplicated, and the invite email is not re-sent. The `notified` field in the response reflects whether an email was actually sent on this call. - Side effects: - The recipient gains access to the meeting, and (unless `notify` is false, or an equivalent grant already existed) an invite email is sent to them. Usage examples for agents ------------------------- 1) User: "Share meeting 01H9T5X9G5K3M7Y8R0D8AYZ5WQ with alex@example.com." -> First confirm the caller can share (get_meeting_by_id -> access_level is "editor" or "owner"), then call: { "id": "01H9T5X9G5K3M7Y8R0D8AYZ5WQ", "email": "alex@example.com" } 2) User: "Give jordan@example.com edit access to that meeting and add a note." -> Call: { "id": "", "email": "jordan@example.com", "access_level": "editor", "message": "Please review and update the action items." } 3) User: "Quietly share the recap of with sam@example.com without emailing them." -> Call: { "id": "", "email": "sam@example.com", "access_level": "viewer_recap_only", "notify": false } |

## Supported Triggers

None listed.

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

The Read AI MCP server provides comprehensive access to Read AI operations through Composio. Once connected, Hermes can perform all major Read AI actions on your behalf using natural language commands.

## Complete Code

None listed.

## Conclusion

### Way Forward
With Read AI connected, Hermes can now act on your behalf whenever it detects a relevant task or you ask it to.
From here, you can extend Hermes further:
- Connect more apps: Calendar, Slack, Notion, Linear, and hundreds of others are available through the same Composio Connect setup. Each new integration compounds what Hermes can do for you.
- Build workflows across tools: Once multiple apps are connected, Hermes can chain actions together — turn an email into a calendar invite, a Slack message into a Linear ticket, or a meeting note into a follow-up draft.
- Let it learn your patterns: The more you use Hermes, the better it gets at anticipating how you'd handle recurring tasks. Give it feedback on drafts and decisions, and it will adapt.
If you run into trouble or want to share what you've built, join the [community](https://discord.com/invite/composio) or check out the [Docs](https://docs.composio.dev?utm_source=toolkits&utm_medium=framework_template&utm_campaign=hermes&utm_content=docs) for deeper configuration options.

## How to build Read AI MCP Agent with another framework

- [ChatGPT Work](https://composio.dev/toolkits/read_ai_mcp/framework/chatgpt)
- [Claude Cowork](https://composio.dev/toolkits/read_ai_mcp/framework/claude-cowork)

## Related Toolkits

- [Gmail](https://composio.dev/toolkits/gmail) - Gmail is Google's email service with powerful spam protection, search, and G Suite integration. It keeps your inbox organized and makes communication fast and reliable.
- [Outlook](https://composio.dev/toolkits/outlook) - Outlook is Microsoft's email and calendaring platform for unified communications and scheduling. It helps users stay organized with powerful email, contacts, and calendar management.
- [Slack](https://composio.dev/toolkits/slack) - Slack is a channel-based messaging platform for teams and organizations. It helps people collaborate in real time, share files, and connect all their tools in one place.
- [Gong](https://composio.dev/toolkits/gong) - Gong is a platform for video meetings, call recording, and team collaboration. It helps teams capture conversations, analyze calls, and turn insights into action.
- [Microsoft teams](https://composio.dev/toolkits/microsoft_teams) - Microsoft Teams is a collaboration platform that combines chat, meetings, and file sharing within Microsoft 365. It keeps distributed teams connected and productive through seamless virtual communication.
- [Slackbot](https://composio.dev/toolkits/slackbot) - Slackbot is a conversational automation tool for Slack that handles reminders, notifications, and automated responses. It boosts team productivity by streamlining onboarding, answering FAQs, and managing timely alerts—all right inside Slack.
- [2chat](https://composio.dev/toolkits/_2chat) - 2chat is an API platform for WhatsApp and multichannel text messaging. It streamlines chat automation, group management, and real-time messaging for developers.
- [Agent mail](https://composio.dev/toolkits/agent_mail) - Agent mail provides AI agents with dedicated email inboxes for sending, receiving, and managing emails. It empowers agents to communicate autonomously with people, services, and other agents—no human intervention needed.
- [Android Texter](https://composio.dev/toolkits/android_texter) - Android Texter is an API service that connects Android phones to SMS, MMS, contacts, and device data. Use it to automate mobile messaging without building your own phone-to-API bridge.
- [Basecamp](https://composio.dev/toolkits/basecamp) - Basecamp is a project management and team collaboration tool by 37signals. It helps teams organize tasks, share files, and communicate efficiently in one place.
- [Blooio](https://composio.dev/toolkits/blooio) - Blooio is a stable v2 API platform for messaging, chats, contacts, groups, phone numbers, and account analytics. It gives teams a clean way to build reliable communication workflows without stitching together fragile custom APIs.
- [CallOnTheGo](https://composio.dev/toolkits/callonthego) - CallOnTheGo is a telephony API for managing phone numbers, caller IDs, suppression lists, audio assets, contact lists, and Voice AI campaigns. It provides programmatic control over calling infrastructure and campaign automation for scalable voice outreach.
- [Carbon Voice MCP](https://composio.dev/toolkits/carbon_voice_mcp) - Carbon Voice MCP is a voice-first collaboration platform for messages, conversations, and workflows. Use it to centralize voice communications and streamline team collaboration.
- [CardClan](https://composio.dev/toolkits/cardclan) - CardClan is a digital card platform for creating and sending personalized team cards. Use it to celebrate moments, share card links, and manage card workflows without extra coordination.
- [Chatwork](https://composio.dev/toolkits/chatwork) - Chatwork is a team communication platform with group chats, file sharing, and task management. It helps businesses boost collaboration and streamline productivity.
- [Clickmeeting](https://composio.dev/toolkits/clickmeeting) - ClickMeeting is a cloud-based platform for running online meetings and webinars. It helps businesses and individuals host, manage, and engage virtual audiences with ease.
- [Confluence](https://composio.dev/toolkits/confluence) - Confluence is Atlassian's team collaboration and knowledge management platform. It helps your team organize, share, and update documents and project content in one secure workspace.
- [Daily](https://composio.dev/toolkits/daily) - Daily is a WebRTC video and audio API platform for building rooms, meetings, recordings, live streams, transcriptions, and telephony. It gives developers reliable real-time media infrastructure without managing complex conferencing stacks.
- [Dailybot](https://composio.dev/toolkits/dailybot) - DailyBot streamlines team collaboration with chat-based standups, reminders, and polls. It keeps work flowing smoothly in your favorite messaging platforms.
- [Dialmycalls](https://composio.dev/toolkits/dialmycalls) - Dialmycalls is a mass notification service for sending voice and text messages to contacts. It helps teams and organizations quickly broadcast urgent alerts and updates.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Read AI MCP?

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

### Can I use Tool Router MCP with Hermes?

Yes, you can. Hermes 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 Read AI tools.

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

Yes, absolutely. You can configure which Read AI 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 Read AI data and credentials are handled as safely as possible.

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