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 +235 -0
- package/docs/images/kanban-view.png +0 -0
- package/docs/images/list-view.png +0 -0
- package/docs/images/remote-mcp-modal.png +0 -0
- package/docs/images/server-view.png +0 -0
- package/package.json +52 -0
- package/public/index.html +325 -0
- package/public/js/api.js +108 -0
- package/public/js/clientView.js +211 -0
- package/public/js/kanbanView.js +224 -0
- package/public/js/main.js +126 -0
- package/public/js/modals.js +822 -0
- package/public/js/serverView.js +299 -0
- package/public/js/utils.js +185 -0
- package/public/style.css +640 -0
- package/src/cli.js +394 -0
- package/src/clients.js +113 -0
- package/src/config-manager.js +520 -0
- package/src/server.js +214 -0
package/README.md
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# MCP Config Manager
|
|
2
|
+
|
|
3
|
+
[](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
|
+

|
|
26
|
+
*Traditional interface with detailed server management, showing individual client configurations with checkboxes for bulk operations.*
|
|
27
|
+
|
|
28
|
+
### Kanban View
|
|
29
|
+

|
|
30
|
+
*Drag-and-drop interface displaying servers as cards organized by client, with visual icons for quick actions.*
|
|
31
|
+
|
|
32
|
+
### Server View
|
|
33
|
+

|
|
34
|
+
*Consolidated view of all servers showing which clients each server is configured for, with bulk management options.*
|
|
35
|
+
|
|
36
|
+
### Remote MCP Setup
|
|
37
|
+

|
|
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 @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>
|