Skip to main content
Glama
masamunet

npm-dev-mcp

by masamunet

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
NameRequiredDescriptionDefault
directoryNo停止対象のディレクトリ(複数起動時に指定。未指定時は唯一のプロセスまたはエラー)

Implementation Reference

  • 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)
        });
      }
    }
  • 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;
      }
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/masamunet/npm-dev-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server