(name: string, json: string, options: {
scope?: string;
clientSecret?: true;
})
| 284 | |
| 285 | // mcp add-json (lines 4801–4870) |
| 286 | export async function mcpAddJsonHandler(name: string, json: string, options: { |
| 287 | scope?: string; |
| 288 | clientSecret?: true; |
| 289 | }): Promise<void> { |
| 290 | try { |
| 291 | const scope = ensureConfigScope(options.scope); |
| 292 | const parsedJson = safeParseJSON(json); |
| 293 | |
| 294 | // Read secret before writing config so cancellation doesn't leave partial state |
| 295 | const needsSecret = options.clientSecret && parsedJson && typeof parsedJson === 'object' && 'type' in parsedJson && (parsedJson.type === 'sse' || parsedJson.type === 'http') && 'url' in parsedJson && typeof parsedJson.url === 'string' && 'oauth' in parsedJson && parsedJson.oauth && typeof parsedJson.oauth === 'object' && 'clientId' in parsedJson.oauth; |
| 296 | const clientSecret = needsSecret ? await readClientSecret() : undefined; |
| 297 | await addMcpConfig(name, parsedJson, scope); |
| 298 | const transportType = parsedJson && typeof parsedJson === 'object' && 'type' in parsedJson ? String(parsedJson.type || 'stdio') : 'stdio'; |
| 299 | if (clientSecret && parsedJson && typeof parsedJson === 'object' && 'type' in parsedJson && (parsedJson.type === 'sse' || parsedJson.type === 'http') && 'url' in parsedJson && typeof parsedJson.url === 'string') { |
| 300 | saveMcpClientSecret(name, { |
| 301 | type: parsedJson.type, |
| 302 | url: parsedJson.url |
| 303 | }, clientSecret); |
| 304 | } |
| 305 | logEvent('ncode_mcp_add', { |
| 306 | scope: scope as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, |
| 307 | source: 'json' as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, |
| 308 | type: transportType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS |
| 309 | }); |
| 310 | cliOk(`Added ${transportType} MCP server ${name} to ${scope} config`); |
| 311 | } catch (error) { |
| 312 | cliError((error as Error).message); |
| 313 | } |
| 314 | } |
| 315 | |
| 316 | // mcp add-from-claude-desktop (lines 4881–4927) |
| 317 | export async function mcpAddFromDesktopHandler(options: { |
no test coverage detected