Hermes can install macOS launchd LaunchAgents that automatically start its gateway, WebUI, and link daemon.
When those LaunchAgents use KeepAlive and RunAtLoad, killing the visible MCP processes does not solve the problem. The Hermes gateway simply restarts and launches every configured MCP server again.
This guide shows how to identify and remove those persistent background services.
You may be dealing with this issue if:
- MCP servers immediately return after being killed
- Activity Monitor fills with Node, Python,
npm exec, or MCP processes - Processes have a parent process ID of
1 mcp_stdio_watchdog.pykeeps recreating servers- Hermes processes return after closing Terminal or restarting your Mac
The MCP servers themselves are not the root problem.
They are child processes launched by a Hermes gateway. That gateway may be managed by a macOS LaunchAgent configured with:
KeepAlive
RunAtLoad
As long as the LaunchAgent remains loaded, macOS will keep restarting the gateway.
ps -axo pid,ppid,etime,command | grep -E \
'hermes_cli.main (serve|gateway)|hermeslink daemon|Hermes.app/Contents/MacOS/Hermes' \
| grep -v grepTo inspect MCP-related child processes:
ps -axo pid,ppid,etime,command | grep -Ei \
'hermes_cli|mcp_stdio_watchdog|npm exec.*mcp|node.*mcp' \
| grep -v grepls -la "$HOME/Library/LaunchAgents" | grep -i hermesCommon examples include:
ai.hermes.gateway.plist
ai.hermes.gateway-pinchy.plist
com.hermes.webui.plist
com.hermespilot.link.plist
Your filenames may be different.
Unload each LaunchAgent before deleting it:
launchctl bootout gui/$(id -u) "$HOME/Library/LaunchAgents/ai.hermes.gateway.plist" 2>/dev/null
launchctl bootout gui/$(id -u) "$HOME/Library/LaunchAgents/com.hermes.webui.plist" 2>/dev/null
launchctl bootout gui/$(id -u) "$HOME/Library/LaunchAgents/com.hermespilot.link.plist" 2>/dev/nullFor a named profile such as pinchy:
launchctl bootout gui/$(id -u) "$HOME/Library/LaunchAgents/ai.hermes.gateway-pinchy.plist" 2>/dev/nullrm -f "$HOME/Library/LaunchAgents/ai.hermes.gateway.plist"
rm -f "$HOME/Library/LaunchAgents/com.hermes.webui.plist"
rm -f "$HOME/Library/LaunchAgents/com.hermespilot.link.plist"
rm -f "$HOME/Library/LaunchAgents/ai.hermes.gateway-pinchy.plist"Only remove files that actually exist on your system.
pkill -f 'hermes_cli.main gateway run' 2>/dev/null || true
pkill -f 'hermeslink daemon' 2>/dev/null || true
pkill -f 'hermes-webui/server.py' 2>/dev/null || trueAvoid broad commands such as:
pkill node
pkill pythonThose can terminate unrelated applications and development tools.
Check that no Hermes services remain:
ps -axo pid,ppid,etime,command | grep -E \
'hermes_cli.main (serve|gateway)|hermeslink daemon|hermes-webui/server.py' \
| grep -v grepCheck that no Hermes LaunchAgents remain:
ls -la "$HOME/Library/LaunchAgents" | grep -i hermesBoth commands should return no output.
You can also verify a specific service:
launchctl print gui/$(id -u)/ai.hermes.gatewayA successful removal should produce a message similar to:
Could not find service "ai.hermes.gateway"
This does not uninstall Hermes.
It only removes the macOS LaunchAgents responsible for automatically starting and restarting Hermes background services.
You can still launch Hermes manually later.
A Hermes update or reinstall may recreate the LaunchAgents, so check ~/Library/LaunchAgents again if the problem returns.
The process tree usually looks like this:
macOS launchd
└── Hermes gateway
└── mcp_stdio_watchdog.py
└── npm, node, uvx, or Python MCP server
Killing the MCP server only removes the final child process.
The watchdog or gateway recreates it. The permanent fix is to unload the LaunchAgent that keeps the gateway alive.
Review every command before running it.
LaunchAgent names can vary between installations, profiles, and Hermes versions. Do not delete unrelated .plist files from ~/Library/LaunchAgents.