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

# Library

> The shared assets campaigns draw on: tags, exclusion rules, saved copy, merge fields and blocked dates.

| Tool | Kind |
| - | - |
| [`blacklist_add`](#blacklist_add) | Write |
| [`blacklist_add_bulk`](#blacklist_add_bulk) | Write |
| [`blacklist_copy`](#blacklist_copy) | Write |
| [`blacklist_delete`](#blacklist_delete) | Write, Destructive |
| [`blacklist_export`](#blacklist_export) | Write |
| [`blacklist_list`](#blacklist_list) | Read-only |
| [`holiday_add`](#holiday_add) | Write |
| [`holiday_delete`](#holiday_delete) | Write, Destructive |
| [`holiday_list`](#holiday_list) | Read-only |
| [`hyperise_images`](#hyperise_images) | Read-only |
| [`placeholder_add`](#placeholder_add) | Write |
| [`placeholder_delete`](#placeholder_delete) | Write, Destructive |
| [`placeholder_list`](#placeholder_list) | Read-only |
| [`tag_create`](#tag_create) | Write |
| [`tag_delete`](#tag_delete) | Write, Destructive |
| [`tag_list`](#tag_list) | Read-only |
| [`tag_update`](#tag_update) | Write |
| [`template_get`](#template_get) | Read-only |
| [`template_list`](#template_list) | Read-only |
| [`template_upsert`](#template_upsert) | Write, Destructive |

## blacklist\_add

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

Exclude prospects by profile URL, company URL, keyword, job title or email. KEYWORD and JOB\_TITLE match as substrings against the profile, so keep them specific — "director" would exclude a very large slice of a search. Account-wide and lasting — it is not a way to skip one prospect in one campaign, which is `lead_update` with `isExcluded`. For a list of rules at once use `blacklist_add_bulk`. There is no tool to delete a rule.

### Parameters

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

<ParamField path="type" type="PROFILE_URL | COMPANY_URL | KEYWORD | JOB_TITLE | EMAIL" required>
  Filter by type.
</ParamField>

<ParamField path="keyword" type="string" required>
  The value to match — a URL, an email, or a substring for KEYWORD / JOB\_TITLE.
</ParamField>

## blacklist\_add\_bulk

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

Add many exclusion rules at once — a competitor domain list, or an opt-out export. Same effect as `blacklist_add`, one call. Rules cannot be removed afterwards by any tool, so review the list with the user before loading it.

### Parameters

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

<ParamField path="entries" type="object[]" required>
  Rules to add, up to 5,000 per call.

  <Expandable title="properties">
    <ParamField path="keyword" type="string" required>
      The value to match — a URL, an email, or a substring for KEYWORD / JOB\_TITLE.
    </ParamField>

    <ParamField path="type" type="PROFILE_URL | COMPANY_URL | KEYWORD | JOB_TITLE | EMAIL" required>
      What `keyword` is matched against.
    </ParamField>
  </Expandable>
</ParamField>

## blacklist\_copy

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

Clone every exclusion rule from one LinkedIn account onto another. Adds to the destination rather than replacing it, and there is no tool to remove rules afterwards — read the destination with `blacklist_list` first so the user knows what the result will be.

### Parameters

<ParamField path="linkedAccountId" type="string" required>
  Source account.
</ParamField>

<ParamField path="newLinkedAccountId" type="string" required>
  Destination account.
</ParamField>

## blacklist\_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 an exclusion rule. Prospects it was blocking become targetable again — which is the risk: a rule added for an opt-out, a competitor or a do-not-contact request starts letting those people back into campaigns. Read the rule with `blacklist_list` and show the user exactly what it blocks before calling, and get an explicit yes. This removes a RULE, not a blacklisted person: a lead blacklisted via `lead_blacklist` is a separate record and no tool removes it.

### Parameters

<ParamField path="blacklistId" type="string" required>
  Blacklist rule id, from `blacklist_list`.
</ParamField>

## blacklist\_export

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

Generate a CSV of every exclusion rule on an account. A file for the user. To read the rules in the conversation use `blacklist_list`.

### Parameters

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

## blacklist\_list

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

Exclusion rules for a LinkedIn account. Matching prospects are filtered out before they ever enter a campaign. Per LinkedIn account, not per campaign, so a rule here affects every campaign on that account. Read it when a search returns fewer leads than expected. Excluding one lead from one campaign instead is `lead_update` with `isExcluded`.

### Parameters

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

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

<ParamField path="pageSize" type="integer (1–200)" default="50">
  Rows per page.
</ParamField>

## holiday\_add

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

Stop all outreach on a given date across every campaign. Every campaign on the account, not one — there is no per-campaign holiday. To stop a single campaign there is no tool at all, and to stop one lead use `lead_update`. Reversible with `holiday_delete`.

### Parameters

<ParamField path="blockedAt" type="string | number" required>
  The date, as epoch milliseconds or ISO 8601.
</ParamField>

## holiday\_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 blocked date so campaigns send on it again. Removes the block only; it does not resend anything that was skipped while the date was blocked — those sends are gone, not deferred. Check `holiday_list` first so the user knows which date is being unblocked.

### Parameters

<ParamField path="holidayId" type="string" required>
  Blocked-date id, from `holiday_list`.
</ParamField>

## holiday\_list

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

Dates on which no campaign sends anything — public holidays and company shutdowns. Account-wide pauses by date. Read this when a user asks why nothing sent on a particular day. The weekly sending window and timezone are per campaign instead, in `campaign_update`.

*No parameters.*

## hyperise\_images

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

Personalised-image templates from a connected Hyperise account, for use in email and message copy. Pass `sync: true` to re-pull from Hyperise first. Read-only listing. Hyperise itself is connected in the web app under Settings - Integrations, and the image is used by referencing it in copy you pass to `flow_set`.

### Parameters

<ParamField path="sync" type="boolean" default="false">
  Re-pull from the upstream service before returning.
</ParamField>

## placeholder\_add

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

Define a merge field with a default value, usable as \{\{key}} in any campaign copy. The default is used when a lead has no value of its own, so a sensible default is what stops a message reading oddly. This defines the field for the whole account; it does not set any lead's value, which is `lead_update`. There is no tool to delete a placeholder.

### Parameters

<ParamField path="key" type="string" required>
  Token name, without braces.
</ParamField>

<ParamField path="value" type="string">
  Fallback value when a lead has none.
</ParamField>

## placeholder\_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 merge field. Copy still referencing \{\{key}} will render it empty — silently, with no error, so a live campaign starts sending messages with a hole in them. That is the danger here and it is worse than it sounds: nothing fails, the sends just go out wrong. Search existing sequences for the key first, show the user, and get an explicit yes. To change the fallback text instead of removing the field, re-add it with `placeholder_add`.

### Parameters

<ParamField path="placeholderId" type="string" required>
  Merge-field id, from `placeholder_list`.
</ParamField>

## placeholder\_list

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

Team-defined merge fields available in campaign copy, on top of the built-ins (firstName, lastName, designation, location, companyName, industry, senderName, signature). Check this before writing copy that uses a \{\{key}} the user mentions — a placeholder that does not exist renders empty rather than failing, which is how a message goes out with a hole in it. Per-lead values are set on the lead by `lead_update`, not here.

### Parameters

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

## tag\_create

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

Create a tag. The `interest` value decides which bucket it feeds in reply-sentiment analytics. Two different jobs use tags: reply classification (Interested, Not Interested, Replied — reused across campaigns), and identifying one campaign's leads in `campaign_update`. For the second, create a short campaign-specific tag with `interest: "NEUTRAL"` rather than reusing an existing one.

### Parameters

<ParamField path="content" type="string" required>
  Tag label, kept short. For reply classification, something like "Booked a call". For a campaign tag, a shortened form of that campaign's own name — ask the user what to call it rather than inventing one.
</ParamField>

<ParamField path="interest" type="POSITIVE | NEGATIVE | NEUTRAL" required>
  POSITIVE, NEGATIVE or NEUTRAL.
</ParamField>

## tag\_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 a tag. Any ASSIGN\_TAG step referencing it stops working, so check your flows first. Leads carrying it lose that classification and it disappears from reply-sentiment reporting, which changes past numbers. Irreversible — show the user what carries it (`tag_list` reports the count) and get an explicit yes. Deleting a campaign's own identity tag makes that campaign's leads indistinguishable in `lead_list`. To rename or reclassify instead, use `tag_update`.

### Parameters

<ParamField path="tagId" type="string" required>
  Tag id, from `tag_list`.
</ParamField>

## tag\_list

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

Tags used to classify leads and replies. Each carries an `interest` of POSITIVE, NEGATIVE or NEUTRAL, which drives reply-sentiment reporting. Tag ids are what ASSIGN\_TAG steps reference. Tags do two unrelated jobs and conflating them causes real damage. The reusable ones listed here — Interested, Not Interested, Replied, Meeting Booked, Deal, Maybe — classify replies and are shared across campaigns. A campaign's own tag, set via `campaign_update`, instead identifies that campaign's leads and must be unique to it: two campaigns sharing one tag cannot have their leads told apart, here or in `lead_list`. So never pass a tag from this list as a campaign tag — mint a short campaign-specific one with `tag_create` (`interest: "NEUTRAL"`).

### Parameters

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

## tag\_update

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

Rename a tag or change its sentiment classification. It edits the tag everywhere at once, including on leads already carrying it and in past reply-sentiment reporting — so changing `interest` rewrites history, it does not reclassify going forward only. To tag a lead use `lead_update`; to set a campaign's own tag use `campaign_update`. There is no tool to delete a tag.

### Parameters

<ParamField path="tagId" type="string" required>
  Tag id, from `tag_list`.
</ParamField>

<ParamField path="content" type="string">
  Body text.
</ParamField>

<ParamField path="interest" type="POSITIVE | NEGATIVE | NEUTRAL">
  Sentiment bucket this tag feeds in reply analytics.
</ParamField>

## template\_get

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

Full body and subject of one saved template, so you can paste it into a sequence step or adapt it for a new campaign. Returns text. Nothing is applied to a campaign until you pass it to `flow_set` (any step) or `sequence_update` (copy on a running campaign).

### Parameters

<ParamField path="templateId" type="string" required>
  Template id, from `template_list`.
</ParamField>

## template\_list

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

Saved copy your team reuses across campaigns. Paste the body into a step when authoring a sequence. Snippets of copy, not sequence shapes: the prebuilt multi-step sequences `flow_from_template` applies are a different library, matched by name there. These do not attach to a campaign by themselves — read one with `template_get` and pass the text to `flow_set`.

*No parameters.*

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

Save reusable copy. Pass `templateId` to update an existing template rather than create a new one. A snippet in the library, nothing more: saving it does not put it in any campaign, which is `flow_set`, and it is not one of the prebuilt sequence shapes `flow_from_template` applies. Updating replaces the body, so read it with `template_get` first if you do not already have the full text.

### Parameters

<ParamField path="templateId" type="string">
  Template id, from `template_list`.
</ParamField>

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

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

<ParamField path="subject" type="string">
  For email and InMail templates.
</ParamField>

<ParamField path="useCredits" type="boolean">
  InMail templates: allow spending InMail credits.
</ParamField>

<ParamField path="assingedUsers" type="string[]">
  Restrict to these team member ids. Field name is spelled this way in the schema.
</ParamField>


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