Skip to content
HAL logo

HAL MCP server

Which MCP servers are HAL's own, from the official registry and from asking its own domain, whether they answer, and what they offer. A program checked each of these, nobody copied them from a product page.

read 2026-10-30

← Back to HAL

Whose server it is
  • Registry namecom.chatwithhal/mcpverified in the MCP registry

The registry name sits under chatwithhal.com. The registry only lets a publisher use that namespace after proving control of the domain through DNS or HTTP.

When we asked itchecked 2026-10-30
  • Stateanswerschecked 2026-10-30
  • Tools134
  • Server calls itself@chatwithhal/mcp
  • Server version1.0.0
  • Protocol version2025-06-18

On 2026-10-30 the server answered initialize and tools/list without a sign-in. First answer in 260 ms.

Should an agent connect itNot proven either way yet
  • Its tools do answer customer questions from your help content; have AI draft replies to customer conversations, but not book client appointments straight into your CRM.
  • Checked on 3 of the 7 days it takes to judge reliability.

Once connected

  • For "have AI draft replies to customer conversations", the likely first call is list_conversations.
  • set_typing, update_conversation, create_article_group, update_article_group, create_article change data without a sign-in: anyone with the address can call them.
  • Its definitions take about 74708 tokens of context: enable only the tools a task needs.
  • Parameters are untyped or undescribed in 58 of 134 tools: check arguments before calling.

Said by rules from the measurements above. The likely first call is a model's pick from the tool list; read its description before relying on it.

Measured dailydaily checks: 3, the first on 2026-10-30
  • INITE MCP scoreafter a weeka score needs 7 daily checks: 3 so far
  • What an agent can do with it2 of 3 use cases
  • Answeredmeasuring3 of the 7 daily checks it takes to print a share
  • Median first answer372 ms
  • Space in an agent's context≈ 74,708 tokensthe definitions of all its tools (134), which an agent carries on every turn
  • Tool definitionsB · 75 of 100
  • Typed results0 of 134 toolsdeclared outputSchema: results come typed, read once
  • No description an agent can choose by: 6 of 134
  • Parameters without a description: in 58 of 134
  • Not saying whether it only reads or can destroy: 134 of 134

What an agent can do with it

  • can do · answer customer questions from your help content
  • cannot · book client appointments straight into your CRM
  • can do · have AI draft replies to customer conversations

Each of the product's use cases, put to Jev against this server's tool list: can an agent do it with these tools?

Worth a look

  • Tools that change data, on a server that answers without a sign-in: set_typing, update_conversation, create_article_group, update_article_group, create_article

A program checks the server once a day: initialize and tools/list, no model. Tokens are the definitions' length at about four characters a token. The grade averages six checks of every tool's name, description, schema and annotations; it says how well the tools are described, not whether they work. The score weighs what was measured and nothing else: answering (25%), doing the product's job (25%), definitions (20%), context (10%), use (10%) and how readily a client connects (10%). A part that was not measured is left out, and a hidden instruction caps the score at 40. The state of vendors' MCP servers: method and numbers →

Tools it offers134 tools · read 2026-10-30
  • 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…

  • 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…

  • 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…

  • 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…

  • 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…

  • 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…

  • 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…

  • 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…

  • 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…

  • 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…

  • 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.

The first 60 of 134, as the server listed them.

How to connect

Add the server to your MCP client config. Claude Desktop, Cursor and most other clients read this shape:

{
  "mcpServers": {
    "chatwithhal": {
      "type": "http",
      "url": "https://api.chatwithhal.com/mcp"
    }
  }
}

Add it

Claude Code, in a terminal

claude mcp add --transport http chatwithhal https://api.chatwithhal.com/mcp

Add to CursorAdd to VS Code

claude.ai, ChatGPT and other clients: add https://api.chatwithhal.com/mcp as a custom connector in the settings.

Each line is something a program found when it went looking: the registry entry, the server's own answer, a spec that parses. A missing line means we did not find it, not that it does not exist.