Visual network topology editor with AI-agent MCP integration plus a cross-platform URL handler agent. Click any SSH / Postgres / Redis port on a node in NetMap (or any ssh:// / postgres:// / redis:// link in your OS) → picks your installed client (psql / DBeaver / iTerm / redis-cli / RDM …). 44 MCP tools, nmap/CSV import, smart auto-layout, multi-sheet, local-first. Open-source successor to netViz (CA Technologies, 1990-2012).
23 tools with complete input schemas and descriptions. Naming follows verb_noun convention consistently (map_get_*, map_add_*, map_update_*, map_delete_*). Descriptions are present and contextual (avg ~120 chars), exceeding the 10-char minimum but below the 50-200 char LLM-optimized range for most tools. All parameters have type definitions and descriptions. However, output schemas are NOT documented, LLMs cannot predict return structures. Error handling is minimal; no recovery guidance or categorization. Destructive operations (map_clear, map_delete_*) lack confirmation patterns beyond a boolean flag. Complex nested schemas (e.g., map_update_node's per-type field variations) are documented in description text rather than formal JSON Schema, forcing LLMs to parse prose. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present.
Add a manual connection between two nodes. Returns the new connection id.
Add a new node to the map. Returns the new node id.
Add a sticky note to the map. Returns the new sticky id.
Auto-arrange all nodes in a grid or circle layout.
Remove all nodes, connections and stickies from the current sheet.
Create a new empty sheet and switch to it. Returns new sheet id.
Delete a connection by id.
Output schemas not documented. LLMs cannot predict return structures (e.g., what fields does map_add_node return? Is it {id, name, ...} or {success, data}?). Forces agents to guess and retry on parse failures.
Complex nested schemas (map_update_node) documented only in prose description, not formal JSON Schema. LLMs cannot parse per-type field variations (server vs project vs domain) from text alone. Requires schema refactoring into oneOf/discriminator pattern.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Clients cannot distinguish safe reads from destructive writes without parsing names. map_delete_* and map_clear should be marked destructiveHint=true.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Delete a node and all its connections.
Delete a sheet. Cannot delete the last remaining sheet.
Delete a sticky note by id.
Return nodes/connections/stickies/notes for a specific sheet (defaults to active sheet).
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).
List all sheets with their id, name, createdAt, updatedAt and which is active.
Move a node to new canvas coordinates without changing any other fields.
Move a sticky note to new canvas coordinates without changing its text or color.
Rename a sheet.
Pan canvas to an absolute pixel offset.
Set canvas zoom level (0.1–3.0).
Switch the active sheet. Saves current sheet state first.
Update label or color of an existing connection.
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]
Update text, color or size of a sticky note.
Auto-fit all nodes into the viewport by adjusting zoom and pan.
Destructive operations lack proper confirmation pattern. map_clear and map_delete_sheet require a boolean 'confirm' flag, but no guidance on how to handle user confirmation flow or retry logic if user declines.
No error handling guidance. Tools return success/failure but descriptions do not explain recovery paths (e.g., 'If node not found, call map_get_state to list available nodes'). Agents cannot self-correct on failures.