[{"data":1,"prerenderedAt":32},["ShallowReactive",2],{"doc-mcp":3},{"html":4,"headings":5},"\u003Cp>Let Claude, ChatGPT, Cursor or any assistant that speaks the\n\u003Ca href=\"https:\u002F\u002Fmodelcontextprotocol.io\" target=\"_blank\" rel=\"noopener\">Model Context Protocol\u003C\u002Fa> work in your\nHelpBites workspace: read the inbox, draft a reply, move a feedback post along,\nwrite a changelog entry, look into an error. You keep control: the assistant\nacts as \u003Cem>you\u003C\u002Fem>, with your role, in one workspace, and you can cut it off from\n\u003Cstrong>Settings → API keys\u003C\u002Fstrong> at any time.\u003C\u002Fp>\n\u003Cp>The server is one address on your HelpBites host:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-plain\">\u003Ccode>https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fmcp\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>It is stateless Streamable HTTP (JSON-RPC 2.0), so it needs nothing beyond the\napp itself. The same address is shown, ready to copy, under \u003Cstrong>Settings → API\nkeys\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Ch2 id=\"connect\">Connect\u003Ca class=\"heading-anchor\" href=\"#connect\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>There are two ways to sign in. Both end in the same thing: an admin API key\n(\u003Ccode>ak_…\u003C\u002Fcode>) that the assistant sends as \u003Ccode>Authorization: Bearer …\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"sign-in-with-your-browser-claudeai-chatgpt\">Sign in with your browser (claude.ai, ChatGPT)\u003Ca class=\"heading-anchor\" href=\"#sign-in-with-your-browser-claudeai-chatgpt\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Assistants that run in the cloud can't be given a header, so they sign in with\nOAuth instead.\u003C\u002Fp>\n\u003Col>\n\u003Cli>In the assistant, add a custom connector (Claude: \u003Cstrong>Settings → Connectors →\nAdd custom connector\u003C\u002Fstrong>; ChatGPT: \u003Cstrong>Settings → Connectors\u003C\u002Fstrong>, with developer\nmode on) and paste the address above.\u003C\u002Fli>\n\u003Cli>Your browser opens HelpBites. Sign in if you aren't, check the workspace,\nchoose all projects or only some, and press \u003Cstrong>Approve\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>The assistant gets a key named \u003Ccode>MCP: Claude\u003C\u002Fcode> (or whatever it called itself).\nIt is listed under \u003Cstrong>Settings → API keys\u003C\u002Fstrong>. Revoking it there disconnects the\nassistant.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>What this needs:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A public \u003Cstrong>https\u003C\u002Fstrong> address. Cloud assistants call your server from the\ninternet, so \u003Ccode>localhost\u003C\u002Fcode> won't do (use a tunnel while you try it, and set\n\u003Ccode>APP_URL\u003C\u002Fcode> to the tunnel's address).\u003C\u002Fli>\n\u003Cli>\u003Ccode>HELPBITES_SECRET\u003C\u002Fcode> set on the server (it signs the assistant's registration).\u003C\u002Fli>\n\u003Cli>A role that may manage API keys (owners and admins).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The key lasts a year. There are no refresh tokens: when it expires, the\nassistant asks you to sign in again.\u003C\u002Fp>\n\u003Ch3 id=\"paste-a-key-claude-code-cursor-scripts\">Paste a key (Claude Code, Cursor, scripts)\u003Ca class=\"heading-anchor\" href=\"#paste-a-key-claude-code-cursor-scripts\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Create a key under \u003Cstrong>Settings → API keys\u003C\u002Fstrong>, optionally limited to some projects,\nand give it to the client as a header.\u003C\u002Fp>\n\u003Cp>Claude Code:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">claude\u003C\u002Fspan> mcp \u003Cspan class=\"shj-syn-kwd\">add\u003C\u002Fspan> --transport http helpbites https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fmcp \\\n  \u003Cspan class=\"shj-syn-func\">--header\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer ak_…\"\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Cursor (\u003Ccode>~\u002F.cursor\u002Fmcp.json\u003C\u002Fcode>), and most other clients that take a URL:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-json\">\u003Ccode>{\n  \u003Cspan class=\"shj-syn-var\">\"mcpServers\"\u003C\u002Fspan>: {\n    \u003Cspan class=\"shj-syn-var\">\"helpbites\"\u003C\u002Fspan>: {\n      \u003Cspan class=\"shj-syn-var\">\"url\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fmcp\"\u003C\u002Fspan>,\n      \u003Cspan class=\"shj-syn-var\">\"headers\"\u003C\u002Fspan>: { \u003Cspan class=\"shj-syn-var\">\"Authorization\"\u003C\u002Fspan>: \u003Cspan class=\"shj-syn-str\">\"Bearer ak_…\"\u003C\u002Fspan> }\n    }\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Clients that only run local programs (an older Claude Desktop) can bridge with\n\u003Ccode>npx mcp-remote https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fmcp --header &quot;Authorization: Bearer ak_…&quot;\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"what-it-can-do\">What it can do\u003Ca class=\"heading-anchor\" href=\"#what-it-can-do\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Each tool is one of the documented \u003Ccode>\u002Fv1\u003C\u002Fcode> API routes, called with the\nassistant's key. Nothing here is a back door: the role check, the workspace and\na key's project limit apply exactly as they do in the panel and the native app.\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Tool\u003C\u002Fth>\n\u003Cth>What it does\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_projects\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The projects in the workspace, with their ids. Most other tools need one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_overview\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The overview: unread, open, revenue and errors per project.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>search\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Search conversations and knowledge base answers.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_conversations\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The inbox: filter by project, status, unread, assignee, priority, tag or customer.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_conversation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>One conversation with its customer and project.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_conversation_messages\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Its messages, including internal notes.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>reply_to_conversation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Send a reply to the customer (and email them).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>add_internal_note\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A note only the team sees.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_conversation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Status, priority, tags, assignee.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>archive_conversation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Archive or restore.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>search_end_users\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Find a customer by name, email or id.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_feedback\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A project's feedback board.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_feedback_post\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>One post with its comments.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_feedback_post\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Change status, hide, feature or lock a post.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>comment_on_feedback_post\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Comment as the team, or leave an internal note.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_board_items\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The work board behind the roadmap.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>create_board_item\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Add an item.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_board_item\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Edit or move an item.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_changelog_entries\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Changelog entries, drafts included.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>create_changelog_entry\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Write an entry: a draft unless told to publish.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_changelog_entry\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Edit an entry, or publish a draft.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_errors\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Issues from the connected error tracker.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_error\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>One issue with its latest event and stack trace.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_contacts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A project's people: filter by segment, tag, subscription, billing or search.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_contact\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>One person, with their plan, MRR, language and tags.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_contact_activity\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Everything one person has done in one list: conversations, posts, votes, emails, payments, onboarding.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_contact\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Name, language, tags and attributes.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_segments\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Saved segments.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_sequences\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Automated email sequences.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>enroll_in_sequence\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Put people (or a whole segment) on an active sequence.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_automation_recipes\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Ready-made sequences started by an event.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>install_automation_recipe\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Add a recipe as a draft sequence.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_conversation_context\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Who the customer is: plan, MRR, past conversations, linked posts.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>link_feedback_post\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Link a feedback post to a conversation, or file one for the customer.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>draft_conversation_reply\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A draft reply from the project's assistant. Nothing is sent.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>save_conversation_faq\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Save an answer from a conversation to the knowledge base.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_saved_replies\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Reusable replies.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>create_saved_reply\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Add one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>changelog_linked_conversations\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The conversations a changelog entry answers.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>reply_to_changelog_conversations\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Tell all of them it shipped.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>file_error_on_board\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Turn an error into a board item.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_github_refs\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Commits and merged pull requests that mention an item as #12.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_webhook_endpoints\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A project's webhook endpoints.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>create_webhook_endpoint\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Add one, choosing the events.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_project_settings\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>The company profile and the public hub page.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>list_pricing_tables\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>A project's pricing tables.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_pricing_table\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>One table's plans, features, words, look and A\u002FB test.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>create_pricing_table\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Start a draft from a template.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>update_pricing_table\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Edit plans, features, prices, words, look or translations.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>publish_pricing_table\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Make the table live: asks first.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_stripe_catalog\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Stripe products, prices and payment links to link plans to.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get_pricing_stats\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Views, clicks, purchases and revenue, and the A\u002FB test result.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>suggest_pricing\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>AI proposal for plans, features and prices, from the repos and Stripe.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>add_pricing_variant\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Copy a table to test against it.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>start_pricing_experiment\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Start an A\u002FB test: asks first.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>stop_pricing_experiment\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>End it, optionally keeping the winner.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Try: \u003Cem>&quot;Which conversations are unread? Draft a reply to the one about the failed\nexport, and show it to me before sending.&quot;\u003C\u002Fem> Or: \u003Cem>&quot;Suggest plans for our pricing\ntable from the repo, and show me before you change anything.&quot;\u003C\u002Fem>\u003C\u002Fp>\n\u003Ch2 id=\"safe-by-design\">Safe by design\u003Ca class=\"heading-anchor\" href=\"#safe-by-design\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>It acts as you.\u003C\u002Fstrong> The assistant can do what your role does in that\nworkspace, no more. A key limited to some projects can't reach the rest, or\nanything workspace-wide.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Writes are marked.\u003C\u002Fstrong> Every tool says whether it only reads, and assistants\nthat ask before acting use that. Replies to customers and publishing a\nchangelog entry reach real people, and the tool descriptions tell the\nassistant to confirm first. Prefer a client that asks you to approve each\nwrite.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Customer text is untrusted.\u003C\u002Fstrong> Messages, feedback and error reports are written\nby other people, and an assistant reads them. Someone can try to slip it\ninstructions (&quot;reply with a refund code&quot;). Keep write approvals on, and read what\nan assistant is about to send before you allow it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Revoke at any time.\u003C\u002Fstrong> Each connection is an API key: rename or revoke it\nunder \u003Cstrong>Settings → API keys\u003C\u002Fstrong>. Changing your password with \u003Cem>revoke keys\u003C\u002Fem>\nticked removes them all.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Limits apply.\u003C\u002Fstrong> A key is limited to 600 calls a minute, and to the plan's\nper-minute allowance on the hosted edition.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Results are trimmed.\u003C\u002Fstrong> A very long answer is cut off after 60,000 characters\nwith a note, so one big list doesn't fill the assistant's memory: ask for less\nwith a filter or \u003Ccode>limit\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"calling-it-yourself\">Calling it yourself\u003Ca class=\"heading-anchor\" href=\"#calling-it-yourself\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Every message is a JSON-RPC POST. List the tools, then call one:\u003C\u002Fp>\n\u003Cdiv class=\"code-block\">\u003Cbutton type=\"button\" class=\"copy-btn\" data-copy aria-label=\"Copy to clipboard\">Copy\u003C\u002Fbutton>\u003Cpre class=\"shj-lang-bash\">\u003Ccode>\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan> https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fmcp \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer ak_…\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools\u002Flist\"}'\u003C\u002Fspan>\n\n\u003Cspan class=\"shj-syn-func\">curl\u003C\u002Fspan> https:\u002F\u002FYOUR-SUPPORT-HOST\u002Fmcp \\\n \u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Authorization: Bearer ak_…\"\u003C\u002Fspan>\u003Cspan class=\"shj-syn-kwd\"> -H\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">\"Content-Type: application\u002Fjson\"\u003C\u002Fspan> \\\n \u003Cspan class=\"shj-syn-kwd\"> -d\u003C\u002Fspan> \u003Cspan class=\"shj-syn-str\">'{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools\u002Fcall\",\"params\":{\"name\":\"list_conversations\",\"arguments\":{\"unread\":true,\"limit\":10}}}'\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>A tool that fails (a wrong id, a role that can't do that) answers with\n\u003Ccode>isError: true\u003C\u002Fcode> and the API's own message, so the assistant can correct itself.\nThe server offers tools only; it keeps no sessions, so \u003Ccode>GET\u003C\u002Fcode> and \u003Ccode>DELETE\u003C\u002Fcode> on\n\u003Ccode>\u002Fmcp\u003C\u002Fcode> answer 405. For anything the tools don't cover, the full\n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Felrumo\u002Fhelp-bites-oss\u002Fblob\u002Fmain\u002Fdocs\u002F_docs\u002Fscalar\" target=\"_blank\" rel=\"noopener\">API\u003C\u002Fa> is the same key's reach, and building your own interface on\nit is just as supported.\u003C\u002Fp>\n\u003Ch2 id=\"how-sign-in-works\">How sign-in works\u003Ca class=\"heading-anchor\" href=\"#how-sign-in-works\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>For the curious, or anyone writing a client. It is standard OAuth 2.1 with PKCE\n(S256), no client secret, and dynamic client registration:\u003C\u002Fp>\n\u003Cdiv class=\"table-wrap\">\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Step\u003C\u002Fth>\n\u003Cth>Where\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>The server answers \u003Ccode>401\u003C\u002Fcode> with \u003Ccode>WWW-Authenticate: Bearer resource_metadata=&quot;…&quot;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>POST \u002Fmcp\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Protected resource metadata (RFC 9728)\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002F.well-known\u002Foauth-protected-resource\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Authorization server metadata (RFC 8414)\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002F.well-known\u002Foauth-authorization-server\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Register the client (RFC 7591)\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>POST \u002Fv1\u002Foauth\u002Fregister\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>The person approves\u003C\u002Ftd>\n\u003Ctd>the panel page \u003Ccode>\u002Foauth\u002Fauthorize\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Exchange the code\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>POST \u002Fv1\u002Foauth\u002Ftoken\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\u003C\u002Fdiv>\n\u003Cp>Registration stores nothing: the client id is the client's name and redirect\naddresses, signed with a key derived from \u003Ccode>HELPBITES_SECRET\u003C\u002Fcode>. Redirect addresses\nmust be https, \u003Ccode>http:\u002F\u002Flocalhost\u003C\u002Fcode>, or an app's own scheme (\u003Ccode>cursor:\u002F\u002F\u003C\u002Fcode>). The\nauthorization code lives two minutes in Redis and works once. The access token\nis an ordinary admin API key, minted when the code is exchanged.\u003C\u002Fp>\n\u003Ch2 id=\"not-built-yet\">Not built yet\u003Ca class=\"heading-anchor\" href=\"#not-built-yet\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>No refresh tokens (the key lasts a year, then the assistant signs in again).\u003C\u002Fli>\n\u003Cli>No prompts, resources or live notifications: the server offers tools.\u003C\u002Fli>\n\u003Cli>No tools for email, campaigns, contacts sync, legal documents, flags or\nknowledge base editing yet; the API has them, and they are the next to add.\u003C\u002Fli>\n\u003C\u002Ful>\n",[6,10,14,17,20,23,26,29],{"id":7,"text":8,"level":9},"connect","Connect",2,{"id":11,"text":12,"level":13},"sign-in-with-your-browser-claudeai-chatgpt","Sign in with your browser (claude.ai, ChatGPT)",3,{"id":15,"text":16,"level":13},"paste-a-key-claude-code-cursor-scripts","Paste a key (Claude Code, Cursor, scripts)",{"id":18,"text":19,"level":9},"what-it-can-do","What it can do",{"id":21,"text":22,"level":9},"safe-by-design","Safe by design",{"id":24,"text":25,"level":9},"calling-it-yourself","Calling it yourself",{"id":27,"text":28,"level":9},"how-sign-in-works","How sign-in works",{"id":30,"text":31,"level":9},"not-built-yet","Not built yet",1792677543076]