mcpick 0.0.19 → 0.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +26 -0
- package/CHANGELOG.md +14 -0
- package/LICENSE +21 -0
- package/README.md +127 -306
- package/dist/{add-B9nVyh8T.js → add-BDyaBew0.js} +2 -2
- package/dist/{add-json-CXNDl3al.js → add-json-BjgzdeG-.js} +2 -2
- package/dist/{claude-cli-BeA-bmoW.js → claude-cli-DnmBJrjg.js} +97 -46
- package/dist/{cli-DNNZjJYL.js → cli-CsFfnWBo.js} +11 -11
- package/dist/{clone-DLFLewBY.js → clone-DYKPEsar.js} +2 -2
- package/dist/{disable-BA8tXPJN.js → disable-xJXZfUR_.js} +2 -2
- package/dist/{enable-Bdnnn_Cq.js → enable-RrpcN6la.js} +2 -2
- package/dist/{get-BPjMXTMc.js → get-Bb1eOOIZ.js} +2 -2
- package/dist/index.js +24 -22
- package/dist/{marketplace-Br89Tg-Z.js → marketplace-DcKk5dc1.js} +2 -2
- package/dist/{plugins-DHYJF5CP.js → plugins-Dc7DN6R_.js} +2 -2
- package/dist/{remove-DIPWYMpk.js → remove-D1owHLhG.js} +2 -2
- package/dist/{reset-project-choices-DRM5KByw.js → reset-project-choices-BfRSNN3m.js} +2 -2
- package/package.json +6 -6
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v6
|
|
14
|
+
|
|
15
|
+
- uses: pnpm/action-setup@v6
|
|
16
|
+
|
|
17
|
+
- uses: actions/setup-node@v6
|
|
18
|
+
with:
|
|
19
|
+
node-version-file: package.json
|
|
20
|
+
cache: pnpm
|
|
21
|
+
|
|
22
|
+
- run: pnpm install --frozen-lockfile
|
|
23
|
+
|
|
24
|
+
- run: pnpm run build
|
|
25
|
+
|
|
26
|
+
- run: pnpm run test
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# mcpick
|
|
2
2
|
|
|
3
|
+
## 0.0.21
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 47e40be: chore: reorder TUI menu and update README for agent-first usage
|
|
8
|
+
|
|
9
|
+
## 0.0.20
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 00ea930: chore: add unit tests and CI workflow with GitHub Actions
|
|
14
|
+
- 37a62e1: feat: auto-show help instead of TUI in non-TTY environments for LLM agents
|
|
15
|
+
- fc1db54: fix: replace exec with execFile to eliminate shell injection on all platforms
|
|
16
|
+
|
|
3
17
|
## 0.0.19
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Scott Spence
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,366 +1,187 @@
|
|
|
1
1
|
# McPick
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
caches, and optimise context usage and performance.
|
|
3
|
+
[](https://viteplus.dev)
|
|
4
|
+
[](https://vitest.dev)
|
|
6
5
|
|
|
7
|
-
|
|
6
|
+
Claude Code extension manager — MCP servers, plugins (skills, hooks,
|
|
7
|
+
agents), and marketplaces.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Quick Start
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
pnpx mcpick
|
|
13
|
-
# or
|
|
14
|
-
pnpm dlx mcpick
|
|
15
|
-
# or
|
|
16
|
-
npx mcpick
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Global Installation
|
|
11
|
+
Use mcpick inline in Claude Code sessions. Tell Claude:
|
|
20
12
|
|
|
21
|
-
```bash
|
|
22
|
-
pnpm install -g mcpick
|
|
23
|
-
# or
|
|
24
|
-
npm install -g mcpick
|
|
25
13
|
```
|
|
26
|
-
|
|
27
|
-
## The Problem
|
|
28
|
-
|
|
29
|
-
Using the Claude Code `/doctor` command you may see something like
|
|
30
|
-
this if you have many MCP servers configured:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
Context Usage Warnings
|
|
34
|
-
└ ⚠ Large MCP tools context (~66,687 tokens > 25,000)
|
|
35
|
-
└ MCP servers:
|
|
36
|
-
└ mcp-omnisearch-testing: 20 tools (~10,494 tokens)
|
|
37
|
-
└ mcp-omnisearch: 20 tools (~10,454 tokens)
|
|
38
|
-
└ mcp-sqlite-tools-testing: 19 tools (~9,910 tokens)
|
|
39
|
-
└ mcp-sqlite-tools: 19 tools (~9,872 tokens)
|
|
40
|
-
└ playwright: 21 tools (~9,804 tokens)
|
|
41
|
-
└ (7 more servers)
|
|
14
|
+
Use npx mcpick to add the marketplace at spences10/claude-code-toolkit
|
|
42
15
|
```
|
|
43
16
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
- 🐌 Slower Claude Code startup times
|
|
49
|
-
- 💾 High context token usage
|
|
50
|
-
- 🧠 Cognitive overload from too many available tools
|
|
51
|
-
|
|
52
|
-
## The Solution
|
|
53
|
-
|
|
54
|
-
McPick provides an intuitive CLI menu and non-interactive subcommands
|
|
55
|
-
to:
|
|
56
|
-
|
|
57
|
-
- ✅ **Toggle servers on/off** - Enable only the MCP servers you need
|
|
58
|
-
for your current task
|
|
59
|
-
- 🔌 **Toggle plugins on/off** - Enable or disable Claude Code
|
|
60
|
-
marketplace plugins
|
|
61
|
-
- 🗑️ **Manage plugin cache** - Detect stale plugins, clear caches,
|
|
62
|
-
clean orphaned versions, refresh marketplaces
|
|
63
|
-
- 📁 **Manage server registry** - Keep a database of all your
|
|
64
|
-
available MCP servers
|
|
65
|
-
- 🔄 **Safe configuration** - Only modifies the `mcpServers` section,
|
|
66
|
-
preserving other Claude Code settings
|
|
67
|
-
- 💾 **Backup & restore** - Create focused backups of your MCP server
|
|
68
|
-
configurations
|
|
69
|
-
|
|
70
|
-
## Features
|
|
71
|
-
|
|
72
|
-
### Interactive Menu
|
|
17
|
+
```
|
|
18
|
+
Use npx mcpick to list my plugins and disable the ones I'm not using
|
|
19
|
+
```
|
|
73
20
|
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
│
|
|
77
|
-
◆ What would you like to do?
|
|
78
|
-
│ ● Enable / Disable MCP servers (Toggle MCP servers on/off)
|
|
79
|
-
│ ○ Enable / Disable plugins (Toggle Claude Code plugins on/off)
|
|
80
|
-
│ ○ Manage plugin cache (View, clear, or refresh plugin caches)
|
|
81
|
-
│ ○ Backup config
|
|
82
|
-
│ ○ Add MCP server
|
|
83
|
-
│ ○ Restore from backup
|
|
84
|
-
│ ○ Load profile
|
|
85
|
-
│ ○ Save profile
|
|
86
|
-
│ ○ Exit
|
|
87
|
-
└
|
|
21
|
+
```
|
|
22
|
+
Use npx mcpick to enable only the mcp-sqlite-tools server
|
|
88
23
|
```
|
|
89
24
|
|
|
90
|
-
|
|
25
|
+
McPick auto-detects non-TTY environments and shows structured help
|
|
26
|
+
instead of launching the interactive TUI — so LLM agents can read
|
|
27
|
+
`npx mcpick --help` and figure out the rest.
|
|
91
28
|
|
|
92
|
-
|
|
29
|
+
## Concepts
|
|
93
30
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
| **Local** | Project-specific servers (default) | `~/.claude.json` → `projects[cwd].mcpServers` |
|
|
97
|
-
| **Project** | Shared via `.mcp.json` in repository | `.mcp.json` in project root |
|
|
98
|
-
| **User** | Global servers for all projects | `~/.claude.json` → `mcpServers` |
|
|
31
|
+
Marketplaces contain plugins. Plugins contain skills
|
|
32
|
+
(`/slash-commands`), hooks, agents, and MCP servers.
|
|
99
33
|
|
|
100
|
-
|
|
34
|
+
```
|
|
35
|
+
Marketplace → Plugin → Skills, Hooks, Agents, MCP Servers
|
|
36
|
+
```
|
|
101
37
|
|
|
102
|
-
|
|
103
|
-
2. Show servers already enabled for that scope (pre-checked)
|
|
104
|
-
3. Use `claude mcp add/remove` CLI commands for Local and Project
|
|
105
|
-
scopes
|
|
38
|
+
## Common Workflows
|
|
106
39
|
|
|
107
|
-
|
|
108
|
-
right configuration location.
|
|
40
|
+
### Install skills from a marketplace
|
|
109
41
|
|
|
110
|
-
|
|
42
|
+
```bash
|
|
43
|
+
# 1. Add the marketplace
|
|
44
|
+
npx mcpick marketplace add spences10/claude-code-toolkit
|
|
111
45
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
- **Registry sync**: Maintains a registry of available servers for
|
|
115
|
-
quick selection
|
|
116
|
-
- **Selective enabling**: Choose exactly which servers to enable via
|
|
117
|
-
multiselect
|
|
118
|
-
- **Configuration safety**: Preserves all non-MCP settings in your
|
|
119
|
-
Claude Code config
|
|
46
|
+
# 2. Install a plugin from it
|
|
47
|
+
npx mcpick plugins install my-plugin@claude-code-toolkit
|
|
120
48
|
|
|
121
|
-
|
|
49
|
+
# 3. Skills are now available as /slash-commands in Claude Code
|
|
50
|
+
```
|
|
122
51
|
|
|
123
|
-
|
|
124
|
-
the entire 30k+ line config)
|
|
125
|
-
- **Automatic cleanup**: Keeps last 10 backups to prevent storage
|
|
126
|
-
bloat
|
|
127
|
-
- **Easy restoration**: Restore from any previous backup with a simple
|
|
128
|
-
menu
|
|
52
|
+
Marketplace sources can be:
|
|
129
53
|
|
|
130
|
-
|
|
54
|
+
- `owner/repo` — GitHub shorthand
|
|
55
|
+
- `https://github.com/owner/repo` — full URL
|
|
56
|
+
- `./local-path` — local directory
|
|
131
57
|
|
|
132
|
-
|
|
58
|
+
### Toggle MCP servers
|
|
133
59
|
|
|
134
60
|
```bash
|
|
135
|
-
#
|
|
136
|
-
mcpick
|
|
137
|
-
mcpick
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
mcpick --save-profile mysetup
|
|
141
|
-
mcpick -s mysetup
|
|
142
|
-
|
|
143
|
-
# List available profiles
|
|
144
|
-
mcpick --list-profiles
|
|
145
|
-
mcpick -l
|
|
61
|
+
npx mcpick list # List servers and status
|
|
62
|
+
npx mcpick enable <server> # Enable a server
|
|
63
|
+
npx mcpick disable <server> # Disable a server
|
|
64
|
+
npx mcpick add --name <n> ... # Add a new server
|
|
65
|
+
npx mcpick remove <server> # Remove a server
|
|
146
66
|
```
|
|
147
67
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
"args": ["-y", "mcp-sqlite-tools"]
|
|
158
|
-
}
|
|
159
|
-
}
|
|
68
|
+
### Manage plugins
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npx mcpick plugins list # List plugins and status
|
|
72
|
+
npx mcpick plugins install <key> # Install from marketplace
|
|
73
|
+
npx mcpick plugins uninstall <key> # Remove plugin
|
|
74
|
+
npx mcpick plugins update <key> # Update to latest
|
|
75
|
+
npx mcpick plugins enable <key> # Enable plugin
|
|
76
|
+
npx mcpick plugins disable <key> # Disable plugin
|
|
160
77
|
```
|
|
161
78
|
|
|
162
|
-
|
|
79
|
+
### Manage marketplaces
|
|
163
80
|
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
81
|
+
```bash
|
|
82
|
+
npx mcpick marketplace list # List configured marketplaces
|
|
83
|
+
npx mcpick marketplace add <src> # Add a marketplace
|
|
84
|
+
npx mcpick marketplace remove <n> # Remove a marketplace
|
|
85
|
+
npx mcpick marketplace update # Update all marketplaces
|
|
170
86
|
```
|
|
171
87
|
|
|
172
|
-
###
|
|
88
|
+
### Manage hooks
|
|
173
89
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
90
|
+
```bash
|
|
91
|
+
npx mcpick hooks list # List all hooks
|
|
92
|
+
npx mcpick hooks add # Add a settings hook
|
|
93
|
+
npx mcpick hooks remove # Remove a hook
|
|
94
|
+
```
|
|
177
95
|
|
|
178
|
-
|
|
96
|
+
### Plugin cache
|
|
179
97
|
|
|
180
|
-
|
|
98
|
+
```bash
|
|
99
|
+
npx mcpick cache status # Show staleness info
|
|
100
|
+
npx mcpick cache clear [key] # Clear plugin cache
|
|
101
|
+
npx mcpick cache clean-orphaned # Remove orphaned dirs
|
|
102
|
+
npx mcpick cache refresh # Git pull marketplaces
|
|
103
|
+
```
|
|
181
104
|
|
|
182
|
-
|
|
183
|
-
indicators (version mismatch, commits behind, orphaned versions)
|
|
184
|
-
- **Clear plugin caches** - Refreshes the marketplace and clears
|
|
185
|
-
selected caches so they rebuild with the latest version
|
|
186
|
-
- **Clean orphaned versions** - Remove old version directories marked
|
|
187
|
-
as orphaned
|
|
188
|
-
- **Refresh marketplaces** - Git pull all marketplace clones to get
|
|
189
|
-
latest plugin listings
|
|
105
|
+
### Profiles
|
|
190
106
|
|
|
191
|
-
|
|
107
|
+
Switch between server/plugin configurations instantly:
|
|
192
108
|
|
|
193
109
|
```bash
|
|
194
|
-
|
|
195
|
-
npx mcpick
|
|
196
|
-
npx mcpick
|
|
197
|
-
|
|
198
|
-
# Clear a specific plugin cache (refreshes marketplace first)
|
|
199
|
-
npx mcpick cache clear plugin-name@marketplace
|
|
200
|
-
npx mcpick cache clear --all
|
|
110
|
+
npx mcpick --profile database # Apply a profile
|
|
111
|
+
npx mcpick --save-profile mysetup # Save current config
|
|
112
|
+
npx mcpick --list-profiles # List profiles
|
|
113
|
+
```
|
|
201
114
|
|
|
202
|
-
|
|
203
|
-
npx mcpick cache clean-orphaned
|
|
115
|
+
### Backups
|
|
204
116
|
|
|
205
|
-
|
|
206
|
-
npx mcpick
|
|
117
|
+
```bash
|
|
118
|
+
npx mcpick backup # Create timestamped backup
|
|
119
|
+
npx mcpick restore [file] # Restore from backup
|
|
207
120
|
```
|
|
208
121
|
|
|
209
|
-
|
|
122
|
+
All commands support `--json` for machine-readable output.
|
|
210
123
|
|
|
211
|
-
|
|
124
|
+
## Interactive TUI
|
|
212
125
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
npx mcpick plugins list
|
|
216
|
-
npx mcpick plugins list --json
|
|
126
|
+
Running `npx mcpick` in a terminal (TTY) launches the interactive
|
|
127
|
+
menu for human use:
|
|
217
128
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
129
|
+
```
|
|
130
|
+
┌ MCPick - Claude Code Extension Manager
|
|
131
|
+
│
|
|
132
|
+
◆ What would you like to do?
|
|
133
|
+
│ ● Enable / Disable MCP servers
|
|
134
|
+
│ ○ Manage plugins
|
|
135
|
+
│ ○ Manage marketplaces
|
|
136
|
+
│ ○ Manage hooks
|
|
137
|
+
│ ○ Manage plugin cache
|
|
138
|
+
│ ○ Backup config
|
|
139
|
+
│ ○ Add MCP server
|
|
140
|
+
│ ○ Restore from backup
|
|
141
|
+
│ ○ Load profile
|
|
142
|
+
│ ○ Save profile
|
|
143
|
+
│ ○ Exit
|
|
144
|
+
└
|
|
145
|
+
```
|
|
221
146
|
|
|
222
|
-
|
|
223
|
-
|
|
147
|
+
In non-TTY environments (LLM agents, piped output), mcpick
|
|
148
|
+
automatically shows `--help` instead.
|
|
224
149
|
|
|
225
|
-
|
|
226
|
-
npx mcpick plugins enable plugin-name@marketplace
|
|
227
|
-
npx mcpick plugins disable plugin-name@marketplace
|
|
228
|
-
```
|
|
150
|
+
## The Problem
|
|
229
151
|
|
|
230
|
-
|
|
231
|
-
|
|
152
|
+
Claude Code loads **all** MCP servers at startup. With many servers
|
|
153
|
+
configured, `/doctor` shows:
|
|
232
154
|
|
|
233
|
-
|
|
155
|
+
```
|
|
156
|
+
Context Usage Warnings
|
|
157
|
+
└ ⚠ Large MCP tools context (~66,687 tokens > 25,000)
|
|
158
|
+
```
|
|
234
159
|
|
|
235
|
-
|
|
236
|
-
|
|
160
|
+
This means slower startup, wasted context tokens, and cognitive
|
|
161
|
+
overload from too many tools. McPick lets you toggle servers on/off so
|
|
162
|
+
you only load what you need.
|
|
237
163
|
|
|
238
|
-
|
|
239
|
-
# MCP server management
|
|
240
|
-
npx mcpick list # List servers
|
|
241
|
-
npx mcpick enable <server> # Enable a server
|
|
242
|
-
npx mcpick disable <server> # Disable a server
|
|
243
|
-
npx mcpick add --name <n> ... # Add a server
|
|
244
|
-
npx mcpick remove <server> # Remove a server
|
|
245
|
-
|
|
246
|
-
# Backups and profiles
|
|
247
|
-
npx mcpick backup # Create backup
|
|
248
|
-
npx mcpick restore [file] # Restore from backup
|
|
249
|
-
npx mcpick profile list # List profiles
|
|
250
|
-
npx mcpick profile load <name> # Load a profile
|
|
251
|
-
npx mcpick profile save <name> # Save current config
|
|
252
|
-
|
|
253
|
-
# Plugin management
|
|
254
|
-
npx mcpick plugins list # List plugins
|
|
255
|
-
npx mcpick plugins enable <key> # Enable plugin
|
|
256
|
-
npx mcpick plugins disable <key> # Disable plugin
|
|
257
|
-
npx mcpick plugins install <key> # Install from marketplace
|
|
258
|
-
npx mcpick plugins uninstall <key> # Remove plugin
|
|
259
|
-
npx mcpick plugins update <key> # Update to latest version
|
|
164
|
+
## Scope Support
|
|
260
165
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
```
|
|
166
|
+
| Scope | Description | Storage Location |
|
|
167
|
+
| ----------- | ---------------------------------- | --------------------------------------------- |
|
|
168
|
+
| **Local** | Project-specific servers (default) | `~/.claude.json` → `projects[cwd].mcpServers` |
|
|
169
|
+
| **Project** | Shared via `.mcp.json` in repo | `.mcp.json` in project root |
|
|
170
|
+
| **User** | Global servers for all projects | `~/.claude.json` → `mcpServers` |
|
|
267
171
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
### Typical Workflow
|
|
271
|
-
|
|
272
|
-
1. **Before a coding session**: Run `mcpick -p <profile>` or use the
|
|
273
|
-
interactive menu to enable relevant servers
|
|
274
|
-
2. **Launch Claude Code**: Run `claude` to start with your configured
|
|
275
|
-
servers
|
|
276
|
-
3. **Switch contexts**: Run `mcpick -p <other-profile>` to quickly
|
|
277
|
-
switch server sets
|
|
278
|
-
|
|
279
|
-
### Adding New Servers
|
|
280
|
-
|
|
281
|
-
1. Select "Add MCP server"
|
|
282
|
-
2. Provide server details:
|
|
283
|
-
- Name (e.g., "mcp-sqlite-tools")
|
|
284
|
-
- Command (e.g., "npx")
|
|
285
|
-
- Arguments (e.g., "-y", "mcp-sqlite-tools")
|
|
286
|
-
- Description (optional)
|
|
287
|
-
- Environment variables (optional)
|
|
288
|
-
|
|
289
|
-
## Configuration
|
|
290
|
-
|
|
291
|
-
MCPick works with the standard Claude Code configuration format:
|
|
292
|
-
|
|
293
|
-
```json
|
|
294
|
-
{
|
|
295
|
-
"mcpServers": {
|
|
296
|
-
"server-name": {
|
|
297
|
-
"command": "npx",
|
|
298
|
-
"args": ["-y", "mcp-server-package"],
|
|
299
|
-
"env": {
|
|
300
|
-
"API_KEY": "your-key"
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
```
|
|
172
|
+
## File Locations
|
|
306
173
|
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
- **Profiles**: `~/.claude/mcpick/profiles/` (predefined server sets)
|
|
317
|
-
- **Plugin Cache**: `~/.claude/plugins/cache/` (cached plugin files)
|
|
318
|
-
- **Installed Plugins**: `~/.claude/plugins/installed_plugins.json`
|
|
319
|
-
(plugin install registry)
|
|
320
|
-
- **Marketplaces**: `~/.claude/plugins/marketplaces/` (marketplace git
|
|
321
|
-
clones)
|
|
322
|
-
|
|
323
|
-
#### MCP Server Storage by Scope
|
|
324
|
-
|
|
325
|
-
| Scope | Location | Use Case |
|
|
326
|
-
| ------- | ------------------------------------------------------------ | ---------------------------------- |
|
|
327
|
-
| Local | `~/.claude.json` → `projects["/path/to/project"].mcpServers` | Personal project config |
|
|
328
|
-
| Project | `.mcp.json` in project root | Shared team config (commit to git) |
|
|
329
|
-
| User | `~/.claude.json` → `mcpServers` | Global servers for all projects |
|
|
330
|
-
|
|
331
|
-
> **Note**: MCPick automatically detects servers in parent
|
|
332
|
-
> directories. If you have local servers configured at
|
|
333
|
-
> `/Users/you/projects` and run MCPick from
|
|
334
|
-
> `/Users/you/projects/myapp`, it will find and display them.
|
|
335
|
-
|
|
336
|
-
## Safety Features
|
|
337
|
-
|
|
338
|
-
- **Non-destructive**: Only modifies the `mcpServers` section of your
|
|
339
|
-
Claude Code config
|
|
340
|
-
- **Backup integration**: Automatically creates backups before major
|
|
341
|
-
changes
|
|
342
|
-
- **Validation**: Ensures all server configurations are valid before
|
|
343
|
-
writing
|
|
344
|
-
- **Error handling**: Graceful failure modes with helpful error
|
|
345
|
-
messages
|
|
346
|
-
|
|
347
|
-
## Future Features
|
|
348
|
-
|
|
349
|
-
McPick is actively being developed with new features planned. See the
|
|
350
|
-
[roadmap](./docs/ROADMAP.md) for details on:
|
|
351
|
-
|
|
352
|
-
- **Settings Validation** - Validate your Claude Code settings files
|
|
353
|
-
using the
|
|
354
|
-
[claude-code-settings-schema](https://github.com/spences10/claude-code-settings-schema)
|
|
355
|
-
- **Permissions Management** - Interactive tool permission
|
|
356
|
-
configuration with presets (Safe Mode, Dev Mode, Review Mode)
|
|
357
|
-
|
|
358
|
-
Have ideas for other features?
|
|
359
|
-
[Open an issue](https://github.com/spences10/mcpick/issues) or check
|
|
360
|
-
out the [contribution guide](./docs/ROADMAP.md)!
|
|
174
|
+
| File | Purpose |
|
|
175
|
+
| ------------------------------------------ | ---------------------------- |
|
|
176
|
+
| `~/.claude.json` | Claude Code configuration |
|
|
177
|
+
| `.mcp.json` | Project-specific shared config |
|
|
178
|
+
| `~/.claude/mcpick/servers.json` | Server registry |
|
|
179
|
+
| `~/.claude/mcpick/backups/` | Configuration backups |
|
|
180
|
+
| `~/.claude/mcpick/profiles/` | Saved profiles |
|
|
181
|
+
| `~/.claude/plugins/cache/` | Cached plugin files |
|
|
182
|
+
| `~/.claude/plugins/marketplaces/` | Marketplace git clones |
|
|
361
183
|
|
|
362
184
|
## Requirements
|
|
363
185
|
|
|
364
186
|
- Node.js 22+
|
|
365
187
|
- Claude Code installed and configured
|
|
366
|
-
- pnpm (for building from source)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as validate_mcp_server } from "./validation-xMlbgGCF.js";
|
|
2
2
|
import { t as add_server_to_registry } from "./registry-CfUKT7_C.js";
|
|
3
|
-
import { t as add_mcp_via_cli } from "./claude-cli-
|
|
3
|
+
import { t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
4
4
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
5
5
|
import { defineCommand } from "citty";
|
|
6
6
|
//#region src/cli/commands/add.ts
|
|
@@ -110,4 +110,4 @@ function parse_key_value_pairs(input) {
|
|
|
110
110
|
//#endregion
|
|
111
111
|
export { add_default as default };
|
|
112
112
|
|
|
113
|
-
//# sourceMappingURL=add-
|
|
113
|
+
//# sourceMappingURL=add-BDyaBew0.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { u as mcp_add_json_via_cli } from "./claude-cli-
|
|
1
|
+
import { u as mcp_add_json_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
2
2
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/cli/commands/add-json.ts
|
|
@@ -55,4 +55,4 @@ var add_json_default = defineCommand({
|
|
|
55
55
|
//#endregion
|
|
56
56
|
export { add_json_default as default };
|
|
57
57
|
|
|
58
|
-
//# sourceMappingURL=add-json-
|
|
58
|
+
//# sourceMappingURL=add-json-BjgzdeG-.js.map
|
|
@@ -1,58 +1,56 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
2
|
import { promisify } from "node:util";
|
|
3
3
|
//#region src/utils/claude-cli.ts
|
|
4
|
-
const
|
|
4
|
+
const exec_file_async = promisify(execFile);
|
|
5
5
|
/**
|
|
6
6
|
* Check if Claude CLI is available
|
|
7
7
|
*/
|
|
8
8
|
async function check_claude_cli() {
|
|
9
9
|
try {
|
|
10
|
-
await
|
|
10
|
+
await exec_file_async("claude", ["--version"]);
|
|
11
11
|
return true;
|
|
12
12
|
} catch {
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
|
|
19
|
-
function shell_escape(str) {
|
|
20
|
-
return `'${str.replace(/'/g, "'\\''")}'`;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Validate environment variable key
|
|
24
|
-
* Must start with letter or underscore, contain only alphanumeric and underscores
|
|
17
|
+
* Validate environment variable key.
|
|
18
|
+
* Must start with letter or underscore, contain only alphanumeric and underscores.
|
|
25
19
|
*/
|
|
26
20
|
function is_valid_env_key(key) {
|
|
27
21
|
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(key);
|
|
28
22
|
}
|
|
29
23
|
/**
|
|
30
|
-
* Build
|
|
24
|
+
* Build args array for claude mcp add command.
|
|
25
|
+
* Returns raw args — no shell escaping needed since we use execFile.
|
|
31
26
|
*/
|
|
32
|
-
function
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
"mcp",
|
|
36
|
-
"add"
|
|
37
|
-
];
|
|
38
|
-
parts.push(shell_escape(server.name));
|
|
27
|
+
function build_add_args(server, scope) {
|
|
28
|
+
const args = ["mcp", "add"];
|
|
29
|
+
args.push(server.name);
|
|
39
30
|
const transport = server.type || "stdio";
|
|
40
|
-
if (transport !== "stdio")
|
|
41
|
-
|
|
31
|
+
if (transport !== "stdio") args.push("--transport", transport);
|
|
32
|
+
args.push("--scope", scope);
|
|
42
33
|
if (transport === "stdio") {
|
|
43
34
|
if (server.env) {
|
|
44
|
-
for (const [key, value] of Object.entries(server.env)) if (is_valid_env_key(key))
|
|
35
|
+
for (const [key, value] of Object.entries(server.env)) if (is_valid_env_key(key)) args.push("-e", `${key}=${value}`);
|
|
45
36
|
}
|
|
46
37
|
if ("command" in server && server.command) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (server.args && server.args.length > 0)
|
|
38
|
+
args.push("--");
|
|
39
|
+
args.push(server.command);
|
|
40
|
+
if (server.args && server.args.length > 0) args.push(...server.args);
|
|
50
41
|
}
|
|
51
42
|
} else {
|
|
52
|
-
if ("url" in server && server.url)
|
|
53
|
-
if ("headers" in server && server.headers) for (const [key, value] of Object.entries(server.headers))
|
|
43
|
+
if ("url" in server && server.url) args.push(server.url);
|
|
44
|
+
if ("headers" in server && server.headers) for (const [key, value] of Object.entries(server.headers)) args.push("-H", `${key}: ${value}`);
|
|
54
45
|
}
|
|
55
|
-
return
|
|
46
|
+
return args;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Run a claude CLI command using execFile (no shell).
|
|
50
|
+
* This avoids all shell escaping issues on every platform.
|
|
51
|
+
*/
|
|
52
|
+
async function run_claude(args) {
|
|
53
|
+
return exec_file_async("claude", args);
|
|
56
54
|
}
|
|
57
55
|
/**
|
|
58
56
|
* Add an MCP server using Claude CLI
|
|
@@ -62,9 +60,8 @@ async function add_mcp_via_cli(server, scope) {
|
|
|
62
60
|
success: false,
|
|
63
61
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
64
62
|
};
|
|
65
|
-
const command = build_add_command(server, scope);
|
|
66
63
|
try {
|
|
67
|
-
await
|
|
64
|
+
await run_claude(build_add_args(server, scope));
|
|
68
65
|
return { success: true };
|
|
69
66
|
} catch (error) {
|
|
70
67
|
return {
|
|
@@ -82,7 +79,11 @@ async function remove_mcp_via_cli(name) {
|
|
|
82
79
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
83
80
|
};
|
|
84
81
|
try {
|
|
85
|
-
await
|
|
82
|
+
await run_claude([
|
|
83
|
+
"mcp",
|
|
84
|
+
"remove",
|
|
85
|
+
name
|
|
86
|
+
]);
|
|
86
87
|
return { success: true };
|
|
87
88
|
} catch (error) {
|
|
88
89
|
return {
|
|
@@ -100,7 +101,13 @@ async function install_plugin_via_cli(key, scope = "user") {
|
|
|
100
101
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
101
102
|
};
|
|
102
103
|
try {
|
|
103
|
-
await
|
|
104
|
+
await run_claude([
|
|
105
|
+
"plugin",
|
|
106
|
+
"install",
|
|
107
|
+
key,
|
|
108
|
+
"--scope",
|
|
109
|
+
scope
|
|
110
|
+
]);
|
|
104
111
|
return { success: true };
|
|
105
112
|
} catch (error) {
|
|
106
113
|
return {
|
|
@@ -118,7 +125,13 @@ async function uninstall_plugin_via_cli(key, scope = "user") {
|
|
|
118
125
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
119
126
|
};
|
|
120
127
|
try {
|
|
121
|
-
await
|
|
128
|
+
await run_claude([
|
|
129
|
+
"plugin",
|
|
130
|
+
"uninstall",
|
|
131
|
+
key,
|
|
132
|
+
"--scope",
|
|
133
|
+
scope
|
|
134
|
+
]);
|
|
122
135
|
return { success: true };
|
|
123
136
|
} catch (error) {
|
|
124
137
|
return {
|
|
@@ -136,7 +149,13 @@ async function update_plugin_via_cli(key, scope = "user") {
|
|
|
136
149
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
137
150
|
};
|
|
138
151
|
try {
|
|
139
|
-
await
|
|
152
|
+
await run_claude([
|
|
153
|
+
"plugin",
|
|
154
|
+
"update",
|
|
155
|
+
key,
|
|
156
|
+
"--scope",
|
|
157
|
+
scope
|
|
158
|
+
]);
|
|
140
159
|
return { success: true };
|
|
141
160
|
} catch (error) {
|
|
142
161
|
return {
|
|
@@ -146,9 +165,6 @@ async function update_plugin_via_cli(key, scope = "user") {
|
|
|
146
165
|
}
|
|
147
166
|
}
|
|
148
167
|
/**
|
|
149
|
-
* Add a marketplace via Claude CLI
|
|
150
|
-
*/
|
|
151
|
-
/**
|
|
152
168
|
* Extract GitHub owner/repo from various source formats.
|
|
153
169
|
* Returns null if not a recognizable GitHub reference.
|
|
154
170
|
*/
|
|
@@ -203,7 +219,12 @@ async function marketplace_add_via_cli(source) {
|
|
|
203
219
|
};
|
|
204
220
|
}
|
|
205
221
|
try {
|
|
206
|
-
await
|
|
222
|
+
await run_claude([
|
|
223
|
+
"plugin",
|
|
224
|
+
"marketplace",
|
|
225
|
+
"add",
|
|
226
|
+
source
|
|
227
|
+
]);
|
|
207
228
|
return { success: true };
|
|
208
229
|
} catch (error) {
|
|
209
230
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
@@ -230,7 +251,12 @@ async function marketplace_remove_via_cli(name) {
|
|
|
230
251
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
231
252
|
};
|
|
232
253
|
try {
|
|
233
|
-
await
|
|
254
|
+
await run_claude([
|
|
255
|
+
"plugin",
|
|
256
|
+
"marketplace",
|
|
257
|
+
"remove",
|
|
258
|
+
name
|
|
259
|
+
]);
|
|
234
260
|
return { success: true };
|
|
235
261
|
} catch (error) {
|
|
236
262
|
return {
|
|
@@ -248,7 +274,13 @@ async function marketplace_update_via_cli(name) {
|
|
|
248
274
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
249
275
|
};
|
|
250
276
|
try {
|
|
251
|
-
|
|
277
|
+
const args = [
|
|
278
|
+
"plugin",
|
|
279
|
+
"marketplace",
|
|
280
|
+
"update"
|
|
281
|
+
];
|
|
282
|
+
if (name) args.push(name);
|
|
283
|
+
await run_claude(args);
|
|
252
284
|
return { success: true };
|
|
253
285
|
} catch (error) {
|
|
254
286
|
return {
|
|
@@ -266,7 +298,11 @@ async function marketplace_list_via_cli() {
|
|
|
266
298
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
267
299
|
};
|
|
268
300
|
try {
|
|
269
|
-
const { stdout } = await
|
|
301
|
+
const { stdout } = await run_claude([
|
|
302
|
+
"plugin",
|
|
303
|
+
"marketplace",
|
|
304
|
+
"list"
|
|
305
|
+
]);
|
|
270
306
|
return {
|
|
271
307
|
success: true,
|
|
272
308
|
stdout: stdout.trim()
|
|
@@ -297,7 +333,11 @@ async function validate_plugin_via_cli(path) {
|
|
|
297
333
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
298
334
|
};
|
|
299
335
|
try {
|
|
300
|
-
const { stdout } = await
|
|
336
|
+
const { stdout } = await run_claude([
|
|
337
|
+
"plugin",
|
|
338
|
+
"validate",
|
|
339
|
+
path
|
|
340
|
+
]);
|
|
301
341
|
return {
|
|
302
342
|
success: true,
|
|
303
343
|
stdout: stdout.trim()
|
|
@@ -318,7 +358,11 @@ async function mcp_get_via_cli(name) {
|
|
|
318
358
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
319
359
|
};
|
|
320
360
|
try {
|
|
321
|
-
const { stdout } = await
|
|
361
|
+
const { stdout } = await run_claude([
|
|
362
|
+
"mcp",
|
|
363
|
+
"get",
|
|
364
|
+
name
|
|
365
|
+
]);
|
|
322
366
|
return {
|
|
323
367
|
success: true,
|
|
324
368
|
stdout: stdout.trim()
|
|
@@ -339,7 +383,14 @@ async function mcp_add_json_via_cli(name, json, scope = "local") {
|
|
|
339
383
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
340
384
|
};
|
|
341
385
|
try {
|
|
342
|
-
await
|
|
386
|
+
await run_claude([
|
|
387
|
+
"mcp",
|
|
388
|
+
"add-json",
|
|
389
|
+
name,
|
|
390
|
+
json,
|
|
391
|
+
"--scope",
|
|
392
|
+
scope
|
|
393
|
+
]);
|
|
343
394
|
return { success: true };
|
|
344
395
|
} catch (error) {
|
|
345
396
|
return {
|
|
@@ -357,7 +408,7 @@ async function mcp_reset_project_choices_via_cli() {
|
|
|
357
408
|
error: "Claude CLI not found. Please install Claude Code CLI."
|
|
358
409
|
};
|
|
359
410
|
try {
|
|
360
|
-
await
|
|
411
|
+
await run_claude(["mcp", "reset-project-choices"]);
|
|
361
412
|
return { success: true };
|
|
362
413
|
} catch (error) {
|
|
363
414
|
return {
|
|
@@ -391,4 +442,4 @@ function get_scope_options() {
|
|
|
391
442
|
//#endregion
|
|
392
443
|
export { install_plugin_via_cli as a, marketplace_remove_via_cli as c, mcp_get_via_cli as d, mcp_reset_project_choices_via_cli as f, validate_plugin_via_cli as g, update_plugin_via_cli as h, get_scope_options as i, marketplace_update_via_cli as l, uninstall_plugin_via_cli as m, check_claude_cli as n, marketplace_add_via_cli as o, remove_mcp_via_cli as p, get_scope_description as r, marketplace_list_via_cli as s, add_mcp_via_cli as t, mcp_add_json_via_cli as u };
|
|
393
444
|
|
|
394
|
-
//# sourceMappingURL=claude-cli-
|
|
445
|
+
//# sourceMappingURL=claude-cli-DnmBJrjg.js.map
|
|
@@ -7,22 +7,22 @@ const main = defineCommand({
|
|
|
7
7
|
},
|
|
8
8
|
subCommands: {
|
|
9
9
|
list: () => import("./list-B8YeDWt6.js").then((m) => m.default),
|
|
10
|
-
enable: () => import("./enable-
|
|
11
|
-
disable: () => import("./disable-
|
|
12
|
-
remove: () => import("./remove-
|
|
13
|
-
add: () => import("./add-
|
|
14
|
-
"add-json": () => import("./add-json-
|
|
15
|
-
clone: () => import("./clone-
|
|
16
|
-
get: () => import("./get-
|
|
17
|
-
"reset-project-choices": () => import("./reset-project-choices-
|
|
10
|
+
enable: () => import("./enable-RrpcN6la.js").then((m) => m.default),
|
|
11
|
+
disable: () => import("./disable-xJXZfUR_.js").then((m) => m.default),
|
|
12
|
+
remove: () => import("./remove-D1owHLhG.js").then((m) => m.default),
|
|
13
|
+
add: () => import("./add-BDyaBew0.js").then((m) => m.default),
|
|
14
|
+
"add-json": () => import("./add-json-BjgzdeG-.js").then((m) => m.default),
|
|
15
|
+
clone: () => import("./clone-DYKPEsar.js").then((m) => m.default),
|
|
16
|
+
get: () => import("./get-Bb1eOOIZ.js").then((m) => m.default),
|
|
17
|
+
"reset-project-choices": () => import("./reset-project-choices-BfRSNN3m.js").then((m) => m.default),
|
|
18
18
|
backup: () => import("./backup-DSDhHI5f.js").then((m) => m.default),
|
|
19
19
|
restore: () => import("./restore-DdMfUljI.js").then((m) => m.default),
|
|
20
20
|
profile: () => import("./profile-CX97sMGp.js").then((m) => m.default),
|
|
21
|
-
plugins: () => import("./plugins-
|
|
21
|
+
plugins: () => import("./plugins-Dc7DN6R_.js").then((m) => m.default),
|
|
22
22
|
hooks: () => import("./hooks-Bmn7pUZa.js").then((m) => m.default),
|
|
23
23
|
cache: () => import("./cache-D6kd7qE8.js").then((m) => m.default),
|
|
24
24
|
dev: () => import("./dev-DRJRNp7y.js").then((m) => m.default),
|
|
25
|
-
marketplace: () => import("./marketplace-
|
|
25
|
+
marketplace: () => import("./marketplace-DcKk5dc1.js").then((m) => m.default),
|
|
26
26
|
reload: () => import("./reload-CYDhkCVZ.js").then((m) => m.default)
|
|
27
27
|
}
|
|
28
28
|
});
|
|
@@ -81,4 +81,4 @@ const run = () => runMain(main, { showUsage: show_usage_with_examples });
|
|
|
81
81
|
//#endregion
|
|
82
82
|
export { run };
|
|
83
83
|
|
|
84
|
-
//# sourceMappingURL=cli-
|
|
84
|
+
//# sourceMappingURL=cli-CsFfnWBo.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as validate_mcp_server } from "./validation-xMlbgGCF.js";
|
|
2
2
|
import { t as add_server_to_registry } from "./registry-CfUKT7_C.js";
|
|
3
|
-
import { t as add_mcp_via_cli } from "./claude-cli-
|
|
3
|
+
import { t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
4
4
|
import { i as find_server_in_scope, r as detect_server_scope } from "./config-DijVdEFn.js";
|
|
5
5
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
6
6
|
import { t as redact_server } from "./redact-O35tjnRD.js";
|
|
@@ -85,4 +85,4 @@ var clone_default = defineCommand({
|
|
|
85
85
|
//#endregion
|
|
86
86
|
export { clone_default as default };
|
|
87
87
|
|
|
88
|
-
//# sourceMappingURL=clone-
|
|
88
|
+
//# sourceMappingURL=clone-DYKPEsar.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as get_all_available_servers } from "./registry-CfUKT7_C.js";
|
|
2
|
-
import { p as remove_mcp_via_cli } from "./claude-cli-
|
|
2
|
+
import { p as remove_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
3
3
|
import { t as error } from "./output-BchYq0mR.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
//#region src/cli/commands/disable.ts
|
|
@@ -36,4 +36,4 @@ var disable_default = defineCommand({
|
|
|
36
36
|
//#endregion
|
|
37
37
|
export { disable_default as default };
|
|
38
38
|
|
|
39
|
-
//# sourceMappingURL=disable-
|
|
39
|
+
//# sourceMappingURL=disable-xJXZfUR_.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as get_all_available_servers } from "./registry-CfUKT7_C.js";
|
|
2
|
-
import { t as add_mcp_via_cli } from "./claude-cli-
|
|
2
|
+
import { t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
3
3
|
import { t as error } from "./output-BchYq0mR.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
//#region src/cli/commands/enable.ts
|
|
@@ -37,4 +37,4 @@ var enable_default = defineCommand({
|
|
|
37
37
|
//#endregion
|
|
38
38
|
export { enable_default as default };
|
|
39
39
|
|
|
40
|
-
//# sourceMappingURL=enable-
|
|
40
|
+
//# sourceMappingURL=enable-RrpcN6la.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as mcp_get_via_cli } from "./claude-cli-
|
|
1
|
+
import { d as mcp_get_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
2
2
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/cli/commands/get.ts
|
|
@@ -38,4 +38,4 @@ var get_default = defineCommand({
|
|
|
38
38
|
//#endregion
|
|
39
39
|
export { get_default as default };
|
|
40
40
|
|
|
41
|
-
//# sourceMappingURL=get-
|
|
41
|
+
//# sourceMappingURL=get-Bb1eOOIZ.js.map
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { m as get_plugin_backup_filename, n as get_backup_filename, r as get_backups_dir, t as ensure_directory_exists } from "./paths-BPISiJi4.js";
|
|
3
3
|
import { n as validate_mcp_server } from "./validation-xMlbgGCF.js";
|
|
4
4
|
import { i as list_plugin_backups, n as get_all_available_servers, o as sync_servers_to_registry, r as list_backups, t as add_server_to_registry } from "./registry-CfUKT7_C.js";
|
|
5
|
-
import { a as install_plugin_via_cli, c as marketplace_remove_via_cli, h as update_plugin_via_cli, i as get_scope_options, l as marketplace_update_via_cli, m as uninstall_plugin_via_cli, n as check_claude_cli, o as marketplace_add_via_cli, p as remove_mcp_via_cli, r as get_scope_description, t as add_mcp_via_cli } from "./claude-cli-
|
|
5
|
+
import { a as install_plugin_via_cli, c as marketplace_remove_via_cli, h as update_plugin_via_cli, i as get_scope_options, l as marketplace_update_via_cli, m as uninstall_plugin_via_cli, n as check_claude_cli, o as marketplace_add_via_cli, p as remove_mcp_via_cli, r as get_scope_description, t as add_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
6
6
|
import { a as get_enabled_servers, c as write_claude_config, n as create_config_from_servers, o as get_enabled_servers_for_scope, s as read_claude_config } from "./config-DijVdEFn.js";
|
|
7
7
|
import { a as read_claude_settings, i as get_all_plugins, n as build_enabled_plugins, r as get_all_hooks, s as write_claude_settings } from "./settings-DEcWtzLE.js";
|
|
8
8
|
import { d as refresh_all_marketplaces, l as read_known_marketplaces, n as clear_plugin_caches, r as get_cached_plugins_info, t as clean_orphaned_versions, u as read_marketplace_manifest } from "./plugin-cache-Bby9Dxm9.js";
|
|
@@ -1108,14 +1108,19 @@ async function main() {
|
|
|
1108
1108
|
hint: "Toggle MCP servers on/off"
|
|
1109
1109
|
},
|
|
1110
1110
|
{
|
|
1111
|
-
value: "
|
|
1112
|
-
label: "
|
|
1113
|
-
hint: "
|
|
1111
|
+
value: "add-server",
|
|
1112
|
+
label: "Add MCP server",
|
|
1113
|
+
hint: "Register a new MCP server"
|
|
1114
1114
|
},
|
|
1115
1115
|
{
|
|
1116
1116
|
value: "manage-marketplace",
|
|
1117
1117
|
label: "Manage marketplaces",
|
|
1118
|
-
hint: "Add
|
|
1118
|
+
hint: "Add a marketplace, then install plugins from it"
|
|
1119
|
+
},
|
|
1120
|
+
{
|
|
1121
|
+
value: "edit-plugins",
|
|
1122
|
+
label: "Manage plugins",
|
|
1123
|
+
hint: "Toggle, install, uninstall, or update plugins"
|
|
1119
1124
|
},
|
|
1120
1125
|
{
|
|
1121
1126
|
value: "manage-hooks",
|
|
@@ -1127,21 +1132,6 @@ async function main() {
|
|
|
1127
1132
|
label: "Manage plugin cache",
|
|
1128
1133
|
hint: "View, clear, or refresh plugin caches"
|
|
1129
1134
|
},
|
|
1130
|
-
{
|
|
1131
|
-
value: "backup",
|
|
1132
|
-
label: "Backup config",
|
|
1133
|
-
hint: "Create a timestamped backup"
|
|
1134
|
-
},
|
|
1135
|
-
{
|
|
1136
|
-
value: "add-server",
|
|
1137
|
-
label: "Add MCP server",
|
|
1138
|
-
hint: "Register a new MCP server"
|
|
1139
|
-
},
|
|
1140
|
-
{
|
|
1141
|
-
value: "restore",
|
|
1142
|
-
label: "Restore from backup",
|
|
1143
|
-
hint: "Restore from a previous backup"
|
|
1144
|
-
},
|
|
1145
1135
|
{
|
|
1146
1136
|
value: "load-profile",
|
|
1147
1137
|
label: "Load profile",
|
|
@@ -1152,6 +1142,16 @@ async function main() {
|
|
|
1152
1142
|
label: "Save profile",
|
|
1153
1143
|
hint: "Save current config as profile"
|
|
1154
1144
|
},
|
|
1145
|
+
{
|
|
1146
|
+
value: "backup",
|
|
1147
|
+
label: "Backup config",
|
|
1148
|
+
hint: "Create a timestamped backup"
|
|
1149
|
+
},
|
|
1150
|
+
{
|
|
1151
|
+
value: "restore",
|
|
1152
|
+
label: "Restore from backup",
|
|
1153
|
+
hint: "Restore from a previous backup"
|
|
1154
|
+
},
|
|
1155
1155
|
{
|
|
1156
1156
|
value: "exit",
|
|
1157
1157
|
label: "Exit",
|
|
@@ -1238,8 +1238,10 @@ const SUBCOMMANDS = new Set([
|
|
|
1238
1238
|
"reload"
|
|
1239
1239
|
]);
|
|
1240
1240
|
const arg = process.argv[2];
|
|
1241
|
-
if (arg && SUBCOMMANDS.has(arg) || arg === "--help" || arg === "-h"
|
|
1242
|
-
|
|
1241
|
+
if (arg && SUBCOMMANDS.has(arg) || arg === "--help" || arg === "-h" || !process.stdout.isTTY) {
|
|
1242
|
+
if (!arg && !process.stdout.isTTY) process.argv.push("--help");
|
|
1243
|
+
import("./cli-CsFfnWBo.js").then((m) => m.run());
|
|
1244
|
+
} else main().catch((error) => {
|
|
1243
1245
|
console.error("Fatal error:", error);
|
|
1244
1246
|
process.exit(1);
|
|
1245
1247
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as marketplace_remove_via_cli, l as marketplace_update_via_cli, o as marketplace_add_via_cli, s as marketplace_list_via_cli } from "./claude-cli-
|
|
1
|
+
import { c as marketplace_remove_via_cli, l as marketplace_update_via_cli, o as marketplace_add_via_cli, s as marketplace_list_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
2
2
|
import { u as read_marketplace_manifest } from "./plugin-cache-Bby9Dxm9.js";
|
|
3
3
|
import { a as redisable_restored_hooks, t as check_restored_hooks } from "./hook-state-Di8lUsPr.js";
|
|
4
4
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
@@ -165,4 +165,4 @@ var marketplace_default = defineCommand({
|
|
|
165
165
|
//#endregion
|
|
166
166
|
export { marketplace_default as default };
|
|
167
167
|
|
|
168
|
-
//# sourceMappingURL=marketplace-
|
|
168
|
+
//# sourceMappingURL=marketplace-DcKk5dc1.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as install_plugin_via_cli, g as validate_plugin_via_cli, h as update_plugin_via_cli, m as uninstall_plugin_via_cli } from "./claude-cli-
|
|
1
|
+
import { a as install_plugin_via_cli, g as validate_plugin_via_cli, h as update_plugin_via_cli, m as uninstall_plugin_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
2
2
|
import { a as read_claude_settings, i as get_all_plugins, n as build_enabled_plugins, s as write_claude_settings } from "./settings-DEcWtzLE.js";
|
|
3
3
|
import { l as read_known_marketplaces, o as parse_plugin_key } from "./plugin-cache-Bby9Dxm9.js";
|
|
4
4
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
@@ -209,4 +209,4 @@ var plugins_default = defineCommand({
|
|
|
209
209
|
//#endregion
|
|
210
210
|
export { plugins_default as default };
|
|
211
211
|
|
|
212
|
-
//# sourceMappingURL=plugins-
|
|
212
|
+
//# sourceMappingURL=plugins-Dc7DN6R_.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { a as read_server_registry, n as get_all_available_servers, s as write_server_registry } from "./registry-CfUKT7_C.js";
|
|
2
|
-
import { p as remove_mcp_via_cli } from "./claude-cli-
|
|
2
|
+
import { p as remove_mcp_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
3
3
|
import { t as error } from "./output-BchYq0mR.js";
|
|
4
4
|
import { defineCommand } from "citty";
|
|
5
5
|
//#region src/cli/commands/remove.ts
|
|
@@ -28,4 +28,4 @@ var remove_default = defineCommand({
|
|
|
28
28
|
//#endregion
|
|
29
29
|
export { remove_default as default };
|
|
30
30
|
|
|
31
|
-
//# sourceMappingURL=remove-
|
|
31
|
+
//# sourceMappingURL=remove-D1owHLhG.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as mcp_reset_project_choices_via_cli } from "./claude-cli-
|
|
1
|
+
import { f as mcp_reset_project_choices_via_cli } from "./claude-cli-DnmBJrjg.js";
|
|
2
2
|
import { n as output, t as error } from "./output-BchYq0mR.js";
|
|
3
3
|
import { defineCommand } from "citty";
|
|
4
4
|
//#region src/cli/commands/reset-project-choices.ts
|
|
@@ -25,4 +25,4 @@ var reset_project_choices_default = defineCommand({
|
|
|
25
25
|
//#endregion
|
|
26
26
|
export { reset_project_choices_default as default };
|
|
27
27
|
|
|
28
|
-
//# sourceMappingURL=reset-project-choices-
|
|
28
|
+
//# sourceMappingURL=reset-project-choices-BfRSNN3m.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcpick",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.21",
|
|
4
4
|
"description": "Claude Code extension manager — MCP servers, plugins (skills, hooks, agents), and marketplaces",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -17,15 +17,15 @@
|
|
|
17
17
|
"type": "module",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@clack/prompts": "^1.
|
|
21
|
-
"citty": "^0.2.
|
|
20
|
+
"@clack/prompts": "^1.2.0",
|
|
21
|
+
"citty": "^0.2.2",
|
|
22
22
|
"valibot": "^1.3.1"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@changesets/cli": "^2.30.0",
|
|
26
|
-
"@types/node": "^25.
|
|
27
|
-
"vite-plus": "^0.1.
|
|
28
|
-
"vitest": "^4.1.
|
|
26
|
+
"@types/node": "^25.6.0",
|
|
27
|
+
"vite-plus": "^0.1.16",
|
|
28
|
+
"vitest": "^4.1.4"
|
|
29
29
|
},
|
|
30
30
|
"engines": {
|
|
31
31
|
"node": ">=22.0.0"
|