Skip to content

Latest commit

 

History

History
243 lines (198 loc) · 12.5 KB

README.md

File metadata and controls

243 lines (198 loc) · 12.5 KB

mcpm — MCP security guard and package manager

mcpm — MCP security guard and package manager

Assess MCP servers before installing, verify supply-chain records, and inspect wrapped stdio traffic for known attack patterns on your machine. mcpm combines client configuration, trust evidence, tool-definition drift detection and an opt-in macOS confinement profile in one CLI.

npm version license tests

The default assessment and guard path is deterministic and local: no account, model subscription, mcpm backend or telemetry. Registry resolution and package record checks contact the public MCP registry and npm; server launchers may fetch packages independently. An external scanner runs only if you explicitly name an already-installed executable.

mcpm CLI demonstration

Visit the project homepage, or preview and deploy it locally.

Quick start

Requires Node ^22.22.2 || ^24.15.0 || >=26.0.0: Node 22.22.2+, 24.15.0+ or 26+. Other versions, including 23 and 25, are outside the supported range.

npm install -g @getmcpm/cli
mcpm search filesystem
mcpm info io.github.domdomegg/filesystem-mcp
mcpm why io.github.domdomegg/filesystem-mcp
mcpm install io.github.domdomegg/filesystem-mcp

Search shows registry lifecycle status; info and why explain computed trust. Review the findings and checks that did not run before accepting an installation. The install command writes client configuration; it does not automatically enroll the server in runtime protection. Registry names and available versions can change.

mcpm guard enable --dry-run
mcpm guard enable
# Restart the affected MCP server in your client to load the wrapper.
mcpm guard status

Use --client <name> or --server <name> to narrow enrollment. Status reports recognized configuration and pin state; it does not prove your client loaded that configuration. New servers start with first-session pinning pending.

The relay supports stdio only. HTTP/SSE servers have no runtime inspection; explicit --allow-unguarded consent records that absence, without adding protection. Warnings forward the original traffic; blocks substitute an error. Optional guard enable --confine adds bounded macOS process restrictions; network-enabled launchers can still send accessible data, including configured credentials. See guard coverage and confinement.

The binary is mcpm; the package is @getmcpm/cli. The Homebrew formula mcpm belongs to a different project. Use this scoped npm package or the pnpm, npx and mise alternatives.

What it does

Task Evidence or behavior
Assess before installation Metadata patterns for secrets, injection and suspicious package/schema shapes, with score components and unrun checks
Lock and verify Package-version records, integrity and applicable Sigstore build-identity baselines; client-free CI verification
Guard MCP traffic Explicit stdio wrapping, field-scoped patterns, first-observation tool pins, drift checks and policy-controlled actions
Manage client configuration Detect, install, import, enable/disable and compare definitions across six client adapters
Inventory project exposure Read-only scope source/instruction metadata: Claude Code default, explicit VS Code/Copilot selector
Review local artifact changes Experimental archive-only skill/plugin snapshot comparison with byte/declaration coverage and unknown host state

These operations answer different questions. An install-time metadata assessment does not execute the server or audit its source. A complete inventory does not establish active selection. A matching lock does not establish safe behavior.

Security boundaries and evidence

A trust score is a signal about available evidence, not a safety probability. Search listing is not publisher verification. Current assessment commands do not run health checks; an unavailable external scanner does not earn a clean pass. See score math, scanner protocol and safety floors.

Tool pins use trust on first observation (TOFU) at runtime, not approval at install. Initial malicious definitions can become the baseline. Field-level comparison warns on description-only changes and blocks schema/annotation changes; unannounced same-session changes and older coarse pins can also block. Pattern findings can independently block. Review the actual upgrade before accepting drift; do not automatically re-pin merely to clear a refusal.

The guard inspects supported JSON-RPC carriers, not every action a server takes. Unknown embedded request shapes produce coverage warnings; binary media, external schema references and fetched archives are outside complete inspection. Retrieved resource/prompt text has warn-and-forward limits. A response block cannot undo server-side effects that already happened. See the carrier matrix and signature catalog.

Confinement is opt-in and macOS-only. Its standard profile denies selected secret paths and restricts writes, with launcher-dependent network access. It is not general exfiltration prevention or an agent-wide sandbox. Backend absence can produce an explicit unconfined launch for non-required enrollment; required and integrity failures have separate refusal rules. See the precise confinement conditions.

Sigstore verification authenticates build identity, not safe code. Integrity checks compare published package records; mcpm does not intercept the bytes a package manager downloads at server launch. Unkeyed local integrity sidecars detect corruption but cannot authenticate against a same-user writer who can rewrite both files.

