hubspot-conversations-mcp
MCP server providing 1:1 tool parity with Arcade.dev's HubSpot Conversations API toolkit, enabling reading and sending conversation messages, managing threads, inboxes, channels, and custom channels from any MCP client.
README
hubspot-conversations-mcp
MCP server for the HubSpot Conversations API with 1:1 tool parity with the Arcade.dev HubSpot Conversations API toolkit (24 tools). Read conversation threads and messages, send replies, manage threads and channel accounts, and integrate custom channels — from any MCP client (Claude Code, Claude Desktop, etc.).
Covers two HubSpot API surfaces:
- Conversations API (
/conversations/conversations/2026-09-beta) — threads, messages, inboxes, channels, actors - Custom Channels API (
/conversations/custom-channels/2026-03) — channel accounts, staging tokens, publishing external messages, delivery status
Install
Once published to npm, no clone or build is needed — MCP clients run the server straight off the registry with npx.
Interactive setup (recommended)
npx -y hubspot-conversations-mcp setup
The wizard walks you through everything:
- Token guide — step-by-step instructions for creating a HubSpot private app (Settings → Integrations → Private Apps) with the right scopes:
conversations.read,conversations.write, and optionallyconversations.custom_channels.read/.writefor the custom-channel tools. - Token prompt — paste the
pat-...token (input is masked; OAuth2 access tokens also work), plus an optional default sender actor ID for replies. - Agent selection — choose which AI agents to configure: Claude Desktop, Claude Code, and/or Hermes (Nous Research hermes-agent).
- Automatic install — each selected agent is configured immediately.
The wizard also works scripted: pipe the answers via stdin (printf 'pat-...\n\n1,3\n' | npx -y hubspot-conversations-mcp setup).
Non-interactive install
npx -y hubspot-conversations-mcp install --client all --token pat-eu1-... --sender-actor-id A-12345
--client takes claude-desktop, claude-code, hermes, both (the two Claude clients), all, or a comma-separated combination:
- claude-desktop — merges the server into
claude_desktop_config.json(existing servers and settings are preserved; a timestamped backup is written first). Restart Claude Desktop afterwards. - claude-code — runs
claude mcp add … -- npx -y hubspot-conversations-mcpfor you (prints the command if theclaudeCLI is unavailable). Add--scope userto register it across all your projects (the setup wizard defaults to this). - hermes — merges the server into
~/.hermes/config.yamlundermcp_serverswithenabled: true(backup written first; note that YAML comments are not preserved). Verify withhermes mcp test hubspot-conversations.
Use --dry-run to preview changes without writing anything, --config-path for a non-standard Claude Desktop config location, and --hermes-config-path (or HERMES_CONFIG_PATH) for a non-standard Hermes config location.
Note on tokens: HubSpot private app tokens can only be created in the HubSpot UI — there is no public API to generate them, so the CLI guides you through it instead of doing it for you.
Manual: Claude Code
claude mcp add hubspot-conversations --env HUBSPOT_ACCESS_TOKEN=pat-eu1-... --env HUBSPOT_DEFAULT_SENDER_ACTOR_ID=A-12345 -- npx -y hubspot-conversations-mcp
Manual: Claude Desktop
claude_desktop_config.json:
{
"mcpServers": {
"hubspot-conversations": {
"command": "npx",
"args": ["-y", "hubspot-conversations-mcp"],
"env": {
"HUBSPOT_ACCESS_TOKEN": "pat-eu1-...",
"HUBSPOT_DEFAULT_SENDER_ACTOR_ID": "A-12345"
}
}
}
}
Prerequisite reminder: HubSpot scopes
The token must belong to a private app (or OAuth2 app) with conversations.read + conversations.write, and conversations.custom_channels.read/.write if you use the custom-channel tools.
One-click bundle for Claude Desktop (MCPB)
The repo ships a manifest.json following Anthropic's MCP Bundle format:
npm run bundle
This produces a .mcpb file. Open it with Claude Desktop (or drag it into Settings → Extensions) for a one-click install — the token is collected in the UI and stored in the OS keychain instead of a config file.
Publishing to npm
npm publish
prepublishOnly builds and runs the full test suite first. The published package contains only dist/, manifest.json, README and LICENSE. Bump version in both package.json and manifest.json (and SERVER_VERSION in server.ts) per release.
Configuration
| Environment variable | Required | Description |
|---|---|---|
HUBSPOT_ACCESS_TOKEN |
✅ | Private app token (pat-...) or OAuth2 access token |
HUBSPOT_DEFAULT_SENDER_ACTOR_ID |
Default sender for SendConversationMessage, e.g. A-12345 (agent actor = A-<hubspot user id>) |
|
HUBSPOT_BASE_URL |
Default https://api.hubapi.com |
|
HUBSPOT_CONVERSATIONS_API_VERSION |
Default 2026-09-beta — update here when the API graduates from beta |
|
HUBSPOT_CUSTOM_CHANNELS_API_VERSION |
Default 2026-03 |
|
HUBSPOT_AUTH_MODE |
private-app or bearer; auto-detected from the token prefix when unset |
Tools (Arcade parity)
Threads
| Tool | Description |
|---|---|
RetrieveConversationThreads |
List/search threads — filter by inbox, OPEN/CLOSED, contact, ticket, time window; paginated |
RetrieveThreadById |
Get a single thread (status, inbox, channel, assignee, contact) |
UpdateConversationThread |
Set OPEN/CLOSED, archive or restore a thread |
ArchiveConversationThread |
Soft-delete a thread (permanently deleted after 30 days) |
Messages
| Tool | Description |
|---|---|
GetMessageHistoryForThread |
Message history of a thread (messages, comments, system events); paginated |
RetrieveThreadMessage |
Get a single message |
RetrieveFullMessageContent |
Original (untruncated) text/richText of a message |
SendConversationMessage |
Send a message to the customer — or an internal comment with message_type=COMMENT |
Inboxes, channels & actors
| Tool | Description |
|---|---|
ListConversationInboxes / GetInboxDetails |
Conversation inboxes / help desks |
ListConversationChannels / RetrieveChannelDetails |
Channel types (email, chat, …) |
RetrieveChannelAccounts / GetChannelAccountDetails |
Connected accounts (specific email addresses / numbers) |
RetrieveActorDetails / ResolveConversationActors |
Resolve actor IDs (A- agent, V- visitor, B- bot, E- email, S- system, I- integrator) |
Custom channels (requires the conversations.custom_channels.* scopes)
| Tool | Description |
|---|---|
CreateChannelAccount |
Create an account on a custom channel |
GetCustomChannelAccounts |
List accounts on a custom channel |
RetrieveChannelAccountDetails |
Get one custom-channel account |
UpdateChannelAccountInfo |
Rename or (de)authorize a channel account |
UpdateChannelAccountStaging |
Finalize a staging-token connection (public apps) |
PublishCustomChannelMessage |
Publish an external message into HubSpot |
GetCustomChannelMessageDetails |
Get a custom-channel message |
UpdateMessageStatus |
Report delivery status: SENT / FAILED / READ |
Sending replies
SendConversationMessage only requires thread_id and text. Everything else is derived:
channel_id/channel_account_id— taken from the thread'soriginalChannelId/originalChannelAccountIdrecipients— the senders of the latest incoming message (i.e. a normal reply)sender_actor_id— falls back toHUBSPOT_DEFAULT_SENDER_ACTOR_ID
Pass any of them explicitly to override. Arcade-style calls are also supported: pass a stringified JSON request_body (typed fields win on conflict), and call with mode="get_request_schema" to inspect the raw body schema. The same pattern applies to PublishCustomChannelMessage.
Development
npm test # vitest — unit + in-memory MCP integration tests
npm run typecheck # tsc --noEmit
npm run build # compile to dist/
npm run bundle # build a .mcpb one-click bundle for Claude Desktop
The integration tests run the full MCP server against a stubbed fetch, so no HubSpot account is needed to develop.
Notes
- Tool names and parameters mirror Arcade's
HubspotConversationsApitoolkit 1:1; list tools additionally accept optional filter/pagination parameters (supersets of Arcade's schemas). - The client retries once on
429/502/503, honoringRetry-After(capped at 10s). - Thread assignee endpoints (
PUT/DELETE /threads/{id}/assignee) exist in the HubSpot API but are not part of Arcade's toolkit, so they are not exposed as tools. Re-add them insrc/tools/threads.tsif needed.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。