A CLI and MCP server for Help Scout's Mailbox and Docs APIs. JSON output by default for LLM and automation workflows.
About this fork: an extended fork of stephendolan/helpscout-cli, adding near-complete Mailbox API coverage (teams, saved replies, custom fields, webhooks, reports, routing, and more), full Docs API support, and an MCP server that mirrors the entire CLI surface (~170 tools). See docs/API_COVERAGE.md for the full matrix.
This fork installs from source:
git clone https://github.com/CLBarajas/helpscout-cli.git
cd helpscout-cli
bun install
bun run link # builds and links globally as `helpscout`The upstream CLI (without this fork's additions) is available from npm: bun install -g @stephendolan/helpscout-cli
Linux: Requires libsecret for keychain storage (apt install libsecret-1-dev), or use environment variables.
Create an OAuth app at Help Scout > Your Profile > My Apps.
helpscout auth login --app-id YOUR_APP_ID --app-secret YOUR_APP_SECRET
helpscout auth status
helpscout auth logout
helpscout auth refresh # Refresh access tokenOr use environment variables: HELPSCOUT_APP_ID, HELPSCOUT_APP_SECRET, HELPSCOUT_MAILBOX_ID
helpscout conversations list
helpscout conversations list --status active --mailbox 123 --tag urgent
helpscout conversations list -q 'status:open customer:john@example.com'
helpscout conversations list --summary
helpscout conversations view 456
helpscout conversations threads 456
helpscout conversations threads 456 --type customer # Filter by type
helpscout conversations threads 456 --html # HTML output
helpscout conversations threads 456 --include-notes
helpscout conversations draft-replies list 456
helpscout conversations draft-replies create 456 --text "Unsent draft"
helpscout conversations draft-replies update 456 987654 --text "Revised unsent draft"
helpscout conversations draft-replies upsert 456 --text "Desired unsent draft"
helpscout conversations draft-replies upsert 456 --thread-id 987654 --text "Chosen draft"
helpscout conversations draft-reply 456 --text "Desired unsent draft" # shorthand for upsert
helpscout conversations attachments download 456 789
helpscout conversations attachments download 456 789 --output ./invoice.pdf
helpscout conversations attachments download 456 789 --output ./downloads/
helpscout conversations attachments download 456 789 --force
helpscout conversations status 456 closed
helpscout conversations assign 456 789 # Assign to a Help Scout user or team ID
helpscout conversations assign 456 --unassign # Remove the current assignee
helpscout conversations note 456 --text "Internal note"
helpscout conversations note 456 --text "Escalating to engineering" --status pending
helpscout conversations add-tag 456 urgent
helpscout conversations remove-tag 456 urgent
helpscout conversations fields 456 # Get custom field values
helpscout conversations set-field 456 --field-id 789 --value "High Priority"
helpscout conversations delete 456
helpscout conversations update 456 --status closed
helpscout conversations update 456 --customer 789
helpscout conversations update 456 --assignee 123
helpscout conversations update 456 --assignee none
helpscout conversations update 456 --status pending --assignee 123helpscout customers list
helpscout customers list --first-name John
helpscout customers view 789
helpscout customers create --first-name John --last-name Doe --email john@example.com
helpscout customers update 789 --organization "Acme Corp"
helpscout customers delete 789
# Customer emails
helpscout customers emails 789
helpscout customers add-email 789 --type work --value new@example.com
helpscout customers update-email 789 123 --type home
helpscout customers delete-email 789 123
# Customer phones
helpscout customers phones 789
helpscout customers add-phone 789 --type mobile --value "+1-555-0100"
helpscout customers update-phone 789 456 --type work
helpscout customers delete-phone 789 456helpscout users list
helpscout users list --mailbox 123
helpscout users view 456
helpscout users mehelpscout users list
helpscout users list --email user@example.com
helpscout users list --mailbox 123 --page 2
helpscout users view 456User responses include the mention handle when Help Scout returns one. Use @mention in Help Scout thread bodies to mention teammates.
helpscout tags list
helpscout tags view 123
helpscout workflows list
helpscout workflows list --type manual
helpscout workflows run 123 --conversations 456,789
helpscout workflows activate 123
helpscout workflows deactivate 123
helpscout mailboxes list
helpscout mailboxes view 123
helpscout mailboxes fields 123 # List custom fields for a mailbox
helpscout mailboxes set-default 123
helpscout mailboxes get-default
helpscout mailboxes clear-defaulthelpscout teams list
helpscout teams view 123
helpscout teams members 123helpscout saved-replies list 123 # List saved replies for mailbox 123
helpscout saved-replies view 123 456 # View saved reply 456 in mailbox 123Reports are available on Plus and Pro plans only.
# Company-wide performance metrics
helpscout reports company --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z
# Compare with previous period
helpscout reports company \
--start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z \
--previous-start 2025-12-01T00:00:00Z --previous-end 2025-12-31T23:59:59Z
# Conversation volume, tags, workflows, custom fields
helpscout reports conversations --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z
# Response and resolution time metrics
helpscout reports productivity --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z
helpscout reports productivity --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z --office-hours
# First response time as time series
helpscout reports first-response-time --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z --view-by day
# Customer satisfaction scores
helpscout reports happiness --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z
# Individual satisfaction ratings
helpscout reports ratings --start 2026-01-01T00:00:00Z --end 2026-01-31T23:59:59Z --rating greatReport Options:
| Option | Description |
|---|---|
--start |
Start date (ISO 8601, required) |
--end |
End date (ISO 8601, required) |
--previous-start |
Previous period start (for comparison) |
--previous-end |
Previous period end |
--mailboxes |
Filter by mailbox IDs (comma-separated) |
--tags |
Filter by tag IDs (comma-separated) |
--types |
Filter by types: email, chat, phone |
--folders |
Filter by folder IDs (comma-separated) |
--office-hours |
Calculate times within office hours (productivity) |
--view-by |
Data granularity: day, week, month (first-response-time) |
The docs commands talk to the Help Scout Docs API (docsapi.helpscout.net), which is
separate from the Mailbox API and uses its own API key — set it in the keychain
(helpscout-cli / docs-api-key) or the HELPSCOUT_DOCS_API_KEY environment variable.
# Discover the structure — collections and their categories in one call
helpscout docs tree
# Browse
helpscout docs collections list
helpscout docs categories list <collectionId>
helpscout docs articles list --collection <collectionId>
helpscout docs articles view <id-or-number>
helpscout docs articles search "audio capture"
# Write (publishing is always explicit; deletes require --yes)
helpscout docs articles create --collection <id> --name "Title" --text "<p>…</p>"
helpscout docs articles update <id> --publish
helpscout docs articles save-draft <id> --text-file ./draft.html
helpscout docs articles delete <id> --yes
# Sites and redirects
helpscout docs sites list
helpscout docs redirects list <siteId>Article create defaults to notpublished — pass --publish (or --status published) to
publish. Collection/category/site/redirect updates and the full surface are documented in
docs/API_COVERAGE.md.
Run as an MCP server for AI agent integration:
helpscout mcpIn this fork, the MCP server mirrors the full CLI surface — ~170 tools spanning conversations, customers, mailboxes, saved replies, teams, tags, workflows, webhooks, reports, and the Docs API — with CLI/MCP parity enforced by tests (see docs/API_COVERAGE.md). Core behaviors:
- Typed tools for Help Scout search, full conversation detail, full conversation thread history, attachment downloads, mailbox/customer/user lookup, and safe draft-note/status mutations
get_conversationaccepts internal conversation IDs or visible ticket numbers like#12345get_conversation_threadsreturns all Help Scout thread types by default, including notes, workflow events, status events, and other system events returned by Help Scoutlist_draft_repliesreturns active unsent reply drafts with thread IDs, bodies/previews, recipients, authors, and timestampscreate_draft_replyintentionally creates an additional unsent draft and returns its verified Help ScoutResource-IDthread IDupdate_draft_replyreplaces/textonly after verifying the selected thread is still an unsent reply draft, then verifies the live resultupsert_draft_replyupdates the sole active draft or creates one when none exists; it refuses multiple drafts unlessthreadIdexplicitly selects onedownload_attachmentsaves a conversation attachment to disk, using the Help Scout filename by default and requiringforcebefore overwriting existing filesupdate_conversation_statussafely changes ticket status, withopennormalized to Help Scout'sactivestatusassign_conversationassigns or reassigns a ticket to a Help Scout user or team ID; passnullasassigneeIdto unassign itcreate_noteadds private notes and can optionally set the ticket status, such as closing no-action tickets- User lookup tools expose Help Scout mention handles for composing
@mentionreferences - Resource templates for
helpscout://conversation/{conversationId},helpscout://customer/{customerId}, andhelpscout://user/{userId} - Prompt templates for
summarize_ticketanddraft_reply
Read-only tools include MCP annotations so hosts can distinguish them from mutating tools, and core read/query tools return structured outputs alongside readable JSON text.
All draft-reply commands and MCP tools preserve the never-send boundary: they only list drafts, create with draft: true, or replace a draft thread's /text. Every create/update re-reads Help Scout and returns success only when the intended thread is still a draft with the requested text.
draft-replies upsert and the legacy draft-reply shorthand are the recommended write paths. With zero active drafts they create one; with one they update it in place; with multiple they refuse and print the candidate thread IDs. Pass --thread-id (or MCP threadId) only after selecting the intended draft from draft-replies list / list_draft_replies.
Help Scout's official Inbox API does not expose an endpoint to delete or discard a draft reply thread. Discard unwanted drafts in the Help Scout web UI.
That boundary covers the draft-reply surface specifically — it is not a claim that this tool never sends. The CLI has no send command at all, but the MCP tool create_reply does send a reply that is immediately visible to the customer. It is the one live-send path here, it is annotated as mutating, and it is deliberately absent from the CLI so that sending is always an explicit, separate act.
| Flag | Description |
|---|---|
-c, --compact |
Minified JSON output |
-p, --plain |
Strip HTML from body fields |
-f, --fields <fields> |
Include only specified fields |
--include-metadata |
Include _links and _embedded |
helpscout conversations list | jq '.conversations[].subject'
helpscout conversations list --fields id,subjectErrors: {"error": {"name": "...", "detail": "...", "statusCode": 400}}
MIT