CRM MCP + hs_email_html: unable to reliably get latest email body for a specific company

Hi everyone,

I’m using the HubSpot CRM MCP server with the following tools exposed to my LLM:

  • hubspot_get_associations
  • hubspot_get_record
  • hubspot_query
  • hubspot_schema

My goal is to reliably get the HTML body (hs_email_html) of the latest email engagement associated with a given company (by companyId).

From the REST API docs I understand that:

  • Email engagements support a property hs_email_html (“the body of an email if it is sent from a CRM record”) and can be associated with CRM objects (contacts, companies, etc.).
  • Reference docs: Email engagements API guide (headers, subject, body, associations):
    Activities | Email - HubSpot docs

What I’m seeing in MCP:

  1. hubspot_get_record works when I already know the email ID

    If I call hubspot_get_record on the emails object with a specific ID and request hs_email_html, the tool returns the full HTML body as expected.

    So the underlying data is there and accessible when I have the engagement ID.

  2. hubspot_get_associations from company → emails does not return usable email IDs

    When I use hubspot_get_associations from a company (e.g. companyId = 6247638843) to its associated emails object, the response the MCP exposes only includes:

    • objectTypeId
    • properties.hs_email_subject
    • total

    There is no email engagement ID (or any other identifier I can pass into hubspot_get_record), and no timestamps, and of course no hs_email_html.

    Because of this, I can’t do the natural two-step pattern:

    1. Get all emails associated with the company
    2. Pick the latest email ID and call hubspot_get_record on that ID with hs_email_html
  3. Natural-language prompts cause the MCP to “guess” and return unrelated emails

    If I ask something like:

    “Show me the email body of the latest email for company 6247638843.”

    the MCP:

    • Sometimes returns an email body that is not actually associated with that company.
    • Other times it says “I can’t access the email body but here is the subject line.”
    • If I then give it a specific email ID from the UI, it can successfully call hubspot_get_record and show hs_email_html.

    So from what I can tell, when it doesn’t have IDs from associations, it falls back on some broader search / heuristic and may pick an email that simply matches the company’s name or domain, but isn’t truly associated.

  4. Search limitations also apply

    From the CRM search docs, I know that for emails:

    • hs_email_html and hs_body_preview are not supported as search filters, so I don’t expect to be able to filter on those.
    • That’s fine — my plan was to filter by association + metadata, then fetch the body with hubspot_get_record. The blocker is that I don’t get the IDs.

What I’m looking for

I’d really appreciate clarification on a few points:

  1. Is it expected that hubspot_get_associations for company → emails does not expose the email engagement IDs (or timestamps)?

    • If not expected, this might be a bug in the MCP tools.
    • If it is by design, is there another MCP tool or pattern that should be used to safely get “all email engagements associated with company X, with their IDs”?
  2. Is there a recommended MCP-safe way to implement this flow?

    Ideal algorithm:

    1. From a companyId, get all associated email engagements (with their IDs).
    2. Choose the latest one by a timestamp.
    3. Call hubspot_get_record on that email ID with hs_email_html in the requested properties.

    I can implement this reliably via the REST APIs, but I’d like to know if there’s a supported way to do it purely inside MCP, without writing separate API integration code.

  3. If this is a current limitation, is it on the roadmap to expose IDs in the association responses for MCP tools?

    Right now the behavior makes it impossible to trust a natural-language request like “latest email body for company X” in MCP, because the tool can’t prove which emails are truly associated to that company.

Happy to provide example prompts and (redacted) tool responses if that helps.
Thanks in advance for any guidance or confirmation on whether this is a known limitation vs. a bug.

Hi @tz18392, I hope that you are well!

Thanks for reaching out to the HubSpot Community!

So that we can help you as best as we can, can you please share which third-party MCP tool you’re using?

I’m asking because it seems like you may be using a third-party or custom MCP wrapper around HubSpot’s APIs but please let me know if that’s not the case.

It sounds like the missing IDs and absence of timestamps in association responses could be a limitation or bug with that particular wrapper.

With the HubSpot MCP server, here’s the recommended approach for your use case:

  • Try using search_crm_objects on the emails object type, applying a filter for associations with your companyId, and sort by timestamp descending.
  • Then, use get_crm_objects with the returned email ID(s) to retrieve hs_email_html.

Just as a heads-up, the MCP server is based on the CRM search API, it doesn’t currently support vector search, but you can filter by associations.

Also, I’d love to put you in touch with our Top Experts: Hi @Anton, @sylvain_tirreau and @zach_threadint do you have suggestions to help @tz18392, please?

Thanks so much and enjoy the weekend!
Bérangère

This post was created with the assistance of AI tools

Hi @Berangere , thanks for your response. We’re using HubSpot’s own MCP server. I’ll try the approach you recommended and see if that produces the results we’re looking for.

Hi @tz18392, I hope that you are well!

Thanks for confirming and let us know how it goes!

Also, please let us know if you have any additional questions, we are here for you!

Have a wonderful day! :sun:

Bérangère