Create a public app in HubSpot's developer account and register a CRM card under the CRM cards section, specifying the target CRM object type (contacts), the card title, and the fetch URL
Implement the fetch URL endpoint on your server: HubSpot sends a GET request with hs_object_id and associatedObjectType query parameters; respond with a JSON payload conforming to the CRM card response schema (results array with title, value, dataType per row)
Optionally include an actions array in the response to add buttons on the card — each action specifies a type (IFRAME, CONFIRMATION_ACTION_HOOK, or ACTION_HOOK) and the target URL
For ACTION_HOOK type buttons, handle the POST HubSpot sends to your action URL when the button is clicked; respond with a confirmation message and optional property updates
Secure your fetch and action endpoints by validating the X-HubSpot-Signature header using your app's client secret to confirm requests originate from HubSpot
Test the card using a connected sandbox portal and the CRM card preview tool in the developer account before publishing the app publicly
Known gotchas
CRM card fetch endpoints must respond within 5 seconds or HubSpot displays an error state on the card; offload slow external queries to a cache layer warmed asynchronously
The CRM card response schema is strict — including an unrecognized field at the top level causes the entire card to fail to render rather than rendering partial data
CRM cards are only available to users of portals that have installed the public app; they are not accessible via private app tokens, so the app must go through the public app + OAuth install flow
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp