Illumio Interactive Security Dashboard
Generate a single-file React component (.jsx) that provides an interactive security assessment of an Illumio PCE environment. The dashboard is rendered as a Claude artifact and uses D3 for network graph visualization.
Prerequisites
- The illumio-mcp MCP server must be connected (verify with
check-pce-connection)
- The frontend-design skill (
/mnt/skills/public/frontend-design/SKILL.md) should be read for design quality guidance
Data Collection
Collect all data from the PCE before generating the artifact. Every MCP call below is required — the dashboard needs all of these data dimensions.
Required MCP Calls
Run these in order. When results are too large for context, parse with bash_tool + python3.
1. illumio-mcp:check-pce-connection
2. illumio-mcp:get-workload-enforcement-status
3. illumio-mcp:get-labels (max_results: 500)
4. illumio-mcp:get-rulesets (max_results: 100)
5. illumio-mcp:identify-infrastructure-services (lookback_days: 90, top_n: 20)
6. illumio-mcp:detect-lateral-movement-paths (lookback_days: 30, max_hops: 4)
7. illumio-mcp:find-unmanaged-traffic (lookback_days: 30, min_connections: 10, top_n: 30)
8. illumio-mcp:compliance-check (framework: "general", lookback_days: 30)
Custom Policy Validation
If the user provides rules of thumb (e.g., "RDP/SSH must go through jumphost"), query the relevant traffic:
illumio-mcp:get-traffic-flows-summary
start_date: <90 days ago>
end_date: <today>
include_services: [{"port": 3389, "proto": "tcp"}, {"port": 22, "proto": "tcp"}]
Also query potentially blocked traffic to identify what would break during enforcement:
illumio-mcp:get-traffic-flows-summary
start_date: <90 days ago>
end_date: <today>
policy_decisions: ["potentially_blocked", "blocked"]
Additional port-specific queries
For high-risk port analysis, also query dangerous protocols:
illumio-mcp:get-traffic-flows-summary
start_date: <90 days ago>
end_date: <today>
include_services: [{"port": 23, "proto": "tcp"}, {"port": 135, "proto": "tcp"}, {"port": 445, "proto": "tcp"}]
Data Transformation
Transform the raw PCE data into JavaScript data structures that the React component consumes. All data is embedded as const declarations at the top of the .jsx file — the artifact is fully self-contained with no external API calls.
Critical: Always Use the app (env) Tuple
Applications are only unique when identified by their app AND env labels together. The same app name can exist in multiple environments (e.g., ordering in both prod and dev, pos in both staging and pci). Every place in the dashboard that displays an application identity must show the tuple:
- Network graph node labels:
ordering (prod), not ordering
- Tooltips: Title as
app (env), do not show env as a separate line
- Flow chips / connection tags:
→ ordering (prod) :5432
- Lateral movement bars:
laptop (users) — no separate env column
- Tables: Merged "Application (Env)" column, e.g.,
ordering with (prod) in lighter gray
- Violations / traffic tables: Source and destination as
app (env) tuples
- Graph node IDs: Use
app|env format internally (e.g., "ordering|prod")
Data Structures to Build
From the collected data, construct these JavaScript objects:
enforcementData — { visibility_only: N, selective: N, full: N } from enforcement status
complianceFindings — Array of { id, name, detail, status } from compliance check
appGroups — Array of { app, env, count, mode, risk } from enforcement status, sorted by workload count descending. Risk is derived: visibility_only in prod = "high", mixed = "critical", full = "low", selective = "medium"
lateralMovement — Array of { app, env, reachable, bridge } from lateral movement paths, sorted by reachable descending
networkGraphData — { nodes: [...], links: [...] }:
- Nodes:
{ id: "app|env", app, env, score, tier, reachable?, bridge? } from infrastructure services + lateral movement
- Links:
{ source: "app|env", target: "app|env", port, risk } from traffic flow summaries. Risk classification: high-risk ports (22, 3389) from non-jumphost sources = "high"; database ports (3306, 5432) = "medium"; infrastructure ports (514, 5666, 123, 53) = "low"; application ports (443, 80) = "medium" if cross-env, "low" if within expected pattern
- Node tiers from infrastructure services: score >= 75 = "core", >= 50 = "shared", endpoint apps (laptop, vdi) = "endpoint", rest = "standard"
jumphostViolations — Array of { source, dest, port, conns, severity } from traffic analysis of the user's custom rules
highRiskPorts — Array of { port, proto, conns, apps, severity } aggregated from traffic flows
unmanagedTraffic — Array of { ip, dest, port, conns, type } from unmanaged traffic analysis
React Component Architecture
The dashboard is a single default-exported React component with these sections:
Technology Stack
- React with hooks (
useState, useEffect, useRef)
- D3.js for the force-directed network graph (imported as
import * as d3 from "d3")
- Tailwind-free: All styling is inline
style={{}} objects — no Tailwind classes, no CSS modules
- Single file: Everything in one .jsx file, no separate CSS
Design System
Light mode, clean, not too dark. Use the Illumio brand palette:
const C = {
green: "#00C48C", // Illumio primary
greenLight: "#E8FAF3", // Success backgrounds
greenDark: "#00A876", // Success text
teal: "#00B4D8", // Selective / info accent
tealLight: "#E5F7FB", // Info backgrounds
navy: "#1A1F36", // Primary text, headers
orange: "#FF6B35", // Warnings
orangeLight: "#FFF3ED", // Warning backgrounds
red: "#E63946", // Critical / failures
redLight: "#FDE8EA", // Critical backgrounds
gray50: "#F9FAFB", // Page background
gray100: "#F3F4F6", // Subtle backgrounds
gray200: "#E5E7EB", // Borders
gray300: "#D1D5DB",
gray400: "#9CA3AF", // Muted text
gray500: "#6B7280", // Secondary text
gray700: "#374151", // Strong secondary text
white: "#FFFFFF",
};
Use Google Fonts DM Sans (weights 400–800) loaded via <link> in the component body.
Status color mapping
Apply consistently everywhere (badges, cells, backgrounds):
- critical / fail / high risk: Red (
E63946) bg, white text
- high: Orange (
FF6B35) bg, white text
- medium / warning: Amber (
#FEF3C7) bg, dark amber text
- low / pass / enforced: Green (
00C48C) bg, white text
- info / in progress: Teal (
00B4D8) bg, white text
Tab Structure
Use a pill-style tab bar with 5 tabs:
- Overview — KPI cards, enforcement donut, compliance cards, app status table
- Network Graph — D3 force-directed graph with risk filter, legend, detail panel, lateral movement bars
- Policy Violations — Alert banner, violations table, remediation card (only if user provided custom rules)
- High-Risk Ports — Visual port cards with severity, connections, affected apps
- Unmanaged Traffic — KPI cards, traffic table, anomaly alerts
Component Inventory
Build these reusable components:
Badge: Pill-shaped label with color + bg props
RiskBadge: Pre-mapped risk level badge
ModeBadge: Pre-mapped enforcement mode badge (visibility_only displays as "vis only")
KPI: Card with label, large value, subtitle, accent color
Section: Heading with icon, optional accent bar, children
TabBar: Pill-style tab switcher
EnforcementDonut: SVG donut chart with arc paths and legend
NetworkGraph: D3 force-directed graph (see below)
Network Graph Specification
The graph is the centerpiece. Build it as a separate NetworkGraph component:
Props: onNodeClick, highlightRisk
D3 Setup:
- Force simulation:
forceLink (distance 100, strength 0.3), forceManyBody (strength -300), forceCenter, forceCollide (radius + 8)
- SVG markers for directional arrows, colored by risk level
- Zoom via
d3.zoom (scale 0.3–3)
- Drag behavior on nodes
Node rendering:
- Circle radius by tier: core=18, shared=15, endpoint=12, standard=10
- Circle fill by tier: core=red, shared=orange, endpoint=teal, standard=gray400
- Bridge nodes override to red fill regardless of tier
- Text label below node:
${d.app} (${d.env}) — always the tuple
- Font: DM Sans, 9px, gray700
Link rendering:
- Stroke color by risk level
- Stroke width: high=2.5, others=1.5
- Opacity: 0.35 default
- Arrow markers at endpoints
Interactions:
- Hover: Highlight connected links (opacity 0.85) and dim unconnected nodes (opacity 0.15). Show tooltip with app (env) tuple, infra score, tier, bridge status, reachable count
- Click: Set selectedNode state, renders detail panel below graph
- Risk filter buttons: When active, highlight only links of that risk level, dim everything else (applied via setTimeout after 1.5s to let simulation settle)
- Drag: Standard D3 drag with alpha target restart
Detail panel (shown below graph when a node is clicked):
- Header:
app (env) with close button
- Grid: Infra Score, Tier, Bridge (YES in red / No in green), Reachable count
- Connected flows: List of flow chips showing
→ app (env) :port with risk-colored backgrounds
Lateral movement bar chart (below graph detail):
- Horizontal bars showing reachable/22 ratio
- Gradient fills: bridge nodes = red→orange, high reachability = orange→amber, low = teal→green
- Bridge nodes get a red "BRIDGE" badge
- Label:
app (env) — always the tuple, no separate env column
Violations Tab (Conditional)
Only show this tab if the user provided custom security rules of thumb. Structure:
- Red alert banner summarizing the total violation count
- Table sorted by connections descending, with red-tinted rows for critical severity
- Green remediation card with numbered steps
Adaptation
If the user does not provide custom rules of thumb, replace the "Policy Violations" tab with a different relevant view (e.g., "Enforcement Roadmap" or "Policy Gaps"). Adjust the tab array accordingly.
Output
Save the artifact as:
/mnt/user-data/outputs/security_assessment.jsx
Present to the user with present_files. The artifact renders directly in Claude's UI.
Quality Checklist
Before finalizing, verify:
1---2name: illumio-security-dashboard3description: Generate an interactive React security assessment dashboard for an Illumio PCE environment. Use this skill whenever the user asks for an interactive, visual, or live security dashboard, security posture visualization, interactive network graph of their Illumio environment, or a React-based PCE assessment. Also trigger when the user says: interactive assessment, security dashboard, visual security report, network topology view, lateral movement visualization, or wants a browser-based view of their PCE security status. Produces a single-file React (.jsx) artifact with D3 force-directed network graph, tabbed navigation, compliance cards, enforcement charts, and filterable tables — all populated from live PCE data. Requires the illumio-mcp MCP server to be connected.4---56# Illumio Interactive Security Dashboard78Generate a single-file React component (.jsx) that provides an interactive security assessment of an Illumio PCE environment. The dashboard is rendered as a Claude artifact and uses D3 for network graph visualization.910## Prerequisites1112- The **illumio-mcp** MCP server must be connected (verify with `check-pce-connection`)13- The **frontend-design skill** (`/mnt/skills/public/frontend-design/SKILL.md`) should be read for design quality guidance1415## Data Collection1617Collect all data from the PCE before generating the artifact. Every MCP call below is required — the dashboard needs all of these data dimensions.1819### Required MCP Calls2021Run these in order. When results are too large for context, parse with `bash_tool` + `python3`.2223```241. illumio-mcp:check-pce-connection252. illumio-mcp:get-workload-enforcement-status263. illumio-mcp:get-labels (max_results: 500)274. illumio-mcp:get-rulesets (max_results: 100)285. illumio-mcp:identify-infrastructure-services (lookback_days: 90, top_n: 20)296. illumio-mcp:detect-lateral-movement-paths (lookback_days: 30, max_hops: 4)307. illumio-mcp:find-unmanaged-traffic (lookback_days: 30, min_connections: 10, top_n: 30)318. illumio-mcp:compliance-check (framework: "general", lookback_days: 30)32```3334### Custom Policy Validation3536If the user provides rules of thumb (e.g., "RDP/SSH must go through jumphost"), query the relevant traffic:3738```39illumio-mcp:get-traffic-flows-summary40 start_date: <90 days ago>41 end_date: <today>42 include_services: [{"port": 3389, "proto": "tcp"}, {"port": 22, "proto": "tcp"}]43```4445Also query potentially blocked traffic to identify what would break during enforcement:4647```48illumio-mcp:get-traffic-flows-summary49 start_date: <90 days ago>50 end_date: <today>51 policy_decisions: ["potentially_blocked", "blocked"]52```5354### Additional port-specific queries5556For high-risk port analysis, also query dangerous protocols:5758```59illumio-mcp:get-traffic-flows-summary60 start_date: <90 days ago>61 end_date: <today>62 include_services: [{"port": 23, "proto": "tcp"}, {"port": 135, "proto": "tcp"}, {"port": 445, "proto": "tcp"}]63```6465## Data Transformation6667Transform the raw PCE data into JavaScript data structures that the React component consumes. All data is embedded as `const` declarations at the top of the .jsx file — the artifact is fully self-contained with no external API calls.6869### Critical: Always Use the app (env) Tuple7071Applications are only unique when identified by their `app` AND `env` labels together. The same app name can exist in multiple environments (e.g., `ordering` in both `prod` and `dev`, `pos` in both `staging` and `pci`). Every place in the dashboard that displays an application identity must show the tuple:7273- **Network graph node labels**: `ordering (prod)`, not `ordering`74- **Tooltips**: Title as `app (env)`, do not show env as a separate line75- **Flow chips / connection tags**: `→ ordering (prod) :5432`76- **Lateral movement bars**: `laptop (users)` — no separate env column77- **Tables**: Merged "Application (Env)" column, e.g., `ordering` with `(prod)` in lighter gray78- **Violations / traffic tables**: Source and destination as `app (env)` tuples79- **Graph node IDs**: Use `app|env` format internally (e.g., `"ordering|prod"`)8081### Data Structures to Build8283From the collected data, construct these JavaScript objects:84851. **`enforcementData`** — `{ visibility_only: N, selective: N, full: N }` from enforcement status862. **`complianceFindings`** — Array of `{ id, name, detail, status }` from compliance check873. **`appGroups`** — Array of `{ app, env, count, mode, risk }` from enforcement status, sorted by workload count descending. Risk is derived: `visibility_only` in prod = "high", `mixed` = "critical", `full` = "low", `selective` = "medium"884. **`lateralMovement`** — Array of `{ app, env, reachable, bridge }` from lateral movement paths, sorted by reachable descending895. **`networkGraphData`** — `{ nodes: [...], links: [...] }`:90 - Nodes: `{ id: "app|env", app, env, score, tier, reachable?, bridge? }` from infrastructure services + lateral movement91 - Links: `{ source: "app|env", target: "app|env", port, risk }` from traffic flow summaries. Risk classification: high-risk ports (22, 3389) from non-jumphost sources = "high"; database ports (3306, 5432) = "medium"; infrastructure ports (514, 5666, 123, 53) = "low"; application ports (443, 80) = "medium" if cross-env, "low" if within expected pattern92 - Node tiers from infrastructure services: score >= 75 = "core", >= 50 = "shared", endpoint apps (laptop, vdi) = "endpoint", rest = "standard"936. **`jumphostViolations`** — Array of `{ source, dest, port, conns, severity }` from traffic analysis of the user's custom rules947. **`highRiskPorts`** — Array of `{ port, proto, conns, apps, severity }` aggregated from traffic flows958. **`unmanagedTraffic`** — Array of `{ ip, dest, port, conns, type }` from unmanaged traffic analysis9697## React Component Architecture9899The dashboard is a single default-exported React component with these sections:100101### Technology Stack102- **React** with hooks (`useState`, `useEffect`, `useRef`)103- **D3.js** for the force-directed network graph (imported as `import * as d3 from "d3"`)104- **Tailwind-free**: All styling is inline `style={{}}` objects — no Tailwind classes, no CSS modules105- **Single file**: Everything in one .jsx file, no separate CSS106107### Design System108109Light mode, clean, not too dark. Use the Illumio brand palette:110111```javascript112const C = {113 green: "#00C48C", // Illumio primary114 greenLight: "#E8FAF3", // Success backgrounds115 greenDark: "#00A876", // Success text116 teal: "#00B4D8", // Selective / info accent117 tealLight: "#E5F7FB", // Info backgrounds118 navy: "#1A1F36", // Primary text, headers119 orange: "#FF6B35", // Warnings120 orangeLight: "#FFF3ED", // Warning backgrounds121 red: "#E63946", // Critical / failures122 redLight: "#FDE8EA", // Critical backgrounds123 gray50: "#F9FAFB", // Page background124 gray100: "#F3F4F6", // Subtle backgrounds125 gray200: "#E5E7EB", // Borders126 gray300: "#D1D5DB",127 gray400: "#9CA3AF", // Muted text128 gray500: "#6B7280", // Secondary text129 gray700: "#374151", // Strong secondary text130 white: "#FFFFFF",131};132```133134Use Google Fonts `DM Sans` (weights 400–800) loaded via `<link>` in the component body.135136### Status color mapping137138Apply consistently everywhere (badges, cells, backgrounds):139- **critical / fail / high risk**: Red (`E63946`) bg, white text140- **high**: Orange (`FF6B35`) bg, white text141- **medium / warning**: Amber (`#FEF3C7`) bg, dark amber text142- **low / pass / enforced**: Green (`00C48C`) bg, white text143- **info / in progress**: Teal (`00B4D8`) bg, white text144145### Tab Structure146147Use a pill-style tab bar with 5 tabs:1481491. **Overview** — KPI cards, enforcement donut, compliance cards, app status table1502. **Network Graph** — D3 force-directed graph with risk filter, legend, detail panel, lateral movement bars1513. **Policy Violations** — Alert banner, violations table, remediation card (only if user provided custom rules)1524. **High-Risk Ports** — Visual port cards with severity, connections, affected apps1535. **Unmanaged Traffic** — KPI cards, traffic table, anomaly alerts154155### Component Inventory156157Build these reusable components:158159- **`Badge`**: Pill-shaped label with `color` + `bg` props160- **`RiskBadge`**: Pre-mapped risk level badge161- **`ModeBadge`**: Pre-mapped enforcement mode badge (visibility_only displays as "vis only")162- **`KPI`**: Card with label, large value, subtitle, accent color163- **`Section`**: Heading with icon, optional accent bar, children164- **`TabBar`**: Pill-style tab switcher165- **`EnforcementDonut`**: SVG donut chart with arc paths and legend166- **`NetworkGraph`**: D3 force-directed graph (see below)167168### Network Graph Specification169170The graph is the centerpiece. Build it as a separate `NetworkGraph` component:171172**Props**: `onNodeClick`, `highlightRisk`173174**D3 Setup**:175- Force simulation: `forceLink` (distance 100, strength 0.3), `forceManyBody` (strength -300), `forceCenter`, `forceCollide` (radius + 8)176- SVG markers for directional arrows, colored by risk level177- Zoom via `d3.zoom` (scale 0.3–3)178- Drag behavior on nodes179180**Node rendering**:181- Circle radius by tier: core=18, shared=15, endpoint=12, standard=10182- Circle fill by tier: core=red, shared=orange, endpoint=teal, standard=gray400183- Bridge nodes override to red fill regardless of tier184- Text label below node: **`${d.app} (${d.env})`** — always the tuple185- Font: DM Sans, 9px, gray700186187**Link rendering**:188- Stroke color by risk level189- Stroke width: high=2.5, others=1.5190- Opacity: 0.35 default191- Arrow markers at endpoints192193**Interactions**:194- **Hover**: Highlight connected links (opacity 0.85) and dim unconnected nodes (opacity 0.15). Show tooltip with app (env) tuple, infra score, tier, bridge status, reachable count195- **Click**: Set selectedNode state, renders detail panel below graph196- **Risk filter buttons**: When active, highlight only links of that risk level, dim everything else (applied via setTimeout after 1.5s to let simulation settle)197- **Drag**: Standard D3 drag with alpha target restart198199**Detail panel** (shown below graph when a node is clicked):200- Header: `app (env)` with close button201- Grid: Infra Score, Tier, Bridge (YES in red / No in green), Reachable count202- Connected flows: List of flow chips showing `→ app (env) :port` with risk-colored backgrounds203204**Lateral movement bar chart** (below graph detail):205- Horizontal bars showing reachable/22 ratio206- Gradient fills: bridge nodes = red→orange, high reachability = orange→amber, low = teal→green207- Bridge nodes get a red "BRIDGE" badge208- Label: `app (env)` — always the tuple, no separate env column209210### Violations Tab (Conditional)211212Only show this tab if the user provided custom security rules of thumb. Structure:213- Red alert banner summarizing the total violation count214- Table sorted by connections descending, with red-tinted rows for critical severity215- Green remediation card with numbered steps216217### Adaptation218219If the user does not provide custom rules of thumb, replace the "Policy Violations" tab with a different relevant view (e.g., "Enforcement Roadmap" or "Policy Gaps"). Adjust the tab array accordingly.220221## Output222223Save the artifact as:224```225/mnt/user-data/outputs/security_assessment.jsx226```227228Present to the user with `present_files`. The artifact renders directly in Claude's UI.229230## Quality Checklist231232Before finalizing, verify:233234- [ ] Every graph node label shows `app (env)`, not just `app`235- [ ] Every tooltip title shows `app (env)`236- [ ] Every flow chip / connection tag shows `app (env) :port`237- [ ] Every lateral movement label shows `app (env)` with NO separate env column238- [ ] Every table uses a merged "Application (Env)" column or shows tuples inline239- [ ] Network graph has working zoom, drag, hover highlight, click detail240- [ ] Risk filter buttons work and dim non-matching content241- [ ] Donut chart segments add up to total workloads242- [ ] All status badges use correct color mapping243- [ ] Tab switching works without losing state244- [ ] No separate env columns anywhere — env is always part of the app tuple