# io.github.den-indance/network-diagram-mcp (npm · @den.dance/network-diagram-mcp)

Network topology editor — Claude builds diagrams via MCP. nmap/CSV import, one-click SSH.

- Trust score: 68/100 (medium)
- Change this week: +44
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-04

## Components

- npm · `@den.dance/network-diagram-mcp`: 68/100 (this document), [markdown](https://verifymcp.io/servers/den-indance-network-diagram-mcp/den-dance-network-diagram-mcp.md), [page](https://verifymcp.io/servers/den-indance-network-diagram-mcp/den-dance-network-diagram-mcp)

## Channel facts

- Registry: `npm`
- Package: `@den.dance/network-diagram-mcp`
- Version: `1.0.7`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-04.

- **Supply Chain Security**: 83/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known medium-severity CVE affects hono 4.12.33, reached via @modelcontextprotocol/sdk > hono. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 70 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 2805 tokens (~63/item across 44 items; 44 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 30/100
  - Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add den-indance-network-diagram-mcp -- npx -y @den.dance/network-diagram-mcp
```

### Codex

```bash
codex mcp add den-indance-network-diagram-mcp -- npx -y @den.dance/network-diagram-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "den-indance-network-diagram-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@den.dance/network-diagram-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add den-indance-network-diagram-mcp --command npx --arg -y --arg @den.dance/network-diagram-mcp
```

### Hermes

```yaml
mcp_servers:
  den-indance-network-diagram-mcp:
    command: "npx"
    args: ["-y", "@den.dance/network-diagram-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "den-indance-network-diagram-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@den.dance/network-diagram-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-04 (score 68, +4)

- [security regression] CVE-2026-69207 affects this package: medium
- [security regression] Known CVEs: partial → fail
- [functional improvement] Stability: unverified → 0.30

### 2026-08-02 (score 64, +51)

- [security regression] Install scripts: pass → unverified
- [security regression] Provenance: fail → unverified
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional regression] Security disclosure: unverified → fail
- [functional regression] License: pass → unverified
- [functional regression] Maintenance: pass → unverified
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Schema quality: unverified → good
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] Licence: MIT

### 2026-08-01 (score 13, −8)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Security disclosure: fail → unverified
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] License: unverified → pass
- [functional] Licence: MIT

### 2026-07-31 (score 21, −7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 28, +4)

- [security regression] Malware scan: pass → unverified
- [functional improvement] Tool coverage: unverified → 100

### 2026-07-28 (score 24, −22)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 46)

First indexed and scored.

## MCP tools (44)

### `map_get_state` (~58 tokens)

Return the current map state: all nodes, manual connections, stickies and notes. NOTE: only manual connections are included — use map_get_all_connections to also get auto-generated connections (DNS→server, project→server, service→node).

### `map_add_node` (~76 tokens)

Add a new node to the map. Returns the new node id.

Input parameters:

- `ip` (string): IP address (optional)
- `name` (string, required): Display name
- `type` (string, required): Node type
- `x` (number): Canvas X position (optional)
- `y` (number): Canvas Y position (optional)

### `map_update_node` (~353 tokens)

Update fields of an existing node by id.

FIELD SCHEMA BY NODE TYPE
All types: name, ip, x, y, w, h, notes
  ips: [{address, label}]  — extra IP addresses

server / pc / nas / ap / camera / printer / router / switch / firewall / other:
  ports: [{port, protocol("tcp"|"udp"|"icmp"), service, url, bindIp}]
  dockerServices: [{name, image, hostPort, containerPort, protocol("tcp"|"udp"), url}]

project:
  parentServer  — id of the parent server node (creates auto-connection)
  repoUrl       — Git/GitLab URL
  deployPath    — deployment directory
  cicdUrl       — CI/CD pipeline URL
  dockerServices (same as server)

