HelpStackDocs

Integrations

MCP: set HelpStack up by asking

HelpStack speaks MCP (Model Context Protocol), so an AI assistant like Claude can configure your workspace for you. You describe what you want in your own words; it adds the knowledge base articles, the FAQ chips, the agent tools.

"Crawl our help centre, then add a tool that looks up an order by its number and email against https://api.mystore.si/orders."

This is a setup connection by default: it configures the workspace. It reads your conversations or replies to a customer only if an admin ticks those scopes when creating the token, which needs the Growth plan. The rest of the limits are under What it cannot do.

Quick facts#

Endpointhttps://helpstack.eu/api/mcp
TransportStreamable HTTP (no local process to install)
AuthA token (Authorization: Bearer hs_…), or sign-in for clients that need it
Who can create a tokenOwner or admin
What a token can doWhatever your own role allows, in one organization
PlanStarter and up (the mcp flag; ask us if you are on Free and need it)
Rate limit120 requests a minute, per token

1. Create a token#

Settings → API tokens → Create a token. Give it a name you will recognise later, like "Claude on my laptop", because that name is how you will know which one to revoke.

The token is shown once. We store only a hash of it, so there is no screen that can show it to you again and no support request that can recover it. If you lose it, revoke it and make another. That takes ten seconds and is the intended path, not a failure.

A token is tied to one organization — the one you were in when you created it. If you belong to several, create one token per organization you want to configure. A token cannot be moved between them, and joining another organization later does not widen a token you already hold.

1b. Choose what the token can do#

When you create a token you tick what it may reach. A token can never do more than you can — your role still applies — and the scopes only narrow it further.

ScopeWhat it allows
settings:readSee channels, agent tools, knowledge base articles and FAQs.
settings:writeCreate and edit agent tools, articles and FAQs, and choose what a channel answers from. Implies settings:read.
conversations:readRead customer conversations, including names, email addresses and anything a customer wrote. Growth plan and up.
conversations:draftWrite draft replies for a person to approve. Cannot send. Implies conversations:read. Growth plan and up.
conversations:sendReply to the customer directly, with nobody reviewing it first. A sent message cannot be recalled. Implies conversations:read, and is never implied by conversations:draft. Growth plan and up.
analytics:readSee aggregate figures: volume, response and resolution times, tag and sentiment breakdowns, AI performance and spend. Numbers only — it cannot read what any customer wrote. Implies nothing, and nothing implies it. Growth plan and up.

The two settings: scopes are ticked by default, which is the setup surface this page describes. The two conversations: scopes are never pre-ticked — showing an assistant your inbox should be a decision someone makes, not one they inherit — and they only appear at all on the Growth plan. Untick settings:write and you get a token that can look at your configuration and change nothing — useful for letting an assistant audit a setup, or answer "what have we actually got configured?", without any risk of it editing.

tools/list only shows tools the token can call, so an assistant never sees a door it cannot open.

2. Connect your assistant#

Claude Code:

claude mcp add helpstack --transport http https://helpstack.eu/api/mcp \
  --header "Authorization: Bearer hs_your_token_here"

Claude Desktop and ChatGPT — add a custom connector pointing at https://helpstack.eu/api/mcp and sign in when it asks. These clients cannot send a token you paste, so they use a sign-in flow instead: you pick which organization to connect and approve what the app may do, on a HelpStack page. Nothing is granted until you approve it, and you can disconnect the app later from Settings → API tokens.

You do not need to create a token for that route. Tokens are for clients like Claude Code that can set a header themselves.

Codex — it reads the token from an environment variable, so it never lands in your config file:

export HELPSTACK_MCP_TOKEN="hs_your_token_here"
codex mcp add helpstack --url https://helpstack.eu/api/mcp \
  --bearer-token-env-var HELPSTACK_MCP_TOKEN

Anything else that speaks MCP over HTTP — point it at the same URL with the same header. There is nothing HelpStack-specific in the transport.

