Skip to main content
Glama
yurii-mandzii

shadow-monitor-mcp

README.md
# shadow-monitor-mcp

Open-source **MCP server** that lets **any AI agent** inspect [Shadow Monitor](https://chromewebstore.google.com/detail/shadow-monitor/medbegkecifnhagdgfionmfmpcacheib) capture files (`uat-report-*.json.gz`) — locally, with no upload.

Works with **any client that speaks [MCP](https://modelcontextprotocol.io)** over stdio: Cursor, Claude Desktop, Claude Code, Windsurf, VS Code Copilot Chat, Continue, Cline, Zed, and others.

```
Shadow Monitor (Chrome) records a UAT session
              ↓
     you download uat-report-….json.gz
              ↓
   this MCP server loads it for your AI
```

| | |
| --- | --- |
| **npm** | [`shadow-monitor-mcp`](https://www.npmjs.com/package/shadow-monitor-mcp) · `npx -y shadow-monitor-mcp` |
| **GitHub** | [`yurii-mandzii/shadow-monitor-mcp`](https://github.com/yurii-mandzii/shadow-monitor-mcp) |
| **Claude one-click** | [`shadow-monitor-mcp.mcpb`](https://github.com/yurii-mandzii/shadow-monitor-mcp/releases/latest/download/shadow-monitor-mcp.mcpb) ([all releases](https://github.com/yurii-mandzii/shadow-monitor-mcp/releases)) |
| **Agent Skill** | [`SKILL.md`](./SKILL.md) (optional — teaches the agent *when* to call the tools) |
| **License** | MIT |
| **Needs** | [Node.js 20+](https://nodejs.org/) for the MCP (Chrome extension is separate) |

---

## Companion: Shadow Monitor (Chrome extension)

This MCP does **not** record the browser. Capture comes from the extension:

| | |
| --- | --- |
| **Chrome Web Store** | [Shadow Monitor](https://chromewebstore.google.com/detail/shadow-monitor/medbegkecifnhagdgfionmfmpcacheib) |
| **User guide** | [Guide](https://yurii-mandzii.github.io/shadow-monitor/guide/) |
| **Homepage** | [Docs site](https://yurii-mandzii.github.io/shadow-monitor/) |
| **Source** | [github.com/yurii-mandzii/shadow-monitor](https://github.com/yurii-mandzii/shadow-monitor) |
| **Support / Privacy** | [Support](https://yurii-mandzii.github.io/shadow-monitor/support/) · [Privacy](https://yurii-mandzii.github.io/shadow-monitor/privacy/) |

1. Install the extension → add your UAT domain in Settings.
2. Hard-reload the tab (**Cmd/Ctrl+Shift+R**).
3. Reproduce the bug → **Download** → get `uat-report-*.json.gz` (often under `Downloads/uat-capture`).

---

## MCP vs Skill (what you need)

| Piece | What it is | Required? |
| --- | --- | --- |
| **MCP server** | The actual tools (`load_bundle`, `find_errors`, …) | **Yes** — without it the agent cannot inspect the file |
| **Agent Skill** | A short playbook (`SKILL.md`) that says “when the user pastes a `uat-report-*.json.gz`, call `load_bundle` — don’t raw-read the file” | **No** — but strongly recommended so the agent behaves correctly |

You can install them **together** (Option A) or **separately** (MCP via UI / `.mcpb`, skill via `init` or copy).

---

## Install the MCP

You need **Node.js 20+** once ([download the LTS installer](https://nodejs.org/) — click through; no coding required).

### Option A — One command (MCP + skill together)

Open Terminal / PowerShell, paste, Enter:

```bash
npx -y shadow-monitor-mcp init --client all
```

Registers the server for Claude Desktop + Cursor + Claude Code **and** installs the Agent Skill. Then restart your AI app (Claude Desktop: fully quit with **Cmd+Q**).

Only one app? Use `--client cursor`, `--client desktop`, or `--client claude-code`.

### Option B — UI / click (MCP only)

#### Claude Desktop — one-click `.mcpb`

1. Download **[shadow-monitor-mcp.mcpb](https://github.com/yurii-mandzii/shadow-monitor-mcp/releases/latest/download/shadow-monitor-mcp.mcpb)**
2. Double-click it, **or** Claude Desktop → **Settings → Extensions → Install Extension…**

#### Any MCP client — paste JSON

```json
{
  "mcpServers": {
    "shadow-monitor": {
      "command": "npx",
      "args": ["-y", "shadow-monitor-mcp"]
    }
  }
}
```

| App | Where |
| --- | --- |
| **Cursor** | Settings → **Tools & MCP** → add / edit MCP config |
| **Claude Desktop** | Settings → Developer, or `claude_desktop_config.json` |
| **Others** | Their MCP / custom-tools settings — same JSON |

### Option C — From a git clone

```bash
cd shadow-monitor-mcp
npm install && npm run build && npm run init:all
```

---

## Install the skill (optional, separate is fine)

The skill teaches Claude/Cursor to call `load_bundle` instead of raw-reading the report.

### Claude Desktop (what you use in Customize → Skills)

`~/.claude/skills/` is **Claude Code only** — Desktop does **not** list those files.

1. Run `npx -y shadow-monitor-mcp init --client desktop` (or `all`) — it writes  
   **`~/Downloads/shadow-monitor-bundles.zip`**
2. Claude Desktop → **Customize → Skills → Add → Upload a skill**
3. Upload that ZIP → enable the skill  
4. Ensure **Settings → Capabilities → Code execution and file creation** is on

Or zip manually: folder `shadow-monitor-bundles/` containing [`SKILL.md`](./SKILL.md).

### Cursor / Claude Code (filesystem)

`init` also copies [`SKILL.md`](./SKILL.md) into:

- Cursor → `~/.cursor/skills/shadow-monitor-bundles/`
- Claude Code → `~/.claude/skills/shadow-monitor-bundles/`

---

## Use it

In any connected agent chat, paste an **absolute** path:

> Investigate `/Users/you/Downloads/uat-capture/uat-report-2026-07-27T07-34-55-912Z.json.gz` and show me what failed.

Expected flow: `load_bundle` → `bundle_overview` → `find_errors` → drill into network / console / actions.

- Path must be absolute (`/Users/…` or `C:\Users\…`).
- Don’t treat the `.json.gz` name as a skill / slash-command.
- Encrypted exports: pass `passphrase` to `load_bundle`.

---

## Tools

| Tool | What it does |
| --- | --- |
| `check_bundle` | Cheap probe: is this path a workable Shadow Monitor `.json` / `.json.gz`? |
| `load_bundle` | Load `.json` / `.json.gz` / encrypted report |
| `bundle_overview` | Errors, slow requests, actions, navigation |
| `bundle_metadata` | Schema, page, window, counts |
| `find_errors` | Network + console failures |
| `search_network` | Filter requests |
| `get_network_request` | Full request by id |
| `get_console_event` | Full console event by id |
| `get_user_actions` | Click / navigate story timeline |
| `get_action_replay` | rrweb slice for one action |
| `get_semantics` | Pre-computed semantics (schema 2/3) |

`bundleId` is optional when only one bundle is loaded.

---

## Optional settings

| Env | Effect |
| --- | --- |
| `SHADOW_MONITOR_FORMAT=toon` | Smaller list responses ([TOON](https://github.com/toon-format/toon)) |
| `SHADOW_MONITOR_REDACT=false` | Keep signed-URL params / auth headers raw |

---

## Commands (developers)

| Command | Purpose |
| --- | --- |
| `npm run build` | Compile → `dist/` |
| `npm run init` / `init:cursor` / `init:all` | Register MCP + skill |
| `npm run init:print` | Preview config, write nothing |
| `npm start` | Run MCP server (stdio) |
| `npm test` | Format / token tests |
| `npm run test:smoke -- <bundle>` | End-to-end against a report |
| `npm run pack:mcpb` | Build `shadow-monitor-mcp.mcpb` locally |

```bash
npx -y shadow-monitor-mcp init --client all
npx -y shadow-monitor-mcp init --launch npx      # client uses npx (default after npm install)
npx -y shadow-monitor-mcp init --launch local    # client uses absolute dist/cli.js
npx -y shadow-monitor-mcp init --no-skill        # MCP only
npx -y shadow-monitor-mcp init --print
```

---

## Troubleshooting

| Problem | Fix |
| --- | --- |
| `404 shadow-monitor-mcp` | Package not on npm yet — use Option C from a clone, or the `.mcpb` release asset. |
| Server disconnected | Node 20+, restart the app, check MCP config / `.mcpb` install. |
| Claude Desktop ignores config | Fully quit (**Cmd+Q**) and reopen. |
| Agent raw-reads the `.json.gz` | Install the skill (`init`, or copy `SKILL.md`). |
| No report file | Install the [Chrome extension](https://chromewebstore.google.com/detail/shadow-monitor/medbegkecifnhagdgfionmfmpcacheib) first. |

---

## Development

```bash
npm install
npm run build
npm start
npm test
```

Capture format: [shadow-monitor README](https://github.com/yurii-mandzii/shadow-monitor#readme) · [BUNDLE_FORMAT.md](https://github.com/yurii-mandzii/shadow-monitor/blob/main/BUNDLE_FORMAT.md).

MIT — see [LICENSE](./LICENSE).

TDQS

A4/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target a clear, distinct retrieval path: loading/checking, network search/detail, console detail, and user-action replay. The main ambiguity is among bundle_metadata, bundle_overview, and get_semantics, which all surface summary-level bundle information, though their descriptions clarify different use cases.

Naming Consistency4/5

The naming is largely consistent, with lowercase snake_case and a dominant verb_noun pattern like load_bundle, check_bundle, find_errors, search_network, and get_*. bundle_metadata and bundle_overview deviate slightly by leading with the noun, but the overall pattern is still predictable and readable.

Tool Count5/5

11 tools is well-scoped for a diagnostic bundle inspection server. Each tool corresponds to a meaningful stage or data type in the workflow, from validation and loading to overview, error discovery, network/console drill-down, user actions, replay, and semantics.

Completeness4/5

The tool set covers the core diagnostic workflow comprehensively: load/validate bundles, orient with overview/semantics, search network and errors, fetch event details, and replay user actions. Minor gaps exist, such as no general non-error console search and no explicit bundle unload/cleanup, but they do not break the primary use case.

Maintenance

ActivitySlowing
ResponsivenessNo issues