domain (DNS Zone):
  ip            — registrar name (e.g. "Cloudflare")
  registrarUrl  — registrar control panel URL
  domains: [{name, record("A"|"AAAA"|"CNAME"|"MX"|"TXT"|"NS"|"SRV"), target, url}]
             target IP in 'target' triggers auto-connection to matching server node

service (External Service):
  provider      — provider name (e.g. "Supabase", "Vercel")
  dashboardUrl  — link to service dashboard
  serviceConns: [{toId, label}]  — links to other nodes (creates auto-connections)
  servedDomains: [string]

Input parameters:

- `changes` (object, required): Fields to update — see tool description for full schema per node type
- `id` (string, required): Node id

### `map_delete_node` (~26 tokens)

Delete a node and all its connections.

Input parameters:

- `id` (string, required): Node id

### `map_add_connection` (~73 tokens)

Add a manual connection between two nodes. Returns the new connection id.

Input parameters:

- `color` (string): Optional line color, e.g. #ef4444
- `from_id` (string, required): Source node id
- `label` (string): Optional connection label
- `to_id` (string, required): Target node id

### `map_delete_connection` (~24 tokens)

Delete a connection by id.

Input parameters:

- `id` (string, required): Connection id

### `map_add_sticky` (~77 tokens)

Add a sticky note to the map. Returns the new sticky id.

Input parameters:

- `color` (string): Hex color, e.g. #fbbf24 (optional)
- `text` (string, required): Note text
- `x` (number): Canvas X position (optional)
- `y` (number): Canvas Y position (optional)

### `map_move_node` (~53 tokens)

Move a node to new canvas coordinates without changing any other fields.

Input parameters:

- `id` (string, required): Node id
- `x` (number, required): New canvas X position
- `y` (number, required): New canvas Y position

### `map_move_sticky` (~57 tokens)

Move a sticky note to new canvas coordinates without changing its text or color.

Input parameters:

- `id` (string, required): Sticky note id
- `x` (number, required): New canvas X position
- `y` (number, required): New canvas Y position

### `map_clear` (~35 tokens)

Remove all nodes, connections and stickies from the current sheet.

Input parameters:

- `confirm` (boolean, required): Must be true to confirm destructive action

### `map_arrange` (~30 tokens)

Auto-arrange all nodes in a grid or circle layout.

Input parameters:

- `layout` (string, required): Layout type

### `map_update_connection` (~37 tokens)

Update label or color of an existing connection.

Input parameters:

- `changes` (object, required): Fields to update
- `id` (string, required): Connection id

### `map_update_sticky` (~41 tokens)

Update text, color or size of a sticky note.

Input parameters:

- `changes` (object, required): Fields to update
- `id` (string, required): Sticky note id

### `map_delete_sticky` (~27 tokens)

Delete a sticky note by id.

Input parameters:

- `id` (string, required): Sticky note id

### `map_list_sheets` (~29 tokens)

List all sheets with their id, name, createdAt, updatedAt and which is active.

### `map_get_sheet_data` (~43 tokens)

Return nodes/connections/stickies/notes for a specific sheet (defaults to active sheet).

Input parameters:

- `id` (string): Sheet id (omit for active sheet)

### `map_create_sheet` (~40 tokens)

Create a new empty sheet and switch to it. Returns new sheet id.

Input parameters:

- `name` (string): Sheet name (optional, auto-generated if omitted)

### `map_switch_sheet` (~32 tokens)

Switch the active sheet. Saves current sheet state first.

Input parameters:

- `id` (string, required): Sheet id to switch to

### `map_rename_sheet` (~37 tokens)

Rename a sheet.

Input parameters:

- `id` (string, required): Sheet id
- `name` (string, required): New name (max 50 chars)

### `map_delete_sheet` (~43 tokens)

Delete a sheet. Cannot delete the last remaining sheet.

Input parameters:

- `confirm` (boolean, required): Must be true to confirm destructive action
- `id` (string, required): Sheet id

### `map_set_zoom` (~50 tokens)

Set canvas zoom level (0.1–3.0).

