Helpdesky MCP server
This URL is a remote MCP endpoint, not a web page. Point Claude, ChatGPT, Cursor or any MCP client at it and the agent can manage your help center as you — within your operator permissions.
Endpoint
Authentication: OAuth 2.1 (authorization code + PKCE, dynamic client registration — what Claude and ChatGPT use when you paste the URL) or a personal MCP token sent as Authorization: Bearer hdmcp_pt_…. Tokens and connected agents are managed in Dashboard → MCP.
Connect from your client
Claude Desktop / Claude.ai
- Settings → Connectors → Add custom connector.
- Paste
https://helpdesky.io/mcp. - Sign in to Helpdesky and approve the consent screen.
ChatGPT
- Settings → Connectors → Create (developer mode).
- URL
https://helpdesky.io/mcp, authentication OAuth. - Sign in and approve.
searchandfetchmake your help center usable as a knowledge source.
Cursor
Create a personal token, then add to .cursor/mcp.json:
{ "mcpServers": { "helpdesky": {
"url": "https://helpdesky.io/mcp/x/lite",
"headers": { "Authorization": "Bearer hdmcp_pt_…" } } } }/x/lite stays under Cursor's 40-tool cap; /x/all serves everything.
Claude Code
claude mcp add --transport http helpdesky \
https://helpdesky.io/mcp \
--header "Authorization: Bearer hdmcp_pt_…"Without --header, Claude Code uses OAuth instead.
Replit Agent, scripts, custom agents
Any MCP client that speaks Streamable HTTP works: use the URL with either a personal token header or the OAuth flow via the discovery documents above.
Tool sets
Every tool belongs to one set. What a connection sees depends on the sets stored on its credential (chosen on the consent screen or in Dashboard → MCP) or pinned by its URL. New connections get Support desk; core is always included.
| Preset | Sets | Tools | When |
|---|---|---|---|
| Support desk (default) | core, knowledge-base, inbox, inbox-admin, team | 59 | Day-to-day support: ChatGPT, Claude and other hosted agents. |
| Setup | + settings, hosting, embeds, ai, data-sources | +41 | Onboarding: settings, branding, domain & address, embeds, AI, data sources. |
| Growth | + seo, links | +18 | SEO advisor and link scanner. |
| Lite | core, knowledge-base, inbox | 33 | Clients with a tool cap (Cursor lists 40 across all servers). |
| Everything | all 12 sets | 118 | Scripts and agents that need the full surface. |
Enabling more on request. The agent can call list_tool_sets and enable_tool_sets (e.g. ["setup"]) when you ask it to configure something; the sets are saved on that connection and tools/list grows. A tool from a disabled set answers with an "enable the … set first" message. Turning the permission off, or removing sets, is done in the dashboard — agents can only add.
URL variants pin the sets regardless of the credential: https://helpdesky.io/mcp/x/lite, https://helpdesky.io/mcp/x/support,setup, https://helpdesky.io/mcp/x/all, and …/readonly on any of them keeps only read-only tools (e.g. https://helpdesky.io/mcp/x/all/readonly). OAuth works on variants too (the resource URL is the variant).
Available tools
Generated from the live registry. Each tool returns structured output (structuredContent) plus a short text summary. Article content is Markdown.
Account
get_profilereadReturns the connected Helpdesky user: a stable opaque id, display name and email. Use it to tell accounts apart.
list_helpdesksreadLists the helpdesks the connected user belongs to, with their role and operator permissions. Call this first; other tools need a helpdeskId when the user has more than one helpdesk.
get_helpdeskreadReturns a helpdesk's name, slug, public URL, enabled features and plan limits. Settings fields are limited to what the user's role may see.
Articles
list_articlesreadLists knowledge-base articles (drafts and published) with optional status, category and title filters, paginated. Returns summaries; call get_article for the Markdown body.
get_articlereadReturns one article in full (Markdown content, publish state, category, authors, public URL) by id or by slug.
create_articlewriteCreates a knowledge-base article. Content is Markdown. The slug is derived from the title unless given (must be unique per helpdesk). Articles are drafts unless published=true; publishing generates search embeddings, same as the dashboard. Fails with a clear message when the plan's article limit is reached.
update_articlewriteUpdates an article's title, Markdown content, excerpt, category, slug or display options. Only the fields you pass change. Use publish_article / unpublish_article to change the publish state.
publish_articlewritePublishes a draft so it appears on the public help center, in search and in AI answers (embeddings are generated). Counts toward the plan's article limit.
unpublish_articlewriteUnpublishes an article: it disappears from the public help center, search and AI answers but keeps its content and slug as a draft.
delete_articledestructivePermanently deletes an article and its redirects. This cannot be undone — confirm with the user first. Consider unpublish_article instead when the content might be needed later.
Categories
list_categoriesreadLists the help center's categories in display order.
create_categorywriteCreates a category. The slug is derived from the name. Optional icon is a Lucide icon name.
update_categorywriteRenames a category (its slug follows the name) or changes its description/icon. Only passed fields change.
reorder_categorieswriteSets the display order of categories. Pass every category id in the desired order; ids that do not belong to the helpdesk are ignored.
delete_categorydestructivePermanently deletes a category. Its articles are kept but become uncategorised. Confirm with the user first.
Redirects
list_redirectsreadLists slug redirects (old article URL → current article), created automatically when a published article's slug changes or added manually.
update_redirectwriteChanges the old slug of a redirect (the source URL). The slug must not be in use by an article or another redirect.
delete_redirectdestructivePermanently deletes a redirect; the old URL will return 404 afterwards. Confirm with the user first.
Search & answers
search_help_centerreadSearches the helpdesk's published articles the way the public help center does (semantic search when embeddings exist). Returns summaries with public URLs.
ask_help_centerreadAsks the helpdesk's AI assistant a question and returns its answer with source articles, using the same retrieval-augmented pipeline (published articles + data sources) that answers visitors. Goes through the dashboard's authenticated Ask AI, so it works even when the widget is restricted to specific domains; requires an AI key (Settings > AI) and the messages permission.
searchreadSearches the published help-center articles of every helpdesk the user belongs to. Returns result ids, titles and absolute public URLs; pass an id to fetch for the full text.
fetchreadFetches the full Markdown text of an article by the id returned from search.
Contacts
list_contactsreadLists the customers (contacts) of a helpdesk with their conversation count and last contact date, optionally filtered to blocked or active contacts or searched by name/email. Paginated (limit ≤ 200).
list_contact_conversationsreadReturns the contact and every conversation they have had with the helpdesk, newest first. Useful to see history before replying.
block_contactdestructiveBlocks a contact: their new widget messages, emails and contact-form submissions are dropped and they can no longer open conversations. Existing conversations stay. Reversible with unblock_contact, but it silences a customer — confirm with the user first.
unblock_contactwriteLifts a block so the contact can message the helpdesk again.
update_contact_emailwriteChanges a contact's email address; future replies on their conversations go to the new address. Fails when another contact of the helpdesk already uses it (merge by moving conversations with set_conversation_contact instead).
Conversations
list_conversationsreadLists customer conversations (tickets) of a helpdesk, newest first by default, paginated. Status values: pending = new, awaiting the first operator reply; unresolved = in progress (an operator has replied); resolved = closed; stale = auto-flagged after a period without activity; promotional = bulk/marketing email kept out of the default list. Omitting status returns every status except promotional. assignee "me" means assigned to the connected operator. sort "unread" puts unread conversations first. search matches the contact name/email and the last message preview. Call get_conversation for the thread.
get_conversation_countsreadReturns the number of conversations that still need attention (every status except resolved and promotional) and the number of unread promotional conversations. The non-resolved count is owner-only; for staff it is returned as null.
get_conversationreadReads one conversation: its details, the contact, and the latest messages (up to 20, oldest first). Use list_conversation_messages with offset to page through longer threads. Attachments are listed as filename/type/size plus the URL the dashboard uses; access to that URL is bound to the uploader and conversation, so the agent cannot necessarily download them. Replies through MCP are text-only: never pass attachment URLs or file contents when replying.
list_conversation_messagesreadPages through a conversation's messages, oldest first (limit ≤ 100). Reading also marks the thread as seen by an operator, like opening it in the inbox. Attachments are listed as filename/type/size plus the URL the dashboard uses; access to that URL is bound to the uploader and conversation, so the agent cannot necessarily download them. Replies through MCP are text-only: never pass attachment URLs or file contents when replying.
reply_to_conversationdestructiveSends an operator reply exactly as the dashboard does: the message is delivered to the customer by email (queued for a minute unless sendInstantly) and pushed live to the widget; the conversation is marked read, assigned to you if unassigned, and moved from pending/stale to unresolved. A sent reply cannot be unsent — confirm with the user (quote the draft) before calling this unless they already approved the exact text. Set isPrivateNote for an internal note that the customer never sees. Text-only: never include attachment URLs.
edit_messagewriteRewrites the body of an operator message you sent (owners can edit any operator message). Customer messages cannot be edited. Already-sent emails are not recalled; the widget and ticket center show the edited text.
delete_messagedestructivePermanently deletes an operator message you sent (owners can delete any operator message); customer messages cannot be deleted. This cannot be undone — confirm with the user first.
translate_messagewriteTranslates one message into a target language with the helpdesk's AI translation (en, el, fr, de, es, it, pt, nl, ru, tr, ar, zh, ja, ko). Translations are cached per message and language; the original is never changed.
set_conversation_statuswriteChanges a conversation's status. resolved closes it and records you as the resolver; pending or unresolved reopens it. Status values: pending = new, awaiting the first operator reply; unresolved = in progress (an operator has replied); resolved = closed; stale = auto-flagged after a period without activity; promotional = bulk/marketing email kept out of the default list. Stale and promotional cannot be set by hand.
assign_conversationwriteAssigns a conversation to an operator of the same helpdesk (ids from list_assignable_operators; your own id is currentOperatorId in get_conversation), or unassigns it when operatorId is null. Assignment only affects inbox filters and avatars; it does not notify the operator.
mark_conversation_readwriteClears (or, with unread: true, restores) the unread flag on a conversation, exactly like the inbox's read/unread toggle.
set_conversation_contactwriteRe-links a conversation to a different contact of the same helpdesk (for example after a customer wrote from a second address). Future reply emails go to the new contact.
set_conversation_notification_emailswriteReplaces the list of extra email addresses (max 5) that receive operator replies for this conversation instead of the contact's own address. Pass an empty list to go back to emailing the contact.
mass_close_conversationsdestructiveMarks EVERY conversation of the helpdesk that is not yet resolved (pending, unresolved, stale, open) as resolved in one go. Owner only. There is no undo and no per-conversation selection — confirm with the user first, naming the exact helpdesk; use set_conversation_status to close individual conversations.
delete_conversationdestructivePermanently deletes a conversation with all of its messages and attachments. This cannot be undone — confirm with the user first. Prefer set_conversation_status resolved when the history should be kept.
Team
list_operatorsreadLists the helpdesk's team: owners and staff, pending invitations included, with each member's permissions. Requires the staff permission (owners always have it).
list_assignable_operatorsreadLists the active operators a conversation can be assigned to (id + display label). Needs only the messages permission, so any inbox user can assign.
invite_operatordestructiveInvites a person to the helpdesk team by email with a role and permissions; Helpdesky sends the invitation email (the same one the dashboard sends) and it cannot be recalled, so confirm with the user first. An existing user is added straight away and gains access immediately. Requires the staff permission (owners always have it).
invite_operator_batchdestructiveInvites the same person to several helpdesks at once with one role and permission set; one invitation email covers all of them and cannot be recalled, so confirm with the user first. Each helpdesk is checked separately and reported in results. Requires the staff permission (owners always have it).
update_operator_permissionswriteReplaces a staff member's permission set (pass the full list you want them to end up with). Owner only; owners' own permissions cannot be restricted.
update_operator_rolewritePromotes a staff member to owner or demotes an owner to staff. Owner only. Demoting keeps the member's existing permission list, so review it with update_operator_permissions afterwards.
update_operator_notificationswriteTurns new-message email notifications on or off for one team member. Members can change their own setting; owners can change anyone's.
remove_operatordestructiveRemoves a team member (or cancels a pending invitation) from the helpdesk; their conversations become unassigned. They lose access immediately and must be re-invited to return — confirm with the user first. Requires the staff permission (owners always have it).
Overview
get_overviewreadThe same numbers the dashboard Overview shows: published and draft article counts, total article views, category count and the five most recently updated articles.
Messaging settings
get_notification_settingsreadReads who gets emailed about new customer messages: the owner toggle, promotional toggle, extra notification addresses and each operator's own preference.
update_notification_settingswriteChanges the helpdesk-wide new-message notification settings. Owner only; only the fields you pass change. Use update_operator_notifications for a single member's preference.
get_messaging_settingsreadReads whether messaging is enabled and the messaging configuration (widget/ticket-center/contact-form options and custom fields). Works while messaging is switched off. Credentials (ticket-center signing secret, Turnstile secret key) are never returned; manage them in the dashboard.
update_messaging_settingswriteTurns messaging on/off (also the way to re-enable it) and/or merges top-level keys into the messaging configuration (keys you pass overwrite the stored value of that key; other keys are kept). Ticket-center keys need the ticket_center permission and contact-form/turnstile keys the contact_form permission; anything else needs settings. Credential keys such as turnstileSecretKey are refused — set them in the dashboard. Read get_messaging_settings first and send complete values for the keys you change.
get_automation_settingsreadReads the inbox automations: auto-resolve (close conversations with no activity after N days) and stale marking (flag quiet conversations after N days).
update_automation_settingswriteChanges auto-resolve and stale-marking automations (1–365 days). Only the fields you pass change; enabling auto-resolve starts the clock from now, so older quiet conversations are not closed retroactively.
Other tools
list_tool_setsreadLists the tool sets of this server with their tools and whether each is enabled for this connection, plus the presets (named bundles of sets). Tools from disabled sets are not listed by tools/list; use enable_tool_sets to turn a set on, then list tools again.
enable_tool_setswriteEnables one or more tool sets (or presets such as setup / growth / all) for this connection, saved on the credential so later requests keep them. Returns the tools that became available; call tools/list again afterwards. Sets can only be added here — the user removes sets from the Helpdesky dashboard. Permissions still apply: a set never grants more than the user's operator role allows.