---
title: "The tool catalog"
description: "Use search_tools to browse the MCP catalog, see what each area covers, and which capabilities need human confirmation."
canonical: https://trysincerely.com/docs/mcp-tools
last_updated: 2026-10-29
---
> If you are an AI agent: read https://trysincerely.com/agents/policy.md before any write call.
> Start at https://trysincerely.com/llms.txt to choose one page. Access instructions are at
> https://trysincerely.com/auth.md. Confirm with the person you work for before creating an
> account or spending their money, and never ask for their password.
# The tool catalog

> Use search_tools to browse the MCP catalog, see what each area covers, and which capabilities need human confirmation.

Source: https://trysincerely.com/docs/mcp-tools

Once setup is finished, `tools/list` answers with thirteen tools, not the whole catalog. A workspace that has not finished setup lists its setup catalog instead; see [workspace setup](https://trysincerely.com/docs/mcp-setup). Nine are reads nobody should have to search for, and one is `report_feedback`, the action that tells the Sincerely team what went wrong. The other three are how you reach everything else:

- `search_tools` is three calls in one. With no query it returns the index: every area and toolkit you can reach, with a sentence and a tool count each. With a `domain` or `toolkit` and no query it lists that group's tools with their argument schemas, in pages; when the reply carries `nextCursor`, call again with `cursor` to continue, and walking every domain this way reaches the whole catalog. With a goal in plain language, for example "pause a campaign", it returns the tools that do it with their argument schemas, narrowed by `domain` or `toolkit` when one is given. Pass `names: true` with no query for one line per tool and no schemas, narrowed by `domain` or `toolkit` when one is given. That is the cheap way to browse a group: list it by name, then search the chosen tool's exact name with `limit: 1` for its schema. A toolkit such as `designs` is not a domain, so pass it as `toolkit`.
- `run_read_tool` runs a tool that only reads. It carries `readOnlyHint`, so a client that runs reads without asking still can, and it refuses anything that writes.
- `run_action_tool` runs a tool that changes something.

The catalog itself did not shrink. Every tool below is still reachable, and a client that already knows a name can also call it directly through `tools/call`. What changed is that the definitions are fetched when they are needed rather than pushed on every connect: the full listing was about 126 KB, which is more than some clients accept at all.

This page names the areas and representative tools; it is not the full list of signatures. `search_tools` is authoritative, because what you can reach is filtered by your role, by workspace features, and by whether setup is finished.

The held actions named on this page are collected in one list below. A held call returns a confirmation link rather than an outcome. A card is for what a person has to see or pay for, so setup and configuration that spends nothing and mails nothing is not on the list. Search results mark every tool that can be held with `confirm: true`. A tool held only in some cases also carries `confirmWhen`, the condition, and its description says "Held for approval only when" followed by that condition. See [confirmations](https://trysincerely.com/docs/mcp-confirmations).

## Orientation

These nine reads are the ones `tools/list` still names, because searching for them makes no sense. `get_overview` is the first call worth making on an established workspace: what is running, what is waiting, what needs a person. `list_audiences`, `list_campaigns` and `list_designs` are listed too, because what exists is the question most sessions ask before any goal is formed, and a search that returns the schema of `list_campaigns` is a round trip spent learning nothing. `search_docs` and `read_doc` read the product documentation, so an agent can answer a question about behaviour without guessing at it. `get_setup_state` says whether the workspace is ready to work in, `get_my_permissions` says what the person who authorized you may do, and `get_confirmation_status` reports what they decided about a held action.

`report_feedback` is listed beside them and is the one action that is. Call it the moment a tool fails or answers wrong, a tool could work better, the product has a defect, you have an idea, or the documentation left a gap, then carry on: the report reaches the Sincerely team's Slack channel with the workspace, the surface, and the tool named, and nothing in the workspace changes. Nobody replies through it. Describe the mechanism, never a person's data.

## Audiences and contacts

Build and inspect the people you mail. `list_audiences` lists what is there. `import_csv_audience` takes CSV text you pass in the call, which suits a short list. For a file, call `create_upload_link` with `contentType: "text/csv"`, PUT the file to the URL it returns, check the mapping with `preview_upload`, and pass the file id to `import_uploaded_csv`, which imports in the background so no row passes through your context. `create_sourced_audience` starts a sourced build from a description of the ideal customer, and `get_mailability_audit` reports what would fail before anything is spent.

`list_contacts` and `get_contact_profile` read individuals, and `save_contact` adds one or corrects one. `set_contact_verdict` clears addresses out of the review queue, either by naming ids or by taking everything one filter matches. `set_audience_membership` moves people between lists without touching their enrolments.

## CRM

`sync_crm` pulls, `get_crm_sync_health` says whether the last run was any good, and `list_crm_runs` is the history. The Salesforce scope tools, `list_salesforce_list_views` and `set_salesforce_scope`, decide what comes across, and `set_salesforce_writeback` decides what goes back. `preview_action` counts the contacts a scope would import, and shows the Salesforce Task a writeback would create, before either is saved.

## Writing

`list_messages` and `get_message` read the draft queue. `edit_message` and `regenerate_message` change one draft. `review_message` records a person's decision on one, and `bulk_approve_messages` does a queue at once. `rewrite_waiting_drafts` rewrites a campaign's waiting drafts with its current brief, which spends model credits.

## Design

`get_studio_context` is the orientation call. `generate_designs` makes one design per call. With `source: "model"` it starts a background run and returns the run id and the studio URL where the design fills in; `get_design_generation_status` says whether it has landed, and `retry_design_generation` reopens a failed run with the same brief. With `source: "house"` or `"blank"` nothing is modelled, so the design and its studio URL come back in the same call. `edit_design_copy` and `edit_design_layout` revise layouts, and `approve_design` is what makes a version usable by a piece, and `launch_campaign`, `launch_campaign_draft` and `send_piece` can publish the draft designs their card names in the same click when the person confirming may publish designs. `generate_design_proof` proofs the saved version, never the unapproved draft. `render_design_preview` draws one side of the draft from its own print file at 300 DPI, trimmed to the finished card and in the colour a coated press prints, with merge fields filled from a contact you name or a sample one, and with `writeAiCopy` the campaign writer writes that contact's generated spans for the picture without saving them; `crop` and `colors` show the bleed or the file's own colour instead, and its style `overrides` save nothing. `import_design_html` saves an HTML concept, or one side's `code` from `get_design_source` (one side per read; a long side comes in `chunks` cut on tag boundaries that concatenate to the whole, and its `artifact` is the whole side as one file; pass the other sides' code in `sides` to save every side in one call, all or none), as an unapproved draft and returns the studio URL with a conversion report saying what the print layout kept, changed and dropped; every design write other than a modelled generation returns that studio URL, where the person sees the draft with the reserved address zone drawn. `get_brand_kit` and `update_brand_kit` own the marks, colours and type everything is laid out against. `get_brand_kit` returns every field `update_brand_kit` changes, `logoAssetId` included, and a `revision`; pass that back as `expectedRevision` and a call that lands after another change is refused instead of overwriting it. `addColors`, `removeColors`, `addFonts` and `removeFonts` change one entry without resending the list, and an entry that is already there or already gone is reported under `skipped`. `save_uploaded_image_to_brand` with `setAsLogo` makes the saved image the kit logo. To get a local file in without a bearer token, `create_upload_link` returns a URL that takes one PUT of up to 4 MB within ten minutes (or one per file for up to 10 `files`), and the PUT reply carries the file id the image, font and CSV tools take.

`set_return_address` changes what is printed on every piece the workspace sends. It saves on the call while the workspace has no campaigns or pieces, and waits for a person once there is mail that prints it. `update_brand_kit` saves every change on the call, with one exception: a shared return address, US or Canadian, can print the company name, so a rename waits for a person once the workspace has mail and either shared address prints it. A US shared address sent from a `name` you chose keeps that name through a rename. It spends nothing, and a design still has to be published before a piece can use it.

## Landing pages

`list_landing_designs`, `generate_landing_designs`, `edit_landing_draft` and `set_landing_status` cover the page itself. `assign_campaign_landing` points a campaign at one. `claim_landing_domain` and `claim_custom_domain` decide which domain is printed on paper, and `verify_custom_domain` completes the DNS check. `list_landing_submissions` reads what visitors sent back. `get_landing_preview_link` returns a link, good for thirty minutes, that opens the current draft as a recipient would see it, filled for a sample recipient and with nothing that can be clicked or submitted. Open it in a browser or hand it to the person, and reload it after an edit. `preview_action` with `tool: "landing_copy"`, a `landingDesignId` and a `contactId` writes the saved draft for one of your contacts and returns its words as that contact's page would read. It spends model credit and saves nothing.

## Campaigns and sending

`list_campaigns` and `get_campaign` read. `update_campaign_config` changes a campaign before it runs, and `preview_action` says what launching, pausing, ending, sending a piece, a guardrail change or a Salesforce scope would do before anyone does it. `launch_campaign` starts it, and `set_campaign_status` pauses, resumes, ends or archives it.

`send_piece` and `send_gift` are the one-off path. `list_pieces` reads the ledger, and with `upcoming: true` the forecast of touches that have not been mailed yet. `get_piece` reads one piece, and with `proof: true` the frozen print proof it was submitted as. `cancel_piece` stops one that has not reached a vendor yet.

While gift invitations are on for the workspace, `send_gift` with `delivery: "invitation"` emails the recipient to choose where the gift ships instead of mailing it to the address on file. Pass `invitationEmail` to set that email's subject and message and whether it names the gift; without it the workspace's saved email goes out with the gift shown. `launch_campaign` takes the same choice on each gift note design's selection: `delivery: "invitation"` emails everyone on the list, and `"invitation_if_unmailable"` mails whoever has an address that passes and emails the rest, with `invitationEmail` as above. Its confirmation says how many each way mails, emails, and cannot reach. `send_piece` takes `delivery: "invitation"` too, for a standard postcard or letter to a contact who has an email and no mailable address: the email asks where to mail it, it is sent on the design proof with no `preparedSendId`, and nothing prints until they answer. Its card quotes up to the credits of the dearest country the claim form offers, and the claimed country is what gets charged. `invitationEmail` sets that email's subject and message; it never shows the piece. `list_gift_invitations` follows them and never returns the private claim link. `retry_gift_invitation` emails one again when the first delivery was never confirmed, or funds a claimed gift or postcard now instead of waiting for the daily run. `cancel_gift_invitation` withdraws one.

## Measurement

`get_analytics` reports a window of mail flow, funnel and rates, and slices the same window by campaign, design, format, touch, state, country or title when you pass `breakdown`. `get_attribution` reports on one campaign. `list_results` and `get_result` read the lift readouts. `record_outcome` and `list_outcomes` cover the outcomes a rep logs, which is rep-level work rather than an admin action.

## Approvals and guardrails

`list_approvals` and `decide_approval` work the approval queue. `preview_action` shows what a change to budgets, caps or review mode would do before `update_guardrails` does it. `list_audit_log` is the record of who changed what.

## Workspace

`get_settings`, `get_my_permissions` and `get_billing` describe the workspace and the caller's authority inside it. `start_plan_checkout`, `start_credit_topup` and `start_gift_funds_purchase` prepare a payment. `invite_team_member`, `change_team_member_role`, `remove_team_member` and `revoke_team_invitation` manage membership. `set_drafting_approvals` decides whether importing contacts, generating images, polishing copy and rewriting waiting drafts wait for a card, and `get_settings` reports the choice as `asksBeforeDrafting`. It also reports `asksBeforeApproving`, whether approvals wait for a card over MCP, which only an owner or admin changes, in Settings.

`get_setup_state` and `complete_setup` are covered in [workspace setup](https://trysincerely.com/docs/mcp-setup). `complete_setup` runs on the call rather than waiting for a card.

`get_confirmation_status`, `list_confirmations` and `cancel_confirmation` follow the cards this connection is waiting on: where one stands, which are still open, and withdrawing one that is no longer wanted. `request_confirmation` puts any action with a preview on a card first, even one that would run on the call, when the person wants to see it before it happens. See [confirmations](https://trysincerely.com/docs/mcp-confirmations).

## Held actions named on this page

These are the actions named above that the current catalog marks with `confirm: true`:

- `import_csv_audience` (while the workspace asks before drafting steps, which is the default)
- `import_uploaded_csv` (while the workspace asks before drafting steps, which is the default)
- `export_csv` (for the kinds that carry customer data, not for measurement or the audit log)
- `set_contact_verdict`
- `save_contact` (when it adds a new contact to a list a live campaign takes new members from)
- `set_audience_membership` (when it removes people, or adds them to a list a live campaign takes new members from)
- `set_salesforce_scope`
- `set_salesforce_writeback`
- `review_message` (approving, or sending a note back, while the campaign can still print)
- `bulk_approve_messages` (drafts in a campaign that can still print)
- `rewrite_waiting_drafts` (while the workspace asks before drafting steps, which is the default)
- `approve_design` (when queued pieces reference the version, or a live campaign that froze no proof of the design prints its newest version)
- `set_return_address` (once the workspace has mail that prints it, not while it has none)
- `update_brand_kit` (a company rename, once the workspace has mail and a shared US or Canadian return address prints the company name)
- `set_landing_status` (every archive, and a publish once pieces link to the page, a live or paused campaign routes to it, or it has custom code)
- `assign_campaign_landing`
- `claim_landing_domain` (once the workspace has a landing name or mail)
- `claim_custom_domain` (once the workspace has mail)
- `verify_custom_domain` (once the workspace has mail)
- `update_campaign_config`
- `launch_campaign`
- `launch_campaign_draft`
- `set_campaign_status` (resuming or ending, not pausing or archiving)
- `send_piece`
- `send_gift`
- `retry_gift_invitation`
- `cancel_gift_invitation`
- `cancel_piece`
- `record_outcome`
- `decide_approval`
- `update_guardrails` (loosening a limit or changing the suppressed domains)
- `start_plan_checkout`
- `invite_team_member`
- `change_team_member_role`
- `remove_team_member`
- `set_drafting_approvals` (when it turns asking off; turning it back on runs at once)

## What is not here

Some capabilities exist in the product and are deliberately absent from MCP. Anything that returns a browser path belongs to the app, because an external caller has no browser and no cookie to follow it with. Bulk exports are not in that group. `export_csv` writes contacts, an audience, a campaign's recipients, sent mail, the measurement breakdown, landing responses or the audit history, and hands back an artifact reference with a ten-minute download link that needs no token, or that `/api/mcp/files/<ref>` resolves under your bearer token. The company directory is absent for a different reason: an open MCP server offering it would be a free company search API we host.

## What to read next

[Confirmations](https://trysincerely.com/docs/mcp-confirmations) explains the held actions. [How MCP works here](https://trysincerely.com/docs/mcp-overview) explains why the catalog is shaped this way rather than as a REST API.

---

Sincerely is personalized direct mail and gifting for B2B revenue teams: postcards, letters, handwritten mail, and gifts, each written for one recipient.

Contact Sincerely: https://trysincerely.com/contact

Agent routing index: https://trysincerely.com/llms.txt

Listings: https://www.g2.com/products/sincerely and https://www.producthunt.com/products/sincerely