Then ask it to run whoami. It should answer with your organization's name and your role. If it does, everything below will work.

Two ways to connect#

TokenSign-in
Who it is forClaude Code, scripts, anything that can set a headerClaude Desktop, ChatGPT, connector UIs
How you set it upCreate a token here, paste it onceAdd the URL, approve on a HelpStack page
Choosing an organizationFixed when you create the tokenChosen when you approve
Turning it offRevoke the tokenDisconnect the app

Both end up in the same place: an identity with a role, an organization, and a set of permissions, re-checked on every call.

What it can do#

ToolWhat it does
whoamiWhich organization the token acts for, and with what role
list_channelsYour channels, with their ids and types
create_channelAdd a website chat channel, optionally copying another channel's widget look. Email, social and voice channels need a login and stay a dashboard job
get_channel_settingsHow one channel behaves: active or not, whether the AI replies and whether those replies are sent without review, translation and languages, and what it answers from
update_channel_settingsChange any of those — turn AI replies on, keep them as drafts, set the team's language, rename or switch the channel off
list_agent_toolsThe tools the AI can already call, built-in ones included
create_agent_toolAdd a tool so the AI can call your API mid-reply, run code on the visitor's page (CLIENT_SIDE), or offer a "Show me" button (CLIENT_ACTION). Growth plan and up
update_agent_toolChange a tool's description, URL, parameters, or active state, or switch it between CLIENT_SIDE and CLIENT_ACTION
delete_agent_toolRemove a tool you created
get_agent_tool_logsRecent calls to one tool — the first place to look when it misbehaves. Buttons log OFFERED, TAPPED, then SUCCESS or FAILED
list_knowledge_base_sourcesThe websites being crawled, and their status
add_knowledge_base_urlCrawl a website into the knowledge base
recrawl_knowledge_base_sourceRun a crawl again, reaching further than last time
delete_knowledge_base_sourceRemove a crawled site and its articles
list_knowledge_base_articlesEvery article, with source and status
add_knowledge_base_articleWrite an article by hand
update_knowledge_base_articleEdit a hand-written article
delete_knowledge_base_articleRemove one article
list_knowledge_base_groupsGroups, with article and channel counts
create_knowledge_base_groupBundle related articles so they can be targeted
attach_knowledge_base_groups_to_channelChoose what a channel answers from
get_widget_configA website chat channel's widget settings: colour, position, greeting, proactive rules, business hours, allowed domains
update_widget_configChange any of those. Creates them if the channel has none, which is what makes the widget render
list_tagsYour tag taxonomy — topic tags that record what a conversation was about, state tags that describe it right now. Growth plan and up
create_tagAdd a tag. Its kind is fixed at creation, because changing it would rewrite what every past use meant
update_tagRename a tag or change its description, colour or category
archive_tagTake a tag out of use. Conversations already tagged keep it, which is why this is not a delete
restore_tagBring an archived tag back under the name it still holds
list_tag_categoriesThe groups tags are organised into, and which of them are exclusive
create_tag_categoryGroup tags — "Sentiment", "Status", "Product area". Exclusive categories hold one tag at a time
update_tag_categoryRename a category, reorder it, or change whether it is exclusive
archive_tag_categoryStop using a grouping. Its tags survive, ungrouped
list_team_membersWho is in the organization, with their role — where the agent ids for a routing rule come from
list_assignment_rulesYour routing rules, in the order they are evaluated
create_assignment_ruleRoute new conversations on a channel to a pool of agents, round-robin. Optional tagIds (ids from list_tags, needs conversation tagging on your plan) route a conversation once it has any of those tags instead, never over a manual assignment; Sentiment-category tags are refused. Omit order and it is appended last
update_assignment_ruleChange a rule's conditions, pool, order, or whether it is on. Removing the last condition of a rule that had one is refused
delete_assignment_ruleRemove a rule. Conversations it already assigned keep their assignee
update_organizationSet the business name customers see, and the default language new channels inherit
get_notification_preferencesWhich notifications the member who owns the token receives
set_notification_preferencesChange them — for that one person, never for the team
list_faqsThe FAQ chips on the widget greeting screen
create_faqAdd an FAQ chip
update_faqChange a chip's question, answer, or visibility
delete_faqRemove a chip
list_conversationsCustomer conversations, newest first, filterable by status and channel
get_conversationOne conversation in full, every message in order
draft_replyWrite a draft into the inbox for a person to approve and send
send_replyReply to the customer directly, with no review
get_data_coverageWhen each dataset begins, so a comparison is never made against data that does not exist
get_analyticsVolume, response and resolution times, AI vs human, busiest hours, channels, agents, draft outcomes, spend, and tags including sentiment
search_conversationsCount the conversations mentioning a word, with short excerpts. Needs conversations:read, not analytics:read, because it returns what customers wrote

