Hi everyone,
I’m using the HubSpot CRM MCP server with the following tools exposed to my LLM:
hubspot_get_associationshubspot_get_recordhubspot_queryhubspot_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:
-
hubspot_get_recordworks when I already know the email IDIf I call
hubspot_get_recordon theemailsobject with a specific ID and requesths_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.
-
hubspot_get_associationsfrom company → emails does not return usable email IDsWhen I use
hubspot_get_associationsfrom a company (e.g.companyId = 6247638843) to its associatedemailsobject, the response the MCP exposes only includes:objectTypeIdproperties.hs_email_subjecttotal
There is no email engagement ID (or any other identifier I can pass into
hubspot_get_record), and no timestamps, and of course nohs_email_html.Because of this, I can’t do the natural two-step pattern:
- Get all emails associated with the company
- Pick the latest email ID and call
hubspot_get_recordon that ID withhs_email_html
-
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_recordand showhs_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.
-
Search limitations also apply
From the CRM search docs, I know that for emails:
hs_email_htmlandhs_body_previeware 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:
-
Is it expected that
hubspot_get_associationsfor 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”?
-
Is there a recommended MCP-safe way to implement this flow?
Ideal algorithm:
- From a
companyId, get all associated email engagements (with their IDs). - Choose the latest one by a timestamp.
- Call
hubspot_get_recordon that email ID withhs_email_htmlin 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.
- From a
-
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.