MongoDB MCP
npm:mongodb-mcp-server@1.11.0
Severity breakdown
Worst finding
Tool `aggregate-db` accepts an unbounded monetary / quota value
· aggregate-db
The numeric parameter(s) `responseBytesLimit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
All 36 findings
- highTool `aggregate-db` accepts an unbounded monetary / quota value· aggregate-dbexcessive agency
The numeric parameter(s) `responseBytesLimit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
- highTool `aggregate` accepts an unbounded monetary / quota value· aggregateexcessive agency
The numeric parameter(s) `responseBytesLimit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
- highTool `collection-schema` accepts an unbounded monetary / quota value· collection-schemaexcessive agency
The numeric parameter(s) `responseBytesLimit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
- highTool `create-collection` name implies a side effect that is not declared· create-collectionexcessive agency
`create-collection` 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 `create-index` name implies a side effect that is not declared· create-indexexcessive agency
`create-index` 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 `delete-many` name implies a side effect that is not declared· delete-manyexcessive agency
`delete-many` 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 `drop-collection` name implies a side effect that is not declared· drop-collectionexcessive agency
`drop-collection` 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 `drop-database` name implies a side effect that is not declared· drop-databaseexcessive agency
`drop-database` 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 `drop-index` name implies a side effect that is not declared· drop-indexexcessive agency
`drop-index` 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 `find` accepts an unbounded monetary / quota value· findexcessive agency
The numeric parameter(s) `limit`, `responseBytesLimit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
- highTool `mongodb-logs` accepts an unbounded monetary / quota value· mongodb-logsexcessive agency
The numeric parameter(s) `limit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
- highTool `update-many` name implies a side effect that is not declared· update-manyexcessive agency
`update-many` 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 `search-knowledge` accepts an unbounded monetary / quota value· search-knowledgeexcessive agency
The numeric parameter(s) `limit` have a money/quota-shaped name but no `maximum` constraint. An LLM tricked by indirect-injection can call the tool with arbitrarily large values.
fix: Add a `maximum` (and ideally `minimum`) to each money/quota numeric, OR enforce the cap via a capframe-bind `--limit` caveat at the agent boundary.
- mediumTool `aggregate-db` accepts unconstrained string input· aggregate-dbunconstrained input
The following string parameter(s) have no `maxLength` constraint: `database`. 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 `aggregate` accepts unconstrained string input· aggregateunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `collection-indexes` accepts unconstrained string input· collection-indexesunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `collection-schema` accepts unconstrained string input· collection-schemaunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `collection-storage-size` accepts unconstrained string input· collection-storage-sizeunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `connect` accepts unconstrained string input· connectunconstrained input
The following string parameter(s) have no `maxLength` constraint: `connectionString`. 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 `count` accepts unconstrained string input· countunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `create-collection` accepts unconstrained string input· create-collectionunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `create-index` accepts unconstrained string input· create-indexunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`, `name`. 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 `db-stats` accepts unconstrained string input· db-statsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `database`. 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 `delete-many` accepts unconstrained string input· delete-manyunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `drop-collection` accepts unconstrained string input· drop-collectionunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `drop-database` accepts unconstrained string input· drop-databaseunconstrained input
The following string parameter(s) have no `maxLength` constraint: `database`. 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 `drop-index` accepts unconstrained string input· drop-indexunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`, `indexName`, `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 `explain` accepts unconstrained string input· explainunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`, `verbosity`. 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 `export` accepts unconstrained string input· exportunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`, `exportTitle`, `jsonExportFormat`. 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 `find` accepts unconstrained string input· findunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `insert-many` accepts unconstrained string input· insert-manyunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `list-collections` accepts unconstrained string input· list-collectionsunconstrained input
The following string parameter(s) have no `maxLength` constraint: `database`. 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 `mongodb-logs` accepts unconstrained string input· mongodb-logsunconstrained 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 `rename-collection` accepts unconstrained string input· rename-collectionunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`, `newName`. 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 `update-many` accepts unconstrained string input· update-manyunconstrained input
The following string parameter(s) have no `maxLength` constraint: `collection`, `database`. 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 `search-knowledge` accepts unconstrained string input· search-knowledgeunconstrained input
The following string parameter(s) have no `maxLength` constraint: `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.
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.