> ## Documentation Index
> Fetch the complete documentation index at: https://docs.linkedcamp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Unified inbox

> LinkedIn and email conversations with prospects — where replies land, and where you answer them.

<Info>Requires the **Inbox** or **Unibox** permission. Tools in this group are hidden from `tools/list` and refused on call when your plan does not grant it.</Info>

| Tool | Kind |
| - | - |
| [`conversation_get`](#conversation_get) | Write |
| [`conversation_list`](#conversation_list) | Read-only |
| [`conversation_mark_all_read`](#conversation_mark_all_read) | Write |
| [`conversation_update`](#conversation_update) | Write |
| [`message_delete`](#message_delete) | Write, Destructive |
| [`message_draft_ai_reply`](#message_draft_ai_reply) | Write |
| [`message_send`](#message_send) | Write, Destructive |
| [`saved_reply_list`](#saved_reply_list) | Read-only |
| [`saved_reply_upsert`](#saved_reply_upsert) | Write, Destructive |

## conversation\_get

<Badge color="orange">Write</Badge>

One thread with its full message history, the lead behind it, and which campaign it came from. Note the side effect: reading a thread marks it seen, so do not call it to browse unless the user wants the badge cleared. This is the prospect-facing exchange. For what an AI agent reasoned on its way to a reply use `agent_logs`, and for the lead's step history `lead_get`.

### Parameters

<ParamField path="conversationId" type="string" required>
  Conversation id, from `conversation_list`.
</ParamField>

<ParamField path="includeMessages" type="boolean" default="true">
  Include the full message thread. Can be long.
</ParamField>

## conversation\_list

<Badge color="blue">Read-only</Badge>

The unified inbox: LinkedIn and email threads with prospects, newest activity first, 20 per page. This is where replies land. Filter by `campaignId` to review one campaign's responses, or `keyword` to find a specific person. Threads, newest first — the conversation view. For one thread's messages use `conversation_get`, for the person behind it `lead_get`, and for campaign reply counts rather than the threads themselves `analytics_campaign`. Nothing here sends: there is no tool to send an inbox message.

### Parameters

<ParamField path="linkedAccountId" type="string">
  Only threads on this LinkedIn account.
</ParamField>

<ParamField path="emailAccountId" type="string">
  Only threads on this mailbox.
</ParamField>

<ParamField path="campaignId" type="string">
  Campaign id, from `campaign_list` or `campaign_create`.
</ParamField>

<ParamField path="keyword" type="string">
  Search names and message bodies.
</ParamField>

<ParamField path="tags" type="string">
  Comma-separated tag ids.
</ParamField>

<ParamField path="type" type="string">
  Thread kind, e.g. "email".
</ParamField>

<ParamField path="platform" type="string">
  Filter by channel, e.g. "linkedin" or "email".
</ParamField>

<ParamField path="page" type="integer (min 1)" default="1">
  1-indexed page number.
</ParamField>

## conversation\_mark\_all\_read

<Badge color="orange">Write</Badge>

Clear the unread badge across every thread on one LinkedIn account. Blunt and account-wide — it marks everything read, including threads nobody has looked at, so confirm before using it to tidy a badge. For one thread use `conversation_update`.

### Parameters

<ParamField path="linkedAccountId" type="string" required>
  LinkedIn account id, from `linkedin_account_list`.
</ParamField>

## conversation\_update

<Badge color="orange">Write</Badge>

Archive a thread, mark it read, or hand it between the AI assistant and a human. Setting `assistant: false` stops the bot replying so a person can take over — the one call to make when an agent is answering badly and a human needs the thread. Scope is this thread: it does not stop the agent elsewhere (`agent_upsert` with `isActive: false`), detach it from the campaign (`campaign_update`), or change the lead itself (`lead_update`). It cannot send a reply either.

### Parameters

<ParamField path="conversationId" type="string" required>
  Conversation id, from `conversation_list`.
</ParamField>

<ParamField path="isArchived" type="boolean">
  Move out of the main list without deleting.
</ParamField>

<ParamField path="seen" type="boolean">
  Mark as read.
</ParamField>

<ParamField path="assistant" type="boolean">
  Whether the AI agent handles this thread.
</ParamField>

<ParamField path="pauseBotOnManualMessage" type="boolean">
  Automatically stand the bot down as soon as a human sends a message here.
</ParamField>

## message\_delete

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Remove a message from the stored thread record. It does NOT unsend anything: the recipient keeps the message on LinkedIn or in their mailbox, so this only edits your own history of the conversation and cannot undo a send. Irreversible and there is no tool to restore it — show the user which message and get an explicit yes first.

### Parameters

<ParamField path="messageId" type="string" required>
  Message id, from `conversation_get` or `message_list`.
</ParamField>

## message\_draft\_ai\_reply

<Badge color="orange">Write</Badge>

Ask a connected AI provider to draft a reply for a thread, given a prompt. Returns the draft only — give it to the user to send themselves, because sending an inbox message has no tool at all and no substitute. This is a one-off draft from a prompt. A configured agent that replies on its own is `agent_upsert` plus `campaign_update`; to see how such an agent would answer, `agent_query`. Requires an AI provider connected in the web app under Settings - Integrations.

### Parameters

<ParamField path="conversationId" type="string" required>
  Conversation id, from `conversation_list`.
</ParamField>

<ParamField path="provider" type="OPENAI | ANTHROPIC | GEMINI | GROK | DEEPSEEK" required>
  Which connected provider to use. Providers are connected in the web app.
</ParamField>

<ParamField path="prompt" type="string" required>
  What the reply should do, e.g. "propose three times next week for a 20-min call".
</ParamField>

## message\_send

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Send a message into a conversation. THIS DELIVERS TO A REAL PERSON immediately, on LinkedIn or by email depending on the thread, and cannot be recalled or edited — there is no tool to delete a sent message. Show the user the exact text and the recipient, and get an explicit yes in the conversation, before every call. Never send copy the user has not read, and never send to a thread they did not name. Sending by hand also stands the AI agent down on that thread when the agent has `pauseBotOnManualMessage` set, so one manual reply can stop the agent answering there. For a draft the user sends themselves use `message_draft_ai_reply`; to hand a thread to a human without sending anything, `conversation_update` with `assistant: false`.

### Parameters

<ParamField path="conversationId" type="string" required>
  Conversation id, from `conversation_list`.
</ParamField>

<ParamField path="content" type="string" required>
  The message, exactly as it will be delivered.
</ParamField>

<ParamField path="attachment" type="object">
  Optional file to attach; must already be hosted at a fetchable URL.

  <Expandable title="properties">
    <ParamField path="url" type="string" required>
      Publicly reachable URL of the file.
    </ParamField>

    <ParamField path="name" type="string">
      File name shown to the recipient, e.g. "case-study.pdf".
    </ParamField>

    <ParamField path="type" type="string">
      MIME type, e.g. "application/pdf".
    </ParamField>
  </Expandable>
</ParamField>

## saved\_reply\_list

<Badge color="blue">Read-only</Badge>

Reusable reply snippets your team keeps for common inbox situations. Text a human can copy when replying by hand. These are not sequence steps (`flow_get`), not agent FAQs (`agent_get`), and nothing here is sent automatically.

*No parameters.*

## saved\_reply\_upsert

<Badge color="orange">Write</Badge> <Badge color="red">Destructive</Badge>

<Warning>Marked destructive in the protocol — your MCP client asks for confirmation before running it.</Warning>

Create a saved reply, or update one by passing `savedRepliesId`. Stores a snippet for humans to reuse; it does not send anything, schedule anything, or teach an agent — agent wording lives in `agent_upsert`. There is no tool to delete a saved reply.

### Parameters

<ParamField path="savedRepliesId" type="string">
  Omit to create a new one.
</ParamField>

<ParamField path="title" type="string" required>
  Short label shown in the reply picker.
</ParamField>

<ParamField path="content" type="string" required>
  Body. Supports \{\{firstName}}-style merge fields.
</ParamField>

<ParamField path="assignedUsers" type="string[]">
  Restrict visibility to these team member ids.
</ParamField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.