This file is automatically read by Claude Code on every session. Keep it updated as decisions are made. Last updated: 2026-03-28.
An open-source, CLI-first MCP package manager — "npm for MCP servers".
A registry where developers can search, install, audit, publish, and update MCP servers across all major clients (Claude Desktop, Cursor, VS Code, Windsurf) from a single tool.
npm package: @getmcpm/cli (v0.2.0) | bin command: mcpm | repo: github.com/getmcpm/cli | web UI: deferred to V1+
The MCP ecosystem has 5,800+ servers and 185M+ monthly SDK downloads, but:
- Servers are scattered across GitHub, npm, PyPI, and personal blogs
- No standardized validation — you don't know if a server works
- No security signals — 66% of servers have security findings (AgentSeal scan)
- No universal installer — each IDE uses different config formats
- No ratings, reviews, or community quality signals on any existing platform
- Discovery is word-of-mouth or Reddit threads
- 185M+ combined monthly SDK downloads (Anthropic figure)
- Python SDK: 161.5M monthly downloads on PyPI
- TypeScript SDK: ~24.5M monthly downloads on npm
- 36,864 npm projects depend on the TypeScript SDK
modelcontextprotocol/serversrepo: 76,000 GitHub stars- 5,800+ production-grade servers (873% growth in 8 months)
- Adopted by OpenAI, Microsoft, Google, AWS, Cloudflare, Bloomberg
- MCP donated to Linux Foundation's Agentic AI Foundation (AAIF) in Dec 2025
- AgentSeal: 66% of 1,808 scanned servers had security findings
- Astrix: 88% require credentials, 53% use insecure static secrets
- Cornell study: 5.5% of servers had tool-poisoning vulnerabilities
- Docker: 43% had command injection flaws
- Real incidents: Postmark MCP infostealer (1,643 downloads), RCE in
mcp-remoteaffecting 437,000+ downloads
- GitHub blog: "MCP servers scattered across numerous registries, random repos, buried in community threads"
- DEV.to: "Imagine if npm didn't exist... That's where MCP is right now"
- VS Code's Harald Kirschner: "copying around JSON blobs and hard-coding API keys"
- GitHub issues: silent MCP server failures with no helpful error messages
| Player | Strength | Weakness | Threat Level |
|---|---|---|---|
| Official MCP Registry | Authority, Anthropic-backed | Intentionally minimal, no UI, no curation | Low — they want us to build on top |
| Smithery.ai | CLI, hosted execution, 2,880+ servers | No security scanning, VC-backed centralization | Medium |
| mcp.so | Volume (19,075 servers) | Quality problems, duplicates, no CLI | Low |
| Glama.ai | Deduplication, basic scanning | Single-maintainer, no CLI | Low |
| PulseMCP | Best metadata enrichment, 12,870+ servers | No install tooling | Low |
| JFrog MCP Registry | Enterprise governance, security scanning | $532M company, enterprise pricing, not OSS | High (enterprise) |
| GitHub MCP Gallery | VS Code integration, curated | IDE-locked, Microsoft-controlled | Medium |
- Runlayer — $11M seed (Khosla + Felicis), MCP security gateway
- Alpic — €5.1M pre-seed (Partech), MCP-native cloud platform
- Manufact (mcp-use) — $6.3M YC S25, enterprise MCP infra
The official MCP Registry is intentionally a meta-registry — it stores metadata only, no UI, no curation, and explicitly invites "subregistries" to build on top. This is the green light we need.
Build the open-source, community-owned npm+npm_audit for MCP:
- CLI-first (search, install, audit, update, publish)
- Integrated security scanning in the publish pipeline
- Community quality signals (ratings, reviews — missing everywhere)
- Works across Claude Desktop, Cursor, VS Code, Windsurf
- OSS and community-owned — differentiated vs Smithery (VC) and JFrog (enterprise)
- Hosted execution (Smithery's lane)
- Enterprise governance/policy enforcement (JFrog's lane)
- A closed/VC-backed product
- Free public registry + CLI (loss leader, drives adoption)
- Private/enterprise registry with SSO + audit logs ($15–50/user/month)
- Premium security scanning as add-on
- Hosted MCP server execution (per-invocation billing) — V2
- Runtime: Node.js (>=20.0.0), TypeScript, ESM
- npm package:
@getmcpm/cli(bin command:mcpm) - CLI framework: Commander.js
- Schema validation: Zod (single source of truth for all types)
- Prompts: @inquirer/prompts (trust score UX, multi-select, confirmations)
- Output: chalk + cli-table3
- Local storage: JSON files in
~/.mcpm/(servers.json, scans.json, cache/) - Testing: Vitest + @vitest/coverage-v8 (80% line, 75% branch thresholds)
- Build: tsup (TypeScript → JS)
- MCP server:
mcpm serveexposes 9 tools via@modelcontextprotocol/sdk(stdio transport) - Commands:
mcpm search,mcpm install,mcpm list,mcpm remove,mcpm info,mcpm audit,mcpm update,mcpm doctor,mcpm init,mcpm import,mcpm serve,mcpm disable,mcpm enable,mcpm alias,mcpm completions,mcpm export,mcpm lock,mcpm up,mcpm diff
- Official MCP Registry:
registry.modelcontextprotocol.io— we consume this, not build our own - API version: v0.1 (v0 lacks search and version filter params)
- Search:
?search=<name>— substring match on server name only (no full-text) - Pagination: cursor-based, max 100 per page,
metadata.nextCursor - Key schema:
packages[]containsregistryType(npm/pypi/oci),environmentVariables[] - Metadata:
_meta.io.modelcontextprotocol.registry/officialhasstatus,publishedAt,isLatest
- Tier 1 (built-in, zero deps): Regex-based secrets detection (with NFKC normalization), prompt injection patterns in descriptions/titles/headers/runtimeArgs, typosquatting detection, exfil-shaped argument schemas, runtime arg allowlist validation
- Tier 2 (optional): Wraps MCP-Scan if installed (
npx @invariantlabs/mcp-scan) - Trust score: 0-100 (health check 30pts, static scan 40pts, external scanner 20pts, registry metadata 10pts, capped to 0 on critical/high findings). Green ≥80, Yellow 50-79, Red <50
When community quality signals require a backend (user reviews, aggregated telemetry):
- Framework: Fastify
- Database: PostgreSQL (SQLite schema designed to ease migration)
- Cache: Redis
- Search: Typesense
- Auth: JWT + OAuth 2.1 for publisher namespaces
- Artifacts: S3 + CloudFront
- Compute: AWS ECS (Fargate)
- Framework: Next.js
- Hosting: Vercel or ECS
- Design: Minimal, developer-focused (think registry.npmjs.com)
-
mcpm search <query>— search official MCP Registry, display with trust scores -
mcpm install <name>— resolve server, trust assessment, write config for Claude Desktop + Cursor + VS Code -
mcpm list— show installed servers across all clients -
mcpm remove <name>— remove from client configs -
mcpm info <name>— full server details -
mcpm audit— scan all installed servers, tabular trust report -
mcpm update— check for newer versions, re-scan -
mcpm doctor— check MCP setup health (clients, configs, runtimes) -
mcpm init <pack>— curated starter packs (developer, data, web) - Auto-detect and import existing MCP configs on first run
- Metadata-based trust assessment on every install (Tier 1 built-in + Tier 2 MCP-Scan)
- Rich trust score visualization (color bar, breakdown)
- Cross-IDE config management (Claude Desktop, Cursor, VS Code, Windsurf experimental)
- Config backup-before-write for safety
- Cross-platform paths (macOS, Linux, Windows)
- Published to npm as
@getmcpm/cli, bin commandmcpm - CI/CD: Node 20/22/24, SHA-pinned actions, npm provenance, Snyk integration
- Security: NFKC normalization, runtime arg allowlist, file permissions, CODEOWNERS
-
mcpm serve— mcpm as an MCP server over stdio, 8 tools withregisterToolAPI - Tools:
mcpm_search,mcpm_install,mcpm_info,mcpm_list,mcpm_remove,mcpm_audit,mcpm_doctor,mcpm_setup(composite NL-to-install) - MCP tool annotations:
readOnlyHinton read tools,destructiveHinton write tools -
mcpm_setupkeyword extraction + parallel search + trust-gated install - Publish mcpm's own MCP server to the official registry (live: io.github.getmcpm/cli)
- Health check tiers (config validation → process start → list_tools verification)
- Demo recording (asciinema: https://asciinema.org/a/Oua80yhXkjz071MP)
-
mcpm disable <name>— disable a server without removing it from config -
mcpm enable <name>— re-enable a previously disabled server -
mcpm alias— short aliases for long server names (stored in ~/.mcpm/aliases.json) -
mcpm completions <shell>— shell completion scripts for bash, zsh, fish -
mcpm listnow shows disabled/active status column -
disabledfield in McpServerEntry +setServerDisabledin ConfigAdapter - Shared toggle handler (deduplicated disable/enable logic)
- Strict alias validation (alphanumeric + hyphens, max 64 chars, prototype pollution guard)
- Client ID validation before unsafe casts
- Security hardening: tool path allowlist, health check sandboxing
-
mcpm export— dump installed servers to mcpm.yaml stack file format -
mcpm lock— resolve semver ranges from registry, trust assess, write mcpm-lock.yaml -
mcpm up— batch install from mcpm.yaml with trust policy enforcement -
mcpm diff— compare installed state vs declared state (colored output + --json) -
mcpm_upMCP server tool (destructiveHint: true) - Stack file Zod schemas (mcpm.yaml + mcpm-lock.yaml) with YAML parse/serialize
- Semver version resolution (caret + tilde ranges via
semverpackage) - Trust policy enforcement with normalized percentage comparison
- .env file parser for env var resolution (process.env → .env → default → prompt)
- Parallel registry resolution, sequential config writes
- Single .bak snapshot before batch writes
- Per-server error isolation (failures collected, others continue)
- URL server support (Cursor-only, warn for other clients)
- --dry-run, --ci, --profile, --strict, --yes flags on
mcpm up - --strict --ci requires --yes for unattended server removal
- Path traversal protection on mcpm_up MCP tool input
- Prototype poisoning protection in .env parser
- Shared isEnoent() utility extracted to src/utils/fs.ts
-
mcpm publish— submit to official registry with mandatory security scan gate - User ratings and reviews (requires backend)
- Verified publisher badge
- Usage stats (installs, active users)
- Optional anonymous telemetry
- Runtime proxy (mcpm-guard) — intercept tool calls, behavioral trust scores
- Private registry for orgs (SSO, audit logs, policy enforcement)
- Dependency graph (which servers compose well together)
- AI-generated docs (Claude reads source → writes human-friendly tool docs)
- Compatibility matrix (auto-tested)
- No universal installer — each IDE has different config format/location
- No
npm auditequivalent — no vulnerability DB for MCP servers - No quality signals — no ratings, reviews, or maturity indicators anywhere
- No offline browsability — tool schemas only discoverable by connecting to server
- No signed tool descriptions — enables rug-pull attacks after user approval
- No dependency resolution — users reference
@latestand discover breaks manually
- GitHub repo — the registry is the OSS project
- Seed with 100 hand-curated popular servers on day one
- Submit to Anthropic's MCP repo as a community resource
- Post: Hacker News, r/ClaudeAI, r/cursor, AI Discord servers
- Reach out to top 20 MCP server authors for early publisher partnerships
"We scanned 1,808 MCP servers and found 66% had security issues. We built the registry that npm never was for MCP — with security scanning built in from day one."
The first MCP server we build is a project context server for this codebase:
// mcp-project-context — tools:
get_architecture_doc(); // returns this CLAUDE.md
search_decisions(query); // semantic search over ADR log
add_decision_log(decision); // appends to DECISIONS.md
get_roadmap(); // returns current roadmap stateThis serves dual purpose: improves our own workflow with Claude Code, and proves the registry concept end-to-end before we launch publicly.
Developer / AI Agent
│
├── CLI (terminal) ├── MCP Server (stdio)
│ mcpm search/install/... │ mcpm serve
│ │ 9 tools via JSON-RPC
▼ ▼
mcpm core (Node.js, npm: @getmcpm/cli, bin: mcpm)
│
├── Registry ─────────► Official MCP Registry API (v0.1)
│ registry.modelcontextprotocol.io
│
├── Scanner ──────────► Trust Assessment (0-100)
│ ├── Tier 1 (built-in: secrets, injection, typosquatting)
│ └── Tier 2 (MCP-Scan, optional)
│
├── Config Adapters ──► Read/write per-client config (atomic + backup)
│ ├── Claude Desktop
│ ├── Cursor
│ ├── VS Code
│ └── Windsurf
│
└── ~/.mcpm/
├── servers.json (installed server registry)
├── aliases.json (short aliases for server names)
└── cache/ (registry response cache, 1hr TTL)
| Date | Decision | Rationale |
|---|---|---|
| 2026-03 | CLI-first over web-first | Developers live in terminal; npm succeeded this way |
| 2026-03 | OSS community-owned, not VC-backed | Differentiation vs Smithery; trust signal for security tool |
| 2026-03 | Build on top of official MCP Registry | They explicitly invite subregistries; no competition |
| 2026-03 | Node.js CLI (not Python) | TypeScript SDK has 3x more dependents; aligns with npm distribution |
| 2026-03-28 | npm package: @getmcpm/cli, bin: mcpm |
mcpm, mcpx, mcp-pm, mcpman all taken on npm |
| 2026-03-28 | Single package (not monorepo) | Only one consumer (CLI); extract registry client later if needed |
| 2026-03-28 | Registry API v0.1 (not v0) | v0.1 has search param and version filter |
| 2026-03-28 | JSON files, not SQLite for MVP | Zero native deps; better-sqlite3 needs node-gyp on some systems |
| 2026-03-28 | Metadata-based trust assessment (not source scan) | npx downloads at runtime, no pre-install artifact to scan |
| 2026-03-28 | Install-then-verify flow | No code runs pre-confirmation; health check is post-install |
| 2026-03-28 | Commander.js (not oclif) | Lighter, no plugin system needed for V1 |
| 2026-03-28 | @inquirer/prompts (not readline) | Security UX needs multi-select, confirm, styled trust score warnings |
| 2026-03-28 | No telemetry in V1 | Trust paradox: security tool shouldn't track users at launch |
| 2026-03-28 | Deferred Typesense/Fastify/PostgreSQL to V1+ | MVP is local-first; backend needed only when user reviews require it |
| 2026-03-30 | mcpm serve over stdio (not HTTP) |
Matches how Claude Desktop/Cursor/Claude Code consume MCP servers |
| 2026-03-30 | registerTool API with annotations |
destructiveHint on install/remove/setup, readOnlyHint on read ops |
| 2026-03-30 | No LLM in mcpm for mcpm_setup |
Calling agent handles NL understanding; mcpm does keyword extraction |
| 2026-03-30 | CI derives version from git tag | Single source of truth; no manual package.json version bumps |
| 2026-03-30 | Auto GitHub Release on publish | --generate-notes from commit history; grouped by label |
When helping with this project:
- We are building
mcpm— an open-source MCP package manager (npm:@getmcpm/cli) - Trust assessment is a core feature, not an afterthought
- We are OSS-first — avoid design decisions that require proprietary lock-in
- Check
docs/ARCHITECTURE.mdfor the detailed implementation plan - Check
TODOS.mdfor blockers and deferred work - The official MCP Registry API v0.1 is at
registry.modelcontextprotocol.io - V1 is local-first: no server infrastructure, JSON files in
~/.mcpm/ - Immutable data patterns: always return new objects, never mutate
- All config writes use atomic write-then-rename with backup-before-write
- Existing competitors: mcpm.sh, mcp-get, mcpman — we differentiate on trust assessment
Use the /browse skill from gstack for all web browsing. Never use mcp__claude-in-chrome__* tools.
Available gstack skills:
/office-hours, /plan-ceo-review, /plan-eng-review, /plan-design-review,
/design-consultation, /review, /ship, /land-and-deploy, /canary,
/benchmark, /browse, /qa, /qa-only, /design-review,
/setup-browser-cookies, /setup-deploy, /retro, /investigate,
/document-release, /codex, /cso, /careful, /freeze, /guard,
/unfreeze, /gstack-upgrade
If gstack skills aren't working, run cd .claude/skills/gstack && ./setup to build the binary and register skills.