Announcing Beacon: Self-improving memory for coding agents
← All MCP servers
MCP server

io.github.sebastienrousseau/camt053-mcp

mcp:sebastienrousseau/camt053-mcp

MCP server for ISO 20022 camt.053 bank-to-customer statement parsing and reconciliation.

Verdict
Inconclusive

The analysis could not cover enough of the artifact to decide.

Analyzed Oct 29, 2026, 16:12 UTC at 73994a0

Dispute security verdict

If you believe this verdict is incorrect, submit a dispute and we'll review it.

0
findings
—
highest severity
0
threat classes
135
files scanned
363/363
checks satisfied
0
package advisories

Why this verdict

  • inconclusive: gap dynamic_metadata at camt053_mcp/_mcp_compat.py
  • inconclusive: gap dynamic_metadata at camt053_mcp/server.py
  • inconclusive: gap no_dataflow_for_dynamic_code at camt053_mcp/_mcp_compat.py

Security findings 0

No individual findings recorded

The inconclusive verdict rests on the coverage gaps below.

Notes 1

Capabilities, vulnerabilities and disclosed behavior worth knowing. Nothing here works against the person who installs it, so notes never change the verdict.

Destructive action

mediumNoteConfirmed on reviewlow confidence

The JWT verifier refetches the configured JWKS URL whenever a token carries an unknown kid, so any unauthenticated caller can force an outbound fetch per request, a resource-exhaustion path with no rate limit.

if self._stale() or (kid is not None and kid not in self._keys):
vector:code
Reviewer's reasoning

The code does refetch the JWKS URL when a token carries an unknown kid, which is the cited behavior, so the claim is not wrong. Harm needs an unauthenticated caller to send tokens with unknown kids, which is attacker input (test 3), so the artifact only makes the resource-exhaustion path possible and the level is note.

Coverage gaps 18

Parts of the artifact the static analysis could not fully examine.

dynamic_metadata line 1862: tool (computed name) registration depends on unsupported construct (unsupported): server object server handed to _tracing.instrument_tracing(): tools may be registered out of sight
camt053_mcp/server.py
dynamic_metadata line 1864: tool (computed name) registration depends on unsupported construct (unsupported): server object server handed to _transport.run_http(): tools may be registered out of sight
camt053_mcp/server.py
dynamic_metadata line 1866: tool (computed name) registration depends on unsupported construct (unsupported): server object server handed to _transports.run(): tools may be registered out of sight
camt053_mcp/server.py
dynamic_metadata line 73: tool (computed name) name depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) annotations depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) param 'message_type' description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) param 'kind' description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) param 'scheme' description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) param 'target' description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: tool (computed name) param 'reason_code' description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: resource (computed name) name depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: resource (computed name) description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: prompt (computed name) name depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: prompt (computed name) description depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
dynamic_metadata line 73: prompt (computed name) arguments depends on unsupported construct (unsupported): module object is handed to other code
camt053_mcp/_mcp_compat.py
no_dataflow_for_dynamic_code line 73: invoked code is not structurally extracted
camt053_mcp/_mcp_compat.py
no_dataflow_for_dynamic_code line 96: invoked code is not structurally extracted
camt053_mcp/_mcp_compat.py