HubSpot MCP
npm:@hubspot/mcp-server@0.4.0
Severity breakdown
Worst finding
Tool `hubspot-batch-create-associations` name implies a side effect that is not declared
· hubspot-batch-create-associations
`hubspot-batch-create-associations` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
All 23 findings
- highTool `hubspot-batch-create-associations` name implies a side effect that is not declared· hubspot-batch-create-associationsexcessive agency
`hubspot-batch-create-associations` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- highTool `hubspot-batch-create-objects` name implies a side effect that is not declared· hubspot-batch-create-objectsexcessive agency
`hubspot-batch-create-objects` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- highTool `hubspot-batch-update-objects` name implies a side effect that is not declared· hubspot-batch-update-objectsexcessive agency
`hubspot-batch-update-objects` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- highTool `hubspot-create-property` name implies a side effect that is not declared· hubspot-create-propertyexcessive agency
`hubspot-create-property` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- highTool `hubspot-update-property` name implies a side effect that is not declared· hubspot-update-propertyexcessive agency
`hubspot-update-property` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- highTool `hubspot-create-engagement` name implies a side effect that is not declared· hubspot-create-engagementexcessive agency
`hubspot-create-engagement` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- highTool `hubspot-update-engagement` name implies a side effect that is not declared· hubspot-update-engagementexcessive agency
`hubspot-update-engagement` looks like a side-effecting tool (its name contains a mutation verb), but its `side_effects` declaration is []. A policy synthesizer cannot produce safe rules for this tool because it cannot tell what it actually does.
fix: Declare the tool's true side effects explicitly. If the tool is genuinely read-only, rename it to match (e.g. `email.preview` rather than `email.send`).
- mediumTool `hubspot-list-objects` accepts unconstrained string input· hubspot-list-objectsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `after`, `objectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-search-objects` accepts unconstrained string input· hubspot-search-objectsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `after`, `objectType`, `query`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-batch-create-associations` accepts unconstrained string input· hubspot-batch-create-associationsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `fromObjectType`, `toObjectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-get-association-definitions` accepts unconstrained string input· hubspot-get-association-definitionsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `fromObjectType`, `toObjectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-list-associations` accepts unconstrained string input· hubspot-list-associationsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `after`, `objectId`, `objectType`, `toObjectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-batch-create-objects` accepts unconstrained string input· hubspot-batch-create-objectsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `objectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-batch-update-objects` accepts unconstrained string input· hubspot-batch-update-objectsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `objectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-batch-read-objects` accepts unconstrained string input· hubspot-batch-read-objectsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `objectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-list-properties` accepts unconstrained string input· hubspot-list-propertiesunconstrained input
The following string parameter(s) have no `maxLength` constraint: `objectType`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-get-property` accepts unconstrained string input· hubspot-get-propertyunconstrained input
The following string parameter(s) have no `maxLength` constraint: `objectType`, `propertyName`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-create-property` accepts unconstrained string input· hubspot-create-propertyunconstrained input
The following string parameter(s) have no `maxLength` constraint: `calculationFormula`, `description`, `fieldType`, `groupName`, `label`, `name`, `objectType`, `type`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-update-property` accepts unconstrained string input· hubspot-update-propertyunconstrained input
The following string parameter(s) have no `maxLength` constraint: `calculationFormula`, `description`, `fieldType`, `groupName`, `label`, `objectType`, `propertyName`, `type`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-create-engagement` accepts unconstrained string input· hubspot-create-engagementunconstrained input
The following string parameter(s) have no `maxLength` constraint: `type`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-get-link` accepts unconstrained string input· hubspot-get-linkunconstrained input
The following string parameter(s) have no `maxLength` constraint: `portalId`, `uiDomain`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-list-workflows` accepts unconstrained string input· hubspot-list-workflowsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `after`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
- mediumTool `hubspot-get-workflow` accepts unconstrained string input· hubspot-get-workflowunconstrained input
The following string parameter(s) have no `maxLength` constraint: `flowId`. Unbounded strings let an attacker stuff arbitrary payloads through the tool, including indirect-injection content.
fix: Add a `maxLength` to each string property, or constrain with an `enum` or `pattern`. Most legitimate tool inputs fit under a few hundred bytes.
How this was scored
Source sandbox — live tools/list captured in an ephemeral Docker container (parameter schemas included → R1/R2/R4 fire). Findings are emitted by the public capframe.findings.v1 schema. Score = 100 − (10·Critical + 4·High + 2·Medium + 1·Low), clamped to [0, 100].
Disagree with a finding? Open an issue.