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
| Users (last 30 days) | 0 |
| Handshake | Healthy |
| Auth needed | None |
| Tool count | 134 |
| Latency | 1119 ms |
| Last checked (UTC) | 2026-10-30T19:10:25.997Z |
| Checked (UTC) | Status | Latency | Error |
|---|---|---|---|
| 2026-10-30T19:10:25.997Z | Healthy | 1119 |
list_projects | List projects available to this MCP key. Call this first, then get_email_capabilities_overview for email features. |
list_conversations | List conversations with filters (status, spam, limit, offset). Each result says whether it is marked as spam. |
get_conversation | 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_ |
get_conversation_image | 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. |
set_typing | 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 | 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 |
update_conversation | 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 |
generate_ai_response_suggestion | 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 au |
list_article_groups | List all article groups |
create_article_group | Create a new article group |
update_article_group | Update an article group |
list_articles | 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 in |
find_relevant_articles | 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 |
get_article | Get an article with translations |
create_article | Create an article with an initial translation |
update_article | Update article properties or upsert a translation |
list_contacts | List contacts with optional search |
get_contact | Get a contact with full details, recent activity and the deals they are on |
create_contact | Create a new contact |
update_contact | Update a contact |
list_crm_stages | List CRM pipeline stages |
list_companies | List companies with optional search and stage filter. Includes companies with no linked contacts. Paginated. |
list_companies_by_stage | 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 s |
get_company | Get a company with contacts, details and its deals. The company stage and deal_value mirror its primary deal. |
link_contact_to_company | Link an existing contact to an existing company. The operation is idempotent and both records must belong to the selected project. |
create_company | Create a new company |
update_company | Update a company |
merge_companies | 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. |
list_deals | 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. |
get_deal_pipeline | 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. |
get_deal | Get a deal with its company, stage, contacts and stage/amount history |
create_deal | Create a deal for a company. The company's own stage and value follow its primary deal (its newest open new-business deal). |
update_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. |
set_deal_contact | Add a contact to a deal, or change their role on it |
remove_deal_contact | Remove a contact from a deal |
delete_deal | Delete a deal. A company with no deals left drops out of the pipeline. |
get_email_capabilities_overview | 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. |
list_email_templates | List reusable workflow email templates for a project. |
get_email_template | Get a reusable workflow email template. |
create_email_template | New to HAL email? Call get_email_capabilities_overview first. Create a reusable workflow email template. |
update_email_template | Update a reusable workflow email template. |
delete_email_template | Delete a reusable workflow email template. Existing campaigns keep their embedded copy. |
preview_email_template | Render an email template preview as subject, preheader, HTML, and plain text. |
validate_email_template | Validate an email template and return AI-client-friendly errors. |
send_test_email_template | Send a workflow email template test to an account user email address only. |
send_test_email_campaign | Send a test email for an existing email campaign to an account user email address only. |
list_email_suppressions | List email addresses suppressed for lifecycle email campaigns in a project. |
suppress_email_recipient | 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. |
unsuppress_email_recipient | 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. |
get_email_unsubscribe_status | Check whether an email address is currently suppressed for lifecycle email campaigns, for a given category (default "all"). |
list_email_campaigns | List email campaigns backed by visitor workflows. |
get_email_campaign | Get email campaign details. |
list_event_names | List tracked lifecycle event names seen in a project. |
list_custom_properties | List visitor custom properties and sampled metadata keys available for campaign predicates and conditions. |
create_email_campaign | New to HAL email? Call get_email_capabilities_overview first. Create an email campaign using campaign language instead of workflow graph internals. |
update_email_campaign | Update an email campaign. |
enable_email_campaign | Enable an email campaign. |
disable_email_campaign | Disable an email campaign. |
delete_email_campaign | Delete an email campaign. Refuses if another workflow in the project still chains into it via trigger_campaign or next_campaign_id. |
list_email_campaign_runs | List email campaign runs with delivery, open, and click data. |
get_email_campaign_run | Get one email campaign run with clicked URLs. |
list_email_categories | 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. |
update_email_categories | 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. |
list_email_images | List images in a project’s email image library, newest first. Use these for lifecycle/workflow email `image` blocks. |
upload_email_image | 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 im |
delete_email_image | Delete an image from a project’s email image library. Remove it from any email templates first, or the image block will break. |
list_broadcasts | List one-off email broadcasts for a project. |
get_broadcast | 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 |
create_broadcast | 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. |
update_broadcast | Update a draft or scheduled broadcast (name, email content, audience, schedule, list-hygiene or tracking options, A/B test). |
delete_broadcast | Delete a broadcast. Refused while it is actively sending. |
preview_broadcast_audience | 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. |
get_broadcast_audience_fields | List the fields available for building a broadcast audience (contact/company builtins, sampled metadata keys, valid operators per type). |
send_test_broadcast_email | Send a test of a broadcast email to an account user email address only (never to real contacts). |
schedule_broadcast | Schedule a draft (or reschedule a scheduled) broadcast to send at a future time. |
send_broadcast_now | 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 |
cancel_broadcast | Cancel a scheduled, in-progress, or paused broadcast. Recipients not yet sent to are marked cancelled. |
list_broadcast_recipients | List the per-recipient delivery status for a broadcast. |
get_broadcast_readiness | 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 short |
resume_broadcast | 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 rema |
select_broadcast_ab_winner | 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 rem |
get_email_deliverability | 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 |
update_email_postal_address | 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. |
reset_email_deliverability_health | 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 |
get_workflow_builder_reference | 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. |
list_workflows | List visitor workflows for a project (trigger + branching graph automations), ordered by priority. |
get_workflow | Get a visitor workflow including its full node/edge graph definition. |
validate_workflow | Validate a visitor workflow definition without saving it. Same input as create_workflow. |
create_workflow | 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. |
update_workflow | 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. |
delete_workflow | Delete a visitor workflow. Refuses if another workflow in the project still chains into it via trigger_campaign or next_campaign_id. |
set_workflow_enabled | Enable or disable a visitor workflow. |
reorder_workflows | Reorder visitor workflows by priority; the first id in the list gets the highest priority. |
list_workflow_executions | List execution history for a visitor workflow. |
get_workflow_execution | Get one visitor workflow execution. |
get_workflow_email_defaults | Get the project default email design used to seed new send_email nodes. |
update_workflow_email_defaults | 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. |
send_test_workflow_email | Send a real test email for one send_email node in a workflow to an account user email address only. |
list_test_email_recipients | List account user emails allowed as workflow/email test recipients. |
track_event | 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 us |