Skip to content

MCP tool reference

All 73 tools the Helmdesk MCP server exposes. You will rarely name one yourself — you describe what you want and the agent picks. This page is for the other moments: deciding which scopes a key needs, working out why a tool was refused, or checking what a prompt is about to do before you run it.

This page is generated

The table is built from the server's own tool catalog at release time, so it cannot drift from the tools that actually exist. If a tool is listed here, it is registered.

What the markers mean

Every tool carries machine-readable annotations, which is how a client like Claude Code decides what to auto-approve and what to stop and ask about. Without them list_tickets and delete_ticket look identical to a permission layer.

MarkerCountWhat it means
read28Looks at data and never changes it. Safe to call speculatively.
write24Changes data inside your account. Nothing leaves Helmdesk.
destructive10Deletes data. There is no trash to recover it from.
outbound10Reaches a real person. An email goes out and cannot be unsent.
external1Calls your own endpoint, never a customer. Nothing to undo.

The two lists worth knowing by heart

10 tools reach a real customer: update_ticket, reply_to_ticket, bulk_update_tickets, send_email, send_email_batch, send_custom_email, resend_email, reply_to_feedback, request_feedback, approve_agent_item. Note update_ticket is on that list — resolving a ticket emails the customer a satisfaction survey.

10 tools delete with no undo: delete_ticket, delete_email_template, delete_article, delete_log_issue, delete_log_events, delete_feedback_request, delete_customer, delete_webhook, revoke_api_key, reset_sandbox.

Both lists behave differently in sandbox: no mail is ever delivered, and Safety & approvals covers how to keep a key away from them entirely.

Tickets (10 tools)

ToolScope What it does
list_ticketstickets:readreadList support tickets, newest first, with optional filters
get_tickettickets:readreadGet one ticket in full: the complete message thread (customer and staff messages, internal notes), tags, assignee, category and customer info
create_tickettickets:writewriteOpen a support ticket on a customer's behalf — for example from a conversation you had with them elsewhere
update_tickettickets:writeoutboundChange a ticket's status, priority, category or assignee
reply_to_tickettickets:writeoutboundPost a staff reply on a ticket. This reaches the customer: the message is recorded on the thread as staff and emailed to them immediately with a link back to the conversation, and a ticket in statu…
add_ticket_notetickets:writewriteAdd an internal note to a ticket — staff-only text that is never emailed to the customer, never shown on their portal, and never changes the ticket's status
bulk_update_ticketstickets:writeoutboundApply one change — status, priority, and/or assignee — to up to 100 tickets at once, for sweeps like "close every ticket tagged spam" or "assign all unassigned billing tickets to Ann"
add_ticket_tagtickets:writewriteAdd a tag (label) to a ticket for triage or categorisation, e.g. "vip", "needs-engineering", "refund"
remove_ticket_tagtickets:writewriteRemove a tag from a ticket. Removing a tag it does not have is a no-op
delete_tickettickets:writedestructivePermanently delete a ticket with its whole thread — messages, tags, and attachments (storage objects removed)

Team (1 tool)

ToolScope What it does
list_team_memberstickets:readreadList the active members of the account (user id, name, email, role) — the valid assignedTo values for update_ticket

Email (16 tools)

ToolScope What it does
list_email_templatesemails:sendreadList the email templates this project can send: its own templates (with subject and the variables each body references) and the account's shared templates (keys already @account/-prefixed)
import_email_templateemails:managewriteCreate or update an email template from Handlebars source
send_emailemails:sendoutboundSend a transactional email from a template to one recipient
send_email_batchemails:sendoutboundSend templated emails to up to 100 recipients in one request, each with its own template, recipient and variables
preview_emailemails:sendreadRender a template with the given variables — same layout, partials and project branding as a real send — without sending or storing anything
send_custom_emailemails:sendoutboundSend a ONE-OFF email written on the spot: a subject and a Markdown body, no template
preview_custom_emailemails:sendreadRender a custom (template-less) email — subject + Markdown body, wrapped in its layout with the project branding — without sending or storing anything
get_template_schemaemails:managereadGet the names of the variables a template's body references, plus its key, display name and unresolved subject line
list_email_sendsemails:readreadList the project's email log, newest first — the "did the customer get it?" tool
get_email_sendemails:readreadGet one email send with its full event timeline — queued, sent, delivered, opened, bounced, complained — plus the block reason, provider message id and the variables it was rendered with
resend_emailemails:sendoutboundSend an existing email AGAIN to its original recipient — the customer receives it a second time, so confirm before calling
cancel_scheduled_emailemails:sendwriteCancel an email that is still waiting in status "scheduled" (one sent with sendAt) so it never goes out
list_suppressionsemails:readreadList the addresses this project will NOT email — the suppression list
add_suppressionemails:managewriteAdd an address to the suppression list so the project stops emailing it
remove_suppressionemails:managewriteRemove an address from the suppression list so mail flows to it again
delete_email_templateemails:managedestructivePermanently delete a project email template by key, in the chosen environment, with all its versions

