@@ -37,6 +37,12 @@ import { Command } from 'commander';
3737import ora from 'ora' ;
3838import { addCursorServer , listCursorServers , removeCursorServer } from '../utils/cursor-config' ;
3939import { logger } from '../utils/logger' ;
40+ import {
41+ output ,
42+ printMcpInstallSuccess ,
43+ printMcpServers ,
44+ printMcpUninstallSuccess ,
45+ } from '../utils/output' ;
4046
4147export const mcpCommand = new Command ( 'mcp' )
4248 . description ( 'MCP (Model Context Protocol) server integration' )
@@ -276,32 +282,21 @@ export const mcpCommand = new Command('mcp')
276282
277283 if ( result . alreadyExists ) {
278284 spinner . info ( chalk . yellow ( 'MCP server already installed in Cursor!' ) ) ;
279- logger . log ( '' ) ;
280- logger . log ( `Server name: ${ chalk . cyan ( result . serverName ) } ` ) ;
281- logger . log ( `Repository: ${ chalk . gray ( repositoryPath ) } ` ) ;
282- logger . log ( '' ) ;
283- logger . log ( `Run ${ chalk . cyan ( 'dev mcp list --cursor' ) } to see all servers` ) ;
285+ output . log ( ) ;
286+ output . log ( `Server name: ${ chalk . cyan ( result . serverName ) } ` ) ;
287+ output . log ( `Repository: ${ chalk . gray ( repositoryPath ) } ` ) ;
288+ output . log ( ) ;
289+ output . log ( `Run ${ chalk . cyan ( 'dev mcp list --cursor' ) } to see all servers` ) ;
290+ output . log ( ) ;
284291 } else {
285- spinner . succeed ( chalk . green ( 'MCP server installed in Cursor!' ) ) ;
286- logger . log ( '' ) ;
287- logger . log ( chalk . bold ( 'Integration complete! 🎉' ) ) ;
288- logger . log ( '' ) ;
289- logger . log ( `Server name: ${ chalk . cyan ( result . serverName ) } ` ) ;
290- logger . log ( 'Available tools in Cursor:' ) ;
291- logger . log ( ` ${ chalk . cyan ( 'dev_search' ) } - Semantic code search` ) ;
292- logger . log ( ` ${ chalk . cyan ( 'dev_status' ) } - Repository status` ) ;
293- logger . log ( ` ${ chalk . cyan ( 'dev_plan' ) } - Generate development plans` ) ;
294- logger . log ( ` ${ chalk . cyan ( 'dev_explore' ) } - Explore code patterns` ) ;
295- logger . log ( ` ${ chalk . cyan ( 'dev_gh' ) } - Search GitHub issues/PRs` ) ;
296- logger . log ( ` ${ chalk . cyan ( 'dev_health' ) } - Server health checks` ) ;
297- logger . log ( ` ${ chalk . cyan ( 'dev_refs' ) } - Find symbol references` ) ;
298- logger . log ( ` ${ chalk . cyan ( 'dev_map' ) } - Generate codebase map` ) ;
299- logger . log ( ` ${ chalk . cyan ( 'dev_history' ) } - Search git history` ) ;
300- logger . log ( '' ) ;
301- logger . log ( `Repository: ${ chalk . yellow ( repositoryPath ) } ` ) ;
302- logger . log ( `Storage: ${ chalk . yellow ( storagePath ) } ` ) ;
303- logger . log ( '' ) ;
304- logger . log ( chalk . yellow ( '⚠️ Please restart Cursor to apply changes' ) ) ;
292+ spinner . succeed ( 'MCP server installed' ) ;
293+
294+ printMcpInstallSuccess ( {
295+ ide : 'Cursor' ,
296+ serverName : result . serverName ,
297+ configPath : '~/.cursor/mcp.json' ,
298+ repository : repositoryPath ,
299+ } ) ;
305300 }
306301 } else {
307302 // Install for Claude Code using claude CLI
@@ -326,56 +321,48 @@ export const mcpCommand = new Command('mcp')
326321 stdio : [ 'inherit' , 'pipe' , 'pipe' ] ,
327322 } ) ;
328323
329- let output = '' ;
330- let error = '' ;
324+ let stdoutData = '' ;
325+ let stderrData = '' ;
331326
332327 result . stdout ?. on ( 'data' , ( data ) => {
333- output += data . toString ( ) ;
328+ stdoutData += data . toString ( ) ;
334329 } ) ;
335330
336331 result . stderr ?. on ( 'data' , ( data ) => {
337- error += data . toString ( ) ;
332+ stderrData += data . toString ( ) ;
338333 } ) ;
339334
340335 result . on ( 'close' , ( code ) => {
341336 if ( code === 0 ) {
342- spinner . succeed ( chalk . green ( 'MCP server installed in Claude Code!' ) ) ;
343- logger . log ( '' ) ;
344- logger . log ( chalk . bold ( 'Integration complete! 🎉' ) ) ;
345- logger . log ( '' ) ;
346- logger . log ( 'Available tools in Claude Code:' ) ;
347- logger . log ( ` ${ chalk . cyan ( 'dev_search' ) } - Semantic code search` ) ;
348- logger . log ( ` ${ chalk . cyan ( 'dev_status' ) } - Repository status` ) ;
349- logger . log ( ` ${ chalk . cyan ( 'dev_plan' ) } - Generate development plans` ) ;
350- logger . log ( ` ${ chalk . cyan ( 'dev_explore' ) } - Explore code patterns` ) ;
351- logger . log ( ` ${ chalk . cyan ( 'dev_gh' ) } - Search GitHub issues/PRs` ) ;
352- logger . log ( ` ${ chalk . cyan ( 'dev_health' ) } - Server health checks` ) ;
353- logger . log ( ` ${ chalk . cyan ( 'dev_refs' ) } - Find symbol references` ) ;
354- logger . log ( ` ${ chalk . cyan ( 'dev_map' ) } - Generate codebase map` ) ;
355- logger . log ( ` ${ chalk . cyan ( 'dev_history' ) } - Search git history` ) ;
356- logger . log ( '' ) ;
357- logger . log ( `Repository: ${ chalk . yellow ( repositoryPath ) } ` ) ;
358- logger . log ( `Storage: ${ chalk . yellow ( storagePath ) } ` ) ;
337+ spinner . succeed ( 'MCP server installed' ) ;
338+
339+ printMcpInstallSuccess ( {
340+ ide : 'Claude Code' ,
341+ serverName : 'dev-agent' ,
342+ configPath : '~/.claude/mcp.json' ,
343+ repository : repositoryPath ,
344+ } ) ;
359345 } else {
360346 // Check if error is due to server already existing
361- const errorText = error . toLowerCase ( ) ;
347+ const errorText = stderrData . toLowerCase ( ) ;
362348 if (
363349 errorText . includes ( 'already exists' ) ||
364350 errorText . includes ( 'dev-agent already exists' )
365351 ) {
366352 spinner . info ( chalk . yellow ( 'MCP server already installed in Claude Code!' ) ) ;
367- logger . log ( '' ) ;
368- logger . log ( `Server name: ${ chalk . cyan ( 'dev-agent' ) } ` ) ;
369- logger . log ( `Repository: ${ chalk . gray ( repositoryPath ) } ` ) ;
370- logger . log ( '' ) ;
371- logger . log ( `Run ${ chalk . cyan ( 'claude mcp list' ) } to see all servers` ) ;
353+ output . log ( ) ;
354+ output . log ( `Server name: ${ chalk . cyan ( 'dev-agent' ) } ` ) ;
355+ output . log ( `Repository: ${ chalk . gray ( repositoryPath ) } ` ) ;
356+ output . log ( ) ;
357+ output . log ( `Run ${ chalk . cyan ( 'claude mcp list' ) } to see all servers` ) ;
358+ output . log ( ) ;
372359 } else {
373360 spinner . fail ( 'Failed to install MCP server in Claude Code' ) ;
374- if ( error ) {
375- logger . error ( error ) ;
361+ if ( stderrData ) {
362+ logger . error ( stderrData ) ;
376363 }
377- if ( output ) {
378- logger . log ( output ) ;
364+ if ( stdoutData ) {
365+ logger . log ( stdoutData ) ;
379366 }
380367 process . exit ( 1 ) ;
381368 }
@@ -409,9 +396,12 @@ export const mcpCommand = new Command('mcp')
409396 const removed = await removeCursorServer ( repositoryPath ) ;
410397
411398 if ( removed ) {
412- spinner . succeed ( chalk . green ( 'MCP server removed from Cursor!' ) ) ;
413- logger . log ( '' ) ;
414- logger . log ( chalk . yellow ( '⚠️ Please restart Cursor to apply changes' ) ) ;
399+ spinner . succeed ( 'MCP server removed' ) ;
400+
401+ printMcpUninstallSuccess ( {
402+ ide : 'Cursor' ,
403+ serverName : 'dev-agent' ,
404+ } ) ;
415405 } else {
416406 spinner . warn ( 'No MCP server found for this repository in Cursor' ) ;
417407 }
@@ -423,7 +413,12 @@ export const mcpCommand = new Command('mcp')
423413
424414 result . on ( 'close' , ( code ) => {
425415 if ( code === 0 ) {
426- spinner . succeed ( chalk . green ( 'MCP server removed from Claude Code!' ) ) ;
416+ spinner . succeed ( 'MCP server removed' ) ;
417+
418+ printMcpUninstallSuccess ( {
419+ ide : 'Claude Code' ,
420+ serverName : 'dev-agent' ,
421+ } ) ;
427422 } else {
428423 spinner . fail ( 'Failed to remove MCP server from Claude Code' ) ;
429424 process . exit ( 1 ) ;
@@ -445,45 +440,42 @@ export const mcpCommand = new Command('mcp')
445440 try {
446441 if ( options . cursor ) {
447442 // List Cursor servers
443+ const spinner = ora ( 'Checking MCP server health...' ) . start ( ) ;
448444 const servers = await listCursorServers ( ) ;
445+ spinner . stop ( ) ;
449446
450- if ( servers . length === 0 ) {
451- logger . log ( chalk . yellow ( 'No MCP servers configured in Cursor' ) ) ;
452- logger . log ( '' ) ;
453- logger . log ( `Run ${ chalk . cyan ( 'dev mcp install --cursor' ) } to add one` ) ;
454- return ;
455- }
456-
457- logger . log ( '' ) ;
458- logger . log ( chalk . bold ( 'MCP Servers in Cursor:' ) ) ;
459- logger . log ( '' ) ;
447+ // Add status check (simple check: does the command exist?)
448+ const serversWithStatus = servers . map ( ( server ) => ( {
449+ ...server ,
450+ status : 'active' as const , // For now, all listed servers are considered active
451+ } ) ) ;
460452
461- for ( const server of servers ) {
462- logger . log ( ` ${ chalk . cyan ( server . name ) } ` ) ;
463- logger . log ( ` Command: ${ chalk . gray ( server . command ) } ` ) ;
464- if ( server . repository ) {
465- logger . log ( ` Repository: ${ chalk . gray ( server . repository ) } ` ) ;
466- }
467- logger . log ( '' ) ;
468- }
469-
470- logger . log ( `Total: ${ chalk . yellow ( servers . length ) } server(s)` ) ;
453+ printMcpServers ( {
454+ ide : 'Cursor' ,
455+ servers : serversWithStatus ,
456+ } ) ;
471457 } else {
472458 // List Claude Code servers
459+ output . log ( ) ;
460+ output . log ( chalk . bold ( 'MCP Servers (Claude Code)' ) ) ;
461+ output . log ( ) ;
462+ output . log ( 'Running: claude mcp list' ) ;
463+ output . log ( ) ;
464+
473465 const result = spawn ( 'claude' , [ 'mcp' , 'list' ] , {
474466 stdio : 'inherit' ,
475467 } ) ;
476468
477469 result . on ( 'close' , ( code ) => {
478470 if ( code !== 0 ) {
479- logger . error ( 'Failed to list MCP servers' ) ;
471+ output . error ( 'Failed to list MCP servers' ) ;
480472 process . exit ( 1 ) ;
481473 }
482474 } ) ;
483475 }
484476 } catch ( error ) {
485- logger . error ( 'Failed to list MCP servers' ) ;
486- logger . error ( error instanceof Error ? error . message : String ( error ) ) ;
477+ output . error ( 'Failed to list MCP servers' ) ;
478+ output . error ( error instanceof Error ? error . message : String ( error ) ) ;
487479 process . exit ( 1 ) ;
488480 }
489481 } )
0 commit comments