Skip to content

Rule Reference

SEC329lintai-ai-securitystablejsonwarn

MCP config: mutable package runner

MCP configuration launches tooling through a mutable package runner

Provider
lintai-ai-security
Surface
json
Scope
per_file
Tier
stable
Severity
warn
Confidence
high
Detection
structural
Remediation
message_only

Activation Model

Preset Membership

This rule is part of the builtin activation graph through these preset memberships.

Lifecycle

Stable Lifecycle Contract

State

stable_gated

Graduation rationale

Checks committed MCP config command launchers for mutable package-runner forms such as npx, uvx, pnpm dlx, yarn dlx, and pipx run.

Deterministic signal basis

JsonSignals command/args analysis over ArtifactKind::McpConfig objects with launcher-specific argument gating.

Malicious corpus
mcp-mutable-launcher
Benign corpus
mcp-pinned-launcher-safe
structured evidence required remediation reviewed
Canonical note

Structural stable rule intended as a high-precision check with deterministic evidence.

Nearby Signals

Related Rules

Why It Matters

Committed MCP configs are executable setup, not just prose. Launching a server through npx, uvx, pnpm dlx, yarn dlx, or pipx run makes that execution path depend on mutable package resolution instead of a vendored, pinned, or otherwise reproducible command.

What Triggers

SEC329 applies to committed MCP configuration JSON and triggers when command/args analysis finds a mutable package-runner launcher such as:

  • npx
  • uvx
  • pnpm dlx
  • yarn dlx
  • pipx run

Examples that trigger:

json
{"command":"npx","args":["@cloudbase/cloudbase-mcp@latest"]}
json
{"command":"uvx","args":["demo-mcp"]}

Examples that stay clean:

json
{"command":"./scripts/run-mcp.sh","args":[]}
json
{"command":"node","args":["./vendor/mcp-server/index.js"]}

False Positives

False positives should be low because the detector is structural and gated on parsed MCP config. The practical tradeoff is not “did the pattern exist”, but whether a team intentionally accepts mutable launcher convenience in committed config. The rule stays useful because it points at real execution posture, not generic documentation advice.

Remediation

Replace the mutable launcher with a vendored script, a pinned local binary path, or another reproducible execution path that does not resolve packages dynamically at runtime.