--- name: topolograph-igp-analysis description: "Reason over the OSPF/IS-IS link-state topology as a whole — shortest and backup paths, per-area LSDB, edge and node failure simulation, MPLS-TE/CSPF feasibility, and a timeline of topology change events. Use when the question is about what the IGP believes the topology is, or what it would do if a link or node failed, rather than what one live device's routing table currently shows. Read-only." license: Apache-2.0 user-invocable: true metadata: { "openclaw": { "requires": { "env": ["TOPOLOGRAPH_API_TOKEN"] } } } --- # Topolograph IGP Topology Analysis Every device-facing routing skill NetClaw has — `pyats-routing`, `pyats-junos-routing`, `multivendor-device-query` — reads **one live device's** RIB and LSDB. This one reasons over the **whole area's link-state database** at once, from a graph Topolograph already built, and can simulate a change without touching anything. It answers "what does the IGP think the topology is, and what would it do if X failed?" — not "what is on this router right now." ## Remote, read-only `topolograph-mcp` is a remote HTTP MCP registered in `config/openclaw.json`. There is no local server. It fronts **your own** Topolograph instance (`TOPOLOGRAPH_MCP_URL`, default `https://topolograph.com/mcp`), bearer `TOPOLOGRAPH_API_TOKEN`. The server runs with `TOPOLOGRAPH_MCP_READ_ONLY=true`: mutation tools (`upload_graph`, `add_lsp`, `update_lsp`, `delete_lsp`) are absent from `tools/list` and cannot be called. Do not try to reach them — a topology change belongs in the device-write path, gated, not here. ## Client-side allowlist The tool filter is enforced with the DefenseClaw CLI, not a config block: ```bash defenseclaw tool allow topolograph-mcp get_all_graphs defenseclaw tool allow topolograph-mcp get_graph_by_time defenseclaw tool allow topolograph-mcp get_network_by_graph_time defenseclaw tool allow topolograph-mcp get_graph_status defenseclaw tool allow topolograph-mcp get_network_events defenseclaw tool allow topolograph-mcp get_adjacency_events defenseclaw tool allow topolograph-mcp get_events_timeline defenseclaw tool allow topolograph-mcp get_nodes defenseclaw tool allow topolograph-mcp get_edges defenseclaw tool allow topolograph-mcp get_lsps defenseclaw tool allow topolograph-mcp get_shortest_path defenseclaw tool allow topolograph-mcp get_cspf_path defenseclaw tool allow topolograph-mcp get_edge_failure_reaction defenseclaw tool block topolograph-mcp upload_graph defenseclaw tool block topolograph-mcp add_lsp defenseclaw tool block topolograph-mcp update_lsp defenseclaw tool block topolograph-mcp delete_lsp ``` The `block` lines are belt-and-braces: the server already hides those, but a misconfigured (`TOPOLOGRAPH_MCP_READ_ONLY=false`) instance must not widen NetClaw's surface. ## Tools | Tool | Answers | |---|---| | `get_all_graphs` | Which stored topology snapshots exist (filter by protocol, area, date). Start here to get a `graph_time`. | | `get_graph_by_time` | The full graph for one snapshot. | | `get_graph_status` | Health of a snapshot — is it complete and consistent. | | `get_network_by_graph_time` | Which prefixes/networks are in the graph, by mask/area. | | `get_nodes` | Routers in the area, filterable by role flag (ABR/ASBR, IS-IS overload/attached). | | `get_edges` | Adjacencies, with `include=["lsps","is_te_link","lsp_left_bw","edge_key"]` for MPLS-TE fields. | | `get_lsps` | MPLS-TE LSP tunnels, filter by `status`, `via_node`, `via_edge`. | | `get_shortest_path` | SPF path between two nodes; `with_lsps=true` accounts for autoroute tunnels. | | `get_cspf_path` | Constrained-SPF feasibility between two nodes — never mutates the graph. | | `get_edge_failure_reaction` | Whole-network impact if one or more links fail: stays connected? rerouting pattern? Simulation only. | | `get_network_events` / `get_adjacency_events` | Raw topology-change events in a time range. | | `get_events_timeline` | The same events grouped into waves for incident narration. | ## Boundary — when to use something else | Question | Skill | |---|---| | "What does the IGP topology look like / what if this link fails?" | **this skill** | | "What is in *this router's* routing table / LSDB right now?" | `pyats-routing`, `pyats-junos-routing`, `multivendor-device-query` | | "Is this adjacency actually up on the device?" | the platform routing skill | | "Push a metric / cost change" | device-write path, gated — never here | Topolograph reasons over a **stored** snapshot. If the question is "is this true on the wire this second", confirm on the device after. ## Never - Never present a simulation result (`get_edge_failure_reaction`, `get_cspf_path`) as something that happened. It is a prediction over a snapshot. - Never report a stale `graph_time` as current — check `get_all_graphs` for the latest snapshot, and say how old it is. ## Failure Behavior - If a tool call fails with an authentication or connection error, check that `TOPOLOGRAPH_API_TOKEN` is set and valid before assuming a data or device problem. - On a tool error (timeout, unreachable host, malformed response), report the failure and its error message directly to the user rather than fabricating or guessing at results. - For a confirmed read-only call, check connectivity and retry once if appropriate. For any call that changes state or sends a message, a timeout does not prove the action failed: inspect current state or delivery status before retrying, preserve the required approval/change gates, and do not repeat an action whose outcome is unknown.