@cloudcli-ai/cloudcli 1.29.4 → 1.30.0

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.
Files changed (179) hide show
  1. package/README.de.md +1 -1
  2. package/README.ja.md +1 -1
  3. package/README.ko.md +1 -1
  4. package/README.md +1 -1
  5. package/README.ru.md +1 -1
  6. package/README.tr.md +252 -0
  7. package/README.zh-CN.md +1 -1
  8. package/dist/assets/index-DI22MZMb.css +32 -0
  9. package/dist/assets/index-RX-W_g_Q.js +1262 -0
  10. package/dist/index.html +2 -2
  11. package/dist-server/server/claude-sdk.js +13 -8
  12. package/dist-server/server/claude-sdk.js.map +1 -1
  13. package/dist-server/server/cursor-cli.js +7 -7
  14. package/dist-server/server/cursor-cli.js.map +1 -1
  15. package/dist-server/server/gemini-cli.js +5 -5
  16. package/dist-server/server/gemini-cli.js.map +1 -1
  17. package/dist-server/server/gemini-response-handler.js +2 -2
  18. package/dist-server/server/gemini-response-handler.js.map +1 -1
  19. package/dist-server/server/index.js +27 -25
  20. package/dist-server/server/index.js.map +1 -1
  21. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +103 -0
  22. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  23. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  24. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  25. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +266 -0
  26. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  27. package/dist-server/server/modules/providers/list/claude/claude.provider.js +13 -0
  28. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  29. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  30. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  31. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  32. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  33. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +282 -0
  34. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  35. package/dist-server/server/modules/providers/list/codex/codex.provider.js +13 -0
  36. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  37. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  38. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  39. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  40. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  41. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +369 -0
  42. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  43. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +13 -0
  44. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  45. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js +131 -0
  46. package/dist-server/server/modules/providers/list/gemini/gemini-auth.provider.js.map +1 -0
  47. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js +82 -0
  48. package/dist-server/server/modules/providers/list/gemini/gemini-mcp.provider.js.map +1 -0
  49. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js +207 -0
  50. package/dist-server/server/modules/providers/list/gemini/gemini-sessions.provider.js.map +1 -0
  51. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js +13 -0
  52. package/dist-server/server/modules/providers/list/gemini/gemini.provider.js.map +1 -0
  53. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  54. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  55. package/dist-server/server/modules/providers/provider.routes.js +159 -0
  56. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  57. package/dist-server/server/modules/providers/services/mcp.service.js +69 -0
  58. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  59. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  60. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  61. package/dist-server/server/modules/providers/services/sessions.service.js +29 -0
  62. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  63. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +14 -0
  64. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  65. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  66. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  67. package/dist-server/server/modules/providers/tests/mcp.test.js +250 -0
  68. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  69. package/dist-server/server/openai-codex.js +5 -5
  70. package/dist-server/server/openai-codex.js.map +1 -1
  71. package/dist-server/server/routes/codex.js +2 -278
  72. package/dist-server/server/routes/codex.js.map +1 -1
  73. package/dist-server/server/routes/commands.js +0 -44
  74. package/dist-server/server/routes/commands.js.map +1 -1
  75. package/dist-server/server/routes/cursor.js +9 -489
  76. package/dist-server/server/routes/cursor.js.map +1 -1
  77. package/dist-server/server/routes/mcp-utils.js +1 -18
  78. package/dist-server/server/routes/mcp-utils.js.map +1 -1
  79. package/dist-server/server/routes/messages.js +6 -6
  80. package/dist-server/server/routes/messages.js.map +1 -1
  81. package/dist-server/server/routes/settings.js +10 -0
  82. package/dist-server/server/routes/settings.js.map +1 -1
  83. package/dist-server/server/routes/taskmaster.js +0 -459
  84. package/dist-server/server/routes/taskmaster.js.map +1 -1
  85. package/dist-server/server/shared/interfaces.js +2 -0
  86. package/dist-server/server/shared/interfaces.js.map +1 -0
  87. package/dist-server/server/shared/types.js +3 -0
  88. package/dist-server/server/shared/types.js.map +1 -0
  89. package/dist-server/server/shared/utils.js +150 -0
  90. package/dist-server/server/shared/utils.js.map +1 -0
  91. package/dist-server/server/utils/mcp-detector.js +0 -49
  92. package/dist-server/server/utils/mcp-detector.js.map +1 -1
  93. package/dist-server/shared/modelConstants.js +1 -0
  94. package/dist-server/shared/modelConstants.js.map +1 -1
  95. package/package.json +6 -3
  96. package/server/claude-sdk.js +14 -8
  97. package/server/cursor-cli.js +7 -7
  98. package/server/gemini-cli.js +5 -5
  99. package/server/gemini-response-handler.js +2 -2
  100. package/server/index.js +33 -29
  101. package/server/modules/providers/list/claude/claude-auth.provider.ts +123 -0
  102. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  103. package/server/modules/providers/list/claude/claude-sessions.provider.ts +306 -0
  104. package/server/modules/providers/list/claude/claude.provider.ts +15 -0
  105. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  106. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  107. package/server/modules/providers/list/codex/codex-sessions.provider.ts +319 -0
  108. package/server/modules/providers/list/codex/codex.provider.ts +15 -0
  109. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  110. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  111. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +421 -0
  112. package/server/modules/providers/list/cursor/cursor.provider.ts +15 -0
  113. package/server/modules/providers/list/gemini/gemini-auth.provider.ts +151 -0
  114. package/server/modules/providers/list/gemini/gemini-mcp.provider.ts +110 -0
  115. package/server/modules/providers/list/gemini/gemini-sessions.provider.ts +227 -0
  116. package/server/modules/providers/list/gemini/gemini.provider.ts +15 -0
  117. package/server/modules/providers/provider.registry.ts +36 -0
  118. package/server/modules/providers/provider.routes.ts +217 -0
  119. package/server/modules/providers/services/mcp.service.ts +94 -0
  120. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  121. package/server/modules/providers/services/sessions.service.ts +45 -0
  122. package/server/modules/providers/shared/base/abstract.provider.ts +20 -0
  123. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  124. package/server/modules/providers/tests/mcp.test.ts +293 -0
  125. package/server/openai-codex.js +5 -5
  126. package/server/routes/codex.js +2 -312
  127. package/server/routes/commands.js +0 -49
  128. package/server/routes/cursor.js +15 -527
  129. package/server/routes/mcp-utils.js +2 -19
  130. package/server/routes/messages.js +6 -6
  131. package/server/routes/settings.js +10 -0
  132. package/server/routes/taskmaster.js +0 -492
  133. package/server/shared/interfaces.ts +54 -0
  134. package/server/shared/types.ts +172 -0
  135. package/server/shared/utils.ts +193 -0
  136. package/server/tsconfig.json +6 -3
  137. package/server/utils/mcp-detector.js +0 -51
  138. package/shared/modelConstants.js +1 -0
  139. package/dist/assets/index-BBAE1OJ_.css +0 -32
  140. package/dist/assets/index-Cyya3LhN.js +0 -1262
  141. package/dist-server/server/providers/claude/adapter.js +0 -266
  142. package/dist-server/server/providers/claude/adapter.js.map +0 -1
  143. package/dist-server/server/providers/claude/status.js +0 -121
  144. package/dist-server/server/providers/claude/status.js.map +0 -1
  145. package/dist-server/server/providers/codex/adapter.js +0 -232
  146. package/dist-server/server/providers/codex/adapter.js.map +0 -1
  147. package/dist-server/server/providers/codex/status.js +0 -70
  148. package/dist-server/server/providers/codex/status.js.map +0 -1
  149. package/dist-server/server/providers/cursor/adapter.js +0 -342
  150. package/dist-server/server/providers/cursor/adapter.js.map +0 -1
  151. package/dist-server/server/providers/cursor/status.js +0 -118
  152. package/dist-server/server/providers/cursor/status.js.map +0 -1
  153. package/dist-server/server/providers/gemini/adapter.js +0 -174
  154. package/dist-server/server/providers/gemini/adapter.js.map +0 -1
  155. package/dist-server/server/providers/gemini/status.js +0 -104
  156. package/dist-server/server/providers/gemini/status.js.map +0 -1
  157. package/dist-server/server/providers/registry.js +0 -58
  158. package/dist-server/server/providers/registry.js.map +0 -1
  159. package/dist-server/server/providers/types.js +0 -117
  160. package/dist-server/server/providers/types.js.map +0 -1
  161. package/dist-server/server/providers/utils.js +0 -28
  162. package/dist-server/server/providers/utils.js.map +0 -1
  163. package/dist-server/server/routes/cli-auth.js +0 -25
  164. package/dist-server/server/routes/cli-auth.js.map +0 -1
  165. package/dist-server/server/routes/mcp.js +0 -480
  166. package/dist-server/server/routes/mcp.js.map +0 -1
  167. package/server/providers/claude/adapter.js +0 -278
  168. package/server/providers/claude/status.js +0 -136
  169. package/server/providers/codex/adapter.js +0 -248
  170. package/server/providers/codex/status.js +0 -78
  171. package/server/providers/cursor/adapter.js +0 -348
  172. package/server/providers/cursor/status.js +0 -128
  173. package/server/providers/gemini/adapter.js +0 -186
  174. package/server/providers/gemini/status.js +0 -111
  175. package/server/providers/registry.js +0 -67
  176. package/server/providers/types.js +0 -132
  177. package/server/providers/utils.js +0 -29
  178. package/server/routes/cli-auth.js +0 -27
  179. package/server/routes/mcp.js +0 -552
