MCP Hub
Back to servers

@itzfaisal/mcp-cli

Unified CLI to manage MCP servers across Claude Code, OpenCode, and more

npm1.3k/wk
Updated
May 3, 2026

Quick Install

npx -y @itzfaisal/mcp-cli

mcps

npx skills for MCP servers. A unified CLI to manage MCP (Model Context Protocol) servers across Claude Code, OpenCode, Cline, and VS Code — from one place.

Vision

npx skills made it trivial to discover and install agent skills from GitHub repos into any AI coding tool. mcps does the same for MCP servers — one command to find, add, and configure MCP servers across Claude Code, OpenCode, Cline, and beyond. No more manually hunting down config files and copy-pasting JSON. Just mcps add <server> and you're done.

Prerequisites

  • Node.js 18+ (ES2022 support required)
  • npm 9+
  • Claude Code, OpenCode, Cline, and/or VS Code installed (to actually use the managed servers)

Install

npm install -g @itzfaisal/mcp-cli

The mcps command is now available globally.

Install from source

git clone <repo-url> mcp-cli
cd mcp-cli
npm install
npm run build
npm link

Usage

List servers

mcps list                              # all servers across all tools and scopes
mcps list --tool claude                # only Claude Code servers
mcps list --tool vscode                # only VS Code servers
mcps list --scope project             # only project-level servers
mcps ls -t opencode -s user           # short alias + combined filters

Add a server

mcps add can auto-detect bundled MCP presets for known server names. When a preset exists, the interactive flow shows the discovered config and lets you:

  • use the preset as-is
  • edit the preset before saving
  • ignore it and enter the server manually

Preset matching is case-insensitive, and explicit non-interactive flags always win over any bundled preset.

Interactive (prompts for tool, scope, then uses a preset when available or falls back to manual transport/command/URL entry):

mcps add brave-search
mcps add github
mcps add consensus

Example preset flow:

$ mcps add github
Found preset for "github": http https://api.githubcopilot.com/mcp/ (Authorization=Bearer YOUR_GITHUB_PAT)
? Found an MCP configuration for "github". How would you like to continue?
  Use preset
  Edit preset
  Enter manually

Non-interactive (all flags provided, no prompts):

mcps add myserver -t claude -s user --transport stdio --command "npx -y my-server"
mcps add notion -t all -s user --transport http --url "https://mcp.notion.com/mcp"
mcps add github -t claude -s user --transport http --url "https://api.githubcopilot.com/mcp/" --header "Authorization=Bearer YOUR_GITHUB_PAT"
mcps add myserver -t opencode -s project --transport stdio --command "node server.js" -e API_KEY=xxx
mcps add playwright -t vscode -s project --transport stdio --command "npx -y @microsoft/mcp-server-playwright"

Options:

FlagDescription
-t, --tool <tool>claude, opencode, cline, vscode, or all
-s, --scope <scope>user (global) or project
--transport <type>stdio (local command) or http (remote URL)
--command <cmd>Command for stdio transport (e.g. "npx -y my-server")
--url <url>URL for http transport
-e, --env <pairs...>Environment variables (KEY=VALUE)
--header <pair>HTTP header for http transport; repeatable

Notes:

  • Presets are only used in interactive mode.
  • --env is only valid with stdio transport.
  • --header is only valid with http transport.

Copy a server

mcps copy brave-search                           # interactive wizard
mcps cp brave-search --tool opencode --scope user
mcps copy notion --tool claude --scope project --from-tool opencode --from-scope user
mcps cp myserver --tool all --scope user --force

Options:

FlagDescription
-t, --tool <tool>Target tool: claude, opencode, cline, vscode, or all
-s, --scope <scope>Target scope: user or project
--from-tool <tool>Source tool (disambiguate when server exists in multiple)
--from-scope <scope>Source scope (disambiguate when server exists in multiple)
-f, --forceOverwrite if server already exists at destination

Move a server

mcps move brave-search                           # interactive wizard
mcps mv brave-search --tool opencode --scope user
mcps move notion --tool claude --scope project --from-tool opencode --from-scope user
mcps mv myserver --tool all --scope user --force

Options:

FlagDescription
-t, --tool <tool>Target tool: claude, opencode, cline, vscode, or all
-s, --scope <scope>Target scope: user or project
--from-tool <tool>Source tool (disambiguate when server exists in multiple)
--from-scope <scope>Source scope (disambiguate when server exists in multiple)
-f, --forceOverwrite if server already exists at destination

Compare a server

mcps compare brave-search             # show where it is already configured
mcps compare                          # interactive selection in a TTY

compare checks the supported locations for one MCP server across Claude Code, OpenCode, Cline, and VS Code, then shows:

  • where the server is already configured
  • which supported tool/scope locations are still missing
  • ready-to-run mcps copy ... commands to fill in the missing locations

Remove a server

mcps rm brave-search                  # interactive confirmation
mcps rm brave-search -y               # skip confirmation
mcps rm notion -t claude -s project   # remove from specific tool/scope
mcps rm myserver --tool all --scope user -y

Config files managed

ToolUser scopeProject scope
Claude Code~/.claude.jsonmcpServers./.mcp.jsonmcpServers
OpenCode~/.config/opencode/opencode.jsonmcp./opencode.jsonmcp
Cline~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.jsonmcpServersN/A (user-scope only)
VS Code~/Library/Application Support/Code/User/mcp.json on macOS, ~/.config/Code/User/mcp.json on Linux, %APPDATA%/Code/User/mcp.json on Windows → servers./.vscode/mcp.jsonservers

Config files are never fully replaced — mcps reads, modifies only the relevant section, and writes back atomically, preserving all other fields.

Development

npm install          # install dependencies
npm run build        # compile TypeScript to dist/
npm run dev          # watch-mode compilation
npm test             # run all tests
npm run test:watch   # watch-mode tests
npm run test:coverage # coverage report (v8)

Running a single test

npx vitest run src/config/reader.test.ts
npx vitest run -t "writes stdio server"

CLI integration tests (src/cli.test.ts) run node dist/index.js via execSync — always build first: npm run build && npm test.

Architecture

src/
├── index.ts              # CLI entry point, Commander program setup
├── types.ts              # Universal MCP server model (McpServer, Transport, Scope, Tool)
├── commands/
│   ├── list.ts           # `mcps list` / `mcps ls`
│   ├── add.ts            # `mcps add`
│   ├── copy.ts           # `mcps copy` / `mcps cp`
│   ├── move.ts           # `mcps move` / `mcps mv`
│   ├── compare.ts        # `mcps compare`
│   └── remove.ts         # `mcps rm` / `mcps remove`
├── config/
│   ├── paths.ts          # Resolves config file paths per tool/scope
│   ├── reader.ts         # Reads and parses servers from all tool configs
│   └── writer.ts         # Read-modify-write for config files
└── translators/
    ├── claude-code.ts    # ↔ Claude Code format (command+args split, stdio|http|sse)
    ├── opencode.ts       # ↔ OpenCode format (command as array, local|remote, enabled)
    ├── cline.ts          # ↔ Cline format (command+args split, streamableHttp|sse, disabled)
    └── vscode.ts         # ↔ VS Code format (command+args split, http|sse, no disabled state)

License

MIT

Reviews

No reviews yet

Sign in to write a review