Input parameters:

- `zoom` (number, required): Zoom level, e.g. 1.0 = 100%, 0.5 = 50%

### `map_set_canvas_offset` (~40 tokens)

Pan canvas to an absolute pixel offset.

Input parameters:

- `x` (number, required): Horizontal offset in pixels
- `y` (number, required): Vertical offset in pixels

### `map_zoom_to_fit` (~39 tokens)

Auto-fit all nodes into the viewport by adjusting zoom and pan.

Input parameters:

- `padding` (number): Padding around content in pixels (default 80)

### `map_get_notes` (~16 tokens)

Return the sheet-level notes text.

### `map_set_notes` (~25 tokens)

Set the sheet-level notes text.

Input parameters:

- `notes` (string, required): Notes content

### `map_lock_sheet` (~67 tokens)

Lock or unlock a sheet. A locked sheet rejects all MCP mutations and disables manual editing in the UI. Pass locked: false to unlock.

Input parameters:

- `id` (string): Sheet id (omit for active sheet)
- `locked` (boolean): true = lock (default), false = unlock

### `map_get_settings` (~31 tokens)

Return current app settings (sshMode, dblClickAction, perfMode, showGrid, showZoomSlider).

### `map_update_settings` (~27 tokens)

Update one or more app settings.

Input parameters:

- `changes` (object, required): Settings fields to update

### `map_get_all_connections` (~53 tokens)

Return all connections including auto-generated ones (DNS→server, project→server, service→node). Auto connections have auto:true flag. Use this instead of map_get_state.connections when you need the full topology picture.

### `map_get_view` (~18 tokens)

Return current canvas zoom level and pan offset.

### `map_find_node` (~112 tokens)

Search nodes by name, IP, type, or free-text query. Returns id, name, type, ip, x, y for each match. Use this to locate a node before updating it.

Input parameters:

- `ip` (string): Exact match on primary IP or any secondary IP
- `name` (string): Substring match on node name (case-insensitive)
- `text` (string): Free-text search across name, IPs, and domain records
- `type` (string): Filter by node type

### `map_search` (~81 tokens)

Full-text search across nodes (name/ip/notes), stickies, connection labels, and ports (port-number/service). Returns categorized hits with a total count. Use map_find_node for structured node-only filtering.

Input parameters:

- `q` (string, required): Query string (case-insensitive substring match)
- `types` (array): Limit search scope (default: all 4)

### `map_import_nmap` (~146 tokens)

Parse nmap scan output (XML from `nmap -oX`) and create nodes with their open ports. Auto-infers node type from OS fingerprint + port profile (router/switch/firewall/server/printer/etc.). Provide either raw `xml` OR pre-parsed `hosts[]` — `hosts` takes priority when both are given. Nodes are auto-arranged in a grid. Returns {count, ids}.

Input parameters:

- `hosts` (array): Alternative: pre-parsed hosts [{ip, hostnames[], ports[{portid, protocol, service}], osMatch}]
- `xml` (string): Raw nmap XML output (use `nmap -oX -`)

### `map_suggest_layout` (~119 tokens)

Smart auto-layout: force-directed (organic, deterministic with seed), cluster-by-type (horizontal lanes per node type), or cluster-by-connection (BFS components → separate zones). Different from map_arrange (naive grid/circle). Mutates node positions in-place.

Input parameters:

- `algorithm` (string): Layout algorithm (default: force)
- `iterations` (number): Force-directed only; default 200, recommended range 50-1000
- `seed` (number): PRNG seed for force-directed reproducibility (default 42)

### `map_import_csv` (~174 tokens)

Import nodes from CSV. Auto-detects columns from the header row (name/ip/type/ports/notes — case-insensitive, aliases like hostname/description/host_ip accepted). Ports field accepts 'port/protocol,port/protocol' (e.g. '22/tcp,80/tcp') or bare port numbers (default tcp). Nodes laid out in a 6-column grid. Returns {count, ids}.

