{"name":"helpdesky","title":"Helpdesky","version":"1.0.0","endpoint":"https://helpdesky.io/mcp","transport":"streamable-http","instructions":"Helpdesky MCP server: manage a Helpdesky help center (knowledge base), its customer conversations, contacts, team and configuration as the connected operator. Start with list_helpdesks. Helpdesk-scoped tools take an optional helpdeskId; it is only defaulted when the user belongs to exactly one helpdesk, otherwise pass it explicitly — the server never guesses a different helpdesk. Conversation- and contact-scoped tools find the helpdesk from the record id. Ask the user to confirm before any delete_, remove_ or forget_ tool, before mass_close_conversations or block_contact, and before anything that sends email a person receives (reply_to_conversation, invite_operator, invite_operator_batch); deletes are permanent, the others silence or lock out people, and sent email cannot be unsent. Replies go to real customers exactly as from the dashboard (email + live widget), so quote the draft before reply_to_conversation unless the user already approved it. Article content and message bodies are Markdown/plain text; replies are text-only (no attachments). Tools act within the user's operator permissions; a permission error means the user's role does not allow the action. Configuration tools cover settings, branding, hosting (custom domain, subfolder, headless), embeds, AI, data sources, SEO and link scanning; hosting checks need at least one published article, and activation only switches the live address when the check passes. Slow actions (run_seo_optimization, start_link_scan) return status running with a jobId when they outlast the wait: poll get_job_status until completed or failed instead of starting them again. Tools are grouped in sets and only the enabled sets are listed. The default (Support desk) covers the inbox, knowledge base, contacts, inbox settings and team. Setup tools (settings, hosting, embeds, ai, data-sources) and growth tools (seo, links) are not listed until enabled: when the user asks for branding, the help center address, a custom domain, widget/ticket-center/contact-form embeds, AI settings, data sources, SEO or link scanning, call list_tool_sets, then enable_tool_sets with the needed sets (or the setup / growth preset) and list tools again. If a tool call answers that its set is not enabled, do the same. Enabling never grants more than the user's operator permissions allow.","authentication":{"methods":["oauth2","personal_token"],"oauth":{"protected_resource_metadata":"https://helpdesky.io/.well-known/oauth-protected-resource/mcp","authorization_server_metadata":"https://helpdesky.io/.well-known/oauth-authorization-server","dynamic_client_registration":true,"pkce":["S256"]},"personal_token":{"header":"Authorization: Bearer hdmcp_pt_…","manage_at":"https://helpdesky.io/dashboard/mcp"}},"documentation":"https://helpdesky.io/docs/mcp","tool_sets":{"description":"Every tool belongs to one set. A connection serves the sets stored on its credential (Support desk unless changed on the consent screen or dashboard); agents can add sets with enable_tool_sets; /mcp/x/<preset-or-set>[,<more>][/readonly] URL variants pin a selection.","default":["core","knowledge-base","inbox","inbox-admin","team"],"default_tool_count":59,"sets":[{"name":"core","label":"Core","description":"Account and helpdesk basics: profile, helpdesks, overview, and the tools that list and enable other tool sets.","tools":["list_tool_sets","enable_tool_sets","get_profile","list_helpdesks","get_helpdesk","get_overview"]},{"name":"knowledge-base","label":"Knowledge base","description":"Articles, categories, redirects, help-center search, Ask AI and the ChatGPT search/fetch pair.","tools":["list_articles","get_article","create_article","update_article","publish_article","unpublish_article","delete_article","list_categories","create_category","update_category","reorder_categories","delete_category","list_redirects","update_redirect","delete_redirect","search_help_center","ask_help_center","search","fetch"]},{"name":"inbox","label":"Inbox","description":"Day-to-day conversation handling: list, counts, read, reply, status, assignment, mark read.","tools":["list_conversations","get_conversation_counts","get_conversation","list_conversation_messages","reply_to_conversation","set_conversation_status","assign_conversation","mark_conversation_read"]},{"name":"inbox-admin","label":"Inbox admin","description":"Message edits and deletes, translations, moving conversations, mass close, contacts (incl. blocking) and the notification, messaging and automation settings.","tools":["edit_message","delete_message","translate_message","set_conversation_contact","set_conversation_notification_emails","mass_close_conversations","delete_conversation","list_contacts","list_contact_conversations","block_contact","unblock_contact","update_contact_email","get_notification_settings","update_notification_settings","get_messaging_settings","update_messaging_settings","get_automation_settings","update_automation_settings"]},{"name":"team","label":"Team","description":"Operators, invitations, roles, permissions and notification preferences.","tools":["list_operators","list_assignable_operators","invite_operator","invite_operator_batch","update_operator_permissions","update_operator_role","update_operator_notifications","remove_operator"]},{"name":"settings","label":"Settings","description":"General settings, branding, SEO metadata, help center address and slug, creating a helpdesk.","tools":["get_helpdesk_settings","update_helpdesk_settings","update_branding","update_seo_metadata","detect_branding","check_slug_availability","change_helpdesk_address","create_helpdesk"]},{"name":"hosting","label":"Hosting","description":"Domain & Address: custom domain, subfolder and headless hosting with setup checks and activation.","tools":["get_hosting_status","get_custom_domain_status","set_custom_domain","remove_custom_domain","save_subfolder_hosting","check_subfolder_setup","activate_subfolder_hosting","remove_subfolder_hosting","forget_previous_subfolder_address","save_headless_hosting","check_headless_setup","activate_headless_hosting","remove_headless_hosting","forget_previous_headless_address","get_hosting_instructions"]},{"name":"embeds","label":"Embeds","description":"Widget, ticket center and contact form settings plus the embed snippets.","tools":["get_widget_settings","update_widget_settings","get_ticket_center_settings","update_ticket_center_settings","get_contact_form_settings","update_contact_form_settings","get_embed_snippets"]},{"name":"ai","label":"AI","description":"AI provider settings, configuration check, models and the question log.","tools":["get_ai_settings","update_ai_settings","check_ai_configuration","list_ai_models","list_ai_questions"]},{"name":"data-sources","label":"Data sources","description":"External pages the AI learns from: list, add, update, delete, rescrape, discover URLs.","tools":["list_data_sources","add_data_sources","update_data_source","delete_data_source","rescrape_data_source","discover_data_source_urls"]},{"name":"seo","label":"SEO","description":"SEO advisor suggestions, fixes, internal links, optimization runs, change history, automation and job status.","tools":["get_seo_suggestions","preview_seo_fix","apply_seo_fix","preview_internal_links","add_internal_links","preview_seo_run","run_seo_optimization","list_seo_changes","undo_seo_change","get_seo_automation","update_seo_automation","get_job_status"]},{"name":"links","label":"Links","description":"Link scanner: scans, results, fixes, follow settings.","tools":["start_link_scan","get_link_scan_results","fix_link","update_link_follow","get_link_scanner_settings","update_link_scanner_settings"]}],"presets":[{"name":"support","label":"Support desk","description":"Inbox, knowledge base, contacts, inbox settings and team. The default for ChatGPT, Claude and other hosted agents.","sets":["core","knowledge-base","inbox","inbox-admin","team"],"tool_count":59,"default":true},{"name":"setup","label":"Setup","description":"For setting an account up: general settings, branding, address and custom domain, embeds, AI settings and data sources.","sets":["settings","hosting","embeds","ai","data-sources"],"tool_count":41,"default":false},{"name":"growth","label":"Growth","description":"SEO advisor and link scanner.","sets":["seo","links"],"tool_count":18,"default":false},{"name":"lite","label":"Lite","description":"Core, knowledge base and inbox essentials. Stays under Cursor's 40-tool cap with room for other servers.","sets":["core","knowledge-base","inbox"],"tool_count":33,"default":false},{"name":"all","label":"Everything","description":"Every tool set.","sets":["core","knowledge-base","inbox","inbox-admin","team","settings","hosting","embeds","ai","data-sources","seo","links"],"tool_count":118,"default":false}],"variant_endpoint":"https://helpdesky.io/mcp/x/{selector}","variant_examples":["https://helpdesky.io/mcp/x/lite","https://helpdesky.io/mcp/x/support,setup","https://helpdesky.io/mcp/x/all","https://helpdesky.io/mcp/x/all/readonly"]},"tools":[{"name":"list_tool_sets","title":"List tool sets","description":"Lists 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.","toolSet":"core","default":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"enabledSets":{"type":"array","items":{"type":"string"}},"sets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"toolCount":{"type":"integer"},"enabled":{"type":"boolean"},"tools":{"type":"array","items":{"type":"string"}}},"required":["name","label","description","toolCount","enabled","tools"],"additionalProperties":false}},"presets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"sets":{"type":"array","items":{"type":"string"}},"toolCount":{"type":"integer"},"default":{"type":"boolean"}},"required":["name","label","description","sets","toolCount","default"],"additionalProperties":false}},"agentMayEnable":{"type":"boolean","description":"Whether enable_tool_sets may add sets for this connection; when false, the user changes sets in the dashboard or via a /mcp/x/… URL variant"},"fixedByUrl":{"type":"boolean","description":"True when the connection URL is a /mcp/x/… variant, which pins the sets"}},"required":["enabledSets","sets","presets","agentMayEnable","fixedByUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"enable_tool_sets","title":"Enable tool sets","description":"Enables 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.","toolSet":"core","default":true,"inputSchema":{"type":"object","properties":{"sets":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Set names (e.g. hosting, embeds, seo) or preset names (setup, growth, all); see list_tool_sets"}},"required":["sets"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"enabledSets":{"type":"array","items":{"type":"string"}},"addedSets":{"type":"array","items":{"type":"string"}},"newTools":{"type":"array","items":{"type":"string"}}},"required":["enabledSets","addedSets","newTools"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"get_profile","title":"Get my profile","description":"Returns the connected Helpdesky user: a stable opaque id, display name and email. Use it to tell accounts apart.","toolSet":"core","default":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Stable opaque user id"},"name":{"type":["string","null"]},"email":{"type":"string"}},"required":["id","name","email"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member","_meta":{"openai/profile":true}},{"name":"list_helpdesks","title":"List my helpdesks","description":"Lists 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.","toolSet":"core","default":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"helpdesks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Public help center URL"},"role":{"type":"string"},"isOwner":{"type":"boolean"},"permissions":{"type":"array","items":{"type":"string"}},"messagingEnabled":{"type":"boolean"},"plan":{"anyOf":[{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"}},"required":["slug","name"],"additionalProperties":false},{"type":"null"}]},"hostingMode":{"type":"string"}},"required":["id","name","slug","url","role","isOwner","permissions","messagingEnabled","plan","hostingMode"],"additionalProperties":false}}},"required":["helpdesks"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"get_helpdesk","title":"Get helpdesk details","description":"Returns a helpdesk's name, slug, public URL, enabled features and plan limits. Settings fields are limited to what the user's role may see.","toolSet":"core","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string"},"hostingMode":{"type":"string"},"role":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"features":{"type":"object","properties":{"messaging":{"type":"boolean"},"widget":{"type":"boolean"},"helpCenterAi":{"type":"boolean"},"ticketCenter":{"type":["boolean","null"]},"contactForm":{"type":["boolean","null"]}},"required":["messaging","widget","helpCenterAi","ticketCenter","contactForm"],"additionalProperties":false},"plan":{"anyOf":[{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"articleLimit":{"type":["number","null"],"description":"null = unlimited"},"conversationLimit":{"type":["number","null"],"description":"null = unlimited"}},"required":["slug","name","articleLimit","conversationLimit"],"additionalProperties":false},{"type":"null"}]},"articleCount":{"type":["number","null"]}},"required":["id","name","slug","url","hostingMode","role","permissions","features","plan","articleCount"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"list_articles","title":"List articles","description":"Lists knowledge-base articles (drafts and published) with optional status, category and title filters, paginated. Returns summaries; call get_article for the Markdown body.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"status":{"type":"string","enum":["all","published","draft"],"default":"all","description":"Filter by publish state"},"categoryId":{"type":"string","description":"Only articles in this category; use \"none\" for uncategorised articles"},"query":{"type":"string","maxLength":200,"description":"Case-insensitive match on title or slug"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":50},"offset":{"type":"integer","minimum":0,"default":0}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"total":{"type":"number"},"articles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Absolute public URL of the article on the help center"},"published":{"type":"boolean"},"categoryId":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","title","slug","url","published","categoryId","excerpt","updatedAt"],"additionalProperties":false}}},"required":["total","articles"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"get_article","title":"Get article","description":"Returns one article in full (Markdown content, publish state, category, authors, public URL) by id or by slug.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string","description":"Article id"},"slug":{"type":"string","description":"Article slug (URL handle), used when articleId is not given"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"article":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Absolute public URL of the article on the help center"},"published":{"type":"boolean"},"categoryId":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]},"content":{"type":"string","description":"Article body in Markdown"},"numberHeadings":{"type":["boolean","null"]},"hiddenFromWidget":{"type":["boolean","null"]},"viewCount":{"type":["number","null"]},"createdAt":{"type":["string","null"]},"authors":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"}},"required":["name"],"additionalProperties":false}}},"required":["id","title","slug","url","published","categoryId","excerpt","updatedAt","content","numberHeadings","hiddenFromWidget","viewCount","createdAt","authors"],"additionalProperties":false}},"required":["article"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"create_article","title":"Create article","description":"Creates 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.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"title":{"type":"string","minLength":1,"maxLength":300},"content":{"type":"string","minLength":1,"maxLength":200000,"description":"Markdown body"},"excerpt":{"type":"string","maxLength":1000},"categoryId":{"type":"string"},"slug":{"type":"string","maxLength":200},"published":{"type":"boolean","default":false},"numberHeadings":{"type":"boolean"}},"required":["title","content"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"article":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Absolute public URL of the article on the help center"},"published":{"type":"boolean"},"categoryId":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","title","slug","url","published","categoryId","excerpt","updatedAt"],"additionalProperties":false}},"required":["article"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"articles"},{"name":"update_article","title":"Update article","description":"Updates 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.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"},"title":{"type":"string","minLength":1,"maxLength":300},"content":{"type":"string","maxLength":200000,"description":"Markdown body"},"excerpt":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"description":"Short summary shown in lists and search; null clears it"},"categoryId":{"type":["string","null"],"description":"Category id; null removes the article from its category"},"slug":{"type":"string","maxLength":200,"description":"URL handle. Changing a published article's slug creates a redirect from the old slug automatically (unless redirectOldSlug is false)."},"redirectOldSlug":{"type":"boolean","default":true,"description":"When the slug of a published article changes, keep the old URL working with a redirect (default true, same as the dashboard). Pass false to drop the old URL."},"numberHeadings":{"type":"boolean","description":"Number the headings (Docs layout)"},"hiddenFromWidget":{"type":"boolean","description":"Hide the article from the widget / AI answers while keeping it on the help center"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"article":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Absolute public URL of the article on the help center"},"published":{"type":"boolean"},"categoryId":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","title","slug","url","published","categoryId","excerpt","updatedAt"],"additionalProperties":false}},"required":["article"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"publish_article","title":"Publish article","description":"Publishes 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.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"article":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Absolute public URL of the article on the help center"},"published":{"type":"boolean"},"categoryId":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","title","slug","url","published","categoryId","excerpt","updatedAt"],"additionalProperties":false}},"required":["article"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"unpublish_article","title":"Unpublish article","description":"Unpublishes an article: it disappears from the public help center, search and AI answers but keeps its content and slug as a draft.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"article":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","description":"Absolute public URL of the article on the help center"},"published":{"type":"boolean"},"categoryId":{"type":["string","null"]},"excerpt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","title","slug","url","published","categoryId","excerpt","updatedAt"],"additionalProperties":false}},"required":["article"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"delete_article","title":"Delete article","description":"Permanently 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.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"deleted":{"type":"boolean"},"articleId":{"type":"string"}},"required":["deleted","articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"list_categories","title":"List categories","description":"Lists the help center's categories in display order.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"order":{"type":["number","null"]},"url":{"type":"string"}},"required":["id","name","slug","description","icon","order","url"],"additionalProperties":false}}},"required":["categories"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"categories"},{"name":"create_category","title":"Create category","description":"Creates a category. The slug is derived from the name. Optional icon is a Lucide icon name.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"name":{"type":"string","minLength":1,"maxLength":120},"description":{"type":"string","maxLength":500},"icon":{"type":"string","maxLength":60}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"category":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"order":{"type":["number","null"]},"url":{"type":"string"}},"required":["id","name","slug","description","icon","order","url"],"additionalProperties":false}},"required":["category"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"categories"},{"name":"update_category","title":"Update category","description":"Renames a category (its slug follows the name) or changes its description/icon. Only passed fields change.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"categoryId":{"type":"string"},"name":{"type":"string","minLength":1,"maxLength":120},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"icon":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}]}},"required":["categoryId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"category":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"order":{"type":["number","null"]},"url":{"type":"string"}},"required":["id","name","slug","description","icon","order","url"],"additionalProperties":false}},"required":["category"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"categories"},{"name":"reorder_categories","title":"Reorder categories","description":"Sets the display order of categories. Pass every category id in the desired order; ids that do not belong to the helpdesk are ignored.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"categoryIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":500}},"required":["categoryIds"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":["string","null"]},"order":{"type":["number","null"]},"url":{"type":"string"}},"required":["id","name","slug","description","icon","order","url"],"additionalProperties":false}}},"required":["categories"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"categories"},{"name":"delete_category","title":"Delete category","description":"Permanently deletes a category. Its articles are kept but become uncategorised. Confirm with the user first.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"categoryId":{"type":"string"}},"required":["categoryId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"deleted":{"type":"boolean"},"categoryId":{"type":"string"}},"required":["deleted","categoryId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"categories"},{"name":"list_redirects","title":"List redirects","description":"Lists slug redirects (old article URL → current article), created automatically when a published article's slug changes or added manually.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"redirects":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"oldSlug":{"type":"string"},"articleId":{"type":"string"},"articleTitle":{"type":["string","null"]},"articleSlug":{"type":["string","null"]},"from":{"type":"string","description":"The old URL that redirects"},"to":{"type":"string","description":"The article URL it redirects to"}},"required":["id","oldSlug","articleId","articleTitle","articleSlug","from","to"],"additionalProperties":false}}},"required":["redirects"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"redirects"},{"name":"update_redirect","title":"Update redirect","description":"Changes the old slug of a redirect (the source URL). The slug must not be in use by an article or another redirect.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"redirectId":{"type":"string"},"oldSlug":{"type":"string","minLength":1,"maxLength":200}},"required":["redirectId","oldSlug"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"redirect":{"type":"object","properties":{"id":{"type":"string"},"oldSlug":{"type":"string"},"articleId":{"type":"string"},"articleTitle":{"type":["string","null"]},"articleSlug":{"type":["string","null"]},"from":{"type":"string","description":"The old URL that redirects"},"to":{"type":"string","description":"The article URL it redirects to"}},"required":["id","oldSlug","articleId","articleTitle","articleSlug","from","to"],"additionalProperties":false}},"required":["redirect"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"redirects"},{"name":"delete_redirect","title":"Delete redirect","description":"Permanently deletes a redirect; the old URL will return 404 afterwards. Confirm with the user first.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"redirectId":{"type":"string"}},"required":["redirectId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"deleted":{"type":"boolean"},"redirectId":{"type":"string"}},"required":["deleted","redirectId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"redirects"},{"name":"search_help_center","title":"Search help center","description":"Searches the helpdesk's published articles the way the public help center does (semantic search when embeddings exist). Returns summaries with public URLs.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"query":{"type":"string","minLength":1,"maxLength":500},"limit":{"type":"integer","minimum":1,"maximum":50,"default":10}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string"},"excerpt":{"type":["string","null"]}},"required":["id","title","slug","url","excerpt"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"ask_help_center","title":"Ask the help center (AI answer)","description":"Asks 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.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"question":{"type":"string","minLength":3,"maxLength":1000}},"required":["question"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"answer":{"type":"string"},"sources":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string"}},"required":["title","slug","url"],"additionalProperties":false}}},"required":["answer","sources"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"messages"},{"name":"search","title":"Search knowledge base","description":"Searches 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.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":500,"description":"Search query"}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"}},"required":["id","title","url"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"fetch","title":"Fetch knowledge-base article","description":"Fetches the full Markdown text of an article by the id returned from search.","toolSet":"knowledge-base","default":true,"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Article id from search"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"text":{"type":"string"},"url":{"type":"string"},"metadata":{"anyOf":[{"type":"object","properties":{"helpdesk":{"type":"string"},"published":{"type":"boolean"},"updatedAt":{"type":["string","null"]}},"required":["helpdesk","published","updatedAt"],"additionalProperties":false},{"type":"null"}]}},"required":["id","title","text","url","metadata"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"list_conversations","title":"List conversations","description":"Lists 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"status":{"type":"string","enum":["all","pending","unresolved","resolved","stale","promotional"],"default":"all"},"assignee":{"type":"string","enum":["any","me","unassigned"],"default":"any"},"search":{"type":"string","maxLength":200},"sort":{"type":"string","enum":["newest","oldest","unread"],"default":"newest"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":25},"offset":{"type":"integer","minimum":0,"default":0}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"total":{"type":"number"},"conversations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false}}},"required":["total","conversations"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"get_conversation_counts","title":"Get conversation counts","description":"Returns 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"nonResolved":{"type":["number","null"]},"promotionalUnread":{"type":"number"}},"required":["nonResolved","promotionalUnread"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"get_conversation","title":"Get conversation","description":"Reads 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"}},"required":["conversationId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"conversation":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false},"contact":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false},{"type":"null"}]},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"senderType":{"type":"string","description":"visitor | operator | system"},"operatorId":{"type":["string","null"]},"operatorName":{"type":["string","null"]},"body":{"type":"string","description":"Plain text / Markdown body"},"isPrivateNote":{"type":"boolean","description":"Internal note: visible to operators only, never sent to the customer"},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string","description":"Download URL as returned by the dashboard handler; may require the uploader's dashboard session"}},"required":["filename","mimeType","size","url"],"additionalProperties":false}},"createdAt":{"type":["string","null"]},"editedAt":{"type":["string","null"]},"readAt":{"type":["string","null"],"description":"When the customer read an operator message, if tracked"},"detectedLanguage":{"type":["string","null"]}},"required":["id","senderType","operatorId","operatorName","body","isPrivateNote","attachments","createdAt","editedAt","readAt","detectedLanguage"],"additionalProperties":false}},"messagesTotal":{"type":"number"},"detectedLanguages":{"type":"array","items":{"type":"string"},"description":"Languages detected in the customer's messages"},"currentOperatorId":{"type":"string","description":"The connected user's operator id in this helpdesk (for assign_conversation)"}},"required":["conversation","contact","messages","messagesTotal","detectedLanguages","currentOperatorId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"list_conversation_messages","title":"List conversation messages","description":"Pages 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":50},"offset":{"type":"integer","minimum":0,"default":0}},"required":["conversationId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"total":{"type":"number"},"messages":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"senderType":{"type":"string","description":"visitor | operator | system"},"operatorId":{"type":["string","null"]},"operatorName":{"type":["string","null"]},"body":{"type":"string","description":"Plain text / Markdown body"},"isPrivateNote":{"type":"boolean","description":"Internal note: visible to operators only, never sent to the customer"},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string","description":"Download URL as returned by the dashboard handler; may require the uploader's dashboard session"}},"required":["filename","mimeType","size","url"],"additionalProperties":false}},"createdAt":{"type":["string","null"]},"editedAt":{"type":["string","null"]},"readAt":{"type":["string","null"],"description":"When the customer read an operator message, if tracked"},"detectedLanguage":{"type":["string","null"]}},"required":["id","senderType","operatorId","operatorName","body","isPrivateNote","attachments","createdAt","editedAt","readAt","detectedLanguage"],"additionalProperties":false}}},"required":["total","messages"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"reply_to_conversation","title":"Reply to conversation","description":"Sends 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"body":{"type":"string","minLength":1,"maxLength":10000,"description":"Plain text or light Markdown"},"isPrivateNote":{"type":"boolean","default":false},"sendEmail":{"type":"boolean","default":true,"description":"false skips the email notification (the reply still appears in the widget/ticket center)"},"sendInstantly":{"type":"boolean","default":false,"description":"true sends the email immediately instead of after the usual short delay"}},"required":["conversationId","body"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"message":{"type":"object","properties":{"id":{"type":"string"},"senderType":{"type":"string","description":"visitor | operator | system"},"operatorId":{"type":["string","null"]},"operatorName":{"type":["string","null"]},"body":{"type":"string","description":"Plain text / Markdown body"},"isPrivateNote":{"type":"boolean","description":"Internal note: visible to operators only, never sent to the customer"},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string","description":"Download URL as returned by the dashboard handler; may require the uploader's dashboard session"}},"required":["filename","mimeType","size","url"],"additionalProperties":false}},"createdAt":{"type":["string","null"]},"editedAt":{"type":["string","null"]},"readAt":{"type":["string","null"],"description":"When the customer read an operator message, if tracked"},"detectedLanguage":{"type":["string","null"]}},"required":["id","senderType","operatorId","operatorName","body","isPrivateNote","attachments","createdAt","editedAt","readAt","detectedLanguage"],"additionalProperties":false}},"required":["message"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"permission":"messages"},{"name":"edit_message","title":"Edit message","description":"Rewrites 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"messageId":{"type":"string"},"body":{"type":"string","minLength":1,"maxLength":10000}},"required":["conversationId","messageId","body"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"message":{"type":"object","properties":{"id":{"type":"string"},"senderType":{"type":"string","description":"visitor | operator | system"},"operatorId":{"type":["string","null"]},"operatorName":{"type":["string","null"]},"body":{"type":"string","description":"Plain text / Markdown body"},"isPrivateNote":{"type":"boolean","description":"Internal note: visible to operators only, never sent to the customer"},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"number"},"url":{"type":"string","description":"Download URL as returned by the dashboard handler; may require the uploader's dashboard session"}},"required":["filename","mimeType","size","url"],"additionalProperties":false}},"createdAt":{"type":["string","null"]},"editedAt":{"type":["string","null"]},"readAt":{"type":["string","null"],"description":"When the customer read an operator message, if tracked"},"detectedLanguage":{"type":["string","null"]}},"required":["id","senderType","operatorId","operatorName","body","isPrivateNote","attachments","createdAt","editedAt","readAt","detectedLanguage"],"additionalProperties":false}},"required":["message"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"delete_message","title":"Delete message","description":"Permanently 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"messageId":{"type":"string"}},"required":["conversationId","messageId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"deleted":{"type":"boolean"},"messageId":{"type":"string"}},"required":["deleted","messageId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"translate_message","title":"Translate message","description":"Translates 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"messageId":{"type":"string"},"targetLanguage":{"type":"string","minLength":2,"maxLength":20,"description":"ISO 639-1 code, e.g. \"en\""}},"required":["conversationId","messageId","targetLanguage"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"messageId":{"type":"string"},"targetLanguage":{"type":"string"},"detectedSourceLanguage":{"type":"string"},"translatedBody":{"type":"string"},"sameLanguage":{"type":"boolean","description":"True when the message was already in the target language"},"cached":{"type":"boolean"}},"required":["messageId","targetLanguage","detectedSourceLanguage","translatedBody","sameLanguage","cached"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"set_conversation_status","title":"Set conversation status","description":"Changes 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"status":{"type":"string","enum":["pending","unresolved","resolved"]}},"required":["conversationId","status"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"conversation":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false}},"required":["conversation"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"assign_conversation","title":"Assign conversation","description":"Assigns 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.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"operatorId":{"type":["string","null"],"description":"Operator id, or null to unassign"}},"required":["conversationId","operatorId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"conversation":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false}},"required":["conversation"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"mark_conversation_read","title":"Mark conversation read or unread","description":"Clears (or, with unread: true, restores) the unread flag on a conversation, exactly like the inbox's read/unread toggle.","toolSet":"inbox","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"unread":{"type":"boolean","default":false,"description":"true marks it unread again"}},"required":["conversationId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"conversationId":{"type":"string"},"unread":{"type":"boolean"}},"required":["conversationId","unread"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"set_conversation_contact","title":"Move conversation to another contact","description":"Re-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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"contactId":{"type":"string","description":"Contact id (from list_contacts or a conversation's contactId)"}},"required":["conversationId","contactId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"conversation":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false},"contact":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false}},"required":["conversation","contact"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"set_conversation_notification_emails","title":"Set conversation notification emails","description":"Replaces 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"},"notificationEmails":{"type":"array","items":{"type":"string","format":"email"},"maxItems":5}},"required":["conversationId","notificationEmails"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"conversation":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false}},"required":["conversation"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"mass_close_conversations","title":"Mass-close conversations","description":"Marks 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"closedCount":{"type":"number"}},"required":["closedCount"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"delete_conversation","title":"Delete conversation","description":"Permanently 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation id (from list_conversations)"}},"required":["conversationId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"deleted":{"type":"boolean"},"conversationId":{"type":"string"}},"required":["deleted","conversationId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"list_contacts","title":"List contacts","description":"Lists 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).","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"query":{"type":"string","maxLength":200,"description":"Case-insensitive match on name or email"},"filter":{"type":"string","enum":["all","active","blocked"],"default":"all"},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50},"offset":{"type":"integer","minimum":0,"default":0}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"total":{"type":"number"},"counts":{"type":"object","properties":{"all":{"type":"number"},"active":{"type":"number"},"blocked":{"type":"number"}},"required":["all","active","blocked"],"additionalProperties":false},"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false}}},"required":["total","counts","contacts"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"list_contact_conversations","title":"List a contact's conversations","description":"Returns the contact and every conversation they have had with the helpdesk, newest first. Useful to see history before replying.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact id (from list_contacts or a conversation's contactId)"}},"required":["contactId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false},"conversations":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"helpdeskId":{"type":"string"},"subject":{"type":["string","null"]},"status":{"type":"string"},"channel":{"type":["string","null"],"description":"widget | email | contact-form | ticket-center"},"unread":{"type":"boolean"},"contactId":{"type":"string"},"contactName":{"type":["string","null"]},"contactEmail":{"type":["string","null"]},"assignedToId":{"type":["string","null"]},"assigneeName":{"type":["string","null"]},"lastMessageAt":{"type":["string","null"]},"lastMessagePreview":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"resolvedAt":{"type":["string","null"]},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Extra addresses that receive operator replies instead of the contact's email"},"overLimit":{"type":"boolean","description":"True when the plan's monthly conversation limit hides this conversation's details"}},"required":["id","helpdeskId","subject","status","channel","unread","contactId","contactName","contactEmail","assignedToId","assigneeName","lastMessageAt","lastMessagePreview","createdAt","resolvedAt","notificationEmails","overLimit"],"additionalProperties":false}}},"required":["contact","conversations"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"block_contact","title":"Block contact","description":"Blocks 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact id (from list_contacts or a conversation's contactId)"}},"required":["contactId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"unblock_contact","title":"Unblock contact","description":"Lifts a block so the contact can message the helpdesk again.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact id (from list_contacts or a conversation's contactId)"}},"required":["contactId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"update_contact_email","title":"Update contact email","description":"Changes 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).","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","description":"Contact id (from list_contacts or a conversation's contactId)"},"email":{"type":"string","format":"email"}},"required":["contactId","email"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"blocked":{"type":"boolean"},"blockedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"conversationCount":{"type":["number","null"]},"lastContactedAt":{"type":["string","null"]}},"required":["id","email","name","blocked","blockedAt","createdAt","conversationCount","lastContactedAt"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"list_operators","title":"List operators","description":"Lists the helpdesk's team: owners and staff, pending invitations included, with each member's permissions. Requires the staff permission (owners always have it).","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"operators":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string","description":"owner | staff"},"status":{"type":"string","description":"active | pending (invitation not yet accepted)"},"permissions":{"type":"array","items":{"type":"string"}},"emailNotificationsEnabled":{"type":"boolean"}},"required":["id","email","name","role","status","permissions","emailNotificationsEnabled"],"additionalProperties":false}}},"required":["operators"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"staff"},{"name":"list_assignable_operators","title":"List assignable operators","description":"Lists the active operators a conversation can be assigned to (id + display label). Needs only the messages permission, so any inbox user can assign.","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"operators":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"additionalProperties":false}}},"required":["operators"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"messages"},{"name":"invite_operator","title":"Invite operator","description":"Invites 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).","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["owner","staff"],"default":"staff","description":"Only owners can invite another owner"},"permissions":{"type":"array","items":{"type":"string","enum":["messages","articles","categories","branding","widget","ticket_center","contact_form","email_forwarding","ai_questions","settings","seo","link_scanner","seo_checker","redirects","staff","billing","overview"]},"description":"Permissions for a staff member (ignored for owners, who have all)","default":[]}},"required":["email"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"operator":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string","description":"owner | staff"},"status":{"type":"string","description":"active | pending (invitation not yet accepted)"},"permissions":{"type":"array","items":{"type":"string"}},"emailNotificationsEnabled":{"type":"boolean"}},"required":["id","email","name","role","status","permissions","emailNotificationsEnabled"],"additionalProperties":false}},"required":["operator"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"permission":"staff"},{"name":"invite_operator_batch","title":"Invite operator to several helpdesks","description":"Invites 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).","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskIds":{"type":"array","items":{"type":"string","format":"uuid"},"minItems":1,"maxItems":50},"email":{"type":"string","format":"email"},"role":{"type":"string","enum":["owner","staff"],"default":"staff","description":"Only owners can invite another owner"},"permissions":{"type":"array","items":{"type":"string","enum":["messages","articles","categories","branding","widget","ticket_center","contact_form","email_forwarding","ai_questions","settings","seo","link_scanner","seo_checker","redirects","staff","billing","overview"]},"description":"Permissions for a staff member (ignored for owners, who have all)","default":[]}},"required":["helpdeskIds","email"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"helpdeskId":{"type":"string"},"status":{"type":"string","description":"invited | skipped (already a member or invited) | forbidden | error"},"message":{"type":["string","null"]}},"required":["helpdeskId","status","message"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true},"permission":"staff"},{"name":"update_operator_permissions","title":"Update operator permissions","description":"Replaces 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.","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"operatorId":{"type":"string","description":"Operator id (from list_operators)"},"permissions":{"type":"array","items":{"type":"string","enum":["messages","articles","categories","branding","widget","ticket_center","contact_form","email_forwarding","ai_questions","settings","seo","link_scanner","seo_checker","redirects","staff","billing","overview"]},"description":"Operator permission keys. Available: messages, articles, categories, branding, widget, ticket_center, contact_form, email_forwarding, ai_questions, settings, seo, link_scanner, seo_checker, redirects, staff, billing, overview. Owners always have every permission."}},"required":["operatorId","permissions"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"operator":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string","description":"owner | staff"},"status":{"type":"string","description":"active | pending (invitation not yet accepted)"},"permissions":{"type":"array","items":{"type":"string"}},"emailNotificationsEnabled":{"type":"boolean"}},"required":["id","email","name","role","status","permissions","emailNotificationsEnabled"],"additionalProperties":false}},"required":["operator"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"staff"},{"name":"update_operator_role","title":"Update operator role","description":"Promotes 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.","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"operatorId":{"type":"string","description":"Operator id (from list_operators)"},"role":{"type":"string","enum":["owner","staff"]}},"required":["operatorId","role"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"operator":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string","description":"owner | staff"},"status":{"type":"string","description":"active | pending (invitation not yet accepted)"},"permissions":{"type":"array","items":{"type":"string"}},"emailNotificationsEnabled":{"type":"boolean"}},"required":["id","email","name","role","status","permissions","emailNotificationsEnabled"],"additionalProperties":false}},"required":["operator"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"staff"},{"name":"update_operator_notifications","title":"Update operator notification preference","description":"Turns new-message email notifications on or off for one team member. Members can change their own setting; owners can change anyone's.","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"operatorId":{"type":"string","description":"Operator id (from list_operators)"},"emailNotificationsEnabled":{"type":"boolean"}},"required":["operatorId","emailNotificationsEnabled"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"operatorId":{"type":"string"},"emailNotificationsEnabled":{"type":"boolean"}},"required":["operatorId","emailNotificationsEnabled"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"remove_operator","title":"Remove operator","description":"Removes 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).","toolSet":"team","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"operatorId":{"type":"string","description":"Operator id (from list_operators)"}},"required":["operatorId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"removed":{"type":"boolean"},"operatorId":{"type":"string"}},"required":["removed","operatorId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"staff"},{"name":"get_notification_settings","title":"Get notification settings","description":"Reads who gets emailed about new customer messages: the owner toggle, promotional toggle, extra notification addresses and each operator's own preference.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"settings":{"type":"object","properties":{"notifyOwnerEmail":{"type":"boolean","description":"Email the owner about new customer messages"},"notifyPromotionalEmails":{"type":"boolean","description":"Also email about messages classified as promotional"},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Up to 5 extra addresses that receive new-message notifications"},"operators":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string"},"emailNotificationsEnabled":{"type":"boolean"}},"required":["id","email","name","role","emailNotificationsEnabled"],"additionalProperties":false}}},"required":["notifyOwnerEmail","notifyPromotionalEmails","notificationEmails","operators"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"update_notification_settings","title":"Update notification settings","description":"Changes 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"notifyOwnerEmail":{"type":"boolean"},"notifyPromotionalEmails":{"type":"boolean"},"notificationEmails":{"type":"array","items":{"type":"string","format":"email"},"maxItems":5,"description":"Replaces the extra address list; [] clears it"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"settings":{"type":"object","properties":{"notifyOwnerEmail":{"type":"boolean","description":"Email the owner about new customer messages"},"notifyPromotionalEmails":{"type":"boolean","description":"Also email about messages classified as promotional"},"notificationEmails":{"type":"array","items":{"type":"string"},"description":"Up to 5 extra addresses that receive new-message notifications"},"operators":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"name":{"type":["string","null"]},"role":{"type":"string"},"emailNotificationsEnabled":{"type":"boolean"}},"required":["id","email","name","role","emailNotificationsEnabled"],"additionalProperties":false}}},"required":["notifyOwnerEmail","notifyPromotionalEmails","notificationEmails","operators"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"get_messaging_settings","title":"Get messaging settings","description":"Reads 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"settings":{"type":"object","properties":{"messagingEnabled":{"type":"boolean"},"messagingConfig":{"type":"object","additionalProperties":{},"description":"Messaging configuration object as stored (widget texts, ticket center, contact form, custom fields…); credentials are never included"}},"required":["messagingEnabled","messagingConfig"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"update_messaging_settings","title":"Update messaging settings","description":"Turns 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"messagingEnabled":{"type":"boolean"},"messagingConfig":{"type":"object","additionalProperties":{}}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"settings":{"type":"object","properties":{"messagingEnabled":{"type":"boolean"},"messagingConfig":{"type":"object","additionalProperties":{},"description":"Messaging configuration object as stored (widget texts, ticket center, contact form, custom fields…); credentials are never included"}},"required":["messagingEnabled","messagingConfig"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"get_automation_settings","title":"Get automation settings","description":"Reads the inbox automations: auto-resolve (close conversations with no activity after N days) and stale marking (flag quiet conversations after N days).","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"settings":{"type":"object","properties":{"autoResolveEnabled":{"type":"boolean"},"autoResolveDays":{"type":["number","null"]},"autoResolveEnabledAt":{"type":["string","null"]},"staleMarkingEnabled":{"type":"boolean"},"staleMarkingDays":{"type":["number","null"]}},"required":["autoResolveEnabled","autoResolveDays","autoResolveEnabledAt","staleMarkingEnabled","staleMarkingDays"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"update_automation_settings","title":"Update automation settings","description":"Changes 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.","toolSet":"inbox-admin","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"autoResolveEnabled":{"type":"boolean"},"autoResolveDays":{"type":"integer","minimum":1,"maximum":365},"staleMarkingEnabled":{"type":"boolean"},"staleMarkingDays":{"type":"integer","minimum":1,"maximum":365}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"settings":{"type":"object","properties":{"autoResolveEnabled":{"type":"boolean"},"autoResolveDays":{"type":["number","null"]},"autoResolveEnabledAt":{"type":["string","null"]},"staleMarkingEnabled":{"type":"boolean"},"staleMarkingDays":{"type":["number","null"]}},"required":["autoResolveEnabled","autoResolveDays","autoResolveEnabledAt","staleMarkingEnabled","staleMarkingDays"],"additionalProperties":false}},"required":["settings"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"get_helpdesk_settings","title":"Get helpdesk settings and branding","description":"Returns the helpdesk's general settings, branding (colours, logo URL, theme, labels) and SEO metadata as the dashboard pages show them. Fields are limited to what the user's permissions allow (settings, branding, seo, widget, ticket_center, contact_form or email_forwarding); keys and secrets are never included.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"general":{"type":"object","additionalProperties":{}},"branding":{"type":"object","additionalProperties":{}},"seo":{"type":"object","additionalProperties":{}},"createdAt":{"type":["string","null"]}},"required":["id","url","general","branding","seo","createdAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"update_helpdesk_settings","title":"Update general helpdesk settings","description":"Updates general settings (name, website URL, powered-by badge, author display, Help Center AI, allowed widget domains, homepage mode, navigation labels, messaging/widget toggles). Only the fields you pass change. Use change_helpdesk_address for the slug, update_branding for colours/logo, update_seo_metadata for meta tags.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"name":{"type":"string","minLength":1,"maxLength":100},"websiteUrl":{"type":["string","null"],"description":"Company website, e.g. https://example.com"},"showPoweredBy":{"type":"boolean"},"showAuthor":{"type":"boolean"},"operatorNameDisplay":{"type":"string","enum":["agent","company","both"],"description":"How operator names appear to visitors"},"helpCenterAiEnabled":{"type":"boolean"},"allowedDomains":{"type":"array","items":{"type":"string"},"description":"Domains allowed to embed the widget; empty = any"},"homepageArticleMode":{"type":"string","enum":["popular","pinned"],"description":"popular = most-viewed articles on the home page; pinned = the pinnedArticleIds list"},"pinnedArticleIds":{"type":"array","items":{"type":"string"}},"homeArticleId":{"$ref":"#/properties/websiteUrl"},"navArticlesLabel":{"$ref":"#/properties/homeArticleId"},"navCategoriesLabel":{"$ref":"#/properties/homeArticleId"},"navBackLabel":{"$ref":"#/properties/homeArticleId"},"messagingEnabled":{"type":"boolean"},"widgetEnabled":{"type":"boolean"},"widgetMessagingEnabled":{"type":"boolean"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"general":{"type":"object","additionalProperties":{}},"branding":{"type":"object","additionalProperties":{}},"seo":{"type":"object","additionalProperties":{}},"createdAt":{"type":["string","null"]}},"required":["id","url","general","branding","seo","createdAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"update_branding","title":"Update branding","description":"Updates the help center's look: logo/favicon/share-image URLs (URLs only — no uploads), colours, button radius, theme, hero text, template layout and navigation labels. Only the fields you pass change. Use detect_branding to pull colours and logo from the company website first.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"logoUrl":{"type":["string","null"]},"faviconUrl":{"$ref":"#/properties/logoUrl"},"socialShareImageUrl":{"$ref":"#/properties/logoUrl"},"backgroundColor":{"anyOf":[{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},{"type":"null"}]},"primaryColor":{"$ref":"#/properties/backgroundColor"},"textColor":{"$ref":"#/properties/backgroundColor"},"surfaceColor":{"$ref":"#/properties/backgroundColor"},"buttonTextColor":{"$ref":"#/properties/backgroundColor"},"buttonRadius":{"type":"integer","minimum":0,"maximum":24,"description":"Button corner radius in pixels (0-24, the Branding page slider)"},"enhancedStyles":{"type":["boolean","null"]},"headingAccentBars":{"$ref":"#/properties/enhancedStyles"},"accentGradient":{"type":"object","properties":{"from":{"$ref":"#/properties/backgroundColor/anyOf/0"},"to":{"$ref":"#/properties/backgroundColor/anyOf/0"}},"required":["from","to"],"additionalProperties":false,"description":"Accent gradient colours, e.g. {\"from\":\"#3b82f6\",\"to\":\"#7c3aed\"}"},"theme":{"type":"string","enum":["light","dark"]},"heroTitle":{"$ref":"#/properties/logoUrl"},"heroSubtitle":{"$ref":"#/properties/logoUrl"},"templateLayout":{"type":"string","enum":["default","sidebar","docs"],"description":"Help center layout: default, sidebar or docs"},"navArticlesLabel":{"$ref":"#/properties/logoUrl"},"navCategoriesLabel":{"$ref":"#/properties/logoUrl"},"navBackLabel":{"$ref":"#/properties/logoUrl"},"homeArticleId":{"$ref":"#/properties/logoUrl"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"general":{"type":"object","additionalProperties":{}},"branding":{"type":"object","additionalProperties":{}},"seo":{"type":"object","additionalProperties":{}},"createdAt":{"type":["string","null"]}},"required":["id","url","general","branding","seo","createdAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"branding"},{"name":"update_seo_metadata","title":"Update help center meta title/description","description":"Sets the help center's meta title and meta description (the homepage <title> and description tag). Pass only what should change.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"metaTitle":{"type":["string","null"]},"metaDescription":{"$ref":"#/properties/metaTitle"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"general":{"type":"object","additionalProperties":{}},"branding":{"type":"object","additionalProperties":{}},"seo":{"type":"object","additionalProperties":{}},"createdAt":{"type":["string","null"]}},"required":["id","url","general","branding","seo","createdAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"seo"},{"name":"detect_branding","title":"Detect branding from a website","description":"Scans a public website's homepage and returns the logo, favicon and colours it finds, as the Branding page's auto-detect does. Nothing is saved: pass the values you want to update_branding. Pass the customer's website URL; without one the helpdesk must already have a custom domain connected (the Branding page flow), and its website/apex is scanned instead.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"url":{"type":"string","format":"uri","description":"Website to analyse, e.g. https://example.com (its homepage is scanned). Defaults to the connected custom domain's site."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"sourceHost":{"type":["string","null"]},"detected":{"type":"object","additionalProperties":{}}},"required":["sourceHost","detected"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"permission":"branding"},{"name":"check_slug_availability","title":"Check whether a Helpdesky address is free","description":"Checks whether helpdesky.io/help/<slug> is available. Returns the normalised slug; the helpdesk's own current slug counts as available.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"slug":{"type":"string","minLength":1,"maxLength":60}},"required":["slug"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"available":{"type":"boolean"},"slug":{"type":"string"},"url":{"type":"string"}},"required":["available","slug","url"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"change_helpdesk_address","title":"Change the Helpdesky address (slug)","description":"Changes the slug behind helpdesky.io/help/<slug>. Check availability first with check_slug_availability; existing links to the old address stop working, so confirm with the user.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"slug":{"type":"string","minLength":1,"maxLength":60}},"required":["slug"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"create_helpdesk","title":"Create a new helpdesk","description":"Creates another help center owned by the user (name + slug, optional meta title/description and logo URL). May be refused when the user's plan has no free slot; the response then explains what the user must do in the dashboard. Billing cannot be changed through MCP.","toolSet":"settings","default":false,"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"slug":{"type":"string","minLength":1,"maxLength":60,"description":"Address: helpdesky.io/help/<slug>"},"metaTitle":{"type":"string"},"metaDescription":{"type":"string"},"logoUrl":{"type":"string","format":"uri"}},"required":["name","slug"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string"}},"required":["id","name","slug","url"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"member"},{"name":"get_hosting_status","title":"Get hosting status (Domain & Address)","description":"Shows how the help center is served: the live mode (helpdesky address, custom domain, subfolder or headless), the live URL, the saved-but-inactive addresses, verification state and the previous address still kept for redirects. For custom-domain DNS/certificate details call get_custom_domain_status.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"get_custom_domain_status","title":"Get custom domain status","description":"Reports the custom domain's state at Cloudflare and in public DNS, with the CNAME (and any TXT) records the user must create at their DNS provider. Readiness depends on DNS changes only the user (or their DNS provider's agent) can make; poll this after they change records — certificates can take minutes.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"status":{"type":"string","description":"not_configured | pending | active | missing | error (Cloudflare hostname status)"},"domain":{"type":["string","null"]},"cnameRecord":{"type":"object","properties":{"type":{"type":"string","const":"CNAME"},"name":{"type":["string","null"]},"target":{"type":"string"}},"required":["type","name","target"],"additionalProperties":false},"txtRecords":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"TXT"},"name":{"type":"string"},"value":{"type":"string"}},"required":["type","name","value"],"additionalProperties":false}},"sslStatus":{"type":["string","null"]},"dns":{"anyOf":[{"type":"object","properties":{"status":{"type":"string"},"cname":{"type":["string","null"]},"addresses":{"type":"array","items":{"type":"string"}}},"required":["status","cname","addresses"],"additionalProperties":false},{"type":"null"}]},"verificationErrors":{"type":"array","items":{"type":"string"}},"error":{"type":["string","null"]}},"required":["status","domain","cnameRecord","txtRecords","sslStatus","dns","verificationErrors","error"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"set_custom_domain","title":"Connect a custom domain","description":"Registers a custom hostname (e.g. help.example.com) for the help center and returns the DNS records to create. The domain only goes live once the CNAME points at the expected target and the certificate is issued — use get_custom_domain_status to poll. Replaces any previously saved custom domain.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"domain":{"type":"string","minLength":3,"maxLength":253,"description":"Hostname only, no scheme or path"}},"required":["domain"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"status":{"type":"string","description":"not_configured | pending | active | missing | error (Cloudflare hostname status)"},"domain":{"type":["string","null"]},"cnameRecord":{"type":"object","properties":{"type":{"type":"string","const":"CNAME"},"name":{"type":["string","null"]},"target":{"type":"string"}},"required":["type","name","target"],"additionalProperties":false},"txtRecords":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","const":"TXT"},"name":{"type":"string"},"value":{"type":"string"}},"required":["type","name","value"],"additionalProperties":false}},"sslStatus":{"type":["string","null"]},"dns":{"anyOf":[{"type":"object","properties":{"status":{"type":"string"},"cname":{"type":["string","null"]},"addresses":{"type":"array","items":{"type":"string"}}},"required":["status","cname","addresses"],"additionalProperties":false},{"type":"null"}]},"verificationErrors":{"type":"array","items":{"type":"string"}},"error":{"type":["string","null"]}},"required":["status","domain","cnameRecord","txtRecords","sslStatus","dns","verificationErrors","error"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"remove_custom_domain","title":"Remove the custom domain","description":"Disconnects the custom domain; the help center falls back to its Helpdesky address (or another active mode). Confirm with the user first — visitors on the old domain will no longer reach the help center.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"save_subfolder_hosting","title":"Save the subfolder address","description":"Saves the public address for subfolder hosting, where the customer's site reverse-proxies the help center under a path on their own domain (snippets from get_hosting_instructions). Saving changes nothing visible yet: run check_subfolder_setup, then activate_subfolder_hosting. Checks are read-only and need at least one published article; activation re-runs the check and only switches the live address when it passes.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"publicUrl":{"type":"string","format":"uri","description":"Public address of the help center on the customer's site, e.g. https://www.example.com/help"}},"required":["publicUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"check_subfolder_setup","title":"Check the subfolder setup","description":"Runs the read-only setup check against the saved subfolder address and reports each step (pass/fail with a message). It changes nothing. Requires at least one published article. When ok is true, call activate_subfolder_hosting to go live.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean"},"publicUrl":{"type":"string"},"checkedAt":{"type":"string"},"active":{"type":"boolean"},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}},"required":["id","status","code","message"],"additionalProperties":false}}},"required":["ok","publicUrl","checkedAt","active","steps"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"activate_subfolder_hosting","title":"Activate subfolder hosting","description":"Re-runs the setup check for the saved address and, only if it passes, makes it the live help center address (the old address keeps redirecting). Pass the exact address the check reported. Fails harmlessly when the check does not pass.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"publicUrl":{"type":"string","format":"uri","description":"The address shown by the check (confirmation)"}},"required":["publicUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean"},"publicUrl":{"type":"string"},"checkedAt":{"type":"string"},"active":{"type":"boolean"},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}},"required":["id","status","code","message"],"additionalProperties":false}}},"required":["ok","publicUrl","checkedAt","active","steps"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"settings"},{"name":"remove_subfolder_hosting","title":"Remove subfolder hosting","description":"Removes the saved subfolder address. If it was live, the help center falls back to the next address and the removed one is kept as the previous address for redirects. Confirm with the user first.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"forget_previous_subfolder_address","title":"Stop redirecting from the previous subfolder address","description":"Forgets the previous subfolder address so it no longer redirects to the live help center. Only do this when old links no longer matter; confirm with the user first.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"save_headless_hosting","title":"Save the headless address","description":"Saves the public address for headless hosting, where the customer's own site renders the help center from the public Content API (spec and prompt from get_hosting_instructions). Saving changes nothing visible yet: run check_headless_setup, then activate_headless_hosting. Checks are read-only and need at least one published article; activation re-runs the check and only switches the live address when it passes.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"baseUrl":{"type":"string","format":"uri","description":"Public address of the help center on the customer's site, e.g. https://www.example.com/help"}},"required":["baseUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"check_headless_setup","title":"Check the headless setup","description":"Runs the read-only setup check against the saved headless address and reports each step (pass/fail with a message). It changes nothing. Requires at least one published article. When ok is true, call activate_headless_hosting to go live.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean"},"publicUrl":{"type":"string"},"checkedAt":{"type":"string"},"active":{"type":"boolean"},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}},"required":["id","status","code","message"],"additionalProperties":false}}},"required":["ok","publicUrl","checkedAt","active","steps"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"activate_headless_hosting","title":"Activate headless hosting","description":"Re-runs the setup check for the saved address and, only if it passes, makes it the live help center address (the old address keeps redirecting). Pass the exact address the check reported. Fails harmlessly when the check does not pass.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"baseUrl":{"type":"string","format":"uri","description":"The address shown by the check (confirmation)"}},"required":["baseUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean"},"publicUrl":{"type":"string"},"checkedAt":{"type":"string"},"active":{"type":"boolean"},"steps":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"code":{"type":"string"},"message":{"type":"string"}},"required":["id","status","code","message"],"additionalProperties":false}}},"required":["ok","publicUrl","checkedAt","active","steps"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"settings"},{"name":"remove_headless_hosting","title":"Remove headless hosting","description":"Removes the saved headless address. If it was live, the help center falls back to the next address and the removed one is kept as the previous address for redirects. Confirm with the user first.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"forget_previous_headless_address","title":"Stop redirecting from the previous headless address","description":"Forgets the previous headless address so it no longer redirects to the live help center. Only do this when old links no longer matter; confirm with the user first.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"helpdesky | subdomain (custom domain) | subfolder | headless"},"liveUrl":{"type":"string"},"helpdeskyUrl":{"type":"string"},"previousAddress":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string"},"url":{"type":"string"}},"required":["mode","url"],"additionalProperties":false},{"type":"null"}]},"customDomain":{"type":["string","null"]},"subfolder":{"type":"object","properties":{"publicUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousPublicUrl":{"type":["string","null"]}},"required":["publicUrl","active","verifiedAt","previousPublicUrl"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":["string","null"]},"active":{"type":"boolean"},"verifiedAt":{"type":["string","null"]},"previousBaseUrl":{"type":["string","null"]}},"required":["baseUrl","active","verifiedAt","previousBaseUrl"],"additionalProperties":false}},"required":["mode","liveUrl","helpdeskyUrl","previousAddress","customDomain","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"get_hosting_instructions","title":"Get subfolder proxy snippets and headless build kit","description":"Returns what the Domain & Address panels offer as copyables, filled in with this helpdesk's values: reverse-proxy snippets for subfolder hosting (Cloudflare, Vercel, Next.js, Netlify, nginx) and, for headless hosting, the public Content API base URL, the article stylesheet URL, the implementation spec link and a ready-to-use implementation prompt for a coding agent. Pass the intended public address to tailor them before saving it; saved addresses are used otherwise.","toolSet":"hosting","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"publicUrl":{"type":"string","format":"uri","description":"Intended public address of the help center on the customer's site, e.g. https://www.example.com/help"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"helpdeskyUrl":{"type":"string"},"subfolder":{"type":"object","properties":{"publicUrl":{"type":"string"},"snippets":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string"},"label":{"type":"string"},"fileName":{"type":"string"},"language":{"type":"string"},"code":{"type":"string"}},"required":["platform","label","fileName","language","code"],"additionalProperties":false}}},"required":["publicUrl","snippets"],"additionalProperties":false},"headless":{"type":"object","properties":{"baseUrl":{"type":"string"},"contentApiBaseUrl":{"type":"string"},"stylesheetUrl":{"type":"string"},"specUrl":{"type":"string"},"implementationPrompt":{"type":"string"}},"required":["baseUrl","contentApiBaseUrl","stylesheetUrl","specUrl","implementationPrompt"],"additionalProperties":false}},"required":["helpdeskyUrl","subfolder","headless"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"settings"},{"name":"get_widget_settings","title":"Get widget settings","description":"Returns the embeddable widget's state: enabled flag, widgetConfig (appearance, labels, suggested articles), messaging-in-widget flag and the widget-related messaging texts.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"widgetEnabled":{"type":"boolean"},"widgetMessagingEnabled":{"type":"boolean"},"helpCenterAiEnabled":{"type":"boolean"},"widgetConfig":{"type":"object","additionalProperties":{}},"messagingConfig":{"type":"object","additionalProperties":{}},"allowedDomains":{"type":"array","items":{"type":"string"}}},"required":["widgetEnabled","widgetMessagingEnabled","helpCenterAiEnabled","widgetConfig","messagingConfig","allowedDomains"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"widget"},{"name":"update_widget_settings","title":"Update widget settings","description":"Enables/disables the widget and updates widgetConfig (merged key by key with the saved config) and the widget messaging texts (welcome note, disclaimer, live-chat notes). Pass only what should change.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"widgetEnabled":{"type":"boolean"},"widgetMessagingEnabled":{"type":"boolean"},"widgetConfig":{"type":"object","additionalProperties":{},"description":"Partial widgetConfig; keys you pass overwrite the saved ones"},"messagingConfig":{"type":"object","additionalProperties":{},"description":"Only these keys: welcomeNote, messagingDisclaimer, messagingMode, liveChatReplyNote, liveChatOfflineMessage, operatorTypingVisible, liveChatShowAvailability, liveChatOfflineBehaviour"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"widgetEnabled":{"type":"boolean"},"widgetMessagingEnabled":{"type":"boolean"},"widgetConfig":{"type":"object","additionalProperties":{}}},"required":["widgetEnabled","widgetMessagingEnabled","widgetConfig"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"widget"},{"name":"get_ticket_center_settings","title":"Get ticket center settings","description":"Returns the ticket center configuration (messagingConfig keys ticketCenter*, tc*, customFields), whether messaging is enabled, and a styling reference: every configurable key with its type, allowed values, default and purpose (including ticketCenterCss for custom CSS), the CSS selectors the embed renders and the dashboard's starter CSS snippets. The Turnstile secret and the HMAC secret are never returned.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"messagingEnabled":{"type":"boolean"},"config":{"type":"object","additionalProperties":{}},"reference":{"type":"object","properties":{"cssKey":{"type":"string"},"notes":{"type":"array","items":{"type":"string"}},"keys":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"type":{"type":"string"},"values":{"type":"array","items":{"type":"string"}},"default":{},"description":{"type":"string"},"writeOnly":{"type":"boolean"}},"required":["key","type","description"],"additionalProperties":false}},"selectors":{"type":"array","items":{"type":"object","properties":{"selector":{"type":"string"},"targets":{"type":"string"}},"required":["selector","targets"],"additionalProperties":false}},"snippets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"}},"required":["id","code"],"additionalProperties":false}}},"required":["cssKey","notes","keys","selectors","snippets"],"additionalProperties":false}},"required":["messagingEnabled","config","reference"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"ticket_center"},{"name":"update_ticket_center_settings","title":"Update ticket center settings","description":"Updates ticket center configuration keys (ticketCenter*, tc*, customFields); they are merged into the saved config, so pass only what should change. Custom CSS goes in ticketCenterCss (plain CSS using the embed's .hdh-tc-* selectors; it lands in the embed's shadow DOM unchanged). Known keys: ticketCenterCss, ticketCenterStyle, ticketCenterAlign, tcAccentSource, tcHideBorder, tcShowEmailField, tcColorPrimary, tcColorPrimaryHover, tcColorPrimaryText, tcColorBg, tcColorSurface, tcColorText, tcColorTextSubdued, tcColorBorder, tcColorAccent, tcColorBubble, tcRadiusButton, tcRadiusCard, tcLabelTitle, tcLabelNewMessage, tcLabelEmptyHeading, tcLabelEmptyBody, tcLabelPlaceholder, tcLabelSend, tcLabelSending, tcLabelClosed, tcLabelSubject, customFields. Read the current values, allowed values, defaults, selectors and starter snippets with get_ticket_center_settings.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"config":{"type":"object","additionalProperties":{},"description":"Keys limited to ticketCenter*, tc*, customFields. Custom CSS: ticketCenterCss. Known keys: ticketCenterCss, ticketCenterStyle, ticketCenterAlign, tcAccentSource, tcHideBorder, tcShowEmailField, tcColorPrimary, tcColorPrimaryHover, tcColorPrimaryText, tcColorBg, tcColorSurface, tcColorText, tcColorTextSubdued, tcColorBorder, tcColorAccent, tcColorBubble, tcRadiusButton, tcRadiusCard, tcLabelTitle, tcLabelNewMessage, tcLabelEmptyHeading, tcLabelEmptyBody, tcLabelPlaceholder, tcLabelSend, tcLabelSending, tcLabelClosed, tcLabelSubject, customFields"}},"required":["config"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"messagingEnabled":{"type":"boolean"},"config":{"type":"object","additionalProperties":{}}},"required":["messagingEnabled","config"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"ticket_center"},{"name":"get_contact_form_settings","title":"Get contact form settings","description":"Returns the contact form configuration (messagingConfig keys contactForm*, cf*, turnstile*, customFields), whether messaging is enabled, and a styling reference: every configurable key with its type, allowed values, default and purpose (including contactFormCss for custom CSS), the CSS selectors the embed renders and the dashboard's starter CSS snippets. The Turnstile secret and the HMAC secret are never returned.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"messagingEnabled":{"type":"boolean"},"config":{"type":"object","additionalProperties":{}},"reference":{"type":"object","properties":{"cssKey":{"type":"string"},"notes":{"type":"array","items":{"type":"string"}},"keys":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"type":{"type":"string"},"values":{"type":"array","items":{"type":"string"}},"default":{},"description":{"type":"string"},"writeOnly":{"type":"boolean"}},"required":["key","type","description"],"additionalProperties":false}},"selectors":{"type":"array","items":{"type":"object","properties":{"selector":{"type":"string"},"targets":{"type":"string"}},"required":["selector","targets"],"additionalProperties":false}},"snippets":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"code":{"type":"string"}},"required":["id","code"],"additionalProperties":false}}},"required":["cssKey","notes","keys","selectors","snippets"],"additionalProperties":false}},"required":["messagingEnabled","config","reference"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"contact_form"},{"name":"update_contact_form_settings","title":"Update contact form settings","description":"Updates contact form configuration keys (contactForm*, cf*, turnstile*, customFields); they are merged into the saved config, so pass only what should change. Custom CSS goes in contactFormCss (plain CSS using the embed's .hdh-cf-* selectors; it lands in the embed's shadow DOM unchanged). Known keys: contactFormCss, contactFormAlign, contactFormMaxWidth, cfAccentSource, contactFormButtonColor, cfButtonTextColor, cfLabelColor, cfUseBranding, cfBgColor, cfHideBorder, contactFormButtonText, contactFormSuccessHeading, contactFormSuccessBody, cfNameLabel, cfNamePlaceholder, cfEmailLabel, cfEmailPlaceholder, cfMessageLabel, cfMessagePlaceholder, customFields, turnstileSiteKey, turnstileSecretKey. Read the current values, allowed values, defaults, selectors and starter snippets with get_contact_form_settings.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"config":{"type":"object","additionalProperties":{},"description":"Keys limited to contactForm*, cf*, turnstile*, customFields. Custom CSS: contactFormCss. Known keys: contactFormCss, contactFormAlign, contactFormMaxWidth, cfAccentSource, contactFormButtonColor, cfButtonTextColor, cfLabelColor, cfUseBranding, cfBgColor, cfHideBorder, contactFormButtonText, contactFormSuccessHeading, contactFormSuccessBody, cfNameLabel, cfNamePlaceholder, cfEmailLabel, cfEmailPlaceholder, cfMessageLabel, cfMessagePlaceholder, customFields, turnstileSiteKey, turnstileSecretKey"}},"required":["config"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"messagingEnabled":{"type":"boolean"},"config":{"type":"object","additionalProperties":{}}},"required":["messagingEnabled","config"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"contact_form"},{"name":"get_embed_snippets","title":"Get copy-ready embed snippets","description":"Returns the widget, ticket center and contact form embed snippets with this helpdesk's id filled in, plus the server-side HMAC signing recipes the ticket center needs (Node.js, Python, PHP, Ruby, Shopify Liquid). The HMAC secret itself is never returned: recipes use the placeholder YOUR_HMAC_SECRET; tell the user to copy the secret from the Ticket Center page.","toolSet":"embeds","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string"},"widget":{"type":"object","properties":{"enabled":{"type":"boolean"},"snippet":{"type":"string"}},"required":["enabled","snippet"],"additionalProperties":false},"ticketCenter":{"type":"object","properties":{"snippet":{"type":"string"},"signingRecipes":{"type":"array","items":{"type":"object","properties":{"language":{"type":"string"},"label":{"type":"string"},"code":{"type":"string"}},"required":["language","label","code"],"additionalProperties":false}},"note":{"type":"string"}},"required":["snippet","signingRecipes","note"],"additionalProperties":false},"contactForm":{"type":"object","properties":{"snippet":{"type":"string"}},"required":["snippet"],"additionalProperties":false}},"required":["helpdeskId","widget","ticketCenter","contactForm"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"get_ai_settings","title":"Get AI provider settings","description":"Returns the preferred AI provider and model and, per provider, whether an API key is saved. Keys are write-only and never returned. Owner only.","toolSet":"ai","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"provider":{"type":"string"},"model":{"type":["string","null"],"description":"null = the provider's default model"},"defaultModel":{"type":["string","null"]},"savedKeys":{"type":"object","additionalProperties":{"type":"boolean"},"description":"Per provider: whether an API key is saved. Keys are never returned."}},"required":["provider","model","defaultModel","savedKeys"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"owner"},{"name":"update_ai_settings","title":"Update AI provider settings","description":"Sets the preferred provider/model and saves provider API keys. Keys are stored encrypted and never returned; pass an empty string to delete a key. Verify with check_ai_configuration afterwards. Owner only.","toolSet":"ai","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"provider":{"type":"string","enum":["openai","anthropic","google","xai","deepseek","qwen","mistral","perplexity"],"description":"One of: openai, anthropic, google, xai, deepseek, qwen, mistral, perplexity"},"model":{"type":["string","null"],"description":"Model id; null resets to the provider default"},"apiKeys":{"type":"object","additionalProperties":{"type":"string"},"description":"Map of provider id → API key (write-only)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"provider":{"type":"string"},"model":{"type":["string","null"],"description":"null = the provider's default model"},"defaultModel":{"type":["string","null"]},"savedKeys":{"type":"object","additionalProperties":{"type":"boolean"},"description":"Per provider: whether an API key is saved. Keys are never returned."}},"required":["provider","model","defaultModel","savedKeys"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"owner"},{"name":"check_ai_configuration","title":"Test the AI configuration","description":"Sends a tiny request to the provider with the saved key (or a key passed just for this test) and reports whether it works. Nothing is saved. Owner only.","toolSet":"ai","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"provider":{"type":"string","enum":["openai","anthropic","google","xai","deepseek","qwen","mistral","perplexity"],"description":"One of: openai, anthropic, google, xai, deepseek, qwen, mistral, perplexity"},"model":{"type":"string"},"apiKey":{"type":"string","description":"Test an unsaved key; omit to use the saved one"}},"required":["provider"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":["string","null"]}},"required":["success","message"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"owner"},{"name":"list_ai_models","title":"List models for an AI provider","description":"Returns the chat models available for a provider: the provider's live list when a key is saved, otherwise the built-in defaults. Owner only.","toolSet":"ai","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"provider":{"type":"string","enum":["openai","anthropic","google","xai","deepseek","qwen","mistral","perplexity"],"description":"One of: openai, anthropic, google, xai, deepseek, qwen, mistral, perplexity"}},"required":["provider"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"provider":{"type":"string"},"models":{"type":"array","items":{"type":"string"}},"source":{"type":["string","null"]},"defaultModel":{"type":["string","null"]}},"required":["provider","models","source","defaultModel"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"owner"},{"name":"list_ai_questions","title":"Browse the Help Center AI question log","description":"Lists questions visitors asked the Help Center AI (most recent first) with the answer given, plus the most popular questions. Filter by text and date.","toolSet":"ai","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"search":{"type":"string","description":"Only questions containing this text"},"since":{"type":"string","description":"ISO date; only questions asked after it"},"limit":{"type":"integer","minimum":1,"maximum":200,"description":"Default 50"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"total":{"type":"number"},"uniqueCount":{"type":"number"},"questions":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"question":{"type":"string"},"answer":{"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["id","question","answer","createdAt"],"additionalProperties":false}},"popular":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"count":{"type":"number"}},"required":["question","count"],"additionalProperties":false}}},"required":["total","uniqueCount","questions","popular"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"ai_questions"},{"name":"list_data_sources","title":"List data sources","description":"Lists the web pages the Help Center AI learns from, with scrape status (pending/processing/ready/error). Poll this after add_data_sources or rescrape_data_source.","toolSet":"data-sources","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"sources":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"title":{"type":["string","null"]},"enabled":{"type":"boolean"},"status":{"type":"string","description":"pending | processing | ready | error"},"error":{"type":["string","null"]},"lastScrapedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["id","url","title","enabled","status","error","lastScrapedAt","createdAt"],"additionalProperties":false}}},"required":["sources"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"add_data_sources","title":"Add data sources","description":"Adds web pages as AI data sources. Scraping starts in the background; returns immediately with status pending/processing — poll list_data_sources. Use discover_data_source_urls to find pages on a site first.","toolSet":"data-sources","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"urls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":50,"description":"Up to 50 URLs per call (the handler's limit)"}},"required":["urls"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"sources":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"title":{"type":["string","null"]},"enabled":{"type":"boolean"},"status":{"type":"string","description":"pending | processing | ready | error"},"error":{"type":["string","null"]},"lastScrapedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["id","url","title","enabled","status","error","lastScrapedAt","createdAt"],"additionalProperties":false}}},"required":["sources"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"permission":"articles"},{"name":"update_data_source","title":"Enable or disable a data source","description":"Turns a data source on or off for AI answers without deleting it.","toolSet":"data-sources","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"id":{"type":"string"},"enabled":{"type":"boolean"}},"required":["id","enabled"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"source":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"title":{"type":["string","null"]},"enabled":{"type":"boolean"},"status":{"type":"string","description":"pending | processing | ready | error"},"error":{"type":["string","null"]},"lastScrapedAt":{"type":["string","null"]},"createdAt":{"type":["string","null"]}},"required":["id","url","title","enabled","status","error","lastScrapedAt","createdAt"],"additionalProperties":false}},"required":["source"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"delete_data_source","title":"Delete a data source","description":"Permanently removes a data source and its indexed content. Confirm with the user first.","toolSet":"data-sources","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"id":{"type":"string"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"deleted":{"type":"boolean"},"id":{"type":"string"}},"required":["deleted","id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"rescrape_data_source","title":"Re-scrape a data source","description":"Fetches and re-indexes a data source in the background. Returns immediately with status processing — poll list_data_sources until it is ready or error.","toolSet":"data-sources","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"id":{"type":"string"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"status":{"type":"string"},"id":{"type":"string"}},"required":["status","id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"permission":"articles"},{"name":"discover_data_source_urls","title":"Discover pages on a website","description":"Reads a site's sitemap and returns page URLs, optionally filtered by a path pattern (e.g. /docs/*). Nothing is added — pass the URLs you want to add_data_sources.","toolSet":"data-sources","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"domain":{"type":"string","description":"Site to crawl, e.g. example.com or https://example.com"},"pattern":{"type":"string","description":"Glob-style path filter such as /docs/*"}},"required":["domain"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}}},"required":["urls"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"permission":"articles"},{"name":"get_seo_suggestions","title":"Analyse an article's SEO","description":"Runs the AI SEO advisor on one article and returns a 1-10 score with concrete suggestions (category, issue, fix). Nothing changes; feed a suggestion to preview_seo_fix or apply_seo_fix.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"articleId":{"type":"string"},"score":{"type":"number"},"suggestions":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"issue":{"type":"string"},"fix":{"type":"string"}},"required":["category","issue","fix"],"additionalProperties":false}}},"required":["articleId","score","suggestions"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"preview_seo_fix","title":"Preview an SEO fix","description":"Shows what applying one suggestion would change (field, current value, proposed value) without saving anything.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"},"category":{"type":"string","description":"From a suggestion returned by get_seo_suggestions"},"issue":{"type":"string"},"fix":{"type":"string"}},"required":["articleId","category","issue","fix"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"fieldChanged":{"type":["string","null"]},"currentValue":{"type":["string","null"]},"newValue":{"type":["string","null"]}},"required":["fieldChanged","currentValue","newValue"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"apply_seo_fix","title":"Apply an SEO fix","description":"Applies one suggestion to the article (title, meta description, slug or content) and records an undoable SEO change. Preview first with preview_seo_fix.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"},"category":{"type":"string","description":"From a suggestion returned by get_seo_suggestions"},"issue":{"type":"string"},"fix":{"type":"string"}},"required":["articleId","category","issue","fix"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"applied":{"type":"boolean"},"fieldChanged":{"type":["string","null"]},"changeId":{"type":["string","null"]}},"required":["applied","fieldChanged","changeId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"articles"},{"name":"preview_internal_links","title":"Preview internal link suggestions","description":"Asks the AI where an article could link to other published articles; returns the proposed links and the rewritten content without saving. Target and method restrictions apply to this preview only (as on the SEO page): add_internal_links re-runs the AI across all published articles.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"},"targetArticleIds":{"type":"array","items":{"type":"string"},"description":"Only propose links to these articles"},"linkMethod":{"type":"string","enum":["existing","new"],"description":"existing = link existing phrases; new = add short link sentences; omit for both"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"linksAdded":{"type":"number"},"links":{"type":"array","items":{"type":"object","additionalProperties":{}}},"newContent":{"type":["string","null"]},"message":{"type":["string","null"]}},"required":["linksAdded","links","newContent","message"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"articles"},{"name":"add_internal_links","title":"Add internal links to an article","description":"Lets the AI insert links to other published articles into this article and saves the result as an undoable SEO change (undo_seo_change). The AI considers every published article; it cannot be restricted to specific targets. Use preview_internal_links first.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"}},"required":["articleId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"linksAdded":{"type":"number"},"changeId":{"type":["string","null"]},"message":{"type":["string","null"]}},"required":["linksAdded","changeId","message"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"articles"},{"name":"preview_seo_run","title":"Plan an SEO run across published articles","description":"Analyses published articles with the AI and returns a plan (per article: score + suggestions) without changing anything; pass it, possibly trimmed, to run_seo_optimization. Each article is one AI analysis, so the work is paged: a call analyses `limit` articles (default 3, max 10, in the order the dashboard uses) starting at `offset`, or exactly the `articleIds` you name. Keep batches small enough to finish within a minute; `nextOffset` is null once every published article has been covered. Needs seo and articles permissions.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"limit":{"type":"integer","minimum":1,"maximum":10,"description":"Articles to analyse in this call (default 3)"},"offset":{"type":"integer","minimum":0,"description":"Skip this many published articles first (default 0)"},"articleIds":{"type":"array","items":{"type":"string"},"minItems":1,"maxItems":10,"description":"Analyse exactly these published articles instead of paging"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["completed"]},"articles":{"type":"array","items":{"type":"object","properties":{"articleId":{"type":"string"},"articleTitle":{"type":"string"},"score":{"type":"number"},"suggestions":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"issue":{"type":"string"},"fix":{"type":"string"}},"required":["category","issue","fix"],"additionalProperties":false}}},"required":["articleId","articleTitle","score","suggestions"],"additionalProperties":false}},"totalSuggestions":{"type":"number"},"totalPublished":{"type":"number"},"nextOffset":{"type":["number","null"]}},"required":["status","articles","totalSuggestions","totalPublished","nextOffset"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":["seo","articles"]},{"name":"run_seo_optimization","title":"Apply an SEO plan to all articles","description":"Applies the suggestions in a plan from preview_seo_run (pass it back, possibly trimmed). Every change is recorded and undoable. Long-running: when the run is not finished after ~20 s the tool returns status running plus a jobId — poll get_job_status until it is completed or failed before starting another run (a retry would apply the plan again). Needs seo and articles permissions.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"plan":{"type":"array","items":{"type":"object","properties":{"articleId":{"type":"string"},"suggestions":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"issue":{"type":"string"},"fix":{"type":"string"}},"required":["category","issue","fix"],"additionalProperties":false}}},"required":["articleId","suggestions"],"additionalProperties":false},"minItems":1}},"required":["plan"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["completed","running"]},"jobId":{"type":["string","null"]},"totalChanges":{"type":["number","null"]},"articles":{"type":"array","items":{"type":"object","additionalProperties":{}}}},"required":["status","jobId","totalChanges","articles"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":["seo","articles"]},{"name":"list_seo_changes","title":"List SEO changes","description":"Lists changes made by the SEO advisor (manual and automated), newest first, with previous/new values and whether each was undone. Needs seo and articles permissions.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"articleId":{"type":"string"},"limit":{"type":"integer","minimum":1,"maximum":500,"description":"Default 100"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"changes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"articleId":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"},"fieldChanged":{"type":["string","null"]},"previousValue":{"type":["string","null"]},"newValue":{"type":["string","null"]},"undone":{"type":"boolean"},"automated":{"type":"boolean"},"createdAt":{"type":["string","null"]}},"required":["id","articleId","category","description","fieldChanged","previousValue","newValue","undone","automated","createdAt"],"additionalProperties":false}}},"required":["changes"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":["seo","articles"]},{"name":"undo_seo_change","title":"Undo an SEO change","description":"Restores the previous value of one SEO change (from list_seo_changes). Needs seo and articles permissions.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"changeId":{"type":"string"}},"required":["changeId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"change":{"type":"object","properties":{"id":{"type":"string"},"articleId":{"type":"string"},"category":{"type":"string"},"description":{"type":"string"},"fieldChanged":{"type":["string","null"]},"previousValue":{"type":["string","null"]},"newValue":{"type":["string","null"]},"undone":{"type":"boolean"},"automated":{"type":"boolean"},"createdAt":{"type":["string","null"]}},"required":["id","articleId","category","description","fieldChanged","previousValue","newValue","undone","automated","createdAt"],"additionalProperties":false}},"required":["change"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":["seo","articles"]},{"name":"get_seo_automation","title":"Get SEO automation settings","description":"Returns whether the SEO advisor runs on a schedule, the schedule and the last run time.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"enabled":{"type":"boolean"},"schedule":{"type":"string"},"lastRun":{"type":["string","null"]}},"required":["enabled","schedule","lastRun"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"seo"},{"name":"update_seo_automation","title":"Update SEO automation settings","description":"Turns scheduled SEO optimisation on or off and sets how often it runs.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"enabled":{"type":"boolean"},"schedule":{"type":"string","enum":["daily","weekly","monthly"]}},"required":["enabled"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"enabled":{"type":"boolean"},"schedule":{"type":"string"},"lastRun":{"type":["string","null"]}},"required":["enabled","schedule","lastRun"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"seo"},{"name":"start_link_scan","title":"Scan article links","description":"Checks every link in published articles and stores the results. Long-running: when the scan is not finished after ~20 s the tool returns status running plus a jobId — poll get_job_status, then read get_link_scan_results.","toolSet":"links","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["completed","running"]},"jobId":{"type":["string","null"]},"totalLinks":{"type":["number","null"]},"brokenLinks":{"type":["number","null"]},"scannedAt":{"type":["string","null"]}},"required":["status","jobId","totalLinks","brokenLinks","scannedAt"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"permission":"link_scanner"},{"name":"get_link_scan_results","title":"Get link scan results","description":"Returns the stored results of the last link scan (URL, HTTP status, article, follow/nofollow). Use brokenOnly to list just the failures.","toolSet":"links","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"brokenOnly":{"type":"boolean"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"articleId":{"type":["string","null"]},"articleTitle":{"type":["string","null"]},"linkUrl":{"type":"string"},"linkType":{"type":["string","null"]},"httpStatus":{"type":["number","null"]},"statusText":{"type":["string","null"]},"isFollow":{"type":"boolean"},"broken":{"type":"boolean"},"scannedAt":{"type":["string","null"]}},"required":["id","articleId","articleTitle","linkUrl","linkType","httpStatus","statusText","isFollow","broken","scannedAt"],"additionalProperties":false}},"total":{"type":"number"},"broken":{"type":"number"}},"required":["results","total","broken"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"link_scanner"},{"name":"fix_link","title":"Replace a link in its article","description":"Replaces a scanned link's URL inside the article that contains it (from get_link_scan_results).","toolSet":"links","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"resultId":{"type":"string"},"newUrl":{"type":"string","format":"uri"}},"required":["resultId","newUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"success":{"type":"boolean"},"oldUrl":{"type":["string","null"]},"newUrl":{"type":"string"}},"required":["success","oldUrl","newUrl"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"permission":"link_scanner"},{"name":"update_link_follow","title":"Set follow/nofollow on scanned links","description":"Marks the given scan results as follow or nofollow, updating the links in their articles.","toolSet":"links","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"resultIds":{"type":"array","items":{"type":"string"},"minItems":1},"isFollow":{"type":"boolean"}},"required":["resultIds","isFollow"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"updated":{"type":"number"}},"required":["updated"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"link_scanner"},{"name":"get_link_scanner_settings","title":"Get link scanner schedule","description":"Returns whether links are scanned automatically, how often, and when the last automatic scan ran.","toolSet":"links","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"enabled":{"type":"boolean"},"schedule":{"type":"string"},"lastRun":{"type":["string","null"]}},"required":["enabled","schedule","lastRun"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"link_scanner"},{"name":"update_link_scanner_settings","title":"Update link scanner schedule","description":"Turns automatic link scanning on or off and sets how often it runs.","toolSet":"links","default":false,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."},"enabled":{"type":"boolean"},"schedule":{"type":"string","enum":["daily","weekly"]}},"required":["enabled"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"enabled":{"type":"boolean"},"schedule":{"type":"string"},"lastRun":{"type":["string","null"]}},"required":["enabled","schedule","lastRun"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"link_scanner"},{"name":"get_job_status","title":"Check a long-running job","description":"Reports a job started by run_seo_optimization or start_link_scan: running, completed (with the handler's result) or failed (with the error), so you know when to stop polling and whether a retry is safe. Jobs are kept in memory on the server that started them for a few hours; status unknown means the id is not held here (server restart or another instance) — then check the persisted outcome with list_seo_changes or get_link_scan_results.","toolSet":"seo","default":false,"inputSchema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^job\\_"}},"required":["jobId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string","enum":["running","completed","failed","unknown"]},"kind":{"type":["string","null"]},"helpdeskId":{"type":["string","null"]},"startedAt":{"type":["string","null"]},"finishedAt":{"type":["string","null"]},"result":{"anyOf":[{},{"type":"null"}]},"error":{"type":["string","null"]}},"required":["jobId","status","kind","helpdeskId","startedAt","finishedAt","error"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"member"},{"name":"get_overview","title":"Get the dashboard overview numbers","description":"The same numbers the dashboard Overview shows: published and draft article counts, total article views, category count and the five most recently updated articles.","toolSet":"core","default":true,"inputSchema":{"type":"object","properties":{"helpdeskId":{"type":"string","format":"uuid","description":"Helpdesk id (from list_helpdesks). Optional only when the user belongs to exactly one helpdesk."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"outputSchema":{"type":"object","properties":{"publishedArticles":{"type":"number"},"draftArticles":{"type":"number"},"totalViews":{"type":"number"},"categories":{"type":"number"},"recentArticles":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"published":{"type":"boolean"},"viewCount":{"type":"number"},"updatedAt":{"type":["string","null"]}},"required":["id","title","published","viewCount","updatedAt"],"additionalProperties":false}}},"required":["publishedArticles","draftArticles","totalViews","categories","recentArticles"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"permission":"overview"}]}