@@ -1,480 +0,0 @@
1
- import express from 'express';
2
- import { promises as fs } from 'fs';
3
- import path from 'path';
4
- import os from 'os';
5
- import { fileURLToPath } from 'url';
6
- import { dirname } from 'path';
7
- import { spawn } from 'child_process';
8
- const router = express.Router();
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = dirname(__filename);
11
- // Claude CLI command routes
12
- // GET /api/mcp/cli/list - List MCP servers using Claude CLI
13
- router.get('/cli/list', async (req, res) => {
14
- try {
15
- console.log('📋 Listing MCP servers using Claude CLI');
16
- const { spawn } = await import('child_process');
17
- const { promisify } = await import('util');
18
- const exec = promisify(spawn);
19
- const process = spawn('claude', ['mcp', 'list'], {
20
- stdio: ['pipe', 'pipe', 'pipe']
21
- });
22
- let stdout = '';
23
- let stderr = '';
24
- process.stdout.on('data', (data) => {
25
- stdout += data.toString();
26
- });
27
- process.stderr.on('data', (data) => {
28
- stderr += data.toString();
29
- });
30
- process.on('close', (code) => {
31
- if (code === 0) {
32
- res.json({ success: true, output: stdout, servers: parseClaudeListOutput(stdout) });
33
- }
34
- else {
35
- console.error('Claude CLI error:', stderr);
36
- res.status(500).json({ error: 'Claude CLI command failed', details: stderr });
37
- }
38
- });
39
- process.on('error', (error) => {
40
- console.error('Error running Claude CLI:', error);
41
- res.status(500).json({ error: 'Failed to run Claude CLI', details: error.message });
42
- });
43
- }
44
- catch (error) {
45
- console.error('Error listing MCP servers via CLI:', error);
46
- res.status(500).json({ error: 'Failed to list MCP servers', details: error.message });
47
- }
48
- });
49
- // POST /api/mcp/cli/add - Add MCP server using Claude CLI
50
- router.post('/cli/add', async (req, res) => {
51
- try {
52
- const { name, type = 'stdio', command, args = [], url, headers = {}, env = {}, scope = 'user', projectPath } = req.body;
53
- console.log(`➕ Adding MCP server using Claude CLI (${scope} scope):`, name);
54
- const { spawn } = await import('child_process');
55
- let cliArgs = ['mcp', 'add'];
56
- // Add scope flag
57
- cliArgs.push('--scope', scope);
58
- if (type === 'http') {
59
- cliArgs.push('--transport', 'http', name, url);
60
- // Add headers if provided
61
- Object.entries(headers).forEach(([key, value]) => {
62
- cliArgs.push('--header', `${key}: ${value}`);
63
- });
64
- }
65
- else if (type === 'sse') {
66
- cliArgs.push('--transport', 'sse', name, url);
67
- // Add headers if provided
68
- Object.entries(headers).forEach(([key, value]) => {
69
- cliArgs.push('--header', `${key}: ${value}`);
70
- });
71
- }
72
- else {
73
- // stdio (default): claude mcp add --scope user <name> <command> [args...]
74
- cliArgs.push(name);
75
- // Add environment variables
76
- Object.entries(env).forEach(([key, value]) => {
77
- cliArgs.push('-e', `${key}=${value}`);
78
- });
79
- cliArgs.push(command);
80
- if (args && args.length > 0) {
81
- cliArgs.push(...args);
82
- }
83
- }
84
- console.log('🔧 Running Claude CLI command:', 'claude', cliArgs.join(' '));
85
- // For local scope, we need to run the command in the project directory
86
- const spawnOptions = {
87
- stdio: ['pipe', 'pipe', 'pipe']
88
- };
89
- if (scope === 'local' && projectPath) {
90
- spawnOptions.cwd = projectPath;
91
- console.log('📁 Running in project directory:', projectPath);
92
- }
93
- const process = spawn('claude', cliArgs, spawnOptions);
94
- let stdout = '';
95
- let stderr = '';
96
- process.stdout.on('data', (data) => {
97
- stdout += data.toString();
98
- });
99
- process.stderr.on('data', (data) => {
100
- stderr += data.toString();
101
- });
102
- process.on('close', (code) => {
103
- if (code === 0) {
104
- res.json({ success: true, output: stdout, message: `MCP server "${name}" added successfully` });
105
- }
106
- else {
107
- console.error('Claude CLI error:', stderr);
108
- res.status(400).json({ error: 'Claude CLI command failed', details: stderr });
109
- }
110
- });
111
- process.on('error', (error) => {
112
- console.error('Error running Claude CLI:', error);
113
- res.status(500).json({ error: 'Failed to run Claude CLI', details: error.message });
114
- });
115
- }
116
- catch (error) {
117
- console.error('Error adding MCP server via CLI:', error);
118
- res.status(500).json({ error: 'Failed to add MCP server', details: error.message });
119
- }
120
- });
121
- // POST /api/mcp/cli/add-json - Add MCP server using JSON format
122
- router.post('/cli/add-json', async (req, res) => {
123
- try {
124
- const { name, jsonConfig, scope = 'user', projectPath } = req.body;
125
- console.log('➕ Adding MCP server using JSON format:', name);
126
- // Validate and parse JSON config
127
- let parsedConfig;
128
- try {
129
- parsedConfig = typeof jsonConfig === 'string' ? JSON.parse(jsonConfig) : jsonConfig;
130
- }
131
- catch (parseError) {
132
- return res.status(400).json({
133
- error: 'Invalid JSON configuration',
134
- details: parseError.message
135
- });
136
- }
137
- // Validate required fields
138
- if (!parsedConfig.type) {
139
- return res.status(400).json({
140
- error: 'Invalid configuration',
141
- details: 'Missing required field: type'
142
- });
143
- }
144
- if (parsedConfig.type === 'stdio' && !parsedConfig.command) {
145
- return res.status(400).json({
146
- error: 'Invalid configuration',
147
- details: 'stdio type requires a command field'
148
- });
149
- }
150
- if ((parsedConfig.type === 'http' || parsedConfig.type === 'sse') && !parsedConfig.url) {
151
- return res.status(400).json({
152
- error: 'Invalid configuration',
153
- details: `${parsedConfig.type} type requires a url field`
154
- });
155
- }
156
- const { spawn } = await import('child_process');
157
- // Build the command: claude mcp add-json --scope <scope> <name> '<json>'
158
- const cliArgs = ['mcp', 'add-json', '--scope', scope, name];
159
- // Add the JSON config as a properly formatted string
160
- const jsonString = JSON.stringify(parsedConfig);
161
- cliArgs.push(jsonString);
162
- console.log('🔧 Running Claude CLI command:', 'claude', cliArgs[0], cliArgs[1], cliArgs[2], cliArgs[3], cliArgs[4], jsonString);
163
- // For local scope, we need to run the command in the project directory
164
- const spawnOptions = {
165
- stdio: ['pipe', 'pipe', 'pipe']
166
- };
167
- if (scope === 'local' && projectPath) {
168
- spawnOptions.cwd = projectPath;
169
- console.log('📁 Running in project directory:', projectPath);
170
- }
171
- const process = spawn('claude', cliArgs, spawnOptions);
172
- let stdout = '';
173
- let stderr = '';
174
- process.stdout.on('data', (data) => {
175
- stdout += data.toString();
176
- });
177
- process.stderr.on('data', (data) => {
178
- stderr += data.toString();
179
- });
180
- process.on('close', (code) => {
181
- if (code === 0) {
182
- res.json({ success: true, output: stdout, message: `MCP server "${name}" added successfully via JSON` });
183
- }
184
- else {
185
- console.error('Claude CLI error:', stderr);
186
- res.status(400).json({ error: 'Claude CLI command failed', details: stderr });
187
- }
188
- });
189
- process.on('error', (error) => {
190
- console.error('Error running Claude CLI:', error);
191
- res.status(500).json({ error: 'Failed to run Claude CLI', details: error.message });
192
- });
193
- }
194
- catch (error) {
195
- console.error('Error adding MCP server via JSON:', error);
196
- res.status(500).json({ error: 'Failed to add MCP server', details: error.message });
197
- }
198
- });
199
- // DELETE /api/mcp/cli/remove/:name - Remove MCP server using Claude CLI
200
- router.delete('/cli/remove/:name', async (req, res) => {
201
- try {
202
- const { name } = req.params;
203
- const { scope } = req.query; // Get scope from query params
204
- // Handle the ID format (remove scope prefix if present)
205
- let actualName = name;
206
- let actualScope = scope;
207
- // If the name includes a scope prefix like "local:test", extract it
208
- if (name.includes(':')) {
209
- const [prefix, serverName] = name.split(':');
210
- actualName = serverName;
211
- actualScope = actualScope || prefix; // Use prefix as scope if not provided in query
212
- }
213
- console.log('🗑️ Removing MCP server using Claude CLI:', actualName, 'scope:', actualScope);
214
- const { spawn } = await import('child_process');
215
- // Build command args based on scope
216
- let cliArgs = ['mcp', 'remove'];
217
- // Add scope flag if it's local scope
218
- if (actualScope === 'local') {
219
- cliArgs.push('--scope', 'local');
220
- }
221
- else if (actualScope === 'user' || !actualScope) {
222
- // User scope is default, but we can be explicit
223
- cliArgs.push('--scope', 'user');
224
- }
225
- cliArgs.push(actualName);
226
- console.log('🔧 Running Claude CLI command:', 'claude', cliArgs.join(' '));
227
- const process = spawn('claude', cliArgs, {
228
- stdio: ['pipe', 'pipe', 'pipe']
229
- });
230
- let stdout = '';
231
- let stderr = '';
232
- process.stdout.on('data', (data) => {
233
- stdout += data.toString();
234
- });
235
- process.stderr.on('data', (data) => {
236
- stderr += data.toString();
237
- });
238
- process.on('close', (code) => {
239
- if (code === 0) {
240
- res.json({ success: true, output: stdout, message: `MCP server "${name}" removed successfully` });
241
- }
242
- else {
243
- console.error('Claude CLI error:', stderr);
244
- res.status(400).json({ error: 'Claude CLI command failed', details: stderr });
245
- }
246
- });
247
- process.on('error', (error) => {
248
- console.error('Error running Claude CLI:', error);
249
- res.status(500).json({ error: 'Failed to run Claude CLI', details: error.message });
250
- });
251
- }
252
- catch (error) {
253
- console.error('Error removing MCP server via CLI:', error);
254
- res.status(500).json({ error: 'Failed to remove MCP server', details: error.message });
255
- }
256
- });
257
- // GET /api/mcp/cli/get/:name - Get MCP server details using Claude CLI
258
- router.get('/cli/get/:name', async (req, res) => {
259
- try {
260
- const { name } = req.params;
261
- console.log('📄 Getting MCP server details using Claude CLI:', name);
262
- const { spawn } = await import('child_process');
263
- const process = spawn('claude', ['mcp', 'get', name], {
264
- stdio: ['pipe', 'pipe', 'pipe']
265
- });
266
- let stdout = '';
267
- let stderr = '';
268
- process.stdout.on('data', (data) => {
269
- stdout += data.toString();
270
- });
271
- process.stderr.on('data', (data) => {
272
- stderr += data.toString();
273
- });
274
- process.on('close', (code) => {
275
- if (code === 0) {
276
- res.json({ success: true, output: stdout, server: parseClaudeGetOutput(stdout) });
277
- }
278
- else {
279
- console.error('Claude CLI error:', stderr);
280
- res.status(404).json({ error: 'Claude CLI command failed', details: stderr });
281
- }
282
- });
283
- process.on('error', (error) => {
284
- console.error('Error running Claude CLI:', error);
285
- res.status(500).json({ error: 'Failed to run Claude CLI', details: error.message });
286
- });
287
- }
288
- catch (error) {
289
- console.error('Error getting MCP server details via CLI:', error);
290
- res.status(500).json({ error: 'Failed to get MCP server details', details: error.message });
291
- }
292
- });
293
- // GET /api/mcp/config/read - Read MCP servers directly from Claude config files
294
- router.get('/config/read', async (req, res) => {
295
- try {
296
- console.log('📖 Reading MCP servers from Claude config files');
297
- const homeDir = os.homedir();
298
- const configPaths = [
299
- path.join(homeDir, '.claude.json'),
300
- path.join(homeDir, '.claude', 'settings.json')
301
- ];
302
- let configData = null;
303
- let configPath = null;
304
- // Try to read from either config file
305
- for (const filepath of configPaths) {
306
- try {
307
- const fileContent = await fs.readFile(filepath, 'utf8');
308
- configData = JSON.parse(fileContent);
309
- configPath = filepath;
310
- console.log(`✅ Found Claude config at: ${filepath}`);
311
- break;
312
- }
313
- catch (error) {
314
- // File doesn't exist or is not valid JSON, try next
315
- console.log(`ℹ️ Config not found or invalid at: ${filepath}`);
316
- }
317
- }
318
- if (!configData) {
319
- return res.json({
320
- success: false,
321
- message: 'No Claude configuration file found',
322
- servers: []
323
- });
324
- }
325
- // Extract MCP servers from the config
326
- const servers = [];
327
- // Check for user-scoped MCP servers (at root level)
328
- if (configData.mcpServers && typeof configData.mcpServers === 'object' && Object.keys(configData.mcpServers).length > 0) {
329
- console.log('🔍 Found user-scoped MCP servers:', Object.keys(configData.mcpServers));
330
- for (const [name, config] of Object.entries(configData.mcpServers)) {
331
- const server = {
332
- id: name,
333
- name: name,
334
- type: 'stdio', // Default type
335
- scope: 'user', // User scope - available across all projects
336
- config: {},
337
- raw: config // Include raw config for full details
338
- };
339
- // Determine transport type and extract config
340
- if (config.command) {
341
- server.type = 'stdio';
342
- server.config.command = config.command;
343
- server.config.args = config.args || [];
344
- server.config.env = config.env || {};
345
- }
346
- else if (config.url) {
347
- server.type = config.transport || 'http';
348
- server.config.url = config.url;
349
- server.config.headers = config.headers || {};
350
- }
351
- servers.push(server);
352
- }
353
- }
354
- // Check for local-scoped MCP servers (project-specific)
355
- const currentProjectPath = process.cwd();
356
- // Check under 'projects' key
357
- if (configData.projects && configData.projects[currentProjectPath]) {
358
- const projectConfig = configData.projects[currentProjectPath];
359
- if (projectConfig.mcpServers && typeof projectConfig.mcpServers === 'object' && Object.keys(projectConfig.mcpServers).length > 0) {
360
- console.log(`🔍 Found local-scoped MCP servers for ${currentProjectPath}:`, Object.keys(projectConfig.mcpServers));
361
- for (const [name, config] of Object.entries(projectConfig.mcpServers)) {
362
- const server = {
363
- id: `local:${name}`, // Prefix with scope for uniqueness
364
- name: name, // Keep original name
365
- type: 'stdio', // Default type
366
- scope: 'local', // Local scope - only for this project
367
- projectPath: currentProjectPath,
368
- config: {},
369
- raw: config // Include raw config for full details
370
- };
371
- // Determine transport type and extract config
372
- if (config.command) {
373
- server.type = 'stdio';
374
- server.config.command = config.command;
375
- server.config.args = config.args || [];
376
- server.config.env = config.env || {};
377
- }
378
- else if (config.url) {
379
- server.type = config.transport || 'http';
380
- server.config.url = config.url;
381
- server.config.headers = config.headers || {};
382
- }
383
- servers.push(server);
384
- }
385
- }
386
- }
387
- console.log(`📋 Found ${servers.length} MCP servers in config`);
388
- res.json({
389
- success: true,
390
- configPath: configPath,
391
- servers: servers
392
- });
393
- }
394
- catch (error) {
395
- console.error('Error reading Claude config:', error);
396
- res.status(500).json({
397
- error: 'Failed to read Claude configuration',
398
- details: error.message
399
- });
400
- }
401
- });
402
- // Helper functions to parse Claude CLI output
403
- function parseClaudeListOutput(output) {
404
- const servers = [];
405
- const lines = output.split('\n').filter(line => line.trim());
406
- for (const line of lines) {
407
- // Skip the header line
408
- if (line.includes('Checking MCP server health'))
409
- continue;
410
- // Parse lines like "test: test test - ✗ Failed to connect"
411
- // or "server-name: command or description - ✓ Connected"
412
- if (line.includes(':')) {
413
- const colonIndex = line.indexOf(':');
414
- const name = line.substring(0, colonIndex).trim();
415
- // Skip empty names
416
- if (!name)
417
- continue;
418
- // Extract the rest after the name
419
- const rest = line.substring(colonIndex + 1).trim();
420
- // Try to extract description and status
421
- let description = rest;
422
- let status = 'unknown';
423
- let type = 'stdio'; // default type
424
- // Check for status indicators
425
- if (rest.includes('✓') || rest.includes('✗')) {
426
- const statusMatch = rest.match(/(.*?)\s*-\s*([✓✗].*)$/);
427
- if (statusMatch) {
428
- description = statusMatch[1].trim();
429
- status = statusMatch[2].includes('✓') ? 'connected' : 'failed';
430
- }
431
- }
432
- // Try to determine type from description
433
- if (description.startsWith('http://') || description.startsWith('https://')) {
434
- type = 'http';
435
- }
436
- servers.push({
437
- name,
438
- type,
439
- status: status || 'active',
440
- description
441
- });
442
- }
443
- }
444
- console.log('🔍 Parsed Claude CLI servers:', servers);
445
- return servers;
446
- }
447
- function parseClaudeGetOutput(output) {
448
- // Parse the output from 'claude mcp get <name>' command
449
- // This is a simple parser - might need adjustment based on actual output format
450
- try {
451
- // Try to extract JSON if present
452
- const jsonMatch = output.match(/\{[\s\S]*\}/);
453
- if (jsonMatch) {
454
- return JSON.parse(jsonMatch[0]);
455
- }
456
- // Otherwise, parse as text
457
- const server = { raw_output: output };
458
- const lines = output.split('\n');
459
- for (const line of lines) {
460
- if (line.includes('Name:')) {
461
- server.name = line.split(':')[1]?.trim();
462
- }
463
- else if (line.includes('Type:')) {
464
- server.type = line.split(':')[1]?.trim();
465
- }
466
- else if (line.includes('Command:')) {
467
- server.command = line.split(':')[1]?.trim();
468
- }
469
- else if (line.includes('URL:')) {
470
- server.url = line.split(':')[1]?.trim();
471
- }
472
- }
473
- return server;
474
- }
475
- catch (error) {
476
- return { raw_output: output, parse_error: error.message };
477
- }
478
- }
479
- export default router;
480
- //# sourceMappingURL=mcp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../server/routes/mcp.js"],"names":[],"mappings":"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"}