
Your agent needs to touch HubSpot. Maybe it's a deal intelligence tool that surfaces pipeline context in real time. Maybe it's a background enrichment job that runs every night against a list of prospects. Maybe it's both, depending on which tenant you're serving. HubSpot now ships two distinct official MCP servers and a full REST API, and the choice between them is not cosmetic. Each path puts you on a different auth model, locks you into a different capability envelope, and creates different operational surface area in production. The non-obvious part: the gap between them matters differently depending on what your agent actually does.
HubSpot's remote CRM MCP server went GA on April 13, 2026. It's a HubSpot-hosted server at mcp.hubspot.com. Any MCP-compatible client can connect to it over Streamable HTTP and get natural language access to CRM data, authenticated via OAuth 2.1 with PKCE.
The setup path is distinct from standard OAuth app registration. You create an "MCP auth app" inside HubSpot's developer dashboard (Development > MCP Auth Apps), HubSpot generates OAuth credentials automatically, and you use those credentials to authenticate any PKCE-capable MCP client to mcp.hubspot.com. Scopes are assigned automatically at installation time based on the tools the MCP server currently exposes. You do not define them explicitly.
By the way, HubSpot's Developer MCP server (hs mcp setup, local, CLI-based, GA February 19, 2026) is a completely different product. It gives agentic coding tools like Claude Code, Cursor, and VS Code access to HubSpot's developer platform for building apps and CMS content. It is not for reading or writing CRM data. The two come up together in search results and documentation and are easy to conflate. For agent-to-CRM workflows, only the remote server matters.
Official docs: developers.hubspot.com/mcp
HubSpot's REST API covers the full platform surface: standard CRM objects, custom objects, marketing content, workflow automation, sequences, the Conversations API (inbox, threads, messages), analytics, and more. The surface area is large: HubSpot publishes versioned endpoints across dozens of API categories, and the platform has continued expanding through 2025 and 2026 (the Conversations API moved to public beta in March 2026; custom object stage calculated properties shipped in May 2026).
OAuth 2.0 is the right choice for multi-tenant apps where each customer installs your application into their own HubSpot account: the standard authorization code flow, user-delegated, scoped at the app level. Private app access tokens are the right choice for single-portal internal integrations: scoped bearer tokens generated inside a specific HubSpot account, no redirect required, no browser, headless-friendly. Private app tokens are what background agents and scheduled workflows actually need.
100 requests per 10 seconds for private apps. The same rate limit applies to MCP server requests — they run against the same CRM Search API underneath.
Official docs: developers.hubspot.com/docs/api-reference
The custom object gap is the most operationally significant one and the most likely to surface in production without warning. HubSpot's community forums documented this in March 2026 — developers discovered the gap only through troubleshooting, not from the documentation. No error code signals "this is a custom object." The agent simply can't access the data.
This matters more than it sounds. Enterprise HubSpot accounts are rarely vanilla. Professional services firms, healthcare tech companies, and revenue operations teams routinely build their core data models on custom objects — proprietary deal types, custom lifecycle stages, non-standard association types. If your agent is connecting to a HubSpot instance that has been configured for a specific vertical, there's a meaningful probability the data you need lives in objects the MCP server doesn't expose.
The sensitive data block is the other gap worth naming explicitly. When a HubSpot account has the "Sensitive Data" toggle enabled (common in healthcare and financial services, required for accounts handling personal health information), the MCP server blocks all activity objects: calls, emails, meetings, notes, and tasks. This restriction does not exist in the standard CRM API. An agent that works correctly against a standard account will fail silently against a Sensitive Data account — same tool call, different outcome.
Every user who connects your agent to their HubSpot account completes a browser-based consent flow. HubSpot generates a short-lived access token and a rotating refresh token — single-use, meaning each token refresh produces a new refresh token and the previous one is immediately invalidated. If your storage layer doesn't handle that atomically, you end up in a state where the old refresh token is gone and the new one wasn't persisted. The agent deauthenticates mid-execution.
When HubSpot updates the MCP server and adds new tools, scopes change. Users who installed your app before the update have a different scope set than users who install after. To access new scopes, every existing connected user must disconnect and reconnect. There's no silent scope expansion. For a multi-tenant agent managing N customer connections, a MCP server update is an N-user re-authorization event.
OAuth 2.0 follows the standard authorization code flow — user-delegated, per-account credential, short-lived access tokens with refresh. The right model for a multi-tenant B2B product where each customer installs your application into their HubSpot account. Private app access tokens are static bearer tokens scoped at creation time, requiring no redirect and no browser interaction. These are what scheduled jobs, background enrichment pipelines, and nightly sync agents actually need — the agent runs at 2am with no user in the loop, and the token is there.
The structural reality for multi-tenant agents: both paths produce a per-user credential. MCP gives you an OAuth token per user. The direct API gives you an OAuth token or private app credential per user. In neither case does the path itself solve how you store those credentials, how you refresh them, or how you revoke them when a user disconnects. At scale, that's an infrastructure problem independent of which transport you chose.
With the remote MCP server,
What you still own: token storage, refresh token rotation (with atomicity requirements, as noted above), revocation, and tenant isolation. You also inherit a dependency on HubSpot's tool schema decisions. When the MCP server adds or changes tools, your agent's available scope changes without your code changing. That's convenient when tools are added; it's a breaking change if a tool is removed or its parameter contract changes.
With the direct API, you own everything.
One practical note on rate limits: MCP requests and direct API calls share the same limit. 100 requests per 10 seconds for private apps. If your agent makes high-frequency calls — enrichment pipelines, bulk contact updates — the MCP server buys you nothing on throughput. The ceiling is the same.
Use the HubSpot remote MCP when:
Use the direct API when:
That said, if you're using a token vault like Scalekit, the headless constraint on the MCP path largely disappears: the user completes the OAuth consent flow once, Scalekit stores and manages the token, and every subsequent background execution retrieves credentials from the vault with no browser and no user in the loop. The reason to still prefer the direct API's private app token for pure headless automation is operational simplicity — a private app token doesn't rotate, so there's no atomic refresh write requirement, no expiry to manage, and no risk of losing the credential mid-execution if a refresh write fails.
Both paths produce a credential per user.
The path you chose changes the token type and the token lifecycle — it does not change the underlying infrastructure requirement.
In a multi-tenant B2B agent, which is the default deployment model for most production use cases, you have N users across N HubSpot accounts. Each has their own credential. Each credential needs to be stored encrypted and isolated per tenant. Each OAuth credential needs to be refreshed before expiry, not after — waiting for a 401 to trigger refresh in a background agent means the agent fails silently and the next scheduled run is the first indication anything went wrong. And when a user offboards or disconnects their HubSpot integration, their credential needs to be revoked cleanly, not just orphaned in your storage layer.
The MCP path adds one layer of complexity here that the direct API doesn't: single-use refresh token rotation means your storage write and your token exchange must be atomic. A missed write during a network hiccup leaves you with an invalidated refresh token and no replacement. Handling this correctly is not trivial.
Scalekit's HubSpot connector handles the OAuth lifecycle for both paths — token storage, proactive refresh, rotation handling, and revocation. So, with Scalekit, the MCP vs API decision doesn't change what you build for auth infrastructure. The connector works the same way regardless of which transport your agent uses.
With Scalekit, the decision is primarily a capability question, not an auth question.
For multi-tenant B2B products, the credential management requirement is the same on both paths. That's the infrastructure problem worth solving once, correctly, at the foundation — regardless of which HubSpot integration path you end up building against.
Browse the Scalekit HubSpot connector → scalekit.com/agent-connector/hubspot