mcp-hubspot — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited mcp-hubspot (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill when a user wants an agent to work with HubSpot through the mcp-hubspot local MCP server and browser extension.
mcp-hubspot does not use HubSpot API tokens, private apps, OAuth apps, cookies, browser storage, or captured authorization headers. It uses a Chromium extension to operate the HubSpot UI that the user is already signed into.
This means:
From the repo:
npm install
npm run buildRegister the MCP server:
codex mcp add mcp-hubspot -- node "C:\path\to\mcp-hubspot\dist\server\index.js"For Claude Code, configure the same stdio server command:
{
"mcpServers": {
"mcp-hubspot": {
"command": "node",
"args": ["C:\\path\\to\\mcp-hubspot\\dist\\server\\index.js"]
}
}
}Run:
node .\dist\server\index.js extension-pathTell the user to open chrome://extensions, enable Developer Mode, choose Load unpacked, and select the printed dist\extension directory.
Run:
node .\dist\server\index.js doctorGive the user the bridge.pairingKey if the extension is not paired. The user pastes it into the extension popup and clicks Pair.
Pairing is remembered by the extension. If pairing is lost after an extension reload, ask the user to pair once again.
doctor first.get_context to understand the active page.get_coverage_matrix when the user asks whether an area is supported.get_page_snapshot to read the visible page.get_visible_tables when the user specifically asks for a clean table/list from the page.search_records and open_record for navigation.taskId, poll get_task.preview_record_update before writing when the user asks for before/after comparison.get_operation until the operation is completed, failed, rejected, or paused.doctor: verify bridge, extension, pairing, HubSpot tab, and available tools.get_context: inspect current page, pending browser tasks, pending operations, and Autopilot state.get_coverage_matrix: report supported, experimental, and out-of-scope HubSpot areas.get_page_snapshot: extract sanitized visible page data, including record fields, tables, associations, and timeline cards when visible.get_visible_tables: extract visible HubSpot tables/lists from the current page.search_records: search contacts, companies, deals, tickets, or custom objects through the HubSpot UI. For custom objects, pass type: "custom" and objectId.open_record: open a CRM record by URL, result, or query.get_task: check a non-blocking browser task.preview_record_update: produce a local diff without touching the browser.request_record_fill: fill fields in the HubSpot UI without saving.request_record_update: update fields after approval or Autopilot.request_record_create: create a contact, company, deal, ticket, or custom object after approval or Autopilot.request_batch_update: update up to 25 CRM records.request_timeline_activity_create: create/log a note, task, call, meeting, or email activity when the visible HubSpot composer supports it.request_association_create: associate two CRM records when the visible HubSpot association picker supports it.request_associated_contacts_create: create contacts and associate them to the current/provided company when the HubSpot UI exposes the association field.get_operation: check write operation status.get_audit_log: read sanitized local audit history.set_autopilot: enable or disable automatic execution of pending writes.By default, every write waits for the user to approve it in the extension side panel.
If the user explicitly enables Autopilot, writes run without per-operation approval. Treat Autopilot as task-scoped trust: confirm that the intended action is narrow, visible, and reversible before running broad changes. Do not perform destructive operations such as delete, merge, permission changes, or large exports.
Treat these as supported:
objectId.Treat these as experimental and verify with get_operation carefully:
Do not claim support for:
get_page_snapshot, then summarize visible fields, timeline clues, tables, and associations.search_records with type company, choose the best visible match, then open_record.search_records with type deal, choose the best visible match, then open_record.get_page_snapshot on the company page and inspect visible associations/tables.request_record_create with the matching type, then wait for approval/Autopilot and poll get_operation.get_context or get_page_snapshot to confirm the current company, then request_associated_contacts_create.request_timeline_activity_create, then poll get_operation.request_association_create.preview_record_update before request_record_update.request_record_fill, not request_record_update.doctor says the extension is not paired, pair with the current bridge.pairingKey.https://app.hubspot.com.get_task.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.