What your assistant is told before it calls

Every tool is published with three hints: whether it only reads, whether its effect can be undone, and which permission it needs. Clients like Claude, Cursor and ChatGPT read those to decide what to put in front of you first, so listing your channels goes through quietly while sending a reply asks.

Two of them are worth knowing about:

  • Only two tools reach outside HelpStack. add_knowledge_base_url and recrawl_knowledge_base_source fetch a page from the web. Every other tool stays inside your own workspace.
  • send_reply is marked irreversible, along with the four delete tools and the edits that overwrite something in place. draft_reply is not: a draft nobody approved has reached nobody, so retracting it costs nothing.

The hints are advice to the client, not a lock. What a token may actually do is still decided by its scopes and your role, re-checked on every call.

Numbers without the inbox

analytics:read and conversations:read are separate on purpose, and this is the distinction worth understanding before you tick anything. get_analytics returns aggregates: how many conversations, how fast they were answered, which tags are growing, what the AI got wrong. None of it is anything a customer wrote. search_conversations returns customer text, so it sits with the inbox tools instead.

So you can hand an assistant your numbers without handing it your inbox. "Refunds are up 40%" and "here is what fourteen people said about refunds" are different disclosures, and they are granted separately.

Reading is available to any member. Writing requires owner or admin, the same as the dashboard: a token belonging to an agent can look but not change. That is checked before your arguments are, so a token without permission learns nothing about a tool by calling it.

The one that ties it together

attach_knowledge_base_groups_to_channel is the step people miss. Adding articles does not aim them anywhere: a channel with no groups attached searches your whole knowledge base, which is right for one topic and poor for many. Group the articles, attach the group, and the AI answers that channel from that slice.

Answering the hard ones#

With conversations:read and conversations:draft, an assistant can read a difficult thread and write you a considered answer:

You: Read conversation 4821 and draft a reply. The customer is right that we shipped late, but the refund they are asking for is more than the order.

It calls get_conversation, reads the whole thread, and calls draft_reply. The draft lands in your inbox exactly like an AI-generated one, and you press send.

A draft cannot reach a customer. draft_reply never queues a send: the draft sits inert until a person approves it in HelpStack, where the approval is recorded against their name.

On an email channel with a reply template, write only the body. The greeting and the sign-off (closing line and signer) are added when the email is sent, so draft_reply and send_reply remove a greeting or sign-off your assistant wrote rather than send it twice.

Sending is a separate scope, conversations:send, and the separation is the point. conversations:draft does not imply it, nothing else grants it, and it is never ticked by default. "Write me an answer" and "answer them for me" are different decisions, so they are different permissions.

If you do grant it, send_reply replies immediately with nobody reviewing it — the same thing your channels already do when auto-reply is on. It runs the same language detection and translation the approve button does, so an English answer does not reach a customer who wrote in Slovenian, and the message is attributed to the person whose token it is rather than to an anonymous assistant. A sent message cannot be recalled.

