mcp-config-manager 1.0.2

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/README.md ADDED
@@ -0,0 +1,235 @@
1
+ # MCP Config Manager
2
+
3
+ [![npm version](https://badge.fury.io/js/mcp-config-manager.svg)](https://badge.fury.io/js/mcp-config-manager)
4
+
5
+ Simple CLI and web UI tool to manage Model Context Protocol (MCP) configurations across multiple AI clients.
6
+
7
+ ## Features
8
+
9
+ - **Auto-detection**: Automatically discovers supported clients with existing MCP configuration files.
10
+ - **Multi-client support**: Manage configs for a growing list of clients, including Claude, VS Code, Cursor, Windsurf, Gemini, and more. The tool can detect any client that follows the MCP specification.
11
+ - **Simple CLI**: Command-line interface for quick operations
12
+ - **Web UI**: Clean web interface with List and Kanban views
13
+ - **Remote MCP Support**: Easy setup for remote MCP servers with just a name and URL
14
+ - **Kanban Board**: Drag-and-drop servers between clients
15
+ - **JSON Editor**: Edit server configs as raw JSON or using forms
16
+ - **Bulk Operations**: Copy servers to multiple clients at once
17
+ - **Clipboard Support**: Quick copy server configs to clipboard
18
+ - **Cross-platform**: Works on macOS, Windows, and Linux
19
+ - **Import/Export**: Share configurations between clients and users
20
+ - **Environment variables**: Easily manage API keys and settings
21
+
22
+ ## Screenshots
23
+
24
+ ### List View
25
+ ![List View](docs/images/list-view.png)
26
+ *Traditional interface with detailed server management, showing individual client configurations with checkboxes for bulk operations.*
27
+
28
+ ### Kanban View
29
+ ![Kanban View](docs/images/kanban-view.png)
30
+ *Drag-and-drop interface displaying servers as cards organized by client, with visual icons for quick actions.*
31
+
32
+ ### Server View
33
+ ![Server View](docs/images/server-view.png)
34
+ *Consolidated view of all servers showing which clients each server is configured for, with bulk management options.*
35
+
36
+ ### Remote MCP Setup
37
+ ![Remote MCP Modal](docs/images/remote-mcp-modal.png)
38
+ *Simple interface for adding remote MCP servers - just provide a name and URL to automatically generate the correct configuration.*
39
+
40
+ ## Installation
41
+
42
+ ```bash
43
+ # Install globally from npm
44
+ npm install -g mcp-config-manager
45
+ ```
46
+
47
+ Alternatively, you can clone the project and run it locally:
48
+
49
+ ```bash
50
+ # Clone or download the project
51
+ cd mcp-config-manager
52
+
53
+ # Install dependencies
54
+ npm install
55
+
56
+ # Make CLI globally available (optional)
57
+ npm link
58
+ ```
59
+
60
+ ## Usage
61
+
62
+ ### CLI Commands
63
+
64
+ ```bash
65
+ # List all clients and their status
66
+ mcp-manager list
67
+
68
+ # Show servers for a specific client
69
+ mcp-manager show claude
70
+
71
+ # Add a new server
72
+ mcp-manager add claude my-server -c npx -a "-y" "@example/server" -e API_KEY=abc123
73
+
74
+ # Remove a server from one client
75
+ mcp-manager remove claude my-server
76
+
77
+ # Remove a server from ALL clients
78
+ mcp-manager remove all my-server
79
+
80
+ # Copy server between clients
81
+ mcp-manager copy claude my-server cursor
82
+
83
+ # Copy server to ALL other clients
84
+ mcp-manager copy claude my-server all
85
+
86
+ # Manage environment variables
87
+ mcp-manager env claude my-server set API_KEY new-value
88
+ mcp-manager env claude my-server unset API_KEY
89
+ mcp-manager env claude my-server list
90
+
91
+ # Export/Import configurations
92
+ mcp-manager export claude config.json
93
+ mcp-manager export claude --server my-server server-config.json
94
+ mcp-manager import cursor config.json
95
+
96
+ # Start web UI
97
+ mcp-manager web
98
+ # or
99
+ npm run web
100
+ ```
101
+
102
+ ### Web UI
103
+
104
+ Start the web server:
105
+ ```bash
106
+ npm run web
107
+ # or
108
+ mcp-manager web --port 3456
109
+ ```
110
+
111
+ Then open http://localhost:3456 in your browser.
112
+
113
+ The web UI provides:
114
+ - **Client auto-discovery**: Automatically detects clients with existing configurations on startup, with a refresh button to scan for more.
115
+ - **List View**: Traditional interface with detailed server management
116
+ - Multi-select checkboxes for bulk delete operations
117
+ - Remove from all clients button for each server
118
+ - Bulk action toolbar with select all/none options
119
+ - **Kanban View**: Drag-and-drop servers between clients
120
+ - Full functionality on cards (edit, copy, export, delete)
121
+ - Visual icons for quick actions
122
+ - Drag to copy servers between clients
123
+ - **Server View**: Consolidated view of all servers across clients
124
+ - Shows which clients each server is configured for
125
+ - Bulk operations to add servers to multiple clients
126
+ - **Remote MCP Support**: Dedicated "Add Remote MCP" button for easy setup
127
+ - Simply provide server name and remote URL
128
+ - Automatically generates `npx mcp-remote [URL]` configuration
129
+ - Perfect for connecting to hosted MCP services
130
+ - **JSON Editor**: Toggle between form and raw JSON editing
131
+ - **Multi-select Copy**: Copy servers to multiple clients at once
132
+ - **Clipboard Support**: Quick copy server configs with one click
133
+ - **Config Path Display**: See where each client's config file is located
134
+ - Visual overview of all clients
135
+ - Add/edit/delete servers
136
+ - Import/export configurations
137
+ - Environment variable management
138
+
139
+ ## Supported Clients
140
+
141
+ This tool supports auto-detection of any client that follows the Model Context Protocol specification. The following is a non-exhaustive list of clients that have been tested and are known to work:
142
+
143
+ - **Amazon Q Developer**: `~/.aws/amazonq/mcp.json`
144
+ - **Claude Desktop**: `~/Library/Application Support/Claude/claude_desktop_config.json`
145
+ - **Claude Code**: `.mcp.json` in project root
146
+ - **Cline**: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`
147
+ - **Cursor**: `.cursor/mcp.json` (project-specific) or `~/.cursor/mcp.json` (global)
148
+ - **Factory Bridge**: `~/Library/Application Support/Factory Bridge/mcp.json`
149
+ - **Gemini**: `~/.gemini/settings.json`
150
+ - **Roo Code**: `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`
151
+ - **VS Code**: `.vscode/mcp.json`
152
+ - **Windsurf**: `~/.codeium/windsurf/mcp_config.json` or `~/AppData/Roaming/WindSurf/mcp_settings.json` (Windows)
153
+
154
+ *Note: Paths may vary based on your operating system. The tool will attempt to find the correct path automatically.*
155
+
156
+ ## Configuration Format
157
+
158
+ Standard MCP server configuration:
159
+ ```json
160
+ {
161
+ "mcpServers": {
162
+ "server-name": {
163
+ "command": "npx",
164
+ "args": ["-y", "@example/mcp-server"],
165
+ "env": {
166
+ "API_KEY": "your-key-here"
167
+ }
168
+ }
169
+ }
170
+ }
171
+ ```
172
+
173
+ ## Security Note
174
+
175
+ Environment variables may contain sensitive data like API keys. The tool masks values containing "KEY" or "SECRET" in the display but stores them in plain text in config files.
176
+
177
+ ## Development & Testing
178
+
179
+ ### Running Tests
180
+
181
+ The project includes comprehensive test coverage:
182
+
183
+ ```bash
184
+ # Run all tests (CLI + UI)
185
+ npm test
186
+
187
+ # Run CLI tests only (17 tests)
188
+ npm run test:cli
189
+
190
+ # Run UI tests only (2 tests) - requires Playwright
191
+ npm run test:ui
192
+
193
+ # Run specific test file
194
+ npx mocha test/ui-simple.test.js --timeout 30000
195
+ ```
196
+
197
+ ### Test Coverage
198
+
199
+ - **CLI Tests**: 17/17 ✅ - Comprehensive command-line functionality testing
200
+ - **UI Tests**: 2/2 ✅ - Frontend integration and API communication testing
201
+ - **Integration Tests**: End-to-end dual-mode form/JSON editing validation
202
+
203
+ ### Development Setup
204
+
205
+ ```bash
206
+ # Install dependencies (includes Playwright for UI testing)
207
+ npm install
208
+
209
+ # Install Playwright browsers (for UI tests)
210
+ npx playwright install chromium
211
+
212
+ # Start development server with mock data
213
+ MCP_USE_MOCK_CLIENTS=true npm run web
214
+
215
+ # Run server on custom port
216
+ PORT=3457 npm run web
217
+ ```
218
+
219
+ ### Testing with Mock Clients
220
+
221
+ For development and testing, you can use mock clients:
222
+
223
+ ```bash
224
+ # Enable mock client mode
225
+ export MCP_USE_MOCK_CLIENTS=true
226
+
227
+ # Start server (will use test clients instead of real ones)
228
+ npm run web
229
+ ```
230
+
231
+ This allows testing functionality without affecting real MCP client configurations.
232
+
233
+ ## License
234
+
235
+ MIT
Binary file
Binary file
Binary file
Binary file
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "mcp-config-manager",
3
+ "version": "1.0.2",
4
+ "description": "Simple CLI and web UI to manage MCP configs across multiple AI clients",
5
+ "main": "src/cli.js",
6
+ "bin": {
7
+ "mcp-manager": "src/cli.js"
8
+ },
9
+ "scripts": {
10
+ "start": "node src/cli.js",
11
+ "web": "node src/server.js",
12
+ "test": "mocha test/**/*.test.js --timeout 30000",
13
+ "test:cli": "mocha test/cli.test.js --timeout 10000",
14
+ "test:ui": "mocha test/ui.test.js --timeout 60000",
15
+ "test:integration": "mocha test/integration.test.js --timeout 60000"
16
+ },
17
+ "keywords": [
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "ai",
21
+ "claude",
22
+ "vscode",
23
+ "cursor",
24
+ "gemini",
25
+ "windsurf",
26
+ "amazonq"
27
+ ],
28
+ "author": "Lev Volkovich <lev.volkovich@seon.io>",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/lev-volkovich-seon/mcp-config-manager.git"
33
+ },
34
+ "files": [
35
+ "src",
36
+ "public",
37
+ "docs",
38
+ "README.md"
39
+ ],
40
+ "type": "module",
41
+ "dependencies": {
42
+ "commander": "^14.0.1",
43
+ "cors": "^2.8.5",
44
+ "express": "^5.1.0"
45
+ },
46
+ "devDependencies": {
47
+ "chai": "^6.0.1",
48
+ "mocha": "^11.7.2",
49
+ "playwright": "^1.55.1",
50
+ "puppeteer": "^24.22.2"
51
+ }
52
+ }
@@ -0,0 +1,325 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>MCP Config Manager</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ </head>
9
+ <body>
10
+ <div class="container">
11
+ <header>
12
+ <h1>MCP Config Manager</h1>
13
+ <p>Manage Model Context Protocol configurations across AI clients</p>
14
+ <div class="view-switcher">
15
+ <button id="listViewBtn" class="view-btn active">List View</button>
16
+ <button id="kanbanViewBtn" class="view-btn">Kanban View</button>
17
+ <button id="serverViewBtn" class="view-btn">Server View</button>
18
+ </div>
19
+ </header>
20
+
21
+ <div id="listViewContainer">
22
+ <div class="main-grid">
23
+ <aside class="sidebar">
24
+ <h2>Clients</h2>
25
+ <div class="sort-options">
26
+ <label for="clientSort">Sort by:</label>
27
+ <select id="clientSort">
28
+ <option value="name-asc">Name (A-Z)</option>
29
+ <option value="name-desc">Name (Z-A)</option>
30
+ <option value="servers-asc">Servers (Low to High)</option>
31
+ <option value="servers-desc">Servers (High to Low)</option>
32
+ </select>
33
+ </div>
34
+ <div id="clientList" class="client-list"></div>
35
+ <button id="refreshBtn" class="btn btn-secondary">Refresh</button>
36
+ </aside>
37
+
38
+ <main class="content">
39
+ <div id="welcomeView" class="view">
40
+ <h2>Welcome</h2>
41
+ <p>Select a client from the sidebar to view and manage its MCP servers.</p>
42
+ </div>
43
+
44
+ <div id="clientView" class="view" style="display: none;">
45
+ <div class="client-header">
46
+ <div>
47
+ <h2 id="clientName"></h2>
48
+ <p class="config-path" id="configPath"></p>
49
+ </div>
50
+ <div class="action-buttons">
51
+ <button id="addServerBtn" class="btn btn-primary">Add Server</button>
52
+ <button id="addRemoteServerBtn" class="btn btn-primary">Add Remote MCP</button>
53
+ <button id="exportConfigBtn" class="btn btn-secondary">Export</button>
54
+ <button id="importConfigBtn" class="btn btn-secondary">Import</button>
55
+ </div>
56
+ </div>
57
+
58
+ <div id="serverList" class="server-list"></div>
59
+ </div>
60
+ </main>
61
+ </div>
62
+ </div>
63
+
64
+ <div id="kanbanViewContainer" style="display: none;">
65
+ <div class="sort-options">
66
+ <label for="kanbanSort">Sort by:</label>
67
+ <select id="kanbanSort">
68
+ <option value="name-asc">Name (A-Z)</option>
69
+ <option value="name-desc">Name (Z-A)</option>
70
+ <option value="servers-asc">Servers (Low to High)</option>
71
+ <option value="servers-desc">Servers (High to Low)</option>
72
+ </select>
73
+ </div>
74
+ <div class="kanban-board" id="kanbanBoard"></div>
75
+ </div>
76
+
77
+ <div id="serverViewContainer" style="display: none;">
78
+ <h2>All Servers</h2>
79
+ <div class="server-list-all" id="allServersList"></div>
80
+ </div>
81
+ </div>
82
+
83
+ <!-- Add/Edit Server Modal -->
84
+ <div id="serverModal" class="modal" style="display: none;">
85
+ <div class="modal-content">
86
+ <h3 id="modalTitle">Add Server</h3>
87
+ <div class="editor-tabs">
88
+ <button type="button" class="tab-btn active" data-tab="form">Form Editor</button>
89
+ <button type="button" class="tab-btn" data-tab="json">JSON Editor</button>
90
+ </div>
91
+
92
+ <form id="serverForm">
93
+ <div id="formTab" class="tab-content active">
94
+ <div class="form-group">
95
+ <label for="serverName">Server Name</label>
96
+ <input type="text" id="serverName" name="serverName" required>
97
+ </div>
98
+
99
+
100
+
101
+ <div class="form-group">
102
+ <label for="serverCommand">Command</label>
103
+ <input type="text" id="serverCommand" name="serverCommand" placeholder="e.g., npx">
104
+ </div>
105
+
106
+ <div class="form-group">
107
+ <label for="serverArgs">Arguments (one per line)</label>
108
+ <textarea id="serverArgs" name="serverArgs" rows="3" placeholder="e.g., -y&#10;@example/mcp-server"></textarea>
109
+ </div>
110
+
111
+ <div class="form-group">
112
+ <label>Environment Variables</label>
113
+ <div id="envVars"></div>
114
+ <button type="button" id="addEnvVar" class="icon-btn no-bg add-env-var">+</button>
115
+ </div>
116
+
117
+
118
+ </div>
119
+
120
+ <div id="jsonTab" class="tab-content" style="display: none;">
121
+ <div class="form-group">
122
+ <label for="jsonEditor">Server Configuration (JSON)</label>
123
+ <textarea id="jsonEditor" name="jsonEditor" rows="15" placeholder='{"command": "npx", "args": ["-y", "@example/server"]}'></textarea>
124
+ </div>
125
+ </div>
126
+
127
+ <div class="modal-actions">
128
+ <button type="submit" class="btn btn-primary">Save</button>
129
+ <button type="button" id="cancelModal" class="btn btn-secondary">Cancel</button>
130
+ </div>
131
+ </form>
132
+ </div>
133
+ </div>
134
+
135
+ <!-- Copy Server Modal -->
136
+ <div id="copyModal" class="modal" style="display: none;">
137
+ <div class="modal-content">
138
+ <h3>Copy Server</h3>
139
+ <form id="copyForm">
140
+ <div class="form-group">
141
+ <label>Target Clients</label>
142
+ <div class="copy-options">
143
+ <button type="button" id="selectAllBtn" class="btn btn-small">Select All</button>
144
+ <button type="button" id="selectNoneBtn" class="btn btn-small">Select None</button>
145
+ </div>
146
+ <div id="targetClients" class="checkbox-list"></div>
147
+ </div>
148
+
149
+ <div class="form-group">
150
+ <label for="targetServerName">New Server Name (optional)</label>
151
+ <input type="text" id="targetServerName" placeholder="Leave empty to keep the same name">
152
+ </div>
153
+
154
+ <div class="modal-actions">
155
+ <button type="submit" class="btn btn-primary">Copy</button>
156
+ <button type="button" id="cancelCopy" class="btn btn-secondary">Cancel</button>
157
+ </div>
158
+ </form>
159
+ </div>
160
+ </div>
161
+
162
+ <!-- Import Modal -->
163
+ <div id="importModal" class="modal" style="display: none;">
164
+ <div class="modal-content">
165
+ <h3>Import Configuration</h3>
166
+ <form id="importForm">
167
+ <div class="form-group">
168
+ <label for="importData">Paste JSON Configuration</label>
169
+ <textarea id="importData" rows="10" required placeholder="Paste exported JSON here..."></textarea>
170
+ </div>
171
+
172
+ <div class="modal-actions">
173
+ <button type="submit" class="btn btn-primary">Import</button>
174
+ <button type="button" id="cancelImport" class="btn btn-secondary">Cancel</button>
175
+ </div>
176
+ </form>
177
+ </div>
178
+ </div>
179
+
180
+ <!-- Edit Server Env Modal -->
181
+ <div id="editServerEnvModal" class="modal" style="display: none;">
182
+ <div class="modal-content">
183
+ <h3 id="editServerEnvTitle">Edit Environment Variables for Server</h3>
184
+ <form id="editServerEnvForm">
185
+ <div class="form-group">
186
+ <label>Server Name:</label>
187
+ <span id="editServerEnvName"></span>
188
+ </div>
189
+ <div class="form-group">
190
+ <label>Environment Variables</label>
191
+ <div id="editEnvVars"></div>
192
+ <button type="button" id="addEditEnvVar" class="btn btn-small">Add Variable</button>
193
+ </div>
194
+ <div class="form-group">
195
+ <label>Apply to Clients:</label>
196
+ <div id="editEnvClients" class="checkbox-list"></div>
197
+ <button type="button" id="selectAllEditEnvClients" class="btn btn-small">Select All</button>
198
+ <button type="button" id="selectNoneEditEnvClients" class="btn btn-small">Select None</button>
199
+ </div>
200
+ <div class="modal-actions">
201
+ <button type="submit" class="btn btn-primary">Save Changes</button>
202
+ <button type="button" id="cancelEditServerEnv" class="btn btn-secondary">Cancel</button>
203
+ </div>
204
+ </form>
205
+ </div>
206
+ </div>
207
+
208
+ <!-- Add Server to Clients Modal -->
209
+ <div id="addServerToClientsModal" class="modal" style="display: none;">
210
+ <div class="modal-content">
211
+ <h3 id="addServerToClientsTitle">Add Server to Clients</h3>
212
+ <form id="addServerToClientsForm">
213
+ <div class="form-group">
214
+ <label>Server Name:</label>
215
+ <span id="addServerToClientsName"></span>
216
+ </div>
217
+ <div class="form-group">
218
+ <label>Server Configuration (JSON)</label>
219
+ <textarea id="addServerToClientsConfig" rows="10" readonly></textarea>
220
+ </div>
221
+ <div class="form-group">
222
+ <label>Select Clients:</label>
223
+ <div id="addServerToClientsList" class="checkbox-list"></div>
224
+ <button type="button" id="selectAllAddServerClients" class="btn btn-small">Select All</button>
225
+ <button type="button" id="selectNoneAddServerClients" class="btn btn-small">Select None</button>
226
+ </div>
227
+ <div class="modal-actions">
228
+ <button type="submit" class="btn btn-primary">Add Server</button>
229
+ <button type="button" id="cancelAddServerToClients" class="btn btn-secondary">Cancel</button>
230
+ </div>
231
+ </form>
232
+ </div>
233
+ </div>
234
+
235
+ <!-- Add Remote MCP Server Modal -->
236
+ <div id="remoteServerModal" class="modal" style="display: none;">
237
+ <div class="modal-content">
238
+ <h3>Add Remote MCP Server</h3>
239
+ <form id="remoteServerForm">
240
+ <div class="form-group">
241
+ <label for="remoteServerName">Server Name:</label>
242
+ <input type="text" id="remoteServerName" name="remoteServerName" placeholder="e.g., my-remote-server" required>
243
+ </div>
244
+ <div class="form-group">
245
+ <label for="remoteServerUrl">Remote URL:</label>
246
+ <input type="url" id="remoteServerUrl" name="remoteServerUrl" placeholder="https://example.com/mcp" required>
247
+ </div>
248
+ <div class="form-group">
249
+ <small>This will create a configuration using npx mcp-remote with your specified URL.</small>
250
+ </div>
251
+ <div class="modal-actions">
252
+ <button type="submit" class="btn btn-primary">Add Remote Server</button>
253
+ <button type="button" id="cancelRemoteServer" class="btn btn-secondary">Cancel</button>
254
+ </div>
255
+ </form>
256
+ </div>
257
+ </div>
258
+
259
+ <!-- Copy Env Vars Modal -->
260
+ <div id="copyEnvVarsModal" class="modal" style="display: none;">
261
+ <div class="modal-content">
262
+ <h3 id="copyEnvVarsTitle">Copy Environment Variables</h3>
263
+ <form id="copyEnvVarsForm">
264
+ <div class="form-group">
265
+ <label>Source Server:</label>
266
+ <span id="copyEnvVarsSourceServer"></span>
267
+ </div>
268
+ <div class="form-group">
269
+ <label>Source Client:</label>
270
+ <span id="copyEnvVarsSourceClient"></span>
271
+ </div>
272
+ <div class="form-group">
273
+ <label>Environment Variable:</label>
274
+ <select id="copyEnvVarSelect"></select>
275
+ </div>
276
+ <div class="form-group">
277
+ <label>Target Clients:</label>
278
+ <div id="copyEnvVarsTargetClients" class="checkbox-list"></div>
279
+ <button type="button" id="selectAllCopyEnvVarsClients" class="btn btn-small">Select All</button>
280
+ <button type="button" id="selectNoneCopyEnvVarsClients" class="btn btn-small">Select None</button>
281
+ </div>
282
+ <div class="modal-actions">
283
+ <button type="submit" class="btn btn-primary">Copy Variables</button>
284
+ <button type="button" id="cancelCopyEnvVars" class="btn btn-secondary">Cancel</button>
285
+ </div>
286
+ </form>
287
+ </div>
288
+ </div>
289
+
290
+ <!-- Copy Single Env Var Modal -->
291
+ <div id="copySingleEnvVarModal" class="modal" style="display: none;">
292
+ <div class="modal-content">
293
+ <h3 id="copySingleEnvVarTitle">Copy Environment Variable</h3>
294
+ <form id="copySingleEnvVarForm">
295
+ <div class="form-group">
296
+ <label>Variable Name:</label>
297
+ <span id="copySingleEnvVarKey"></span>
298
+ </div>
299
+ <div class="form-group">
300
+ <label>Variable Value:</label>
301
+ <span id="copySingleEnvVarValue"></span>
302
+ </div>
303
+ <div class="form-group">
304
+ <label>Target Clients:</label>
305
+ <div id="copySingleEnvVarTargetClients" class="checkbox-list"></div>
306
+ <button type="button" id="selectAllCopySingleEnvVarClients" class="btn btn-small">Select All</button>
307
+ <button type="button" id="selectNoneCopySingleEnvVarClients" class="btn btn-small">Select None</button>
308
+ </div>
309
+ <div class="modal-actions">
310
+ <button type="submit" class="btn btn-primary">Copy</button>
311
+ <button type="button" id="cancelCopySingleEnvVar" class="btn btn-secondary">Cancel</button>
312
+ </div>
313
+ </form>
314
+ </div>
315
+ </div>
316
+
317
+ <script type="module" src="js/utils.js"></script>
318
+ <script type="module" src="js/api.js"></script>
319
+ <script type="module" src="js/modals.js"></script>
320
+ <script type="module" src="js/clientView.js"></script>
321
+ <script type="module" src="js/kanbanView.js"></script>
322
+ <script type="module" src="js/serverView.js"></script>
323
+ <script type="module" src="js/main.js"></script>
324
+ </body>
325
+ </html>