HAL

com.chatwithhal/mcp · v1.0.0 · communication

HAL is healthy: it completed an MCP handshake in 1119 ms and exposes 134 tools.

Customer conversations, help center, CRM, deals and email campaigns on HAL (chatwithhal.com).

Endpoint: https://api.chatwithhal.com/mcp (streamable-http)

No repository listed · Website · JSON · Add to my inventory

Facts

Users (last 30 days)0
HandshakeHealthy
Auth neededNone
Tool count134
Latency1119 ms
Last checked (UTC)2026-10-30T19:10:25.997Z

Health history

Checked (UTC)StatusLatencyError
2026-10-30T19:10:25.997ZHealthy1119

Tools (100)

list_projectsList projects available to this MCP key. Call this first, then get_email_capabilities_overview for email features.
list_conversationsList conversations with filters (status, spam, limit, offset). Each result says whether it is marked as spam.
get_conversationGet 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_
get_conversation_imageGet 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.
set_typingShow 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_conversationSend 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
update_conversationUpdate 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
generate_ai_response_suggestionGenerate 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 au
list_article_groupsList all article groups
create_article_groupCreate a new article group
update_article_groupUpdate an article group
list_articlesList 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 in
find_relevant_articlesFind 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
get_articleGet an article with translations
create_articleCreate an article with an initial translation
update_articleUpdate article properties or upsert a translation
list_contactsList contacts with optional search
get_contactGet a contact with full details, recent activity and the deals they are on
create_contactCreate a new contact
update_contactUpdate a contact
list_crm_stagesList CRM pipeline stages
list_companiesList companies with optional search and stage filter. Includes companies with no linked contacts. Paginated.
list_companies_by_stageRead-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 s
get_companyGet a company with contacts, details and its deals. The company stage and deal_value mirror its primary deal.
link_contact_to_companyLink an existing contact to an existing company. The operation is idempotent and both records must belong to the selected project.
create_companyCreate a new company
update_companyUpdate a company
merge_companiesMerge 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.
list_dealsList 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.
get_deal_pipelineSummarize 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.
get_dealGet a deal with its company, stage, contacts and stage/amount history
create_dealCreate a deal for a company. The company's own stage and value follow its primary deal (its newest open new-business deal).
update_dealUpdate 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.
set_deal_contactAdd a contact to a deal, or change their role on it
remove_deal_contactRemove a contact from a deal
delete_dealDelete a deal. A company with no deals left drops out of the pipeline.
get_email_capabilities_overviewOrientation 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.
list_email_templatesList reusable workflow email templates for a project.
get_email_templateGet a reusable workflow email template.
create_email_templateNew to HAL email? Call get_email_capabilities_overview first. Create a reusable workflow email template.
update_email_templateUpdate a reusable workflow email template.
delete_email_templateDelete a reusable workflow email template. Existing campaigns keep their embedded copy.
preview_email_templateRender an email template preview as subject, preheader, HTML, and plain text.
validate_email_templateValidate an email template and return AI-client-friendly errors.
send_test_email_templateSend a workflow email template test to an account user email address only.
send_test_email_campaignSend a test email for an existing email campaign to an account user email address only.
list_email_suppressionsList email addresses suppressed for lifecycle email campaigns in a project.
suppress_email_recipientSuppress 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.
unsuppress_email_recipientRemove 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.
get_email_unsubscribe_statusCheck whether an email address is currently suppressed for lifecycle email campaigns, for a given category (default "all").
list_email_campaignsList email campaigns backed by visitor workflows.
get_email_campaignGet email campaign details.
list_event_namesList tracked lifecycle event names seen in a project.
list_custom_propertiesList visitor custom properties and sampled metadata keys available for campaign predicates and conditions.
create_email_campaignNew to HAL email? Call get_email_capabilities_overview first. Create an email campaign using campaign language instead of workflow graph internals.
update_email_campaignUpdate an email campaign.
enable_email_campaignEnable an email campaign.
disable_email_campaignDisable an email campaign.
delete_email_campaignDelete an email campaign. Refuses if another workflow in the project still chains into it via trigger_campaign or next_campaign_id.
list_email_campaign_runsList email campaign runs with delivery, open, and click data.
get_email_campaign_runGet one email campaign run with clicked URLs.
list_email_categoriesList 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.
update_email_categoriesReplace 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.
list_email_imagesList images in a project’s email image library, newest first. Use these for lifecycle/workflow email `image` blocks.
upload_email_imageUpload 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 im
delete_email_imageDelete an image from a project’s email image library. Remove it from any email templates first, or the image block will break.
list_broadcastsList one-off email broadcasts for a project.
get_broadcastGet 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
create_broadcastNew 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.
update_broadcastUpdate a draft or scheduled broadcast (name, email content, audience, schedule, list-hygiene or tracking options, A/B test).
delete_broadcastDelete a broadcast. Refused while it is actively sending.
preview_broadcast_audiencePreview 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.
get_broadcast_audience_fieldsList the fields available for building a broadcast audience (contact/company builtins, sampled metadata keys, valid operators per type).
send_test_broadcast_emailSend a test of a broadcast email to an account user email address only (never to real contacts).
schedule_broadcastSchedule a draft (or reschedule a scheduled) broadcast to send at a future time.
send_broadcast_nowIMMEDIATELY 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
cancel_broadcastCancel a scheduled, in-progress, or paused broadcast. Recipients not yet sent to are marked cancelled.
list_broadcast_recipientsList the per-recipient delivery status for a broadcast.
get_broadcast_readinessDeliverability 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 short
resume_broadcastResume 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 rema
select_broadcast_ab_winnerEnd 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 rem
get_email_deliverabilityProject 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
update_email_postal_addressSet 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.
reset_email_deliverability_healthStart 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
get_workflow_builder_referenceNew 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.
list_workflowsList visitor workflows for a project (trigger + branching graph automations), ordered by priority.
get_workflowGet a visitor workflow including its full node/edge graph definition.
validate_workflowValidate a visitor workflow definition without saving it. Same input as create_workflow.
create_workflowNew 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.
update_workflowUpdate a visitor workflow. Partial: only provided fields change. If trigger fields change without a new definition, the existing trigger node is synced in place.
delete_workflowDelete a visitor workflow. Refuses if another workflow in the project still chains into it via trigger_campaign or next_campaign_id.
set_workflow_enabledEnable or disable a visitor workflow.
reorder_workflowsReorder visitor workflows by priority; the first id in the list gets the highest priority.
list_workflow_executionsList execution history for a visitor workflow.
get_workflow_executionGet one visitor workflow execution.
get_workflow_email_defaultsGet the project default email design used to seed new send_email nodes.
update_workflow_email_defaultsUpdate 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.
send_test_workflow_emailSend a real test email for one send_email node in a workflow to an account user email address only.
list_test_email_recipientsList account user emails allowed as workflow/email test recipients.
track_eventTrack 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 us