Transparent observability for agentic AI pipelines.
MCP Monitor
Transparent observability for agentic AI pipelines.
MCP Monitor intercepts every tool call made by an AI agent — whether the agent uses the Model Context Protocol (MCP) or calls Python functions directly — and surfaces metrics, session replays, and alerts through a local web dashboard.
Zero changes to your agent. Zero changes to your MCP servers.

Features
- ⚡ Live Feed — Real-time SSE-powered stream of all tool calls with status badges and latency
- 📋 Session Replay — Browse sessions, view call timelines with a Gantt chart, expand any call to inspect arguments and responses
- 📊 Tool Analytics — P50/P95/P99 latency charts, call volume, and error rate trends via Chart.js
- 🖥️ Server Health — Per-server status cards (healthy / degraded / down) with auto-refresh
- 🔔 Alerts — Configurable P95 latency and error rate thresholds with cooldown-based alerting
- 🔒 Secret Sanitization — Automatically redacts tokens, passwords, API keys from stored arguments
- 🐍 Python SDK — Zero-dependency pip package to monitor any Python agent (QwenAgent, LangChain, custom)
- 💾 SQLite Storage — Single-file database with WAL mode for fast concurrent reads
Architecture
Agent (Claude, Cursor, etc.)
│
├── Multiplexer mode
│ mcp-monitor serve
│ ├── spawns Server A ──┐
│ ├── spawns Server B ──┤── POST /api/ingest ──► Dashboard Server ──► SQLite
│ └── spawns Server C ──┘ │
│ EventBus.emit()
├── Per-server proxy mode │
│ mcp-monitor proxy SSE push to
│ └── spawns Server ──────► Dashboard UI
│
└── Python SDK ──► POST /api/ingest
Multiplexer mode is the one approach: add one entry to your MCP config and monitor all servers. The serve command spawns every configured server, merges their tools, routes calls, and records everything.
Per-server proxy mode wraps a single server — useful when you want fine-grained control over which servers are monitored.
Quick Start
Prerequisites
- Node.js 18+
- npm
Install via GitHub Packages
- Authenticate to GitHub Packages: You need a Personal Access Token (classic) with the
read:packagesscope. - Tell npm where to find the package:
echo "@partha-sust16:registry=https://npm.pkg.github.com" >> ~/.npmrc - Install the package globally:
npm install -g @partha-sust16/mcp-monitor
You are now ready to run mcp-monitor start!
Install from Source
git clone https://github.com/Partha-SUST16/mcp_monitor.git
cd mcp_monitor
# Install backend dependencies
npm install
# Build the backend and the dashboard UI automatically
npm run build
# Link globally to use the 'mcp-monitor' command anywhere
npm link
# Start the dashboard server
mcp-monitor start
The dashboard will be available at http://localhost:4242.
Send a Test Event
curl -X POST http://localhost:4242/api/ingest \
-H 'Content-Type: application/json' \
-d '{
"sessionId": "test-session",
"agentType": "python-sdk",
"serverName": "my-server",
"toolName": "read_file",
"method": "read_file",
"arguments": {"path": "/tmp/test.txt"},
"response": null,
"status": "success",
"latencyMs": 150,
"timestamp": "2026-03-09T10:00:00Z"
}'
Connecting Agents
Multiplexer Mode
Monitor all MCP servers with a single config entry. No need to wrap each server individually.
Step 1. List your servers in mcp-monitor.config.json:
{
"servers": [
{ "name": "filesystem", "transport": "stdio", "command": "npx @modelcontextprotocol/server-filesystem /tmp" },
{ "name": "github", "transport": "stdio", "command": "npx @modelcontextprotocol/server-github", "env": { "GITHUB_TOKEN": "$GITHUB_TOKEN" } }
],
"dashboard": { "port": 4242 }
}
Step 2. Replace all MCP server entries in your agent config with one:
{
"mcpServers": {
"mcp-monitor": {
"command": "mcp-monitor",
"args": ["serve", "-c", "/absolute/path/to/mcp-monitor.config.json"]
}
}
}
Step 3. Start the dashboard server separately:
mcp-monitor start
The agent sees one MCP server with all tools combined. MCP Monitor spawns each real server internally, routes every tools/call to the correct child, and records the call.
Note on Tool Names: To prevent naming collisions between different MCP servers that happen to expose identical tools, the Multiplexer prefixes all tool names with their originating server's name. For example, if your
filesystemserver has a tool namedread_file, the LLM will see it exposed asfilesystem_read_file.
Per-Server Proxy Mode
Alternatively, wrap individual servers by replacing their command:
{
"mcpServers": {
Environment Variables
GITHUB_TOKENRequired for authenticating to GitHub Packages if installing via npmConfiguration
{"mcpServers": {"mcp-monitor": {"command": "mcp-monitor", "args": ["serve", "-c", "/absolute/path/to/mcp-monitor.config.json"]}}}