The public mcp-guardbench contains versioned results and known misses measured through published guard inspect binaries. Those stateless runtime results do not measure install-time detection prevalence or promise coverage of unseen attacks. The v0.53.0 release record retains the published artifact, compatibility and synchronized companion evidence.

Common workflows

Goal Start here
Explain one candidate mcpm why <name>
Review installed configuration and findings mcpm list, mcpm doctor, mcpm audit (coverage report: --report-json)
Find available updates mcpm outdated
Compare clients mcpm sync --check
Start a project stack mcpm init, edit mcpm.yaml, then mcpm lock
Install a reviewed stack with frozen checks mcpm up --frozen
Check a committed lock in CI mcpm verify --json
Inspect captured MCP frames without a server mcpm guard inspect frames.ndjson --json
Inventory a project mcpm scope /path/to/project --json
Inventory fixed VS Code/Copilot sources mcpm scope /path/to/project --client vscode --json
Compare local skill snapshots mcpm review-artifacts before.tar after.tar --profile agent-skills-2026-11-06 --json

init scaffolds an empty stack; it does not install curated starter packs. To share an existing setup, mcpm export > mcpm.yaml, review the declaration, then lock it. Locks distinguish MCP publication versions from actual package versions; OCI tags remain mutable. See stack examples and the command index and use mcpm <command> --help for flags.

For CI, use the verification Action. Pin its source and executed CLI version separately. Verification checks lock coverage as well as applicable integrity/provenance baselines; unknown or unenforceable coverage must remain visible. audit --sarif provides a separate report for GitHub code scanning. Exit codes and JSON are documented in contracts.

When a guard block fires, read its signature and remediation. A legitimate upgrade may need explicit accept-drift with the reported hash; a false positive may need a scoped policy override. Blocks/warnings are recorded in ~/.mcpm/guard-events.jsonl. Pause and mute changes are startup snapshots: restart the affected server to load changes or resume after a pause expires. See guard commands and policy.

Supported clients

Adapter Managed configuration scope
Claude Desktop Native user configuration
Claude Code User-global mcpServers in ~/.claude.json
Cursor User-global ~/.cursor/mcp.json
VS Code User MCP configuration, including JSONC comments/trailing commas
Windsurf User-global MCP configuration
Gemini CLI User-global ~/.gemini/settings.json

macOS, Linux and Windows paths are supported by the adapters. Run mcpm doctor for detected configurations. Portable/workspace and Copilot Agent Host paths are not managed by those adapters; the read-only scope inventory has its own fixed coverage. Unreadable configuration is not evidence of an empty or healthy setup.

Adapter support and native proof are separate. Pinned disposable-client runs cover named VS Code/Claude Code paths, with separate Cursor and Gemini evidence; they do not establish all clients/platforms or live-model behavior. Cursor/Gemini disable parks managed definitions for future discovery; it does not stop running peers or override project-local/native exclusion state. See native scope and platform limits, Cursor and Gemini.

Agent use

mcpm serve exposes search, info, install, list, remove, audit, doctor, setup and up through stdio MCP. For clients using an mcpServers configuration map:

{
  "mcpServers": {
    "mcpm": {
      "command": "npx",
      "args": ["-y", "@getmcpm/cli@0.53.0", "serve"]
    }
  }
}

Other clients use their native schema. This pins the executed CLI; review updates explicitly. Restart your client after adding the configuration, then ask:

Find filesystem MCP servers. Explain findings, lifecycle status and checks that did not run. Show proposed configuration changes before installing.

Prefer versioned structured evidence, retaining unsupported schema versions, unrun checks and incomplete coverage as unknown. A successful MCP transport is not proof that every check passed. Served mutation tools retain trust floors; CLI-only scope and review-artifacts are separate inspection surfaces. See agent workflows and contracts.

The portable mcpm usage skill is self-contained. Copy its folder from a reviewed, pinned repository checkout into your host's skill directory. npm ships the CLI, not that skill. It adds no hooks, scripts or tool grants; discovery, permissions and model compliance depend on the host.

Agent lifecycle hooks cover a different boundary from MCP wire inspection. Command hooks can also be local and deterministic; some host hooks can deny or modify tool calls, while post-action hooks cannot undo completed effects. See relay, confinement and hook comparison for host coverage, failure limits and the bounded native experiments.

Documentation and contribution

Use the task-oriented docs index for security references, consumer guides, contribution/release workflows and dated evidence. Current selected work lives in BACKLOG; older roadmaps retain historical planning context.

For source setup and appropriate checks, read CONTRIBUTING. Contributor instructions/skills are repo-owned and separate from the distributed usage skill. Security findings should go through private vulnerability reporting; scanner false-positive/negative reports can use ordinary GitHub issues. See SECURITY for the reporting policy.

MIT license.