Tools — Inbox & Communication
MCP tools for reading email threads, viewing interaction details, browsing activity feeds, and listing calendar events.
The Inbox & Communication tools give your AI assistant access to email threads, interaction history, activity feeds, and calendar events across all synced accounts.
crm_inbox
Read email and message threads from synced accounts.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
action | list_threads | get_thread | mark_read | mark_unread | Yes | Operation to perform. |
channel | all | email | linkedin | whatsapp | No | Filter by communication channel. Defaults to all. |
is_read | boolean | No | Filter threads by read status. |
thread_id | string | No | Thread UUID. Required for get_thread, mark_read, and mark_unread. |
message_cursor | string | No | Pagination cursor for messages within a thread. |
message_limit | number | No | Messages per page. Default 50, max 200. |
cursor | string | No | Pagination cursor for thread listing. |
limit | number | No | Max threads per page. Default 20, max 50. |
Key behaviors
- User isolation — Each user only sees threads from their own synced email accounts. There is no cross-user visibility.
- Content gating — Email bodies require the
inbox:contentscope on your API token. Without it, message bodies are replaced with a placeholder and a prompt to upgrade the token scope. - SQL-level pagination — Thread listing is paginated server-side. Use
cursorandlimitto page through results. - Message pagination — Large threads support internal pagination via
message_cursorandmessage_limit, so you can incrementally load conversation history.
Examples
List unread email threads:
{
"action": "list_threads",
"channel": "email",
"is_read": false,
"limit": 10
}Response:
{
"data": [
{
"thread_id": "t_abc123",
"subject": "Q3 contract renewal",
"last_message_at": "2025-06-10T14:22:00Z",
"is_read": false,
"message_count": 4,
"participants": ["alice@example.com", "bob@acme.com"]
}
],
"total": 23,
"nextCursor": "eyJ0aHJlYWRfaWQiOiJ0X2FiYzEy..."
}Get a thread with paginated messages:
{
"action": "get_thread",
"thread_id": "t_abc123",
"message_limit": 20
}Response:
{
"thread": {
"thread_id": "t_abc123",
"subject": "Q3 contract renewal",
"is_read": true
},
"messages": [
{
"id": "msg_001",
"from": "alice@example.com",
"to": ["bob@acme.com"],
"body": "Hi Bob, following up on the renewal...",
"sent_at": "2025-06-10T14:22:00Z"
}
],
"total_messages": 4,
"next_message_cursor": null
}When next_message_cursor is null, all messages in the thread have been returned.
Mark a thread as read:
{
"action": "mark_read",
"thread_id": "t_abc123"
}Response:
{
"thread_id": "t_abc123",
"is_read": true
}crm_interaction_detail
Get details of a single interaction (email, call, meeting) or a full thread.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
interaction_id | string | No | UUID of a single interaction. |
thread_id | string | No | Thread UUID. Returns the thread metadata plus all messages. |
One of interaction_id or thread_id must be provided. If both are given, interaction_id takes precedence.
Key behaviors
- User isolation — Access is restricted to interactions belonging to the authenticated user's synced email accounts.
- Metadata stripped — Sensitive data such as OAuth tokens and internal sync metadata is never exposed in the response.
- Content gating — Like
crm_inbox, email bodies require theinbox:contentscope. - Automatic routing — The tool detects which parameter is provided and routes to the appropriate handler internally.
Example
Get a single email interaction:
{
"interaction_id": "550e8400-e29b-41d4-a716-446655440000"
}Response:
{
"interaction": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "email",
"subject": "Partnership proposal",
"from": "alice@example.com",
"to": ["bob@acme.com"],
"body": "Hi Bob, I wanted to discuss a potential partnership...",
"sent_at": "2025-06-08T09:15:00Z",
"thread_id": "t_xyz789",
"is_read": true
}
}crm_activity_feed
Get the complete activity feed for any record: interactions, tasks, and notes in a single call.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
entity_type | string | Yes | Object name: contacts, companies, opportunities, or any custom object. |
entity_id | string | Yes | UUID of the record to get activity for. |
include | string[] | No | Filter which sections to return: interactions, tasks, notes. Defaults to all three. |
channel | all | email | linkedin | whatsapp | phone | meeting | No | Filter interactions by communication channel. |
cursor | string | No | Pagination cursor. |
limit | number | No | Max items per section. |
Example
Get full activity for a contact:
{
"entity_type": "contacts",
"entity_id": "550e8400-e29b-41d4-a716-446655440000"
}Response:
{
"interactions": {
"data": [
{
"id": "int_001",
"type": "email",
"subject": "Follow-up call notes",
"sent_at": "2025-06-10T14:00:00Z"
}
],
"total": 12
},
"tasks": {
"data": [
{
"id": "task_001",
"title": "Send proposal by Friday",
"status": "todo",
"due_date": "2025-06-13"
}
],
"total": 3
},
"notes": {
"data": [
{
"id": "note_001",
"body": "Met at the trade show, interested in enterprise plan.",
"created_at": "2025-06-05T11:00:00Z"
}
],
"total": 5
}
}Each section follows the normalized { data: [], total } shape. When a section is excluded via include, it is omitted from the response entirely.
Filter to notes only:
{
"entity_type": "contacts",
"entity_id": "550e8400-e29b-41d4-a716-446655440000",
"include": ["notes"]
}crm_manage_events
Read calendar events (meetings, calls) from synced accounts.
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
action | list | create | update | delete | Yes | Operation to perform. |
start_date | string | No | ISO 8601 date. Filter events starting from this date (used with list). |
end_date | string | No | ISO 8601 date. Filter events ending before this date (used with list). |
event_id | string | No | Event UUID. Required for update and delete. |
title | string | No | Event title. Used with create. |
start | string | No | ISO 8601 datetime. Event start time. Used with create. |
end | string | No | ISO 8601 datetime. Event end time. Used with create. |
Currently, only the list action is fully supported via MCP. The create, update, and delete actions require direct OAuth access to the calendar provider and are not yet available through the MCP server.
The list action queries meeting-type interactions stored in the CRM database, not an external calendar API directly. Events are sourced from synced calendar data.
Example
List events for next week:
{
"action": "list",
"start_date": "2025-06-16",
"end_date": "2025-06-22"
}Response:
{
"data": [
{
"id": "evt_001",
"title": "Quarterly review with Acme",
"start": "2025-06-17T10:00:00Z",
"end": "2025-06-17T11:00:00Z",
"attendees": ["alice@example.com", "bob@acme.com"],
"location": "Google Meet"
},
{
"id": "evt_002",
"title": "Internal standup",
"start": "2025-06-18T09:00:00Z",
"end": "2025-06-18T09:30:00Z",
"attendees": ["alice@example.com", "carol@example.com"],
"location": null
}
],
"total": 2
}