v1.0.0
[GitHub]
░█▄█░█▀▀░█▀█░█▄█░█▀█░█▀█
░█░█░█░░░█▀▀░█░█░█░█░█░█
░▀░▀░▀▀▀░▀░░░▀░▀░▀▀▀░▀░▀

Hot reload for MCP servers.

Change code. Server restarts. Tools refresh. Context stays.

$ mcpmon --watch src/ -- python -m my_server
[mcpmon 14:32:01] Watching src/ for .py changes
[mcpmon 14:32:01 pid:48291] Started: python -m my_server
[mcpmon 14:32:15] File modified: tools.py
[mcpmon 14:32:15 pid:48291] Restarting...
[mcpmon 14:32:15 pid:48342] Restart #1 complete
[mcpmon 14:32:15] Sent tools/list_changed notification

FEATURES

HOT RELOAD

Watch files, restart server on change. SIGTERM graceful shutdown.

TOOL REFRESH

Sends notifications/tools/list_changed. Claude sees new tools instantly.

GATEWAY MODE

Aggregate multiple MCP servers. One connection, all tools.

DUAL RUNTIME

Python + Bun/TypeScript. Full feature parity. Your choice.

INSTALL

Python

pip install mcpmon

gateway + hot reload

Bun

bunx mcpmon

no install needed

Binary

download & run

no dependencies

MCP CONFIG

// .mcp.json - single server with hot reload
{
  "mcpServers": {
    "my-server": {
      "command": "mcpmon",
      "args": ["--watch", "src/", "--", "python", "-m", "my_server"]
    }
  }
}
// .mcp.json - gateway aggregates multiple servers
{
  "mcpServers": {
    "gateway": {
      "command": "mcpmon",
      "args": ["--config", ".mcpmon.yaml"]
    }
  }
}

# .mcpmon.yaml
servers:
  sage:
    command: sage-mcp
    watch: ~/.sage/src/
  crucible:
    command: crucible-mcp
    watch: ~/crucible/src/

LOGGING LEVELS

--quiet

errors only

default

start/stop + PIDs

--verbose

+ file changes

--debug

+ everything