Input parameters:

- `columns` (object): Optional explicit column mapping: {name: 0, ip: 1, type: 2, ports: 3, notes: 4} — overrides auto-detect; missing keys default to -1
- `csv` (string, required): CSV content with header row (RFC 4180-lite: quoted fields, escaped "", UTF-8 BOM tolerated)

### `map_get_nodes_by_type` (~65 tokens)

Return all nodes of a given type with FULL field data (ports, dockerServices, domains, ips, notes, parentServer, etc.). For stripped projection or multi-criteria filtering use map_find_node instead.

Input parameters:

- `type` (string, required): Node type to filter by

### `map_import_sheet` (~52 tokens)

Replace active sheet content with provided JSON data. Useful for loading a prepared topology in one call.

Input parameters:

- `data` (object, required): Sheet data: { nodes: [], connections: [], stickies?: [], notes?: '' }

### `map_export_sheet` (~38 tokens)

Export sheet data as JSON including auto-connections. Defaults to active sheet.

Input parameters:

- `id` (string): Sheet id (omit for active sheet)

### `map_export` (~95 tokens)

Export current or specified sheet as JSON / PNG / PDF. PNG and PDF return base64-encoded blobs with mimeType — the client decodes and saves to a file. Server raises the response timeout to 30s for PNG/PDF since large maps can take several seconds to render.

Input parameters:

- `format` (string): Output format (default: json)
- `sheet_id` (string): Sheet id (omit for the active sheet)

### `map_duplicate_node` (~90 tokens)

Clone a node with all its properties (ports, services, domains, etc.). Returns new node id.

Input parameters:

- `id` (string, required): Source node id
- `name` (string): Override name for the clone (default: same as original)
- `offset_x` (number): X offset from original (default 40)
- `offset_y` (number): Y offset from original (default 40)

### `map_get_selection` (~51 tokens)

Return currently selected node/sticky ids and connection id. Result shape: { nodeIds: string[], nodeId: string|null (= nodeIds[0], legacy single-id), connId: string|null }.

### `map_select` (~127 tokens)

Programmatically select node(s)/sticky(s) and/or a connection. Pass node_ids (array) for multi-select; node_id (string) is legacy single-select. Empty array or null deselects. Connection selection remains single (multi-select connections out of scope v1).

Input parameters:

- `conn_id` (string|null): Connection id to select (single-select)
- `node_id` (string|null): Legacy single node/sticky id (prefer node_ids for multi-select)
- `node_ids` (array): Array of node/sticky ids to select (multi-select). Replaces the existing selection.

### `map_bulk_add_nodes` (~63 tokens)

Add multiple nodes in a single call. Each node accepts the same fields as map_add_node plus all type-specific fields (ports, dockerServices, domains, parentServer, etc.). Returns array of created ids.

Input parameters:

- `nodes` (array, required): Array of node objects

### `map_bulk_add_connections` (~35 tokens)

Add multiple connections in a single call. Returns array of created ids.

Input parameters:

- `connections` (array, required): Array of connection objects

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/den-indance-network-diagram-mcp/den-dance-network-diagram-mcp#diagnostics

## Score history

- 2026-08-04: 68
- 2026-08-03: 64
- 2026-08-02: 64
- 2026-08-01: 13
- 2026-07-31: 21
- 2026-07-30: 28
- 2026-07-28: 24
- 2026-07-27: 46

## Links

- npm package: https://www.npmjs.com/package/@den.dance/network-diagram-mcp
- Socket report: https://socket.dev/npm/package/@den.dance/network-diagram-mcp
- Repository: https://github.com/den-indance/network-diagram-mcp
- Changelog RSS feed: https://verifymcp.io/servers/den-indance-network-diagram-mcp/den-dance-network-diagram-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/den-indance-network-diagram-mcp/den-dance-network-diagram-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/den-indance-network-diagram-mcp/den-dance-network-diagram-mcp
