stop_dev_server
Stop npm run dev processes managed by the npm-dev-mcp server. Specify a directory to target specific projects when multiple processes are running.
Instructions
npm run devプロセス停止
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| directory | No | 停止対象のディレクトリ(複数起動時に指定。未指定時は唯一のプロセスまたはエラー) |
Implementation Reference
- src/tools/stopDevServer.ts:22-79 (handler)The primary handler function for the 'stop_dev_server' MCP tool. It checks for the target process, stops it using ProcessManager, collects log stats, and returns a detailed JSON response.export async function stopDevServer(args: { directory?: string }): Promise<string> { try { const processManager = ProcessManager.getInstance(); // Check if target process exists BEFORE stopping const targetProcess = processManager.getProcess(args.directory); if (!targetProcess) { return JSON.stringify({ success: false, message: '指定されたディレクトリのDev serverは見つかりませんでした(または起動していません)', wasRunning: false }); } logger.info('Stopping dev server', { directory: targetProcess.directory }); const logManager = processManager.getLogManager(targetProcess.directory); const finalLogStats = logManager?.getLogStats(); // Stop the dev server const stopResult = await processManager.stopDevServer(args.directory); const result: any = { success: stopResult, message: stopResult ? 'Dev serverを正常に停止しました' : 'Dev serverの停止中にエラーが発生しましたが、プロセスは終了した可能性があります', wasRunning: true, stoppedProcess: { pid: targetProcess.pid, directory: targetProcess.directory, ports: targetProcess.ports } }; if (finalLogStats) { result.finalLogStats = { total: finalLogStats.total, errors: finalLogStats.errors, warnings: finalLogStats.warnings }; if (finalLogStats.errors > 0) { result.message += `\n最終ログに${finalLogStats.errors}個のエラーが記録されています`; } } return JSON.stringify(result, null, 2); } catch (error) { logger.error('Failed to stop dev server', { error }); return JSON.stringify({ success: false, message: `Dev serverの停止に失敗しました: ${error}`, wasRunning: false, error: String(error) }); } }
- src/tools/stopDevServer.ts:7-20 (schema)Input schema definition for the 'stop_dev_server' tool, defining the optional 'directory' parameter.export const stopDevServerSchema: Tool = { name: 'stop_dev_server', description: 'npm run devプロセス停止', inputSchema: { type: 'object', properties: { directory: { type: 'string', description: '停止対象のディレクトリ(複数起動時に指定。未指定時は唯一のプロセスまたはエラー)' } }, additionalProperties: false } };
- src/index.ts:167-175 (registration)Registration and dispatch of the 'stop_dev_server' tool handler in the main CallToolRequestSchema switch statement.case 'stop_dev_server': return { content: [ { type: 'text', text: await stopDevServer(args as { directory?: string }), }, ], };
- Core helper method in ProcessManager that performs the actual process termination (SIGTERM then SIGKILL if needed) and cleanup, called by the tool handler.async stopDevServer(directory?: string): Promise<boolean> { this.logger.info(`Stopping dev server${directory ? ` for ${directory}` : ''}`); const targetDirectory = this.resolveTargetDirectory(directory); const processData = this.processes.get(targetDirectory); if (!processData) { this.logger.info(`No dev server running for ${targetDirectory}`); return true; // Already stopped or not found } try { const pid = processData.info.pid; // Try graceful shutdown first if (processData.child) { processData.child.kill('SIGTERM'); } else { await killProcess(pid, 'SIGTERM'); } // Wait a moment for graceful shutdown await new Promise(resolve => setTimeout(resolve, 3000)); // Check if process is still running if (await isProcessRunning(pid)) { this.logger.warn(`Process ${pid} did not stop gracefully, forcing termination`); await killProcess(pid, 'SIGKILL'); } await this.cleanupProcess(targetDirectory); this.logger.info(`Dev server stopped successfully for ${targetDirectory}`); return true; } catch (error) { this.logger.error(`Failed to stop dev server for ${targetDirectory}`, { error }); await this.cleanupProcess(targetDirectory); // Clean up anyway return false; } }