Total Orphaned Processes: 140+
- 25 Python processes (MCP servers) - ~40 MB
- 24 Node.js processes (npx + MCP servers) - ~60 MB
- 91 Console/Shell processes (cmd, powershell, conhost) - Unknown
- Total Memory Impact: ~100+ MB wasted
Root Cause: Duplicate MCP server definitions in ~/.kiro/settings/mcp.json
Pattern: Each MCP server running twice
mcp-server-fetch- 4 processesaws-api-mcp-server- 4 processesaws-iac-mcp-server- 2 processesstrands-agents-mcp-server- 2 processesaurora-dsql-mcp-server- 2 processesamazon-bedrock-agentcore-mcp-server- 2 processesdynamodb-mcp-server- 2 processesaws-pricing-mcp-server- 2 processescloudwatch-applicationsignals-mcp-server- 2 processesaws-healthomics-mcp-server- 2 processes
Why: Powers define same servers multiple times without deduplication
Solution: See PROCESS_CLEANUP_AND_ROOT_CAUSE.md
Root Cause: NPX processes not being cleaned up after spawning actual servers
Pattern: Each Node.js MCP server has 2 processes
- Parent:
npx-cli.js(launcher) - Child: Actual server process
Servers Running:
@amazon-devices/amazon-devices-buildertools-mcp- 12 processes (6 pairs)@upstash/context7-mcp- 2 processes (1 pair)snyk@latest- 2 processes (1 pair)
Why:
- NPX spawns child process but doesn't exit
- Multiple instances of same power loaded
- No process cleanup on power unload
Solution:
// In MCP server manager
class NPXServerManager {
async startServer(packageName) {
// Check if already running
const existing = this.findRunningServer(packageName);
if (existing) {
logger.info(`Server ${packageName} already running (PID: ${existing.pid})`);
return existing;
}
// Start new server
const npxProcess = spawn('npx', ['-y', packageName]);
// Track and cleanup
this.trackProcess(packageName, npxProcess);
// Ensure cleanup on exit
npxProcess.on('exit', () => {
this.untrackProcess(packageName);
});
return npxProcess;
}
async stopServer(packageName) {
const proc = this.findRunningServer(packageName);
if (proc) {
proc.kill();
this.untrackProcess(packageName);
}
}
}Root Cause: Multiple sources creating console windows without cleanup
Likely Sources:
- Test runners - Each test spawns a console
- Build processes - npm/yarn scripts create shells
- Development servers - Background processes
- MCP servers - Each server may spawn console
- IDE integrations - Terminal instances not closed
Why:
- No automatic cleanup on process exit
- Detached processes not tracked
- Multiple IDE instances or workspaces
- Background tasks not properly terminated
Solution:
# Identify orphaned consoles
Get-Process conhost | ForEach-Object {
$parent = Get-Process -Id $_.ProcessId -ErrorAction SilentlyContinue
if ($parent.Parent.ProcessName -notlike "*explorer*" -and
$parent.Parent.ProcessName -notlike "*vscode*" -and
$parent.Parent.ProcessName -notlike "*cursor*") {
Write-Host "Orphaned: $($_.Id) - Parent: $($parent.Parent.ProcessName)"
}
}
# Kill orphaned consoles
Get-Process conhost | Where-Object {
$parent = Get-Process -Id $_.ProcessId -ErrorAction SilentlyContinue
$parent.Parent.ProcessName -notlike "*explorer*" -and
$parent.Parent.ProcessName -notlike "*vscode*" -and
$parent.Parent.ProcessName -notlike "*cursor*"
} | Stop-Process -Force- Python MCP servers: ~40 MB (25 processes × 1.6 MB avg)
- Node.js MCP servers: ~60 MB (24 processes × 2.5 MB avg)
- Console processes: ~100+ MB (91 processes × 1+ MB avg)
- Total: ~200+ MB wasted
- CPU: Idle processes consuming CPU cycles
- File Descriptors: Each process uses 10-20 FDs
- Memory Pressure: Reduced available RAM
- Startup Time: Slower IDE startup due to process overhead
- Slower responsiveness
- Higher memory footprint
- Potential crashes if memory exhausted
- Difficulty debugging actual issues
# Kill all orphaned processes
Write-Host "Killing orphaned Python MCP servers..."
Get-Process python | Where-Object { $_.CommandLine -like "*mcp-server*" } | Stop-Process -Force
Write-Host "Killing orphaned Node.js processes..."
Get-Process node | Stop-Process -Force
Write-Host "Killing orphaned console windows..."
Get-Process conhost | Stop-Process -Force -ErrorAction SilentlyContinue
Write-Host "Cleanup complete. Restart IDE."- Deduplicate MCP config - Remove duplicate server definitions
- Disable unused powers - Set
disabled: truefor unused MCP servers - Clean npm cache -
npm cache clean --force
1. Process Registry
class ProcessRegistry:
"""Track all spawned processes"""
def __init__(self):
self.processes = {} # name -> PID
def register(self, name, pid):
if name in self.processes:
logger.warning(f"Process {name} already registered")
return False
self.processes[name] = pid
return True
def unregister(self, name):
if name in self.processes:
del self.processes[name]
def cleanup_all(self):
for name, pid in self.processes.items():
try:
os.kill(pid, signal.SIGTERM)
except:
pass2. Automatic Cleanup
class ManagedProcess:
"""Process with automatic cleanup"""
def __init__(self, name, command):
self.name = name
self.process = None
self.command = command
def start(self):
# Check if already running
if self.is_running():
return self.process.pid
# Start process
self.process = subprocess.Popen(self.command)
registry.register(self.name, self.process.pid)
return self.process.pid
def stop(self):
if self.process:
self.process.terminate()
self.process.wait(timeout=5)
registry.unregister(self.name)
def is_running(self):
return self.process and self.process.poll() is None
def __enter__(self):
self.start()
return self
def __exit__(self, *args):
self.stop()3. Health Monitor
class ProcessHealthMonitor:
"""Monitor for orphaned processes"""
def __init__(self):
self.check_interval = 60 # seconds
def check_orphaned_processes(self):
"""Detect and report orphaned processes"""
orphaned = {
'python': self._find_orphaned_python(),
'node': self._find_orphaned_node(),
'console': self._find_orphaned_console(),
}
if any(orphaned.values()):
logger.warning(f"Orphaned processes detected: {orphaned}")
self._alert_user(orphaned)
return orphaned
def _find_orphaned_python(self):
"""Find orphaned Python processes"""
processes = Get-Process python
orphaned = []
for proc in processes:
if proc.CommandLine.contains('mcp-server'):
if not self._is_tracked(proc.Id):
orphaned.append(proc.Id)
return orphaned- Implement process registry
- Add automatic cleanup on process exit
- Deduplicate MCP server definitions
- Add health monitoring
- Implement process timeout
- Add IDE shutdown cleanup
- Document process lifecycle
- Add tests for process cleanup
- Monitor memory usage
- Alert on process count threshold
~/.kiro/settings/mcp.json- Duplicate MCP definitions- MCP server manager code - No deduplication
- IDE shutdown handlers - No cleanup
- Power loading code - No duplicate detection
Root Causes:
- Python: Duplicate MCP server definitions in config
- Node.js: NPX launcher processes not cleaned up
- Console: Orphaned terminal windows from various sources
Impact: 200+ MB wasted memory, slower IDE, potential crashes
Fix: Deduplicate config, implement process registry, add cleanup handlers
Prevention: Process tracking, health monitoring, automatic cleanup