Unsent drafts are marked as such when the assistant reads a thread back, so it never mistakes its own unapproved draft for something the customer has seen.

What it cannot do#

Deliberately, and this is the more useful half of the list:

  • It cannot send unless you granted conversations:send, which is off by default, separate from drafting, and available only on Growth.
  • It cannot see another organization. The organization comes from the token and is never something a caller passes in, so there is no argument to get wrong and no way to ask about a workspace that is not yours.
  • It cannot read your inbox unless you granted that. The conversation scopes are off unless ticked, and unavailable below the Growth plan.
  • It cannot exceed your own permissions. A token acts as the person who made it, with that person's role as it is now — demote someone and their tokens lose the same access immediately.
  • It cannot outlive your membership. Remove someone from the organization and their tokens stop working on the next call, with no cleanup step.
  • It cannot touch a channel's credentials. Mailbox passwords, Google refresh tokens and Meta page tokens are not fields any tool accepts, so connecting or reconnecting a channel stays a dashboard job. An assistant can change how a channel behaves; it cannot change what it logs in as.
  • It cannot keep a scope your plan lost. Downgrade from Growth and the conversation scopes stop working that day, on tokens already issued. Tags work the same way: the taxonomy tools refuse an organization below Growth, so MCP is never a way around the plan.
  • It cannot create a token. A token that could mint tokens would escape its own permissions in one call, so there is no tool for it. Tokens are created in Settings, by a person.
  • It cannot add, remove, or re-role a team member. Changing who can reach your inbox is the same escalation as minting a token, so list_team_members reads and nothing writes. Invitations stay in the dashboard.
  • It cannot touch billing. No tool starts a checkout, changes a plan, or opens the billing portal. A merchant billed through Shopify is refused off-platform checkout by the server anyway.
  • It cannot connect Shopify or WooCommerce. Both need a person in a browser — an OAuth screen, or a pairing code pasted into WordPress.
  • It cannot change anyone else's notifications. A preference row belongs to one person, so set_notification_preferences writes the token owner's and nobody else's.
  • It cannot change the organization's URL slug. Your name and default language are settable; the slug appears in links and is not.

Worked example#

Setting up a store's support from nothing, in one conversation:

You: Here is our help centre: https://mystore.si/pomoc. Crawl it, then add an FAQ chip asking about delivery times, and a tool that checks order status against our API.

The assistant will call add_knowledge_base_url, then create_faq, then create_agent_tool — and will usually call list_agent_tools first to avoid duplicating a tool you already have.

Two things to expect:

  • The crawl is not instant. Each run indexes roughly 50 pages and re-running reaches further, so a large site is covered over several crawls. Ask for list_knowledge_base_sources to see how far it has got.
  • A tool's description is the important part. It is what the model reads to decide when to call your tool. Ask for it in plain terms — "only use this when the customer gives both an order number and the email they ordered with" — and it will be written into the description where it belongs.

When something is refused#

The errors you are most likely to see, and what they mean:

MessageWhat happened
unauthorizedThe token is wrong, revoked, or its owner has left the organization. Make a new one.
This token belongs to a member who cannot change settings.The token's owner is an agent or viewer. Writing needs owner or admin.
Custom agent tools are available on the Growth plan and up.Exactly that. Reading tools still works.
Website limit for your plan reached.Delete a knowledge base source or upgrade.
invalid arguments: …The assistant sent a field we do not accept. Unknown fields are refused rather than ignored, so a typo fails loudly instead of quietly doing something else.

Keeping a token safe#

A token is a password that types itself. Treat it like one:

  • One token per place it is used, so revoking one does not break the others.
  • Revoke it when you stop using it. Settings → API tokens shows when each was last used, which is usually enough to tell which one is idle.
  • Do not paste it into a shared document or a chat. If you have, revoke it — the cost of being wrong is someone reconfiguring your assistant.
  • It is not for your customers or your website. It belongs on machines you control.