Model Context Protocol (MCP) server for Apollo.io API integration
HAL is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Customer conversations, help center, CRM, deals and email campaigns on HAL (chatwithhal.com).
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http chatwithhal-hal-mcp https://api.chatwithhal.com/mcp --header 'Authorization: Bearer ${API_KEY}'
# 2 — ask your agent for something these tools do
# list_projects, list_conversations, get_conversation and 131 more
It needs API_KEY (Bearer <key>: an account MCP key or a project MCP key (hal_mk_…), created in HAL under Settings → API): this sends it in the Authorization header from your environment, so export it first — its endpoint answers 401 without it.
HAL costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it. Claude Code reads API_KEY (Bearer <key>: an account MCP key or a project MCP key (hal_mk_…), created in HAL under Settings → API) from your environment each time it connects and sends it in the Authorization header — its endpoint answers 401 without it — so the key stays out of its config: export it in your shell profile (macOS, Linux), or run setx API_KEY … and open a new terminal (Windows).
claude mcp add --scope user --transport http chatwithhal-hal-mcp https://api.chatwithhal.com/mcp --header 'Authorization: Bearer ${API_KEY}'Reconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs your own credential rather than the publisher’s: Authorization header — Bearer <key>: an account MCP key or a project MCP key (hal_mk_…), created in HAL under Settings → API.. You set it in your own client’s config, on your machine — this marketplace never holds it.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
134 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
List projects available to this MCP key. Call this first, then get_email_capabilities_overview for email features.
No parameter schema on file.
List conversations with filters (status, spam, limit, offset). Each result says whether it is marked as spam.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| status | string | no | Filter by status |
| spam | string | no | Spam filter: "exclude" hides spam like the inbox, "only" lists spam to review |
| limit | number | no | Max results to return |
| offset | number | no | Offset for pagination |
Get a conversation with its messages and attachment metadata. agents_typing lists teammates drafting a reply right now; if someone is, let them answer instead of replying over them. replied_to_email is set when the conversation started as a reply to a campaign, workflow or broadcast email. Call get_conversation_image with an image attachment ID to inspect its visual content. To incorporate HAL's o
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversation_id | string | yes | The conversation ID |
Get an image attached to a conversation message as MCP image content so the AI client can inspect it. Images over 2 MB are resized and compressed before delivery. Use an attachment ID returned by get_conversation.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| attachment_id | string | yes | The image attachment ID returned by get_conversation |
Show the visitor and your teammates in the dashboard that a reply is being written. Call it right before you draft a reply the visitor will read, so a live agent sees the conversation is being handled. Do not call it for internal notes, for reading or summarizing, or when you are not going to reply. reply_to_conversation clears it; call again with is_typing false if you decide not to reply.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversation_id | string | yes | The conversation ID |
| is_typing | boolean | no | true while you draft the reply, false to clear it without replying |
| duration_seconds | integer | no | Clear the indicator after this many seconds if no reply is sent |
Send an agent message to a conversation. To show a help article to the visitor, write [label](hal-article:<article id or slug>) into the content of reply_to_conversation. The widget renders it as a clickable card at that spot, on its own line (it is not an inline link inside a sentence), so put it between sentences or paragraphs, e.g. "Refunds take 5 days. [Refund policy](hal-article:refund-p
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversation_id | string | yes | The conversation ID |
| content | string | no | The message content. May contain article cards as [label](hal-article:<article id or slug>), each on its own line where it belongs in the reply. May be empty when sending attachments. |
| is_internal | boolean | no | Whether this is an internal note (not visible to visitor) |
| offer_guide_id | string | no | Offer a guide below the message. The visitor gets a button that walks them through it on the page. Use a manual, enabled guide with a title (see list_guides). Do not write the guide markup into `conte |
| attachments | array | no | Files to attach to the message (max 5) |
Update conversation status, assignment, snooze state, or spam. is_spam true does what "Mark as spam" does in the inbox: the conversation leaves the inbox, is marked read, and the same sender's next conversations in this project go straight to spam; is_spam false undoes it and lets the sender back in. The change is recorded in the conversation's activity as done via MCP. Use list_conversations with
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversation_id | string | yes | The conversation ID |
| status | string | no | New status |
| assigned_user_id | string/null | no | User ID to assign (null to unassign) |
| snoozed_until | no | ISO 8601 time to snooze until (null to unsnooze) | |
| is_spam | boolean | no | true to mark the conversation as spam, false to unmark it |
Generate an advisory-only HAL AI reply suggestion for the latest visitor message. Call this after get_conversation, then combine HAL's draft, evidence, and confidence with the conversation messages when composing your final answer. This tool never sends a message to the visitor, even when project auto-send or AI deflection is enabled.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversation_id | string | yes | The conversation ID |
List all article groups
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Create a new article group
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | Group name |
| slug | string | yes | URL-friendly slug |
| description | string | no | Group description |
| show_in_helpdesk | boolean | no | Whether to show this group in the helpdesk (defaults to true) |
Update an article group
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| group_id | string | yes | The group ID |
| name | string | no | New name |
| slug | string | no | New slug |
| description | string/null | no | New description |
| sort_order | integer | no | New display order |
| show_in_helpdesk | boolean | no | Whether to show this group in the helpdesk |
List articles, optionally filtered by group or to published ones. To show a help article to the visitor, write [label](hal-article:<article id or slug>) into the content of reply_to_conversation. The widget renders it as a clickable card at that spot, on its own line (it is not an inline link inside a sentence), so put it between sentences or paragraphs, e.g. "Refunds take 5 days. [Refund pol
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| group_id | string | no | Filter by group ID |
| published_only | boolean | no | Only published articles, the ones that can be shared with a visitor |
Find published help articles that fit a conversation, in the visitor's language and limited to ones this visitor may see. Matches the visitor's latest message, or query when given. Returns up to 6, best match first; weaker results can be only loosely related, so check the title and excerpt before sharing one. Read-only; uses no AI quota. Each result has insert, the exact markup to put in the r
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversation_id | string | yes | The conversation to find articles for |
| query | string | no | What to look for, e.g. 'refund policy'. Defaults to the visitor's latest message. |
Get an article with translations
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| article_id | string | yes | The article ID |
Create an article with an initial translation
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| slug | string | yes | URL-friendly slug |
| group_id | string/null | no | Group ID (null for ungrouped) |
| title | string | yes | Article title |
| content | string | yes | Article content (Markdown) |
| locale | string | no | Locale for the initial translation |
| show_in_helpdesk | boolean | no | Whether to show this article in the helpdesk (defaults to true) |
Update article properties or upsert a translation
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| article_id | string | yes | The article ID |
| slug | string | no | New slug |
| group_id | string/null | no | New group ID (null for ungrouped) |
| is_published | boolean | no | Publish/unpublish |
| show_in_helpdesk | boolean | no | Whether to show in the helpdesk |
| sort_order | integer | no | New display order |
| locale | string | no | Locale to upsert translation for |
| title | string | no | Translation title (requires locale) |
| content | string | no | Translation content in Markdown (requires locale) |
List contacts with optional search
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| search | string | no | Search by name or email |
| limit | number | no | Max results |
| offset | number | no | Offset for pagination |
Get a contact with full details, recent activity and the deals they are on
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| contact_id | string | yes | The contact ID |
Create a new contact
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | no | Contact name |
| string | no | Contact email | |
| phone | string | no | Contact phone |
| notes | string | no | Notes |
| tags | array | no | Tags |
| metadata | object | no | Flat custom metadata (max 50 keys, 10KB). Values: string, number, boolean, or null. Replaces entire object on write. |
Update a contact
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| contact_id | string | yes | The contact ID |
| name | string | no | New name |
| string | no | New email | |
| phone | string | no | New phone |
| notes | string | no | New notes |
| tags | array | no | New tags |
| metadata | no | Flat custom metadata (max 50 keys, 10KB). Values: string, number, boolean, or null. Replaces entire object when set. Pass null or {} to clear. |
List CRM pipeline stages
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
List companies with optional search and stage filter. Includes companies with no linked contacts. Paginated.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| search | string | no | Search by name or notes |
| stage_id | string/null | no | Filter by CRM stage ID. Pass null for unstaged companies only. |
| limit | number | no | Max results |
| offset | number | no | Offset for pagination |
Read-only CRM board: list ALL companies grouped by pipeline stage, including companies with no linked contacts and unstaged companies. Returns per-stage deal totals so agents can reconcile Won totals with company rows. Company stage and deal value mirror the company primary deal; use list_deals to see every deal, including expansions and renewals.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| stage_id | string | no | Optional: only include companies in this stage. Omits unstaged when set. |
| stage_name | string | no | Optional: filter by stage name (case-insensitive, e.g. "Won"). Omits unstaged when set. Do not combine with stage_id. |
| include_unstaged | boolean | no | Include companies with no stage. Default true. Ignored when stage_id or stage_name is set. |
Get a company with contacts, details and its deals. The company stage and deal_value mirror its primary deal.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| company_id | string | yes | The company ID |
Link an existing contact to an existing company. The operation is idempotent and both records must belong to the selected project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| contact_id | string | yes | The contact ID |
| company_id | string | yes | The company ID |
Create a new company
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | Company name |
| deal_value | number | no | Deal value |
| stage_id | string | no | CRM stage ID |
| notes | string | no | Notes |
| domain | string | no | Company domain |
| industry | string | no | Industry |
| metadata | object | no | Flat custom metadata (max 50 keys, 10KB). Values: string, number, boolean, or null. Replaces entire object on write. |
Update a company
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| company_id | string | yes | The company ID |
| name | string | no | New name |
| deal_value | number/null | no | New deal value |
| stage_id | string/null | no | New stage ID |
| notes | string | no | New notes |
| domain | string/null | no | New domain |
| industry | string/null | no | New industry |
| metadata | no | Flat custom metadata (max 50 keys, 10KB). Values: string, number, boolean, or null. Replaces entire object when set. Pass null or {} to clear. |
Merge a duplicate company into a keeper. Contacts, tracked events, and CRM timeline move to the keeper; the source company is deleted. Use when the same org has a HAL-generated row and a later source-system (e.g. Apollo) id row. Refuses to merge companies that already have different external ids.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| keeper_company_id | string | yes | Company to keep. Prefer the older row when hydrating a source-system id. |
| source_company_id | string | yes | Duplicate company to absorb and delete |
List deals (sales opportunities). A company can have several deals: new business, expansion, renewal. Each deal has a stage, amount, expected close date, owner, next step and contacts. Filter by company, contact, stage, owner or status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| company_id | string | no | — |
| contact_id | string | no | Deals this contact takes part in |
| stage_id | string/null | no | Pass null for deals with no stage |
| owner_user_id | string | no | — |
| status | string | no | — |
| search | string | no | Search deal and company names |
| limit | number | no | — |
| offset | number | no | — |
Summarize the sales pipeline: per stage the number of deals, total and probability-weighted amount, plus open/won/lost totals, win rate and open deals whose expected close date has passed. Use list_deals for the deals themselves.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get a deal with its company, stage, contacts and stage/amount history
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| deal_id | string | yes | — |
Create a deal for a company. The company's own stage and value follow its primary deal (its newest open new-business deal).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| company_id | string | yes | — |
| name | string | no | Deal name. Defaults to the company name. |
| stage_id | string/null | no | CRM stage ID (see list_crm_stages). A 100% stage means won, 0% means lost. |
| amount | no | Deal amount in the project's sales currency and value unit | |
| deal_type | string | no | new_business, expansion or renewal |
| source | string/null | no | Where the deal came from, e.g. inbound, outbound, referral |
| owner_user_id | string/null | no | User who owns the deal |
| expected_close_date | string/null | no | ISO 8601 date, e.g. 2026-12-31. Pass null to clear. |
| next_step | string/null | no | The next action to move the deal |
| next_step_due_at | string/null | no | ISO 8601 date, e.g. 2026-12-31. Pass null to clear. |
| notes | string/null | no | — |
| lost_reason | string/null | no | Why the deal was lost. Kept only while the deal is in a lost stage. |
| contacts | array | no | People involved in the deal |
Update a deal. Moving it to a 100% stage marks it won and a 0% stage marks it lost (pass lost_reason); moving it back to an open stage reopens it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| deal_id | string | yes | — |
| name | string | no | Deal name. Defaults to the company name. |
| stage_id | string/null | no | CRM stage ID (see list_crm_stages). A 100% stage means won, 0% means lost. |
| amount | no | Deal amount in the project's sales currency and value unit | |
| deal_type | string | no | new_business, expansion or renewal |
| source | string/null | no | Where the deal came from, e.g. inbound, outbound, referral |
| owner_user_id | string/null | no | User who owns the deal |
| expected_close_date | string/null | no | ISO 8601 date, e.g. 2026-12-31. Pass null to clear. |
| next_step | string/null | no | The next action to move the deal |
| next_step_due_at | string/null | no | ISO 8601 date, e.g. 2026-12-31. Pass null to clear. |
| notes | string/null | no | — |
| lost_reason | string/null | no | Why the deal was lost. Kept only while the deal is in a lost stage. |
Add a contact to a deal, or change their role on it
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| deal_id | string | yes | — |
| contact_id | string | yes | — |
| role | no | — |
Remove a contact from a deal
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| deal_id | string | yes | — |
| contact_id | string | yes | — |
Delete a deal. A company with no deals left drops out of the pipeline.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| deal_id | string | yes | — |
Orientation for HAL email features: campaigns vs workflows vs broadcasts, templates vs project defaults vs inline design, sender domains, images, test sending, track_event, and unsubscribe/suppression. Call this before creating any campaign, workflow, broadcast, or template.
No parameter schema on file.
List reusable workflow email templates for a project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get a reusable workflow email template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| template_id | string | yes | — |
New to HAL email? Call get_email_capabilities_overview first. Create a reusable workflow email template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | — |
| subject | string | yes | Email subject |
| preheader | string | no | Email preheader |
| theme | object | no | — |
| template_document | object | no | Structured email document |
| blocks | array | no | Shortcut for template_document.blocks |
Update a reusable workflow email template.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| template_id | string | yes | — |
| name | string | no | — |
| subject | string | no | — |
| preheader | string | no | — |
| theme | object | no | — |
| template_document | object | no | — |
| blocks | array | no | — |
Delete a reusable workflow email template. Existing campaigns keep their embedded copy.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| template_id | string | yes | — |
Render an email template preview as subject, preheader, HTML, and plain text.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| template_id | string | no | — |
| workflow_name | string | no | — |
| sample_context | object | no | — |
| subject | string | no | Email subject |
| preheader | string | no | Email preheader |
| theme | object | no | — |
| template_document | object | no | Structured email document |
| blocks | array | no | Shortcut for template_document.blocks |
Validate an email template and return AI-client-friendly errors.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| template_id | string | no | — |
| subject | string | no | Email subject |
| preheader | string | no | Email preheader |
| theme | object | no | — |
| template_document | object | no | Structured email document |
| blocks | array | no | Shortcut for template_document.blocks |
Send a workflow email template test to an account user email address only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| to_email | string | yes | Recipient email. Must belong to a user on this account. |
| template_id | string | no | — |
| workflow_name | string | no | — |
| sample_context | object | no | — |
| subject | string | no | Email subject |
| preheader | string | no | Email preheader |
| theme | object | no | — |
| template_document | object | no | Structured email document |
| blocks | array | no | Shortcut for template_document.blocks |
Send a test email for an existing email campaign to an account user email address only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
| to_email | string | yes | Recipient email. Must belong to a user on this account. |
| sample_context | object | no | — |
List email addresses suppressed for lifecycle email campaigns in a project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| reason | string | no | — |
| limit | number | no | — |
| cursor | string | no | — |
Suppress an email address so lifecycle email campaigns skip it. Defaults to category "all" (blocks everything); pass a specific category key (see list_email_categories) to block only that category.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| string | yes | — | |
| reason | string | no | — |
| note | string | no | — |
| category | string | no | EmailCategory key (see list_email_categories), or "all" for every category |
Remove an email address from the lifecycle email suppression list. Omit category to lift every suppression on the address (bounce/complaint rows are never removed); pass category to lift only that one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| string | yes | — | |
| category | string | no | EmailCategory key (see list_email_categories), or "all" for every category |
Check whether an email address is currently suppressed for lifecycle email campaigns, for a given category (default "all").
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| string | yes | — | |
| category | string | no | EmailCategory key (see list_email_categories), or "all" for every category |
List email campaigns backed by visitor workflows.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get email campaign details.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
List tracked lifecycle event names seen in a project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| limit | integer | no | — |
List visitor custom properties and sampled metadata keys available for campaign predicates and conditions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| company_sample_limit | integer | no | — |
New to HAL email? Call get_email_capabilities_overview first. Create an email campaign using campaign language instead of workflow graph internals.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | — |
| enabled | boolean | no | — |
| trigger | object | yes | — |
| frequency | string | no | — |
| frequency_scope | string | no | — |
| custom_frequency_key | string | no | — |
| next_campaign_id | string | no | Optional campaign id to trigger after this campaign email is sent |
| reevaluate_conditions_at_send | boolean | no | — |
| delay_seconds | number | no | — |
| template_id | string | no | — |
| email_design | object | no | — |
| conditions | array | no | — |
| email_category | string | no | Defaults to "marketing" if omitted |
| skip_unengaged | boolean | no | Skip contacts who received 5+ emails in the last 180 days without opening, clicking or replying to any (the sunset rule broadcasts use). Ignored for categories people cannot unsubscribe from. Default |
Update an email campaign.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
| name | string | no | — |
| enabled | boolean | no | — |
| trigger | object | no | — |
| frequency | string | no | — |
| frequency_scope | string | no | — |
| custom_frequency_key | string | no | — |
| next_campaign_id | string/null | no | Campaign id to trigger after this campaign email is sent, or null to clear |
| reevaluate_conditions_at_send | boolean | no | — |
| delay_seconds | number | no | — |
| template_id | string | no | — |
| email_design | object | no | — |
| conditions | array | no | — |
| email_category | string | no | EmailCategory key (see list_email_categories), or "all" for every category |
| skip_unengaged | boolean | no | Skip contacts who received 5+ emails in the last 180 days without opening, clicking or replying to any (the sunset rule broadcasts use). Ignored for categories people cannot unsubscribe from. Default |
Enable an email campaign.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
Disable an email campaign.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
Delete an email campaign. Refuses if another workflow in the project still chains into it via trigger_campaign or next_campaign_id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
List email campaign runs with delivery, open, and click data.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
| limit | number | no | — |
| cursor | string | no | — |
Get one email campaign run with clicked URLs.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| campaign_id | string | yes | — |
| run_id | string | yes | — |
List a project's email categories used for per-category unsubscribe/preferences (marketing, product updates, transactional, ...). A project with no customized categories returns the built-in defaults.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Replace the full set of email categories for a project (upserts by key, removes any key not included). Refused with the referencing suppressions/broadcasts/workflows if a key still in use would be removed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| categories | array | yes | — |
List images in a project’s email image library, newest first. Use these for lifecycle/workflow email image blocks.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| limit | integer | no | — |
| cursor | string | no | — |
Upload an image to a project's email image library so it can be used in lifecycle/workflow email image blocks (email_block_types.image.url must be an absolute URL — external hosting is no longer required). Provide exactly one of data_base64 (with mime_type) or source_url. Use email_url in email image blocks (image.url).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| data_base64 | string | no | Base64-encoded image bytes, max 5MB decoded |
| mime_type | string | no | Required with data_base64: image/jpeg, image/png, image/gif, or image/webp |
| source_url | string | no | https/http URL to fetch the image from |
| alt | string | no | Alt text for the image |
| filename | string | no | Original filename for the data_base64 path, used to derive alt text when alt is omitted |
Delete an image from a project’s email image library. Remove it from any email templates first, or the image block will break.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| image_id | string | yes | The email image ID |
List one-off email broadcasts for a project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| status | string | no | — |
| cursor | string | no | — |
| limit | integer | no | — |
Get a single email broadcast, including delivery/open/click counts. With an A/B test, ab_test has its settings, phase (testing, waiting, winner_sending, done, skipped, cancelled), ends_at (automatic winner pick), the winner, and results (test-group sent/opens/clicks/rates per variant plus a confidence score).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
New to HAL email? Call get_email_capabilities_overview first. Create a draft (or scheduled, if scheduled_at is set) one-off email broadcast. Does not send anything.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | — |
| audience | object | no | Defaults to all contacts with an email |
| category | string | no | EmailCategory key (see list_email_categories); defaults to "marketing" |
| scheduled_at | string | no | ISO datetime to schedule the send |
| subject | string | yes | Email subject |
| preheader | string | no | Email preheader |
| theme | object | no | — |
| template_document | object | no | Structured email document |
| blocks | array | no | Shortcut for template_document.blocks |
| skip_unengaged | boolean | no | Leave out contacts who got 5+ emails in the last 180 days without opening or clicking any (default true) |
| skip_recently_emailed | boolean | no | Frequency cap: leave out contacts who got a broadcast in the last 24h (default true) |
| skip_role_addresses | boolean | no | Leave out shared role mailboxes like info@ or admin@ (default false) |
| track_engagement | boolean | no | Open pixel + click tracking (default true) |
| ab_test | object | no | Optional automatic A/B test: a random test group gets variant A (the main email) or B; after duration_hours the variant with the better winner_metric is sent to everyone else. Needs track_engagement o |
Update a draft or scheduled broadcast (name, email content, audience, schedule, list-hygiene or tracking options, A/B test).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
| name | string | no | — |
| audience | object | no | — |
| category | string | no | EmailCategory key (see list_email_categories); defaults to "marketing" |
| scheduled_at | string/null | no | ISO datetime, or null to unschedule |
| subject | string | no | — |
| preheader | string | no | — |
| theme | object | no | — |
| template_document | object | no | — |
| blocks | array | no | — |
| skip_unengaged | boolean | no | Leave out contacts who got 5+ emails in the last 180 days without opening or clicking any (default true) |
| skip_recently_emailed | boolean | no | Frequency cap: leave out contacts who got a broadcast in the last 24h (default true) |
| skip_role_addresses | boolean | no | Leave out shared role mailboxes like info@ or admin@ (default false) |
| track_engagement | boolean | no | Open pixel + click tracking (default true) |
| ab_test | object | no | Optional automatic A/B test: a random test group gets variant A (the main email) or B; after duration_hours the variant with the better winner_metric is sent to everyone else. Needs track_engagement o |
Delete a broadcast. Refused while it is actively sending.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
Preview who a broadcast (or a candidate audience) would reach: match count, suppressed count, contacts left out by list hygiene (invalid/disposable/role addresses, unengaged, recently emailed) per reason, and a sample.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | no | Preview the audience already saved on this broadcast |
| audience | object | no | Override audience to preview before saving |
| category | string | no | Only used with audience (no broadcast_id); defaults to "marketing" |
| skip_unengaged | boolean | no | Leave out contacts who got 5+ emails in the last 180 days without opening or clicking any (default true) |
| skip_recently_emailed | boolean | no | Frequency cap: leave out contacts who got a broadcast in the last 24h (default true) |
| skip_role_addresses | boolean | no | Leave out shared role mailboxes like info@ or admin@ (default false) |
List the fields available for building a broadcast audience (contact/company builtins, sampled metadata keys, valid operators per type).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Send a test of a broadcast email to an account user email address only (never to real contacts).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
| to_email | string | yes | Recipient email. Must belong to a user on this account. |
| sample_contact_id | string | no | Contact to source sample merge fields from |
| variant | string | no | A/B test variant to send (default a, the main email) |
Schedule a draft (or reschedule a scheduled) broadcast to send at a future time.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
| scheduled_at | string | yes | — |
IMMEDIATELY sends this broadcast to its whole live audience - a real, irreversible email blast to real contacts, not a test. You MUST call preview_broadcast_audience first and pass its exact count as confirm_recipient_count; a mismatch is refused. Call get_broadcast_readiness first too: sends with blocking deliverability checks are refused. Only call this after the user has explicitly confirmed
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
| confirm_recipient_count | integer | yes | Must exactly equal the current preview_broadcast_audience count |
Cancel a scheduled, in-progress, or paused broadcast. Recipients not yet sent to are marked cancelled.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
List the per-recipient delivery status for a broadcast.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
| status | string | no | — |
| cursor | string | no | — |
| limit | integer | no | — |
Deliverability checklist for a broadcast before sending: sender authentication (custom domain, DMARC, MAIL FROM/SPF), postal address, project bounce/complaint health, warm-up capacity (how many days the send will be spread over), and content lint (size, image-heavy, subject, spam phrases, link shorteners). error checks block sending; share warnings with the user.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
Resume a paused broadcast. Broadcasts auto-pause when their bounce or spam-complaint rate is too high, or when a scheduled send hits a blocking deliverability check; pause_reason says why. Only resume after the user understands the reason and has addressed it (e.g. removed bad addresses). The remaining recipients are sent to, and it pauses again if rates stay high.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
End a broadcast's A/B test early and send the winner to the rest of the audience now, instead of waiting for the automatic pick. ab_test.results on get_broadcast shows each variant's open/click rates. Pass variant to choose it; omit it to send the current leader. This sends real email to the remaining recipients: confirm with the user first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| broadcast_id | string | yes | — |
| variant | string | no | — |
Project email reporting. Always returns: health (last 30 days across every campaign, workflow and broadcast: sent, sent_last_24h, delivered, hard bounces (bounced), soft bounces, complaints and their rates, plus the status that blocks broadcasts, and reset_at when a list-cleanup reset restarted the window), sources (the same window broken down per workflow/broadcast with delivered, hard/soft bounc
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | no | Campaign/workflow to report on |
| broadcast_id | string | no | Broadcast to report on |
| days | integer | no | Trailing window for the workflow_id/broadcast_id stats; omitted = all time |
Set the physical mailing address shown in the footer of every marketing/lifecycle email (required by CAN-SPAM). Pass null or an empty string to remove it. Confirm the exact address with the user first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| postal_address | yes | — |
Start a fresh 30-day health window for a project that is blocked from sending broadcasts by old bounces or complaints. ONLY use this after the bounced and complained addresses have been suppressed (list_email_suppressions / suppress_email_recipient) so the same list cannot bounce again. HAL enforces this: the reset is refused, and nothing changes, if any recipient that bounced or complained in the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| reason | string | yes | What was cleaned up, e.g. "Suppressed all 312 hard-bounced addresses from the March 2026 import" (3-500 characters) |
| confirm | boolean | yes | Must be true: confirms the bounced/complained addresses were suppressed |
New to HAL email? Call get_email_capabilities_overview first. Static reference for building visitor workflows through create_workflow/update_workflow/validate_workflow: trigger shapes, node types, graph rules, condition/predicate operators, email block types, and variable syntax.
No parameter schema on file.
List visitor workflows for a project (trigger + branching graph automations), ordered by priority.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| enabled | boolean | no | — |
| trigger_type | string | no | — |
Get a visitor workflow including its full node/edge graph definition.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
Validate a visitor workflow definition without saving it. Same input as create_workflow.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | — |
| enabled | boolean | no | — |
| priority | integer | no | — |
| frequency | string | no | — |
| trigger_mode | string | no | — |
| trigger_type | string | yes | — |
| trigger_config | object | no | Shape depends on trigger_type; call get_workflow_builder_reference first. |
| definition | object | yes | — |
New to HAL email? Call get_email_capabilities_overview first. Create a visitor workflow: a trigger plus a branching graph of condition/send_widget_message/send_email/trigger_campaign/end nodes. Call get_workflow_builder_reference first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | — |
| enabled | boolean | no | — |
| priority | integer | no | — |
| frequency | string | no | — |
| trigger_mode | string | no | — |
| trigger_type | string | yes | — |
| trigger_config | object | no | Shape depends on trigger_type; call get_workflow_builder_reference first. |
| definition | object | yes | — |
Update a visitor workflow. Partial: only provided fields change. If trigger fields change without a new definition, the existing trigger node is synced in place.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
| name | string | no | — |
| enabled | boolean | no | — |
| priority | integer | no | — |
| frequency | string | no | — |
| trigger_mode | string | no | — |
| trigger_type | string | no | — |
| trigger_config | object | no | — |
| definition | object | no | — |
Delete a visitor workflow. Refuses if another workflow in the project still chains into it via trigger_campaign or next_campaign_id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
Enable or disable a visitor workflow.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
| enabled | boolean | yes | — |
Reorder visitor workflows by priority; the first id in the list gets the highest priority.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_ids | array | yes | — |
List execution history for a visitor workflow.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
| cursor | string | no | — |
| limit | integer | no | — |
Get one visitor workflow execution.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
| execution_id | string | yes | — |
Get the project default email design used to seed new send_email nodes.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Update the project default email design (subject/preheader/theme/template_document) used to seed new send_email nodes. Merges into the project config without touching other settings.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| subject | string | no | — |
| preheader | string | no | — |
| theme | object | no | — |
| template_document | object | no | — |
| blocks | array | no | Shortcut for template_document.blocks |
Send a real test email for one send_email node in a workflow to an account user email address only.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| workflow_id | string | yes | — |
| node_id | string | no | Required if the workflow has more than one send_email node |
| to_email | string | yes | Recipient email. Must belong to a user on this account. |
| sample_context | object | no | — |
List account user emails allowed as workflow/email test recipients.
No parameter schema on file.
Track a lifecycle event exactly like the public track-event API. THIS CAN SEND REAL EMAILS: matching enabled api_trigger workflows fire immediately for real contacts. Use dry_run to preview matches without tracking or sending anything. Workflows only fire for events that resolve to a visitor (via user_id or email); company-only events never trigger workflows.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | — |
| user_id | string | no | — |
| string | no | — | |
| company_id | string | no | — |
| entity | string | no | — |
| value | string/number/boolean/null | no | — |
| event_key | string | no | Idempotency key; a repeat call with the same key returns the original event |
| contact_name | string | no | — |
| metadata | object | no | Contact properties. Only fills properties the contact does not have yet (missing, null or empty), unless overwrite_metadata is true. |
| overwrite_metadata | boolean | no | Replace existing contact properties with the metadata values |
| occurred_at | string | no | ISO timestamp; defaults to now |
| dry_run | boolean | no | If true, does not track anything or send emails; only reports which enabled api_trigger workflows would match |
List all automations for this project
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get automation details
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| automation_id | string | yes | The automation ID |
Create a new automation
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | Automation name |
| trigger_type | string | yes | Trigger type |
| messages | object | yes | Messages by locale (e.g. {"en": "Hello!"}) |
| trigger_config | object | no | Trigger configuration |
| frequency | string | no | How often to fire |
| delay_seconds | number | no | Delay before showing |
| enabled | boolean | no | Whether enabled |
Update an automation
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| automation_id | string | yes | The automation ID |
| name | string | no | New name |
| trigger_type | string | no | New trigger type |
| messages | object | no | New messages by locale |
| trigger_config | object | no | New trigger configuration |
| frequency | string | no | New frequency |
| delay_seconds | number | no | New delay |
| enabled | boolean | no | Enable/disable |
Enable or disable an automation
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| automation_id | string | yes | The automation ID |
| enabled | boolean | yes | Whether to enable or disable |
List all guides for this project
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get guide details
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| guide_id | string | yes | The guide ID |
Create a new guide
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| name | string | yes | Guide name (internal label, not shown to visitors). A slug for host-page calls is generated from it and returned. |
| trigger_type | string | yes | Trigger type |
| title | object | no | Guide title by locale, e.g. {"en":"Change your plan"}. Shown to visitors. |
| description | object | no | One-line description by locale. Shown under the title. |
| show_in_suggestions | boolean | no | Offer this guide to a visitor typing a matching question. Requires title. Independent of trigger_type: a route guide may fire on arrival and still be offered in chat. |
| start_url | string | no | Where this guide runs, as a same-origin path template against the visitor's stored properties, e.g. "{{app_base_path}}/documents/add/invoice". When a visitor starts the guide from elsewhere, the widge |
| conditions | object | no | Audience conditions, evaluated server-side: an ineligible visitor receives nothing at all. guide.completed:<id> and event.count:<name> enable completion-style targeting (e.g. not_exists on guide.compl |
| steps | array | yes | Guide steps |
| trigger_config | object | no | Trigger configuration |
| frequency | string | no | How often to show |
| delay_seconds | number | no | Delay before showing |
| enabled | boolean | no | Whether enabled |
Update a guide
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| guide_id | string | yes | The guide ID |
| name | string | no | New name. The slug does NOT change — host-page calls keep working across renames. |
| title | object | no | Guide title by locale. Shown to visitors. |
| description | object | no | One-line description by locale. |
| show_in_suggestions | boolean | no | Offer this guide to a visitor typing a matching question. Independent of trigger_type. |
| start_url | string | no | Where this guide runs — same-origin path template, e.g. "{{app_base_path}}/documents/add/invoice". Empty string clears it. |
| conditions | object | no | Audience conditions, evaluated server-side before the guide is sent. Pass an empty rules array to clear. |
| trigger_type | string | no | New trigger type |
| steps | array | no | New steps |
| trigger_config | object | no | New trigger config |
| frequency | string | no | New frequency |
| delay_seconds | number | no | New delay |
| enabled | boolean | no | Enable/disable |
Enable or disable a guide
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| guide_id | string | yes | The guide ID |
| enabled | boolean | yes | Whether to enable or disable |
Permanently delete a guide and its execution history
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| guide_id | string | yes | The guide ID |
Per-guide analytics: triggers, completions, completion rate, per-step drop-off, selector misses
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| guide_id | string | yes | The guide ID |
| since_days | number | no | Count only executions from the last N days. Omit for all time. |
Which guides had steps fail to anchor recently — the signal that a selector rotted in the target app
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| since_days | number | no | Look at misses from the last N days. Default: 7. |
Validate a guide's start location and step selectors against the live pages the developer is logged into. Results are recorded by the widget's authoring mode (?hal_guide_debug=1 on any page where the widget runs); this tool returns the newest snapshot per page, so a guide that spans pages reports each of them.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| guide_id | string | yes | The guide ID |
Add tags to a message. Merges with existing tags (deduplicates). If Damper integration is enabled and a tag matches tags_to_sync, pushes the conversation to Damper as feedback.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| message_id | string | yes | The message ID to tag |
| tags | array | yes | Tags to add to the message |
Remove specific tags from a message
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| message_id | string | yes | The message ID |
| tags | array | yes | Tags to remove |
List all tags defined for this project
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get all project tags with their usage counts
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
List all teams for this project with member and conversation counts
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get a team with its members
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| team_id | string | yes | The team ID |
List shared macros (available to all team members)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Get a single shared macro by ID
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| macro_id | string | yes | The macro ID |
List all webhooks for this project
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Create a new webhook
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| url | string | yes | The webhook URL to receive events |
| events | array | yes | Event types to subscribe to (e.g. conversation.created, message.created) |
| secret | string | no | Optional HMAC secret for signature verification |
Update an existing webhook
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| webhook_id | string | yes | The webhook ID |
| url | string | no | New webhook URL |
| events | array | no | New event types |
| secret | string/null | no | New secret (null to remove) |
| enabled | boolean | no | Enable or disable the webhook |
Delete a webhook
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| webhook_id | string | yes | The webhook ID |
Get project statistics including responsiveness, conversation volume, and per-agent metrics. Defaults to last 30 days.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| start_date | string | no | Start date (ISO 8601, e.g. 2025-01-01) |
| end_date | string | no | End date (ISO 8601, e.g. 2025-01-31) |
Get the custom sender domain (Starter plan and above) configured for this project, including DNS records, verification status, and any Reply-To override (sender_domain.reply_to, alongside the top-level reply_to this project's emails actually use).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Configure a custom sender domain for visitor-facing email on this project (Starter plan and above). Returns DNS records (DKIM CNAMEs, and MX/TXT if a mail-from subdomain is set) that the user must add themselves at their DNS provider before the domain can verify. Reply-To stays on the HAL inbound address so inbound routing keeps working, unless a Reply-To override is set afterwards with update_sen
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| domain | string | yes | The domain to send from, e.g. mail.yourcompany.com |
| local_part | string | yes | The local part of the From address, e.g. "support" |
| sender_name | string | no | Display name to use in From. Defaults to the project name. |
| mail_from_subdomain | string | no | Optional custom MAIL FROM subdomain label, e.g. "bounce" |
Re-check the project's custom sender domain verification status against Amazon SES.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Update the local part, display sender name, and/or Reply-To override of the configured sender domain, without changing the domain itself. By default, Reply-To stays on the HAL inbound address so inbound routing/threading keep working. Setting reply_to overrides that with the given address - it must already forward into the project's HAL inbound address, or replies will be lost. Pass an empty str
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| local_part | string | no | New local part of the From address |
| sender_name | string | no | New display name to use in From |
| reply_to | string/null | no | Reply-To override, a single bare email address (e.g. support@yourcompany.com) that already forwards into the HAL inbound address. Pass an empty string or null to clear the override. |
Remove the project's custom sender domain. Visitor-facing email reverts to the default Hal address.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
Import a single historical conversation silently (no webhooks, no notifications). Use for migrating data from other chat platforms.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| visitor | object | yes | Visitor info — matched by email first, then user_id, then external_id, or creates new |
| conversation | object | no | Conversation metadata (defaults to resolved status) |
| messages | array | yes | Messages to import (1-1000, ordered chronologically) |
Import multiple historical conversations in batch (max 100). Each conversation is imported independently — one failure does not affect others. Silent: no webhooks, no notifications.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| project_id | string | no | Target project ID |
| project_slug | string | no | Target project slug (helpdesk slug) |
| conversations | array | yes | Conversations to import (1-100) |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install HAL or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | high | capability blast radius (high) — client exposure if the model is manipulated | −6 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. high is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| list_projects | no tags | |
| list_conversations | no tags | |
| get_conversation | no tags | |
| get_conversation_image | no tags | |
| set_typing | no tags | |
| reply_to_conversation | no tags | |
| update_conversation | no tags | |
| generate_ai_response_suggestion | no tags | |
| list_article_groups | no tags | |
| create_article_group | no tags | |
| update_article_group | no tags | |
| list_articles | no tags | |
| find_relevant_articles | no tags | |
| get_article | no tags | |
| create_article | no tags | |
| update_article | no tags | |
| list_contacts | no tags | |
| get_contact | no tags | |
| create_contact | no tags | |
| update_contact | no tags | |
| list_crm_stages | no tags | |
| list_companies | no tags | |
| list_companies_by_stage | no tags | |
| get_company | no tags | |
| link_contact_to_company | no tags | |
| create_company | no tags | |
| update_company | no tags | |
| merge_companies | no tags | |
| list_deals | no tags | |
| get_deal_pipeline | no tags | |
| get_deal | no tags | |
| create_deal | no tags | |
| update_deal | no tags | |
| set_deal_contact | no tags | |
| remove_deal_contact | no tags | |
| delete_deal | no tags | |
| get_email_capabilities_overview | no tags | |
| list_email_templates | no tags | |
| get_email_template | no tags | |
| create_email_template | no tags | |
| update_email_template | no tags | |
| delete_email_template | no tags | |
| preview_email_template | no tags | |
| validate_email_template | no tags | |
| send_test_email_template | no tags | |
| send_test_email_campaign | no tags | |
| list_email_suppressions | no tags | |
| suppress_email_recipient | no tags | |
| unsuppress_email_recipient | no tags | |
| get_email_unsubscribe_status | no tags | |
| list_email_campaigns | no tags | |
| get_email_campaign | no tags | |
| list_event_names | no tags | |
| list_custom_properties | no tags | |
| create_email_campaign | no tags | |
| update_email_campaign | no tags | |
| enable_email_campaign | no tags | |
| disable_email_campaign | no tags | |
| delete_email_campaign | no tags | |
| list_email_campaign_runs | no tags | |
| get_email_campaign_run | no tags | |
| list_email_categories | no tags | |
| update_email_categories | no tags | |
| list_email_images | no tags | |
| upload_email_image | no tags | |
| delete_email_image | no tags | |
| list_broadcasts | no tags | |
| get_broadcast | no tags | |
| create_broadcast | no tags | |
| update_broadcast | no tags | |
| delete_broadcast | no tags | |
| preview_broadcast_audience | no tags | |
| get_broadcast_audience_fields | no tags | |
| send_test_broadcast_email | no tags | |
| schedule_broadcast | no tags | |
| send_broadcast_now | external-sink | external-sink: parameter "recipient" |
| cancel_broadcast | no tags | |
| list_broadcast_recipients | no tags | |
| get_broadcast_readiness | no tags | |
| resume_broadcast | no tags | |
| select_broadcast_ab_winner | no tags | |
| get_email_deliverability | no tags | |
| update_email_postal_address | no tags | |
| reset_email_deliverability_health | no tags | |
| get_workflow_builder_reference | no tags | |
| list_workflows | no tags | |
| get_workflow | no tags | |
| validate_workflow | no tags | |
| create_workflow | external-sink | external-sink: keyword "send_email" |
| update_workflow | no tags | |
| delete_workflow | no tags | |
| set_workflow_enabled | no tags | |
| reorder_workflows | no tags | |
| list_workflow_executions | no tags | |
| get_workflow_execution | no tags | |
| get_workflow_email_defaults | no tags | |
| update_workflow_email_defaults | external-sink | external-sink: keyword "send_email" |
| send_test_workflow_email | external-sink | external-sink: keyword "send_email" |
| list_test_email_recipients | no tags | |
| track_event | no tags | |
| list_automations | no tags | |
| get_automation | no tags | |
| create_automation | no tags | |
| update_automation | no tags | |
| toggle_automation | no tags | |
| list_guides | no tags | |
| get_guide | no tags | |
| create_guide | no tags | |
| update_guide | no tags | |
| toggle_guide | no tags | |
| delete_guide | no tags | |
| get_guide_stats | no tags | |
| get_guide_health | no tags | |
| validate_guide | no tags | |
| tag_message | no tags | |
| untag_message | no tags | |
| list_message_tags | no tags | |
| get_message_tags_stats | no tags | |
| list_teams | no tags | |
| get_team | no tags | |
| list_macros | no tags | |
| get_macro | no tags | |
| list_webhooks | no tags | |
| create_webhook | external-sink | external-sink: keyword "webhook" |
| update_webhook | external-sinksensitive-source | external-sink: keyword "webhook", parameter "webhook"; sensitive-source: parameter "secret" |
| delete_webhook | external-sink | external-sink: keyword "webhook", parameter "webhook" |
| get_statistics | no tags | |
| get_sender_domain | no tags | |
| configure_sender_domain | no tags | |
| check_sender_domain | no tags | |
| update_sender_identity | no tags | |
| remove_sender_domain | no tags | |
| import_conversation | no tags | |
| import_conversations | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.0.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish HAL can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.