> ## 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.

# AI agents

> Agents that reply to prospects, draft content, and book meetings, plus the knowledge base they draw on.

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

| Tool | Kind |
| - | - |
| [`agent_delete`](#agent_delete) | Write, Destructive |
| [`agent_duplicate`](#agent_duplicate) | Write |
| [`agent_get`](#agent_get) | Read-only |
| [`agent_list`](#agent_list) | Read-only |
| [`agent_logs`](#agent_logs) | Read-only |
| [`agent_query`](#agent_query) | Read-only |
| [`agent_stats`](#agent_stats) | Read-only |
| [`agent_train`](#agent_train) | Write |
| [`agent_upsert`](#agent_upsert) | Write, Destructive |
| [`kb_attach`](#kb_attach) | Write |
| [`kb_delete`](#kb_delete) | Write, Destructive |
| [`kb_list`](#kb_list) | Read-only |
| [`kb_upsert`](#kb_upsert) | Write, Destructive |

## agent\_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>

Delete an agent. Campaigns and conversations pointing at it lose their automated replies, silently — prospects mid-conversation simply stop getting answers. Irreversible, and its knowledge attachments and training go with it. Read `agent_list` for which campaigns use it, show the user, and get an explicit yes first. To stop an agent replying without destroying it, use `agent_upsert` with `isActive: false`, or `conversation_update` with `assistant: false` for one thread. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

## agent\_duplicate

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

Copy an agent, optionally into a sub-account. Copies the configuration; the duplicate still needs `agent_train` before its knowledge works. Passing `userId` to place it in another user's account is accepted only from an account owner. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

<ParamField path="userId" type="string">
  Sub-account owner id. Omit to act on your own data.
</ParamField>

## agent\_get

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

One agent's full configuration: personality, intent, instructions, FAQs, follow-ups and booking action. Read this out to the user when they are choosing an existing agent. Configuration only: for what it actually said use `agent_logs`, for how it would answer a specific question `agent_query`, and for volumes `agent_stats`. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

## agent\_list

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

AI agents configured for this account. CHAT agents reply to prospects in the inbox, CONTENT agents draft LinkedIn posts, and the rest are specialised assistants. Start here when the user asks about automated replies, and show them `agent_get` so they can judge the fit before anything is attached. An agent writes replies; a persona (`persona_list`) decides who qualifies; a knowledge base (`kb_list`) is the material an agent draws on. Attaching one to a campaign is `campaign_update` — and it answers real prospects by itself, so never attach one unasked. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="type" type="CHAT | VOICE | CONTENT | CAMPAIGN | REPORTING">
  Filter by type.
</ParamField>

<ParamField path="keyword" type="string">
  Free-text search.
</ParamField>

<ParamField path="withStats" type="boolean" default="false">
  Include conversation and booking counts.
</ParamField>

## agent\_logs

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

What an agent was asked and what it answered — the trace to read when its replies look wrong. What it actually said in real conversations. To try a hypothetical instead, without sending anything, use `agent_query`; to read the prospect-facing thread use `conversation_get`. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

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

## agent\_query

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

Run a question through an agent against a real conversation, to see how it would answer. Returns the answer without sending anything — nothing reaches the prospect, which makes this the safe way to vet an agent before it goes active. For what it has already said use `agent_logs`. This is not a way to reply to anyone: sending an inbox message has no tool at all. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

<ParamField path="conversationId" type="string" required>
  Context for the retrieval.
</ParamField>

<ParamField path="query" type="string" required>
  The question to put to the agent.
</ParamField>

## agent\_stats

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

Conversations handled, replies sent and appointments booked, across all agents. Totals across every agent, not one — there is no per-agent breakdown here. To judge a single agent's quality read `agent_logs`. Requires the "Agents" permission on the plan.

*No parameters.*

## agent\_train

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

Rebuild the agent's knowledge embeddings from its attached knowledge-base entries. Required after every `kb_upsert` or `kb_attach`, or the agent answers from stale material — this is the step most easily forgotten. It only re-indexes existing knowledge: it does not change the agent's instructions (`agent_upsert`) and does not teach it anything not attached via `kb_attach`. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

## agent\_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 an AI agent, or update one by passing `agentId`. A CHAT agent will reply to real prospects once it is active and attached to a campaign — set `isActive: false` while iterating on its instructions. The behaviour comes from `personality` (who it is), `intent` (what it is trying to achieve) and `instructions` (how it should write). This creates or edits the agent and nothing else. It does not attach it to a campaign (`campaign_update`), give it source material (`kb_upsert` then `kb_attach`), or build its embeddings (`agent_train`, which must run after any knowledge change). Test with `agent_query` before it touches a real conversation. There is no tool to delete an agent. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string">
  Omit to create a new agent.
</ParamField>

<ParamField path="name" type="string" required>
  Internal name.
</ParamField>

<ParamField path="type" type="CHAT | VOICE | CONTENT | CAMPAIGN | REPORTING">
  CHAT for inbox replies, CONTENT for post drafting.
</ParamField>

<ParamField path="businessName" type="string">
  Company the agent represents; injected into its prompt.
</ParamField>

<ParamField path="provider" type="OPENAI | ANTHROPIC | GEMINI | GROK | DEEPSEEK">
  Primary model provider. Must be connected.
</ParamField>

<ParamField path="fallbackProvider" type="OPENAI | ANTHROPIC | GEMINI | GROK | DEEPSEEK">
  Used when the primary provider errors.
</ParamField>

<ParamField path="language" type="string">
  Language code, e.g. "en", "fr", "de", "it", "pt", "ja".
</ParamField>

<ParamField path="channels" type="string[]">
  Where the agent operates, e.g. \["linkedin","email"].
</ParamField>

<ParamField path="personality" type="string">
  Who the agent is and how it carries itself.
</ParamField>

<ParamField path="intent" type="string">
  The outcome it is steering the conversation toward.
</ParamField>

<ParamField path="instructions" type="string">
  Concrete writing rules: tone, length, what to avoid.
</ParamField>

<ParamField path="prompt" type="string">
  Raw system prompt override. Usually leave unset.
</ParamField>

<ParamField path="topics" type="string[]">
  Subjects the agent is allowed to discuss.
</ParamField>

<ParamField path="faqs" type="object[]">
  Canned answers the agent should use verbatim.

  <Expandable title="properties">
    <ParamField path="question" type="string" required>
      A question leads ask.
    </ParamField>

    <ParamField path="answer" type="string" required>
      The answer the agent gives, verbatim.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="followups" type="array of object (free-form)">
  Follow-up messages sent when a lead goes quiet.
</ParamField>

<ParamField path="prohabitedWords" type="string[]">
  Words the agent must never use. Field name is spelled this way in the schema.
</ParamField>

<ParamField path="waitTime" type="integer (min 0)">
  Minutes to wait before replying, so it reads as human.
</ParamField>

<ParamField path="maxMessages" type="integer (min 1)">
  Cap on agent messages per conversation.
</ParamField>

<ParamField path="pauseBotOnManualMessage" type="boolean">
  Stand down as soon as a human replies in the thread.
</ParamField>

<ParamField path="stopScenarios" type="object">
  Situations in which the agent stops replying.

  <Expandable title="properties">
    <ParamField path="aggressive" type="boolean">
      Stop when the lead becomes hostile.
    </ParamField>

    <ParamField path="goodbye" type="boolean">
      Stop when the lead signs off.
    </ParamField>

    <ParamField path="notInterested" type="boolean">
      Stop when the lead declines.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="action" type="&#x22;APPOINTMENT&#x22;">
  Enable calendar booking.
</ParamField>

<ParamField path="actionSettings" type="object">
  Booking settings. Used when `action` is "APPOINTMENT".

  <Expandable title="properties">
    <ParamField path="calendar" type="string">
      Which calendar to book into: a Calendly event, a GoHighLevel calendar id, or "CUSTOM" to share `customCalendarLink`.
    </ParamField>

    <ParamField path="calendarType" type="string">
      e.g. "calendly", "ghl".
    </ParamField>

    <ParamField path="customCalendarLink" type="string">
      Booking page URL the agent shares. Required when `calendar` is "CUSTOM", which also forces `sendLinkOnly`.
    </ParamField>

    <ParamField path="sendLinkOnly" type="boolean">
      Send the booking link instead of negotiating a time.
    </ParamField>

    <ParamField path="pauseBotOnBooking" type="boolean">
      Stop replying to a lead once they have booked.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField path="userIds" type="string[]">
  Share this agent with these sub-accounts.
</ParamField>

<ParamField path="notify" type="boolean">
  Notify you when the agent replies.
</ParamField>

<ParamField path="isActive" type="boolean">
  Whether the agent runs. Keep false while drafting.
</ParamField>

## kb\_attach

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

Include or exclude a knowledge entry for one agent. Run `agent_train` afterwards or the change has no effect on answers. Scoped to one agent: it neither creates the entry (`kb_upsert`) nor deletes it, and there is no tool to delete a knowledge entry. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

<ParamField path="kbId" type="string" required>
  Knowledge-base entry id, from `kb_list`.
</ParamField>

<ParamField path="value" type="boolean" default="true">
  true attaches, false detaches.
</ParamField>

## kb\_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 knowledge entry and its embeddings. The source material is gone — a crawled page would have to be crawled again, pasted text retyped — so confirm with the user first; `kb_list` shows what is there. The agent keeps answering, just without this material, and it will still cite it until `agent_train` reruns. To stop one agent using an entry while keeping it, use `kb_attach` to exclude it instead of deleting. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="agentId" type="string" required>
  AI agent id, from `agent_list`.
</ParamField>

<ParamField path="kbId" type="string" required>
  Knowledge-base entry id, from `kb_list`.
</ParamField>

## kb\_list

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

Source material agents can draw on: crawled URLs, uploaded files and pasted text. Account-wide. Which agent may use which entry is set per agent by `kb_attach`, so an entry listed here is not necessarily in use. Requires the "Agents" permission on the plan.

*No parameters.*

## kb\_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>

Add source material for agents. Type URL crawls a page, TEXT stores pasted content. Three steps, and skipping either of the last two leaves the agent unchanged: add it here, attach it with `kb_attach`, then rebuild with `agent_train`. Storing material does not change how the agent writes — that is `agent_upsert` instructions. Requires the "Agents" permission on the plan.

### Parameters

<ParamField path="_id" type="string">
  Omit to create a new entry.
</ParamField>

<ParamField path="type" type="URL | FILE | TEXT" required>
  Filter by type.
</ParamField>

<ParamField path="title" type="string">
  Short label.
</ParamField>

<ParamField path="url" type="string">
  Required when type is URL.
</ParamField>

<ParamField path="content" type="string">
  Required when type is TEXT.
</ParamField>


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