Knowledge base (8 tools)

ToolScope What it does
search_articlesarticles:readreadSearch the project's published knowledge base for articles matching a query
list_articlesarticles:readreadList the project's knowledge-base articles in the chosen environment, newest-updated first — DRAFTS INCLUDED, unlike search_articles, which only sees published articles
create_articlearticles:writewriteCreate a knowledge-base article in Markdown. Use it to capture a resolution or a recurring answer so future replies can cite it
get_articlearticles:readreadGet one knowledge-base article by id, including its full Markdown body, status and category
update_articlearticles:writewriteRevise an article's title, body or category, or change its status
delete_articlearticles:writedestructivePermanently delete a knowledge-base article. It disappears from the public help centre, from search_articles, and from the widget's AI answers at once, and images it referenced are removed from sto…
list_article_categoriesarticles:readreadList the project's article categories with their ids — the valid categoryId values for create_article and update_article
create_article_categoryarticles:writewriteCreate an article category for organising the knowledge base

Logs (6 tools)

ToolScope What it does
write_loglogs:writewriteShip one or more log events to this project. Events are fingerprinted server-side and grouped into log issues that the Log Watch agent monitors
query_logslogs:readreadQuery raw application log events your own code shipped to this project, newest first
list_log_issueslogs:readreadList grouped error issues (one per error fingerprint) for this project, most recently seen first
set_log_issue_statuslogs:writewriteAcknowledge, resolve, or reopen a grouped log issue from list_log_issues. "acknowledged" means "I have seen it" — it stays in the list but stops looking new; "resolved" means "fixed" — a resolved i…
delete_log_issuelogs:deletedestructiveDelete a grouped log issue AND the raw log events behind it
delete_log_eventslogs:deletedestructiveDelete up to 200 raw log events by id. IRREVERSIBLE. Ids outside the project or environment of the current key match nothing rather than erroring, so compare `deleted` against `requested` to see wh…

Feedback (7 tools)

