Skip to main content
Rule ID: AE-MCP-001 · Severity: High · Category: MCP Safety · Auto-fixable: Yes (partial)
AE-MCP-001 is partially auto-fixable. Charter can bump unpinned or behind-stable packages to the catalog’s stable version. Deprecated or archived packages require manual migration — Charter provides the successor package name in the finding evidence, but will not rewrite the entry automatically.

Why this rule

An MCP server at @latest can change behavior between runs without any change to the repo. A package can be deprecated, archived, or found to contain a known vulnerability after a repo first passed Charter. Pinning to an exact version ties the tool definition to a reviewable artifact — every tool-call behavior is deterministic across machines and runs. See the MCP safety model for how Charter reasons about MCP supply chain.

What triggers it

Charter scans MCP configuration files for server entries launched by package runners and checks whether each entry pins an exact version. Scanned files: .mcp.json, mcp.json, .cursor/mcp.json, .vscode/mcp.json, .gemini/settings.json Scanned runners: npx, bunx, uvx, pnpm dlx The finding ladder based on signal type: Unpinned forms that fire High: @latest, a missing version suffix, semver ranges (^1.0.0, ~1.0.0, >=1.0.0), floating git refs, or dynamic values like pkg@${VERSION}.

Examples

.mcp.json (floating tag)
.mcp.json (archived package)

How to fix

For unpinned or behind-stable packages, charter fix updates the package spec to the catalog’s stable version as a diff-first preview before writing anything. For deprecated or archived packages, migration is manual — the finding evidence includes the recommended successor package name. Update the entry to use the successor at its current stable version.

Score impact

Deprecated, unpinned, or advisory-covered findings are High (−10 per finding). The behind-stable-only nudge is Informational (0). No hard cap — caps are reserved for raw-secret and Blocker findings. See Scoring and caps.

Edge cases

Package specs are resolved only for direct runners (npx, bunx, uvx) and the dlx subcommand of pnpm/yarn. Local path arguments (./, /, ../) and exec/run forms launch local binaries and are not treated as registry packages. Scoped packages (@scope/name@1.2.3) are pinned only when the trailing version is exact. A dynamic pkg@${VERSION} reference is treated as unpinned.

AE-MCP-002

Remote MCP server origins must be trusted.

AE-MCP-003

Remote MCP servers must declare auth.

AE-SEC-002

No raw secrets in MCP config files.

CLI