Every tool of the HelpCenter.io MCP server at https://mcp.helpcenter.io: what it does, its arguments, the permission it needs, the REST API endpoint behind it and what it returns. To connect a client first, see Connect an AI assistant to your help center. For plans, sign-in and the security model, see The HelpCenter.io MCP server.
How to read this reference
Permission is the OAuth permission (scope) the tool needs. An API key covers the same ground: a Read only key holds
content.readandanalytics.read, a Read & write key addscontent.write, and the team notes tools need a key created with team notes access (a Read only key can then read notes, a Read & write key can also reply and resolve). See Scopes.Read-only tools change nothing. Destructive tools can throw work away or change what readers see, and carry
destructiveHint: trueso MCP clients can ask you first. Every tool's annotations are intools/list.Arguments are strict. An argument a tool does not list is refused before any request is made, with
Input validation errorandUnrecognized key(s) in object: '<name>'. No tool takes a help center argument: the connection decides the help center.Per-language fields (
title,contentandslugof articles,nameanddescriptionof categories) are objects keyed by language code, for example{"en": "Getting started"}. Keys must be two letters, optionally followed by a hyphen and two more letters, such asenorde-AT, so the tools refusezh-Hans,zh-Hant,filandmultoday, although help centers can publish in those languages. A language your help center does not publish in is refused withUnsupported language key "de" provided.
What tools return
Every successful call returns the API's response in
structuredContent.Read tools take
response_format:markdown(the default) puts a short readable summary in the text, without article bodies;jsonputs the full response in the text. Write tools always return the response as JSON text.The four list tools (
helpcenter_search_articles,helpcenter_list_articles,helpcenter_list_categories,helpcenter_list_comments) wrap the API's list in{total, count, page, per_page, total_pages, has_more, items}.In
jsonformat, a list longer than 25,000 characters is cut to half its items and gains"truncated": trueand atruncation_message. The nextpagestarts after the full page, so the items cut this way are never returned: when you seetruncated, ask again with a smallerlimitinstead of paging on.A failed call returns
isError: trueand a text that says what went wrong and what to do, usually starting withError:. The common ones are in the troubleshooting section of Connect an AI assistant to your help center.
All tools
Tool | What it does | Permission | Kind |
|---|---|---|---|
| Search published articles |
| Read-only |
| List every article, drafts included |
| Read-only |
| Read one article |
| Read-only |
| Create an article, or update the one with the same |
| Writes |
| Change an article, live |
| Writes |
| Create or update up to 50 articles |
| Writes |
| Read the unpublished edits on an article |
| Read-only |
| Stage an edit to a published article |
| Writes |
| Publish staged edits |
| Writes |
| Throw staged edits away |
| Destructive |
| List earlier published versions |
| Read-only |
| Put an earlier version back live |
| Destructive |
| List categories |
| Read-only |
| Create a category |
| Writes |
| Change a category or move it |
| Writes |
| Delete a category and re-file what it holds |
| Destructive |
| Set the order of categories |
| Writes |
| Set the order of articles in a category |
| Writes |
| List reader comments, the moderation queue |
| Read-only |
| Read one article's comment threads |
| Read-only |
| Approve or unpublish a comment |
| Writes |
| Post a reply or a comment |
| Writes |
| Traffic, ratings and activity for a period |
| Read-only |
| Views and ratings per article |
| Read-only |
| What readers searched for and did not find |
| Read-only |
| Read team notes on an article |
| Read-only |
| Reply to a team note |
| Writes |
| Mark a team note resolved |
| Writes |
| List the help centers the connection can reach |
| Read-only |
29 tools |
Articles
Article objects are the REST API's, with every language in per-language maps. See Articles for every field.
helpcenter_search_articles
Searches article titles and content by keyword. Calls GET /v1/articles?search=. Read-only.
Argument | Type | Description |
|---|---|---|
| string | Required. The words to search for. |
| string | The help center's default language when omitted. The language to search in. |
| integer | Only articles in this category. |
| integer, 1-100 | Default |
| integer, 1 or more | Default |
|
| Default |
Returns the list envelope with full article objects in items. Search finds what an anonymous reader could find: published, public articles in public categories, and released translations. It returns at most 15 matches whatever limit says, and total then reports 15 even when more articles match. On a help center whose default language is not English, it finds only articles that also have a released English translation. To go through every article, use helpcenter_list_articles.
helpcenter_list_articles
Lists every article that is not in the Trash: drafts, private and link-only articles included. Calls GET /v1/articles. Read-only.
Argument | Type | Description |
|---|---|---|
| integer | Only articles in this category. |
|
| Most recently updated first when omitted. |
|
| Default |
| string | Has no effect on a list: every article comes back with all its languages. |
| integer, 1-100 | Default |
| integer, 1 or more | Default |
|
| Default |
The tool cannot filter by status or by date. The REST API can, with status and updated_since.
helpcenter_get_article
Reads one article, including whether staged edits are waiting on it (has_staged_changes, staged_locales, staged_updated_at). Calls GET /v1/articles/{id}. Read-only.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
|
| Default |
Returns {status, article}. The API counts this read against the 120-a-minute write limit.
helpcenter_create_article
Creates an article. With an external_id it is an upsert: the same key again updates the article it created. Calls POST /v1/articles.
Argument | Type | Description |
|---|---|---|
| per-language object | Required. For example |
| per-language object | The body, in HTML or Markdown (see |
| per-language object | Made from the title when omitted. |
| integer, 0 or more | The primary category. |
| array of integers | Leave it out: a new article sent with |
|
| Default |
|
| Default |
| boolean | Default |
| string, up to 191 characters | A stable key you own, such as a file path or a CMS id. |
|
| Default |
Returns {status, action, article}, plus images when you send content. action is created, or updated when the external_id matched an article. This is the images report of an article with one embedded image and one image on a private address:
{
"rehosted": 1,
"reused": 0,
"failed": [
{
"src": "http://127.0.0.1:9/nothing.png",
"reason": "the host resolves to a private or reserved address"
}
],
"failed_count": 1
}
Images are copied in. Images in
contentthat point to other websites, or are embedded asdata:URLs, are copied into your help center's storage, up to 25 per article, andimagesreports what happened. An image that cannot be copied keeps its original address and is listed infailedwith a reason.link_onlyis lost on create. The article is savedpublic, with a share token. For a link-only article, create it as a draft (leave outpublished), then sendvisibility: "link_only"andpublished: truetogether in onehelpcenter_update_articlecall, so readers never see it without the link.Use
external_idfor anything that may run twice. Without it, every retry creates another article.
helpcenter_update_article
Changes an article. Calls PATCH /v1/articles/{id}. On a published article, readers see the change at once: stage it instead to review it first.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| as in | All optional. Only what you send changes. |
Returns {status, article}, plus images when you send content. An external_id that already belongs to another article is refused with That external_id already belongs to another article.
helpcenter_bulk_create_articles
Creates or updates several articles in one request, for imports and migrations. Calls POST /v1/articles/bulk.
Argument | Type | Description |
|---|---|---|
| array of article objects | Required. Each item takes the arguments of |
Returns {status, results, meta}, where meta counts total, created, updated and failed. Each result is {index, status, article, images} with status created or updated, or {index, status: "error", external_id, error} for an item that failed (external_id when the item had one), with error.code one of invalid_item, validation_error, invalid_argument, external_id_busy and persist_failed (for example a new article sent with categories). One failed item does not stop the others.
The tool accepts up to 100 items, but the API takes at most 50. A call with 51 to 100 items fails as a whole, and the agent only reads The request could not be accepted. Keep batches at 50 or fewer, each item with an external_id.
Staged changes and versions
Staging lets an agent prepare an edit to a published article without readers seeing it. Staging an edit needs staged changes on the help center, part of the Catalyst plan in early preview; otherwise helpcenter_stage_article_changes is refused with STAGING_UNAVAILABLE. Staged edits are kept per language. See Staged changes and versions for the objects and errors.
helpcenter_get_staged_changes
Reads the unpublished edits waiting on an article, with the etag to pass when you stage again. Calls GET /v1/articles/{id}/staged. Read-only.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| string | One language. Every staged language when omitted. |
|
| Default |
Returns {status, staged}: one object when you name a locale, otherwise an array. Each has article_id, locale, fields, shared, release_translation, etag, shared_etag, base_signature, updated_at and _links. The API counts this read against the write limit.
helpcenter_stage_article_changes
Saves an edit to a published article without readers seeing it. Calls PATCH /v1/articles/{id}/staged.
Argument | Type | Description |
|---|---|---|
| integer | Required. A published article. |
| string | Required. The language of this edit, one of your help center's language codes, for example |
| string | Plain strings for this language, not per-language objects. |
| as in | Shared by every language of the article. |
| boolean |
|
| string | The |
Returns {status, staged}. On an article that isn't published, the call is refused with NOT_PUBLISHED, and the agent is told to use helpcenter_update_article.
helpcenter_publish_staged_changes
Publishes staged edits, so readers see them. Calls POST /v1/articles/{id}/staged/publish.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| string | One language. Every staged language when omitted. |
| boolean | Publish even when the live article changed after the edit was staged, which is otherwise refused with |
Returns {status, published_locales, article}. If the article was unpublished in the meantime, the staged edit is still applied and the article stays unpublished.
helpcenter_discard_staged_changes
Throws staged edits away. The live article does not change. Calls DELETE /v1/articles/{id}/staged. Destructive: a discarded edit cannot be recovered.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| string | One language. Every staged language when omitted. |
Returns {status, discarded, article}, where discarded counts the staged languages removed. On an article with nothing staged, the tool answers not found: This article has no staged changes to discard.
helpcenter_list_article_versions
Lists an article's earlier published versions, newest first. Calls GET /v1/articles/{id}/versions. Read-only.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
|
| Default |
Returns {status, versions}, each {id, locale, title, published_at, _links}, at most 20 across all languages. HelpCenter.io keeps 20 versions per language. A version is recorded when staged changes are published or a version is restored, so an article that was never staged has none. This tool and the next need no Catalyst plan. The API counts this read against the write limit.
helpcenter_restore_article_version
Puts an earlier version back live. Calls POST /v1/articles/{id}/versions/{versionId}/restore. Destructive: readers see the restored version at once.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| integer | Required. An |
Returns {status, article}. The version it replaced is kept in the history, so you can restore it back.
Categories
Category objects are {id, parent, name, description, icon, position, privacy, created_at, updated_at}. See Categories.
helpcenter_list_categories
Lists every category of the help center. Calls GET /v1/categories. Read-only.
Argument | Type | Description |
|---|---|---|
| integer, 1-100 | Default |
| integer, 1 or more | Default |
|
| Default |
helpcenter_create_category
Creates a category, at the top level or inside another one. Calls POST /v1/categories.
Argument | Type | Description |
|---|---|---|
| per-language object | Required. For example |
| per-language object | Optional. |
| integer | A category of this help center. |
| string, up to 190 characters | An icon identifier. |
| integer, 0 or more | Order among its siblings, ascending. When omitted, the category goes after the ones you have ordered. |
Returns {status, category}. When you leave out position, the response shows "position": 0 although the category is stored after the others: list the categories to see the stored order. New categories are always public. To make one private, use the dashboard.
helpcenter_update_category
Renames a category, changes its description, icon or position, or moves it. Calls PATCH /v1/categories/{id}.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| per-language object | Optional. |
| integer | The new parent: a category of this help center, but not the category itself or one beneath it. |
| string, up to 190 characters | Optional. |
| integer, 0 or more | Order among its siblings. |
Returns {status, category}. The tool cannot change a category's privacy.
helpcenter_delete_category
Deletes a category. Calls DELETE /v1/categories/{id}. Destructive. It never deletes articles: it re-files them.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
|
| Default |
Returns {status, message, on_orphan, articles_moved, children_moved, trashed_articles_refiled, trashed_children_refiled, moved_to}. A refused delete tells the agent what the category holds, for example It holds 1 article., and asks it to choose uncategorize or reparent.
helpcenter_reorder_categories
Sets the order of many categories in one call. Calls PUT /v1/categories/order.
Argument | Type | Description |
|---|---|---|
| array of | Required. The categories in the order you want. Leave out |
Returns {status, message, updated_count, categories}.
helpcenter_reorder_category_articles
Sets the order of the articles in one category. Calls PUT /v1/categories/{id}/articles/order.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| array of | Required. Leave out |
Returns {status, message, updated_count, skipped_article_ids, order_visible, article_sort, article_sort_source, hint}. Readers see this order only when the help center's category pages sort articles by Custom: check order_visible, and read hint when it is false.
Comments
Comment objects leave out the commenter's email address and IP address, and team notes never appear in these tools. See Comments for the fields.
helpcenter_list_comments
Lists reader comments across the help center, for example the ones waiting for approval. Calls GET /v1/comments. Read-only.
Argument | Type | Description |
|---|---|---|
|
| Everything except deleted comments when omitted. |
| integer | Only this article's comments. |
| string | A language the help center publishes in. |
| string, up to 190 characters | Text the comment contains. |
|
| Default |
| integer, 1-100 | Default |
| integer, 1 or more | Default |
| boolean | Does not work today: leave it out. See below. |
|
| Default |
Returns the list envelope plus status_counts, the number of comments in each state. A call with include_email: true fails today, whatever the credential, so the tools cannot return email addresses.
helpcenter_get_article_comments
Reads one article's comments as threads, with each reply under the comment it answers. Calls GET /v1/articles/{id}/comments. Read-only.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| as in | Everything except deleted comments when omitted. |
| string | Only comments in this language. |
|
| Default |
| boolean | Does not work today, as in |
|
| Default |
Returns {status, article, comments, meta}, with meta.threads_count and meta.comments_count. The whole conversation comes back in one call, without paging.
helpcenter_moderate_comment
Approves a comment, or unpublishes it to take it off the article. Calls PATCH /v1/comments/{id}. It cannot delete a comment.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
|
| Required. |
Returns {status, message, comment}. Approving a reply emails the author of the comment it answers, once, as approving it in the dashboard does.
helpcenter_reply_to_comment
Posts a reply to a comment, or a new comment on an article, in the name of the person behind the connection. Calls POST /v1/articles/{id}/comments. The comment is published at once.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| string, 1 to 5,000 characters | Required. Plain text: HTML is shown as text, not as formatting. |
| integer | The comment to answer, on the same article. A new top-level comment when omitted. |
| string | The parent comment's language, else the help center's default, when omitted. |
Returns {status, message, comment}. Calling it twice posts two comments: read the thread before retrying.
Analytics
The three analytics tools share a limit of 6 requests a minute per credential, on top of the API's other limits. Traffic, view and search figures are computed once a day, so asking again for the same period returns the same numbers; ratings, activity and totals are current. Over the limit, the agent is told not to retry. Without from and to, a report covers the last 7 days; a range can be at most 92 days. The fields are in Analytics.
helpcenter_get_analytics_summary
Visitors, searches, article views, ratings and your team's activity for a period, compared with the period before. Calls GET /v1/analytics/summary. Read-only.
Argument | Type | Description |
|---|---|---|
| string, | The period, both days included. The last 7 days when omitted; |
| string | Only this language. |
|
| Default |
Returns {status, range, summary}, with summary.traffic, summary.ratings, summary.activity and summary.totals.
helpcenter_get_content_performance
Views and ratings for each article that was viewed in the period. Calls GET /v1/analytics/content. Read-only.
Argument | Type | Description |
|---|---|---|
| as in | Optional. |
|
| Default |
| integer | Only articles in this category. |
| integer, 1-100 | Has no effect today: every page holds 25 articles. |
| integer, 1 or more | Default |
|
| Default |
Returns {status, range, excludes_never_viewed, articles, meta}. Articles nobody viewed in the period are not listed.
helpcenter_get_search_queries
What readers searched for, and which searches found nothing: a list of articles you have not written yet. Calls GET /v1/analytics/searches. Read-only.
Argument | Type | Description |
|---|---|---|
| as in | Optional. |
| integer, 1-50 | Default |
|
| Default |
Returns {status, range, content_gaps, frequent_queries, common_terms, meta}. The lists are the top entries only.
Team notes
Team notes are the private notes your team leaves on articles; readers never see them. Every call also checks that the person behind the credential still has access to team notes on the help center, and answers notes_forbidden when they do not. See Team notes.
helpcenter_list_article_notes
Reads the open notes on an article, each tied to the passage it is about. Calls GET /v1/articles/{id}/notes. Read-only.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| boolean | Does not work today: |
| string | Only notes in this language. |
|
| Default |
Returns {status, article, notes, meta}. Each note has id, note, anchor (mark_id and quote, the highlighted passage), author, resolved, replies and _links. meta has threads_count, open_count and includes_resolved.
helpcenter_reply_to_article_note
Replies to a note. The reply stays internal. Calls POST /v1/articles/{id}/notes/{noteId}/replies.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| integer | Required. The note thread to answer. |
| string, 1 to 5,000 characters | Required. Plain text. |
Returns {status, message, note}, the thread with the new reply in replies. Calling it twice posts two replies.
helpcenter_resolve_article_note
Marks a note as done. Calls POST /v1/articles/{id}/notes/{noteId}/resolve.
Argument | Type | Description |
|---|---|---|
| integer | Required. |
| integer | Required. |
Returns {status, message, id}.
Help centers
helpcenter_list_sites
Lists the help centers the connection can reach, with their ids. Calls GET /v1/sites. Read-only. It works before a help center is chosen, which makes it the way out of site_required: list the ids, then connect with ?site=<id>.
Argument | Type | Description |
|---|---|---|
|
| Default |
Returns {status, sites, meta}. Each site has id, uuid, name, subdomain, domain, url, default_language, visibility, publicly_accessible, languages and created_at. With an API key it lists the key's one help center. See Sites and account.