ToolScope What it does
list_feedback_conversationsfeedback:readreadList feedback conversations (customer feedback threads) with optional filters, newest first
get_feedback_conversationfeedback:readreadGet a feedback conversation's full detail including the complete message thread (customer + staff messages, with any attachments), rating, and status
reply_to_feedbackfeedback:writeoutboundPost a staff reply to a feedback conversation. The reply is recorded on the thread and the customer is emailed the message with a link back to the conversation — so only send text you intend the cu…
close_feedback_conversationfeedback:writewriteClose a feedback conversation once it has been handled
list_feedback_requestsfeedback:readreadList outgoing feedback requests ("tickles") with their funnel status, newest first
request_feedbackfeedback:writeoutboundAsk a customer for feedback. With the default channel "email" this creates a feedback request AND immediately emails the customer a branded message with your prompt and a respond link (with a sandb…
delete_feedback_requestfeedback:writedestructivePermanently delete a feedback request ("tickle") by id

Customers (8 tools)

ToolScope What it does
list_customerscustomers:readreadList the project's customers, most recently seen first
get_customercustomers:readreadGet a customer including their full interaction history — their tickets and feedback conversations, joined by email, recent-first, capped at 50 each
create_customercustomers:writewriteCreate a customer explicitly. Customers are also created automatically when someone opens a ticket or gives feedback — use this to pre-load or enrich the directory, e.g. syncing your own user base…
update_customercustomers:writewriteUpdate a customer's profile. Email is immutable — it is the join key back to tickets and feedback. internalNote is a staff-only, CRM-style note the customer never sees: use it to record context lik…
delete_customercustomers:writedestructiveDelete a customer from the directory. Their tickets and feedback conversations are untouched — linkage is by email, not foreign key — and any new interaction from the same email simply re-creates t…
tag_customercustomers:writewriteAdd a tag to a customer. Tags are the directory's segmentation primitive: use a plain tag for a property ("vip", "beta-tester", "churn-risk") or a namespace:value tag for a state that has exactly o…
untag_customercustomers:writewriteRemove a tag from a customer. Returns the customer's remaining tags
set_customer_tagscustomers:writewriteReplace a customer's tags in one call. This is the tool to use when syncing state from another system

Webhooks (6 tools)

ToolScope What it does
list_webhookswebhooks:managereadList the project's webhook endpoints for this environment: URL, subscribed events and active state
create_webhookwebhooks:managewriteRegister a webhook endpoint that will receive signed event payloads (whsec_ secret) for the chosen events, in the environment of the current key
update_webhookwebhooks:managewriteChange a webhook endpoint's URL, subscribed events, active flag, or Slack formatting
delete_webhookwebhooks:managedestructiveDelete a webhook endpoint by id. Deliveries stop immediately and there is no undo — recreating it issues a new secret
test_webhookwebhooks:manageexternalSend a synthetic ticket.created payload (ticket number 0, all-zero id, data.test=true) to ONE webhook endpoint and report what it answered: success, HTTP status, response body (up to 1 KB), and dur…
list_webhook_deliverieswebhooks:managereadList a webhook endpoint's recent deliveries, newest first — every attempt with its event, success flag, HTTP status, response body, and time

Projects, keys & sandbox (8 tools)

ToolScope What it does
list_projectsprojects:readreadList the projects this API key can reach, and which one is the default (null when the key reaches several and no HELMDESK_PROJECT is set)
get_projectprojects:readreadThe setup view of one project, by slug or id: branding (name, logo, colour), the public support and knowledge-base URLs to link from the app, whether email sending is configured (from address, mode…
get_project_overviewprojects:readreadOne snapshot of how an app is doing right now, for its project and environment: the ticket queue by status plus how many await a reply and how many of those are stale (5+ days), tickets resolved th…
get_usageprojects:readreadThe account's plan tier and every quota meter next to its limit: tickets this month against the allowance (and whether it is in overage), email sends, log events and retention days, storage bytes…
create_projectprojects:managewriteCreate a new Helmdesk project for an app — one project per app
create_api_keyapi_keys:managewriteMint an API key for an app you are building, so the app can call Helmdesk from its own code (SDK emails, logs, tickets)
revoke_api_keyapi_keys:managedestructiveRevoke an API key by id, permanently. The key stops authenticating on its very next request, so every app or CI job still using it breaks immediately — confirm with the user which app holds it befo…
reset_sandboxprojects:managedestructiveClear a project's SANDBOX plane in one call — the thing to run between test runs or when a seeded sandbox has gone stale

Agent review queue (3 tools)

ToolScope What it does
list_agent_activityagents:reviewreadThe "anything waiting for me?" tool: list what this project's agents did that needs a human, newest first
approve_agent_itemagents:reviewoutboundKeep what an agent did and mark the item approved. Read the item with list_agent_activity FIRST — what this does depends on details.kind
revert_agent_itemagents:reviewwriteUndo what an agent did and mark the item reverted. Nothing is emailed

Resources

Alongside the tools, the server publishes three read-only snapshots an agent can pull in as context without deciding to call anything. They always use the server's default project and environment.

URIContents
helmdesk://tickets/openUp to 50 new and 50 open tickets, newest first
helmdesk://tickets/pendingUp to 50 tickets waiting on the customer or a third party
helmdesk://articlesUp to 100 published knowledge base articles

Every tool takes two extra arguments

Every project-scoped tool above accepts project (a slug or id) and environment (live or sandbox) on top of its own arguments. The one exception is reset_sandbox, which takes only project — it is always the sandbox plane, so there is nothing to choose. You almost never type either: the project comes from HELMDESK_PROJECTor from a key that reaches exactly one project, and the environment comes from the key. They exist so an agent can say "do this one against Ledgerly, in sandbox" without you reconfiguring anything.

A live key may ask for sandbox on a single call. A sandbox key asking for live is a 403. The downgrade only runs one way — see Sandbox.

Where to go next

  • Prompt cookbook — what to actually say, and which of these tools it calls.
  • Safety & approvals — scoping a key so the outbound and destructive tools are out of reach.
  • REST API — the same surface for code rather than an agent.