itglue-mcp 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/package.json +1 -1
- package/skills/account-review/SKILL.md +18 -0
- package/skills/client-onboard/CLAUDE.md +5 -1
- package/skills/client-onboard/SKILL.md +10 -0
- package/skills/compliance-audit/CLAUDE.md +6 -1
- package/skills/compliance-audit/SKILL.md +10 -0
- package/skills/find-password/SKILL.md +10 -0
- package/skills/incident-response/CLAUDE.md +5 -1
- package/skills/incident-response/SKILL.md +10 -0
- package/skills/report-generator/CLAUDE.md +7 -0
- package/skills/report-generator/SKILL.md +847 -0
package/README.md
CHANGED
|
@@ -16,8 +16,8 @@ This package connects [Claude Code](https://docs.anthropic.com/en/docs/claude-co
|
|
|
16
16
|
|
|
17
17
|
**What you get:**
|
|
18
18
|
- 19 tools for querying ITGlue data through natural language
|
|
19
|
-
-
|
|
20
|
-
- Standalone HTML report generation for QBRs and
|
|
19
|
+
- 6 pre-built Skills that automate common MSP workflows
|
|
20
|
+
- Standalone HTML report generation for QBRs, security assessments, and asset inventories
|
|
21
21
|
- Security audit logging on every password access
|
|
22
22
|
- Smart caching and rate limiting so you don't hit ITGlue's API limits
|
|
23
23
|
|
|
@@ -63,7 +63,7 @@ If you see a healthy status, you're all set.
|
|
|
63
63
|
|
|
64
64
|
## Installing the Skills
|
|
65
65
|
|
|
66
|
-
The package ships with **
|
|
66
|
+
The package ships with **6 Skills** - guided workflows that Claude follows to complete common MSP tasks. Skills are optional but dramatically speed up repetitive work.
|
|
67
67
|
|
|
68
68
|
Install them globally (available in every Claude Code session):
|
|
69
69
|
|
|
@@ -84,6 +84,7 @@ This works on macOS, Linux, and Windows.
|
|
|
84
84
|
| Skill | What It Does | Time Savings |
|
|
85
85
|
|-------|-------------|-------------|
|
|
86
86
|
| **Account Review** | Generates a standalone HTML report covering asset inventory, credential hygiene, compliance posture, and action items. Aligned with ITIL v4 and NIST standards. Output is ready for ConnectWise tickets or QBR presentations. | 4-8 hrs → 5-10 min |
|
|
87
|
+
| **Report Generator** | Generates professional HTML reports: Security Assessments (NIST CSF + CIS Controls with risk matrix) and Asset Inventories (fleet composition, documentation grade, warranty tracking). CSS-only visualizations, dark mode, print-ready. | 2-6 hrs → 5-15 min |
|
|
87
88
|
| **Find Password** | Finds and retrieves a specific credential using natural language. Handles ambiguous names, multiple matches, and organization lookup automatically. | 5-10 min → <1 min |
|
|
88
89
|
| **Incident Response** | Pulls everything you need during an outage: affected asset details, network interfaces, related systems, credentials, emergency contacts, and relevant docs - all in parallel. | 5-15 min → <2 min |
|
|
89
90
|
| **Compliance Audit** | Runs password rotation checks, asset documentation audits, staleness detection, and data quality scoring. Produces a prioritized findings report. | 4-8 hrs → 5-10 min |
|
|
@@ -102,6 +103,9 @@ You: "Get me the WiFi password for Acme Corp"
|
|
|
102
103
|
|
|
103
104
|
You: "Server down at Contoso - pull everything"
|
|
104
105
|
→ Activates the Incident Response skill
|
|
106
|
+
|
|
107
|
+
You: "Generate a security assessment for Acme Corp"
|
|
108
|
+
→ Activates the Report Generator skill
|
|
105
109
|
```
|
|
106
110
|
|
|
107
111
|
## Usage Examples
|
package/package.json
CHANGED
|
@@ -19,6 +19,24 @@ You are performing a comprehensive Account Review for an MSP-managed client orga
|
|
|
19
19
|
a standalone HTML report aligned with industry frameworks: ITIL v4, NIST CSF, NIST SP 800-63B, CIS Controls,
|
|
20
20
|
and MSP QBR best practices.
|
|
21
21
|
|
|
22
|
+
## IMPORTANT: Tool Discovery
|
|
23
|
+
|
|
24
|
+
All ITGlue tools are MCP tools. You MUST use `ToolSearch` to load them before calling them.
|
|
25
|
+
|
|
26
|
+
**Before starting, run this ToolSearch query:**
|
|
27
|
+
```
|
|
28
|
+
ToolSearch(query="+itglue", max_results=5)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This loads the ITGlue MCP tools (prefixed `mcp__itglue__`). Then call them directly as tool calls — do NOT use Bash to invoke the MCP server. For example:
|
|
32
|
+
- `mcp__itglue__itglue_search_organizations` (not bash)
|
|
33
|
+
- `mcp__itglue__itglue_generate_report` (not bash)
|
|
34
|
+
- `mcp__itglue__itglue_compliance_check` (not bash)
|
|
35
|
+
|
|
36
|
+
If a tool isn't loaded yet, run another ToolSearch query for it (e.g., `ToolSearch(query="+itglue staleness")`).
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
22
40
|
## Standards Reference
|
|
23
41
|
|
|
24
42
|
### ITIL v4 — Service Review & CMDB Audit
|
|
@@ -3,5 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
### Feb 10, 2026
|
|
7
|
+
|
|
8
|
+
| ID | Time | T | Title | Read |
|
|
9
|
+
|----|------|---|-------|------|
|
|
10
|
+
| #11296 | 5:50 PM | 🔵 | Report Generation Architecture Analysis for ITGlue MCP Skills | ~495 |
|
|
7
11
|
</claude-mem-context>
|
|
@@ -13,6 +13,16 @@ version: 1.0.0
|
|
|
13
13
|
|
|
14
14
|
You are helping an MSP onboard a new client to ITGlue. Follow this systematic workflow to ensure complete, consistent documentation.
|
|
15
15
|
|
|
16
|
+
## IMPORTANT: Tool Discovery
|
|
17
|
+
|
|
18
|
+
All ITGlue tools are MCP tools. You MUST use `ToolSearch` to load them before calling them.
|
|
19
|
+
|
|
20
|
+
**Before starting, run:** `ToolSearch(query="+itglue", max_results=5)`
|
|
21
|
+
|
|
22
|
+
This loads the ITGlue MCP tools (prefixed `mcp__itglue__`). Call them directly as tool calls — do NOT use Bash. If a tool isn't loaded yet, run another ToolSearch query for it.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
16
26
|
## Step 1: Client Discovery
|
|
17
27
|
|
|
18
28
|
Gather initial client information:
|
|
@@ -3,5 +3,10 @@
|
|
|
3
3
|
|
|
4
4
|
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
### Feb 10, 2026
|
|
7
|
+
|
|
8
|
+
| ID | Time | T | Title | Read |
|
|
9
|
+
|----|------|---|-------|------|
|
|
10
|
+
| #11296 | 5:50 PM | 🔵 | Report Generation Architecture Analysis for ITGlue MCP Skills | ~495 |
|
|
11
|
+
| #11258 | 5:43 PM | ✅ | MCP Tool Discovery Instructions Added to Compliance Audit Skill | ~385 |
|
|
7
12
|
</claude-mem-context>
|
|
@@ -13,6 +13,16 @@ version: 1.0.0
|
|
|
13
13
|
|
|
14
14
|
You are performing a comprehensive compliance audit for an organization's IT documentation.
|
|
15
15
|
|
|
16
|
+
## IMPORTANT: Tool Discovery
|
|
17
|
+
|
|
18
|
+
All ITGlue tools are MCP tools. You MUST use `ToolSearch` to load them before calling them.
|
|
19
|
+
|
|
20
|
+
**Before starting, run:** `ToolSearch(query="+itglue", max_results=5)`
|
|
21
|
+
|
|
22
|
+
This loads the ITGlue MCP tools (prefixed `mcp__itglue__`). Call them directly as tool calls — do NOT use Bash. If a tool isn't loaded yet, run another ToolSearch query for it.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
16
26
|
## Step 1: Identify Scope
|
|
17
27
|
|
|
18
28
|
Clarify with user:
|
|
@@ -13,6 +13,16 @@ version: 1.0.0
|
|
|
13
13
|
|
|
14
14
|
You are helping a user find a specific password from ITGlue. Follow this workflow:
|
|
15
15
|
|
|
16
|
+
## IMPORTANT: Tool Discovery
|
|
17
|
+
|
|
18
|
+
All ITGlue tools are MCP tools. You MUST use `ToolSearch` to load them before calling them.
|
|
19
|
+
|
|
20
|
+
**Before starting, run:** `ToolSearch(query="+itglue", max_results=5)`
|
|
21
|
+
|
|
22
|
+
This loads the ITGlue MCP tools (prefixed `mcp__itglue__`). Call them directly as tool calls — do NOT use Bash. If a tool isn't loaded yet, run another ToolSearch query for it.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
16
26
|
## Step 1: Understand the Request
|
|
17
27
|
|
|
18
28
|
Parse the user's request to identify:
|
|
@@ -3,5 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
### Feb 10, 2026
|
|
7
|
+
|
|
8
|
+
| ID | Time | T | Title | Read |
|
|
9
|
+
|----|------|---|-------|------|
|
|
10
|
+
| #11296 | 5:50 PM | 🔵 | Report Generation Architecture Analysis for ITGlue MCP Skills | ~495 |
|
|
7
11
|
</claude-mem-context>
|
|
@@ -13,6 +13,16 @@ version: 1.0.0
|
|
|
13
13
|
|
|
14
14
|
You are helping a user respond to an IT incident/outage. Speed is critical. Gather all relevant information systematically.
|
|
15
15
|
|
|
16
|
+
## IMPORTANT: Tool Discovery
|
|
17
|
+
|
|
18
|
+
All ITGlue tools are MCP tools. You MUST use `ToolSearch` to load them before calling them.
|
|
19
|
+
|
|
20
|
+
**Before starting, run:** `ToolSearch(query="+itglue", max_results=5)`
|
|
21
|
+
|
|
22
|
+
This loads the ITGlue MCP tools (prefixed `mcp__itglue__`). Call them directly as tool calls — do NOT use Bash. If a tool isn't loaded yet, run another ToolSearch query for it.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
16
26
|
## Step 1: Incident Scope Assessment
|
|
17
27
|
|
|
18
28
|
Ask clarifying questions if not provided:
|
|
@@ -0,0 +1,847 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: itglue:report-generator
|
|
3
|
+
description: >
|
|
4
|
+
Use this skill when the user needs to generate a professional HTML report from ITGlue data.
|
|
5
|
+
Supports multiple report types: security assessments, asset inventories, and more.
|
|
6
|
+
|
|
7
|
+
Trigger examples: "generate security report for Acme", "create asset inventory for client X",
|
|
8
|
+
"security assessment report", "asset report for Contoso", "generate report for org Y",
|
|
9
|
+
"build inventory report", "NIST compliance report", "CIS controls assessment"
|
|
10
|
+
|
|
11
|
+
Produces standalone HTML reports with CSS-only visualizations, CVSS severity badges,
|
|
12
|
+
NIST CSF/CIS Controls alignment, and print-ready layouts. No JavaScript dependencies.
|
|
13
|
+
Reports are suitable for embedding in ConnectWise/Autotask PSA tickets.
|
|
14
|
+
version: 1.0.0
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# ITGlue Report Generator
|
|
18
|
+
|
|
19
|
+
You are generating a professional, standalone HTML report from ITGlue data. This skill supports
|
|
20
|
+
multiple report types — each with its own data requirements, scoring logic, and visual layout.
|
|
21
|
+
|
|
22
|
+
## IMPORTANT: Tool Discovery
|
|
23
|
+
|
|
24
|
+
All ITGlue tools are MCP tools. You MUST use `ToolSearch` to load them before calling them.
|
|
25
|
+
|
|
26
|
+
**Before starting, run:** `ToolSearch(query="+itglue", max_results=5)`
|
|
27
|
+
|
|
28
|
+
This loads the ITGlue MCP tools (prefixed `mcp__itglue__`). Call them directly as tool calls — do NOT use Bash. If a tool isn't loaded yet, run another ToolSearch query for it.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Step 1: Identify Scope
|
|
33
|
+
|
|
34
|
+
Clarify with the user:
|
|
35
|
+
- **Organization name** (required)
|
|
36
|
+
- **Report type** (required — see below):
|
|
37
|
+
- `security` — Security Assessment (NIST CSF + CIS Controls)
|
|
38
|
+
- `asset-inventory` — Full Asset Inventory & Lifecycle Report
|
|
39
|
+
- **Additional options** (optional):
|
|
40
|
+
- Include sensitive metadata? (default: true for security, false for asset-inventory)
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
itglue_search_organizations(name="[org name]")
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If multiple matches, ask the user to select. Note the **organization ID**.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Step 2: Gather Data
|
|
51
|
+
|
|
52
|
+
Execute queries **in parallel** based on report type.
|
|
53
|
+
|
|
54
|
+
### For `security` report:
|
|
55
|
+
```
|
|
56
|
+
itglue_generate_report(organization_id="[id]", report_type="full", include_sensitive=true)
|
|
57
|
+
itglue_compliance_check(organization_id="[id]", checks=["passwords", "configurations", "documentation", "warranties"])
|
|
58
|
+
itglue_detect_staleness(organization_id="[id]", thresholds={"passwords_days": 180, "configurations_days": 90, "documents_days": 365})
|
|
59
|
+
itglue_list_passwords(organization_id="[id]", limit=100)
|
|
60
|
+
itglue_list_configurations(organization_id="[id]", limit=100)
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### For `asset-inventory` report:
|
|
64
|
+
```
|
|
65
|
+
itglue_generate_report(organization_id="[id]", report_type="full", include_sensitive=false)
|
|
66
|
+
itglue_list_configurations(organization_id="[id]", limit=100)
|
|
67
|
+
itglue_compliance_check(organization_id="[id]", checks=["configurations", "warranties"])
|
|
68
|
+
itglue_detect_staleness(organization_id="[id]", thresholds={"configurations_days": 90})
|
|
69
|
+
itglue_list_locations(organization_id="[id]")
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Step 3: Analyze and Score
|
|
75
|
+
|
|
76
|
+
### Scoring Algorithms
|
|
77
|
+
|
|
78
|
+
#### NIST CSF Posture Score (security report)
|
|
79
|
+
For each of the 5 NIST CSF functions, compute a 0-100 maturity score:
|
|
80
|
+
|
|
81
|
+
- **Identify** (Asset Management):
|
|
82
|
+
- Config completeness: % of configs with serial + manufacturer + model
|
|
83
|
+
- Asset categorization: % of configs with a type assigned
|
|
84
|
+
- Score = average of both metrics
|
|
85
|
+
|
|
86
|
+
- **Protect** (Access Control):
|
|
87
|
+
- Credential categorization: % of passwords with a category
|
|
88
|
+
- Username completeness: % of passwords with username field
|
|
89
|
+
- Admin credential tracking: are domain admin / firewall creds documented?
|
|
90
|
+
- Score = weighted average (40% categorization, 30% username, 30% admin tracking)
|
|
91
|
+
|
|
92
|
+
- **Detect** (Monitoring):
|
|
93
|
+
- Staleness detection: inverse of stale config % (fresh = monitored)
|
|
94
|
+
- Document freshness: % of docs updated in past year
|
|
95
|
+
- Score = average of both
|
|
96
|
+
|
|
97
|
+
- **Respond** (Response Planning):
|
|
98
|
+
- Contact availability: are emergency contacts documented?
|
|
99
|
+
- Location accuracy: are locations complete with addresses?
|
|
100
|
+
- SOP existence: are incident response docs present?
|
|
101
|
+
- Score = 33% each
|
|
102
|
+
|
|
103
|
+
- **Recover** (Recovery Planning):
|
|
104
|
+
- Backup documentation: are backup configs/docs present?
|
|
105
|
+
- Warranty coverage: % of active assets with warranty data
|
|
106
|
+
- Score = average of both
|
|
107
|
+
|
|
108
|
+
**Overall NIST CSF Score** = average of 5 function scores
|
|
109
|
+
|
|
110
|
+
**Maturity Tiers**:
|
|
111
|
+
- 0-25%: Tier 1 — Partial
|
|
112
|
+
- 25-50%: Tier 2 — Risk Informed
|
|
113
|
+
- 50-75%: Tier 3 — Repeatable
|
|
114
|
+
- 75-100%: Tier 4 — Adaptive
|
|
115
|
+
|
|
116
|
+
#### CIS Controls Assessment (security report)
|
|
117
|
+
Evaluate 4 key CIS Controls:
|
|
118
|
+
|
|
119
|
+
- **CIS 1 — Enterprise Asset Inventory**: % of configs with complete data (name + type + serial + manufacturer)
|
|
120
|
+
- **CIS 2 — Software Asset Inventory**: presence of software-type configurations or application documentation
|
|
121
|
+
- **CIS 5 — Account Management**: password categorization rate, % with usernames, admin credential documentation
|
|
122
|
+
- **CIS 6 — Access Control**: credential age compliance (% within 180-day review window), infrastructure credential tracking
|
|
123
|
+
|
|
124
|
+
Each scored 0-100. Implementation Group assignment:
|
|
125
|
+
- IG1 (Basic): score < 40
|
|
126
|
+
- IG2 (Moderate): score 40-70
|
|
127
|
+
- IG3 (Advanced): score > 70
|
|
128
|
+
|
|
129
|
+
#### Risk Matrix (security report)
|
|
130
|
+
Classify findings into a 5x5 grid (Likelihood x Impact):
|
|
131
|
+
|
|
132
|
+
| Risk | Criteria | Example |
|
|
133
|
+
|------|----------|---------|
|
|
134
|
+
| Critical (20-25) | Infrastructure creds >365d, 0% asset documentation | Domain admin pw 1000+ days old |
|
|
135
|
+
| High (12-19) | Any credential >180d, missing serials on servers | Server missing serial number |
|
|
136
|
+
| Medium (6-11) | Uncategorized passwords, stale configs >90d | 50 uncategorized credentials |
|
|
137
|
+
| Low (1-5) | Missing notes, cosmetic data gaps | Contact without job title |
|
|
138
|
+
|
|
139
|
+
#### Asset Health Metrics (asset-inventory report)
|
|
140
|
+
- **Fleet Composition**: count by type (servers, workstations, network, other)
|
|
141
|
+
- **Active Rate**: active configs / total configs
|
|
142
|
+
- **Documentation Grade**: % with serial + manufacturer + model
|
|
143
|
+
- A (>90%), B (70-90%), C (50-70%), D (30-50%), F (<30%)
|
|
144
|
+
- **Warranty Coverage**: % of active assets with warranty info
|
|
145
|
+
- **Staleness Rate**: % of configs not updated in 90+ days
|
|
146
|
+
- **Naming Convention Analysis**: detect common patterns (prefixes, domains)
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Step 4: Generate Standalone HTML
|
|
151
|
+
|
|
152
|
+
Generate a self-contained HTML file — **all CSS inlined**, no external dependencies.
|
|
153
|
+
|
|
154
|
+
The report must be suitable for:
|
|
155
|
+
- Opening standalone in any browser
|
|
156
|
+
- Embedding in ConnectWise/Autotask ticket HTML body
|
|
157
|
+
- Printing to PDF via browser print dialog
|
|
158
|
+
|
|
159
|
+
### Shared CSS Foundation
|
|
160
|
+
|
|
161
|
+
Every report uses this base CSS. Copy it exactly into the `<style>` block:
|
|
162
|
+
|
|
163
|
+
```css
|
|
164
|
+
/* === CSS Custom Properties (Theme) === */
|
|
165
|
+
:root {
|
|
166
|
+
/* Surfaces */
|
|
167
|
+
--bg-primary: #ffffff;
|
|
168
|
+
--bg-secondary: #f7f8fa;
|
|
169
|
+
--bg-tertiary: #edf0f4;
|
|
170
|
+
--bg-card: #ffffff;
|
|
171
|
+
|
|
172
|
+
/* Text */
|
|
173
|
+
--text-primary: #161616;
|
|
174
|
+
--text-secondary: #525252;
|
|
175
|
+
--text-tertiary: #8d8d8d;
|
|
176
|
+
--text-inverse: #ffffff;
|
|
177
|
+
|
|
178
|
+
/* Borders */
|
|
179
|
+
--border-light: #e0e0e0;
|
|
180
|
+
--border-medium: #c6c6c6;
|
|
181
|
+
|
|
182
|
+
/* Brand */
|
|
183
|
+
--brand-primary: #1a365d;
|
|
184
|
+
--brand-accent: #2b6cb0;
|
|
185
|
+
|
|
186
|
+
/* Severity — CVSS Standard */
|
|
187
|
+
--severity-critical: #9B1B30;
|
|
188
|
+
--severity-high: #DC0000;
|
|
189
|
+
--severity-medium: #FD8C00;
|
|
190
|
+
--severity-low: #FDC500;
|
|
191
|
+
--severity-pass: #00AC46;
|
|
192
|
+
--severity-info: #3182ce;
|
|
193
|
+
|
|
194
|
+
/* Shadows */
|
|
195
|
+
--shadow-sm: 0 1px 3px rgba(0,0,0,0.08);
|
|
196
|
+
--shadow-md: 0 4px 12px rgba(0,0,0,0.1);
|
|
197
|
+
|
|
198
|
+
/* Spacing */
|
|
199
|
+
--space-xs: 0.25rem;
|
|
200
|
+
--space-sm: 0.5rem;
|
|
201
|
+
--space-md: 1rem;
|
|
202
|
+
--space-lg: 1.5rem;
|
|
203
|
+
--space-xl: 2rem;
|
|
204
|
+
--space-2xl: 3rem;
|
|
205
|
+
|
|
206
|
+
/* Radius */
|
|
207
|
+
--radius-sm: 4px;
|
|
208
|
+
--radius-md: 8px;
|
|
209
|
+
--radius-lg: 12px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
@media (prefers-color-scheme: dark) {
|
|
213
|
+
:root {
|
|
214
|
+
--bg-primary: #161616;
|
|
215
|
+
--bg-secondary: #1e1e1e;
|
|
216
|
+
--bg-tertiary: #262626;
|
|
217
|
+
--bg-card: #1e1e1e;
|
|
218
|
+
--text-primary: #f4f4f4;
|
|
219
|
+
--text-secondary: #c6c6c6;
|
|
220
|
+
--text-tertiary: #8d8d8d;
|
|
221
|
+
--border-light: #393939;
|
|
222
|
+
--border-medium: #525252;
|
|
223
|
+
--shadow-sm: 0 1px 3px rgba(0,0,0,0.3);
|
|
224
|
+
--shadow-md: 0 4px 12px rgba(0,0,0,0.4);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/* === Base Reset & Typography === */
|
|
229
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
230
|
+
|
|
231
|
+
body {
|
|
232
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
233
|
+
font-size: 14px;
|
|
234
|
+
line-height: 1.6;
|
|
235
|
+
color: var(--text-primary);
|
|
236
|
+
background: var(--bg-secondary);
|
|
237
|
+
-webkit-font-smoothing: antialiased;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.report-container {
|
|
241
|
+
max-width: 1100px;
|
|
242
|
+
margin: 0 auto;
|
|
243
|
+
padding: var(--space-xl);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
h1 { font-size: 1.75rem; font-weight: 700; color: var(--brand-primary); margin-bottom: var(--space-sm); }
|
|
247
|
+
h2 { font-size: 1.25rem; font-weight: 600; color: var(--text-primary); margin: var(--space-2xl) 0 var(--space-md); padding-bottom: var(--space-sm); border-bottom: 2px solid var(--border-light); }
|
|
248
|
+
h3 { font-size: 1rem; font-weight: 600; color: var(--text-secondary); margin: var(--space-lg) 0 var(--space-sm); }
|
|
249
|
+
|
|
250
|
+
/* === Card Component === */
|
|
251
|
+
.card {
|
|
252
|
+
background: var(--bg-card);
|
|
253
|
+
border: 1px solid var(--border-light);
|
|
254
|
+
border-radius: var(--radius-md);
|
|
255
|
+
padding: var(--space-lg);
|
|
256
|
+
box-shadow: var(--shadow-sm);
|
|
257
|
+
margin-bottom: var(--space-md);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* === Grid Layouts === */
|
|
261
|
+
.grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--space-md); }
|
|
262
|
+
.grid-3 { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-md); }
|
|
263
|
+
.grid-4 { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--space-md); }
|
|
264
|
+
.grid-5 { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--space-md); }
|
|
265
|
+
.grid-6 { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: var(--space-md); }
|
|
266
|
+
|
|
267
|
+
/* === KPI Score Card === */
|
|
268
|
+
.kpi-card {
|
|
269
|
+
background: var(--bg-card);
|
|
270
|
+
border: 1px solid var(--border-light);
|
|
271
|
+
border-radius: var(--radius-md);
|
|
272
|
+
padding: var(--space-lg);
|
|
273
|
+
text-align: center;
|
|
274
|
+
box-shadow: var(--shadow-sm);
|
|
275
|
+
}
|
|
276
|
+
.kpi-card .kpi-value {
|
|
277
|
+
font-size: 2rem;
|
|
278
|
+
font-weight: 700;
|
|
279
|
+
line-height: 1.2;
|
|
280
|
+
}
|
|
281
|
+
.kpi-card .kpi-label {
|
|
282
|
+
font-size: 0.75rem;
|
|
283
|
+
font-weight: 600;
|
|
284
|
+
text-transform: uppercase;
|
|
285
|
+
letter-spacing: 0.05em;
|
|
286
|
+
color: var(--text-tertiary);
|
|
287
|
+
margin-top: var(--space-xs);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* === Severity Badges === */
|
|
291
|
+
.badge {
|
|
292
|
+
display: inline-block;
|
|
293
|
+
padding: 2px 10px;
|
|
294
|
+
border-radius: 12px;
|
|
295
|
+
font-size: 0.7rem;
|
|
296
|
+
font-weight: 700;
|
|
297
|
+
text-transform: uppercase;
|
|
298
|
+
letter-spacing: 0.04em;
|
|
299
|
+
}
|
|
300
|
+
.badge-critical { background: var(--severity-critical); color: #fff; }
|
|
301
|
+
.badge-high { background: var(--severity-high); color: #fff; }
|
|
302
|
+
.badge-medium { background: var(--severity-medium); color: #fff; }
|
|
303
|
+
.badge-low { background: var(--severity-low); color: #1a1a1a; }
|
|
304
|
+
.badge-pass { background: var(--severity-pass); color: #fff; }
|
|
305
|
+
.badge-info { background: var(--severity-info); color: #fff; }
|
|
306
|
+
|
|
307
|
+
/* === Progress Bar === */
|
|
308
|
+
.progress-bar {
|
|
309
|
+
background: var(--bg-tertiary);
|
|
310
|
+
border-radius: 6px;
|
|
311
|
+
height: 10px;
|
|
312
|
+
overflow: hidden;
|
|
313
|
+
margin: var(--space-xs) 0;
|
|
314
|
+
}
|
|
315
|
+
.progress-bar .fill {
|
|
316
|
+
height: 100%;
|
|
317
|
+
border-radius: 6px;
|
|
318
|
+
transition: width 0.3s;
|
|
319
|
+
}
|
|
320
|
+
.fill-critical { background: var(--severity-critical); }
|
|
321
|
+
.fill-high { background: var(--severity-high); }
|
|
322
|
+
.fill-medium { background: var(--severity-medium); }
|
|
323
|
+
.fill-low { background: var(--severity-low); }
|
|
324
|
+
.fill-pass { background: var(--severity-pass); }
|
|
325
|
+
.fill-info { background: var(--severity-info); }
|
|
326
|
+
.fill-brand { background: var(--brand-accent); }
|
|
327
|
+
|
|
328
|
+
/* === Donut Chart (CSS conic-gradient) === */
|
|
329
|
+
.donut-chart {
|
|
330
|
+
width: 120px;
|
|
331
|
+
height: 120px;
|
|
332
|
+
border-radius: 50%;
|
|
333
|
+
position: relative;
|
|
334
|
+
margin: 0 auto;
|
|
335
|
+
}
|
|
336
|
+
.donut-chart::before {
|
|
337
|
+
content: '';
|
|
338
|
+
position: absolute;
|
|
339
|
+
top: 25%;
|
|
340
|
+
left: 25%;
|
|
341
|
+
width: 50%;
|
|
342
|
+
height: 50%;
|
|
343
|
+
border-radius: 50%;
|
|
344
|
+
background: var(--bg-card);
|
|
345
|
+
}
|
|
346
|
+
.donut-label {
|
|
347
|
+
position: absolute;
|
|
348
|
+
top: 50%;
|
|
349
|
+
left: 50%;
|
|
350
|
+
transform: translate(-50%, -50%);
|
|
351
|
+
font-size: 1.25rem;
|
|
352
|
+
font-weight: 700;
|
|
353
|
+
z-index: 1;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/* === Bar Chart (CSS Grid) === */
|
|
357
|
+
.bar-chart {
|
|
358
|
+
display: flex;
|
|
359
|
+
align-items: flex-end;
|
|
360
|
+
gap: var(--space-sm);
|
|
361
|
+
height: 160px;
|
|
362
|
+
padding: var(--space-md) 0;
|
|
363
|
+
border-bottom: 2px solid var(--border-light);
|
|
364
|
+
}
|
|
365
|
+
.bar-chart .bar {
|
|
366
|
+
flex: 1;
|
|
367
|
+
min-width: 40px;
|
|
368
|
+
background: var(--brand-accent);
|
|
369
|
+
border-radius: var(--radius-sm) var(--radius-sm) 0 0;
|
|
370
|
+
position: relative;
|
|
371
|
+
display: flex;
|
|
372
|
+
align-items: flex-start;
|
|
373
|
+
justify-content: center;
|
|
374
|
+
}
|
|
375
|
+
.bar-chart .bar-value {
|
|
376
|
+
position: absolute;
|
|
377
|
+
top: -20px;
|
|
378
|
+
font-size: 0.75rem;
|
|
379
|
+
font-weight: 700;
|
|
380
|
+
color: var(--text-primary);
|
|
381
|
+
}
|
|
382
|
+
.bar-chart .bar-label {
|
|
383
|
+
position: absolute;
|
|
384
|
+
bottom: -22px;
|
|
385
|
+
font-size: 0.65rem;
|
|
386
|
+
color: var(--text-secondary);
|
|
387
|
+
text-align: center;
|
|
388
|
+
white-space: nowrap;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/* === Radial Gauge (conic-gradient score) === */
|
|
392
|
+
.gauge {
|
|
393
|
+
width: 100px;
|
|
394
|
+
height: 100px;
|
|
395
|
+
border-radius: 50%;
|
|
396
|
+
position: relative;
|
|
397
|
+
margin: 0 auto var(--space-sm);
|
|
398
|
+
}
|
|
399
|
+
.gauge::before {
|
|
400
|
+
content: '';
|
|
401
|
+
position: absolute;
|
|
402
|
+
top: 20%;
|
|
403
|
+
left: 20%;
|
|
404
|
+
width: 60%;
|
|
405
|
+
height: 60%;
|
|
406
|
+
border-radius: 50%;
|
|
407
|
+
background: var(--bg-card);
|
|
408
|
+
}
|
|
409
|
+
.gauge-label {
|
|
410
|
+
position: absolute;
|
|
411
|
+
top: 50%;
|
|
412
|
+
left: 50%;
|
|
413
|
+
transform: translate(-50%, -50%);
|
|
414
|
+
font-size: 1rem;
|
|
415
|
+
font-weight: 700;
|
|
416
|
+
z-index: 1;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/* === Tables === */
|
|
420
|
+
table {
|
|
421
|
+
width: 100%;
|
|
422
|
+
border-collapse: collapse;
|
|
423
|
+
font-size: 0.85rem;
|
|
424
|
+
margin: var(--space-md) 0;
|
|
425
|
+
}
|
|
426
|
+
thead th {
|
|
427
|
+
background: var(--bg-tertiary);
|
|
428
|
+
padding: 10px 12px;
|
|
429
|
+
text-align: left;
|
|
430
|
+
font-weight: 600;
|
|
431
|
+
font-size: 0.75rem;
|
|
432
|
+
text-transform: uppercase;
|
|
433
|
+
letter-spacing: 0.04em;
|
|
434
|
+
color: var(--text-secondary);
|
|
435
|
+
border-bottom: 2px solid var(--border-medium);
|
|
436
|
+
position: sticky;
|
|
437
|
+
top: 0;
|
|
438
|
+
}
|
|
439
|
+
tbody td {
|
|
440
|
+
padding: 8px 12px;
|
|
441
|
+
border-bottom: 1px solid var(--border-light);
|
|
442
|
+
vertical-align: top;
|
|
443
|
+
}
|
|
444
|
+
tbody tr:nth-child(even) { background: var(--bg-secondary); }
|
|
445
|
+
tbody tr:hover { background: var(--bg-tertiary); }
|
|
446
|
+
|
|
447
|
+
/* === Risk Matrix (5x5) === */
|
|
448
|
+
.risk-matrix {
|
|
449
|
+
display: grid;
|
|
450
|
+
grid-template-columns: auto repeat(5, 1fr);
|
|
451
|
+
grid-template-rows: repeat(5, 48px) auto;
|
|
452
|
+
gap: 2px;
|
|
453
|
+
max-width: 500px;
|
|
454
|
+
margin: var(--space-md) auto;
|
|
455
|
+
font-size: 0.7rem;
|
|
456
|
+
text-align: center;
|
|
457
|
+
}
|
|
458
|
+
.risk-matrix .rm-cell {
|
|
459
|
+
display: flex;
|
|
460
|
+
align-items: center;
|
|
461
|
+
justify-content: center;
|
|
462
|
+
border-radius: var(--radius-sm);
|
|
463
|
+
font-weight: 600;
|
|
464
|
+
color: #fff;
|
|
465
|
+
}
|
|
466
|
+
.rm-critical { background: var(--severity-critical); }
|
|
467
|
+
.rm-high { background: var(--severity-high); }
|
|
468
|
+
.rm-medium { background: var(--severity-medium); }
|
|
469
|
+
.rm-low { background: #a8d08d; color: #1a1a1a; }
|
|
470
|
+
.rm-label { font-weight: 600; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; font-size: 0.65rem; }
|
|
471
|
+
|
|
472
|
+
/* === Summary Boxes === */
|
|
473
|
+
.summary-critical { border-left: 4px solid var(--severity-critical); background: #fef2f2; }
|
|
474
|
+
.summary-warning { border-left: 4px solid var(--severity-medium); background: #fff8f0; }
|
|
475
|
+
.summary-success { border-left: 4px solid var(--severity-pass); background: #f0fdf4; }
|
|
476
|
+
|
|
477
|
+
@media (prefers-color-scheme: dark) {
|
|
478
|
+
.summary-critical { background: #2d1215; }
|
|
479
|
+
.summary-warning { background: #2d2010; }
|
|
480
|
+
.summary-success { background: #0d2818; }
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/* === Header === */
|
|
484
|
+
.report-header {
|
|
485
|
+
background: var(--brand-primary);
|
|
486
|
+
color: #fff;
|
|
487
|
+
padding: var(--space-xl) var(--space-2xl);
|
|
488
|
+
border-radius: var(--radius-lg);
|
|
489
|
+
margin-bottom: var(--space-xl);
|
|
490
|
+
}
|
|
491
|
+
.report-header h1 { color: #fff; margin: 0; }
|
|
492
|
+
.report-header .subtitle { opacity: 0.85; font-size: 0.9rem; margin-top: var(--space-xs); }
|
|
493
|
+
.report-header .meta { opacity: 0.7; font-size: 0.75rem; margin-top: var(--space-sm); }
|
|
494
|
+
|
|
495
|
+
/* === Footer === */
|
|
496
|
+
.report-footer {
|
|
497
|
+
text-align: center;
|
|
498
|
+
padding: var(--space-xl) 0;
|
|
499
|
+
margin-top: var(--space-2xl);
|
|
500
|
+
border-top: 1px solid var(--border-light);
|
|
501
|
+
font-size: 0.75rem;
|
|
502
|
+
color: var(--text-tertiary);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/* === Print Styles === */
|
|
506
|
+
@media print {
|
|
507
|
+
body { background: #fff; font-size: 11pt; }
|
|
508
|
+
.report-container { max-width: 100%; padding: 0; }
|
|
509
|
+
.report-header { break-after: avoid; }
|
|
510
|
+
.card, table, .bar-chart { break-inside: avoid; }
|
|
511
|
+
h2 { break-after: avoid; }
|
|
512
|
+
.no-print { display: none; }
|
|
513
|
+
thead th { background: #f0f0f0 !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
514
|
+
tbody tr:nth-child(even) { background: #f8f8f8 !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
515
|
+
.badge, .fill-critical, .fill-high, .fill-medium, .fill-low, .fill-pass, .fill-info, .fill-brand,
|
|
516
|
+
.badge-critical, .badge-high, .badge-medium, .badge-low, .badge-pass, .badge-info,
|
|
517
|
+
.rm-critical, .rm-high, .rm-medium, .rm-low,
|
|
518
|
+
.summary-critical, .summary-warning, .summary-success,
|
|
519
|
+
.gauge, .donut-chart, .report-header {
|
|
520
|
+
-webkit-print-color-adjust: exact;
|
|
521
|
+
print-color-adjust: exact;
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
---
|
|
527
|
+
|
|
528
|
+
## Report Type: `security` — Security Assessment Report
|
|
529
|
+
|
|
530
|
+
### Required Sections
|
|
531
|
+
|
|
532
|
+
#### 1. Header
|
|
533
|
+
- Organization name, type, ITGlue ID
|
|
534
|
+
- Report type: "Security Assessment"
|
|
535
|
+
- Standards reference: "Aligned with NIST CSF 2.0, CIS Controls v8, NIST SP 800-63B Rev 4"
|
|
536
|
+
- Report generation timestamp
|
|
537
|
+
- "Built for Productivity by sully" branding
|
|
538
|
+
|
|
539
|
+
#### 2. Executive Summary (3 color-coded boxes)
|
|
540
|
+
- **Critical Findings** (red `summary-critical`): Top 3-5 most severe security issues. Lead with infrastructure credential risks and compliance gaps.
|
|
541
|
+
- **Recommendations** (amber `summary-warning`): Prioritized remediation steps with specific asset/credential names.
|
|
542
|
+
- **Strengths** (green `summary-success`): What's well-documented. Acknowledge strong areas.
|
|
543
|
+
|
|
544
|
+
#### 3. NIST CSF Posture Dashboard
|
|
545
|
+
Display 5 radial gauges in a `grid-5` layout, one per NIST function:
|
|
546
|
+
- Identify, Protect, Detect, Respond, Recover
|
|
547
|
+
- Each gauge uses `conic-gradient`:
|
|
548
|
+
- Score portion colored by severity (pass/low/medium/high/critical based on %)
|
|
549
|
+
- Remaining portion `var(--bg-tertiary)`
|
|
550
|
+
- Below gauges: **Overall Maturity Tier** (Tier 1-4) with description
|
|
551
|
+
- Below tier: text explaining what each score means
|
|
552
|
+
|
|
553
|
+
Gauge color thresholds:
|
|
554
|
+
- 75-100%: `var(--severity-pass)` (green)
|
|
555
|
+
- 50-74%: `var(--severity-medium)` (orange)
|
|
556
|
+
- 25-49%: `var(--severity-high)` (red)
|
|
557
|
+
- 0-24%: `var(--severity-critical)` (dark red)
|
|
558
|
+
|
|
559
|
+
#### 4. CIS Controls Assessment
|
|
560
|
+
For each of the 4 assessed controls (CIS 1, 2, 5, 6):
|
|
561
|
+
- **Score** with progress bar
|
|
562
|
+
- **Implementation Group** badge (IG1/IG2/IG3)
|
|
563
|
+
- **Key findings** for that control
|
|
564
|
+
- **Specific gaps** with affected item counts
|
|
565
|
+
|
|
566
|
+
Layout: `grid-2` with a card per control.
|
|
567
|
+
|
|
568
|
+
#### 5. Risk Matrix
|
|
569
|
+
Render a 5x5 grid with:
|
|
570
|
+
- Y-axis: Likelihood (Almost Certain → Rare, top to bottom)
|
|
571
|
+
- X-axis: Impact (Negligible → Catastrophic, left to right)
|
|
572
|
+
- Color cells: Critical (dark red), High (red), Medium (orange), Low (green)
|
|
573
|
+
- Below the matrix: table of actual findings mapped to their risk position
|
|
574
|
+
|
|
575
|
+
```html
|
|
576
|
+
<!-- Risk Matrix HTML Pattern -->
|
|
577
|
+
<div class="risk-matrix">
|
|
578
|
+
<!-- Y-axis labels (left column) -->
|
|
579
|
+
<div class="rm-label">Almost Certain</div>
|
|
580
|
+
<div class="rm-cell rm-medium">5</div><div class="rm-cell rm-high">10</div><div class="rm-cell rm-high">15</div><div class="rm-cell rm-critical">20</div><div class="rm-cell rm-critical">25</div>
|
|
581
|
+
|
|
582
|
+
<div class="rm-label">Likely</div>
|
|
583
|
+
<div class="rm-cell rm-low">4</div><div class="rm-cell rm-medium">8</div><div class="rm-cell rm-high">12</div><div class="rm-cell rm-high">16</div><div class="rm-cell rm-critical">20</div>
|
|
584
|
+
|
|
585
|
+
<div class="rm-label">Possible</div>
|
|
586
|
+
<div class="rm-cell rm-low">3</div><div class="rm-cell rm-medium">6</div><div class="rm-cell rm-medium">9</div><div class="rm-cell rm-high">12</div><div class="rm-cell rm-high">15</div>
|
|
587
|
+
|
|
588
|
+
<div class="rm-label">Unlikely</div>
|
|
589
|
+
<div class="rm-cell rm-low">2</div><div class="rm-cell rm-low">4</div><div class="rm-cell rm-medium">6</div><div class="rm-cell rm-medium">8</div><div class="rm-cell rm-high">10</div>
|
|
590
|
+
|
|
591
|
+
<div class="rm-label">Rare</div>
|
|
592
|
+
<div class="rm-cell rm-low">1</div><div class="rm-cell rm-low">2</div><div class="rm-cell rm-low">3</div><div class="rm-cell rm-low">4</div><div class="rm-cell rm-medium">5</div>
|
|
593
|
+
|
|
594
|
+
<!-- X-axis labels (bottom row) -->
|
|
595
|
+
<div class="rm-label"></div>
|
|
596
|
+
<div class="rm-label">Negligible</div><div class="rm-label">Minor</div><div class="rm-label">Moderate</div><div class="rm-label">Major</div><div class="rm-label">Catastrophic</div>
|
|
597
|
+
</div>
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
#### 6. Credential Security Analysis
|
|
601
|
+
- **Stale Credentials Table**: Top 15 most critical stale passwords with name, category, days since update, severity badge
|
|
602
|
+
- Critical: infrastructure creds (domain admin, firewall, RADIUS) >365 days
|
|
603
|
+
- High: any credential >180 days
|
|
604
|
+
- Medium: >90 days for admin-class credentials
|
|
605
|
+
- **Password Categorization**: donut chart showing categorized vs uncategorized split
|
|
606
|
+
- **Credential Distribution**: bar chart by category (Network, Server, Cloud, Application, etc.)
|
|
607
|
+
- **Username Completeness**: progress bar showing % with username documented
|
|
608
|
+
- **NIST SP 800-63B Note**: "Per NIST SP 800-63B Rev 4, time-based mandatory rotation is no longer recommended. Credentials flagged here are for review, not automatic rotation. Change only upon evidence of compromise."
|
|
609
|
+
|
|
610
|
+
#### 7. Configuration Security Posture
|
|
611
|
+
- **Documentation Gaps Summary**: cards showing counts of missing serial numbers, missing manufacturer, missing model
|
|
612
|
+
- **Active vs Inactive Assets**: donut chart with active/inactive/decommissioned split
|
|
613
|
+
- **Stale Configurations**: count and % of configs not updated in 90+ days
|
|
614
|
+
- **Root Cause Analysis**: if >80% configs stale, note possible RMM sync failure
|
|
615
|
+
|
|
616
|
+
#### 8. Compliance Findings Table
|
|
617
|
+
Full table of all compliance findings with columns:
|
|
618
|
+
- #, Finding, Severity (badge), Category, Affected Items, Framework Reference
|
|
619
|
+
- Sort by severity (Critical first)
|
|
620
|
+
- Framework reference maps to NIST CSF function or CIS Control number
|
|
621
|
+
|
|
622
|
+
#### 9. Remediation Roadmap
|
|
623
|
+
Prioritized action plan in 3 tiers:
|
|
624
|
+
|
|
625
|
+
**Immediate (0-7 days)**: Critical and high-severity findings
|
|
626
|
+
**Short-term (7-30 days)**: Medium-severity findings
|
|
627
|
+
**Long-term (30-90 days)**: Low-severity and continuous improvement
|
|
628
|
+
|
|
629
|
+
Each action item: numbered, specific description, priority badge, framework reference.
|
|
630
|
+
|
|
631
|
+
#### 10. Footer
|
|
632
|
+
- "Built for Productivity by sully"
|
|
633
|
+
- Generation timestamp, ITGlue MCP version reference
|
|
634
|
+
- Disclaimer: "This report contains metadata only. No password values are included."
|
|
635
|
+
|
|
636
|
+
---
|
|
637
|
+
|
|
638
|
+
## Report Type: `asset-inventory` — Asset Inventory & Lifecycle Report
|
|
639
|
+
|
|
640
|
+
### Required Sections
|
|
641
|
+
|
|
642
|
+
#### 1. Header
|
|
643
|
+
- Organization name, type, ITGlue ID
|
|
644
|
+
- Report type: "Asset Inventory & Lifecycle Report"
|
|
645
|
+
- Report generation timestamp
|
|
646
|
+
- "Built for Productivity by sully" branding
|
|
647
|
+
|
|
648
|
+
#### 2. Fleet Summary KPIs
|
|
649
|
+
`grid-6` layout with KPI cards:
|
|
650
|
+
- Total Assets
|
|
651
|
+
- Active Assets
|
|
652
|
+
- Inactive Assets
|
|
653
|
+
- Servers
|
|
654
|
+
- Workstations
|
|
655
|
+
- Network Devices
|
|
656
|
+
|
|
657
|
+
#### 3. Asset Composition
|
|
658
|
+
- **Bar chart**: count by configuration type (servers, workstations, switches, firewalls, APs, printers, other)
|
|
659
|
+
- **Donut chart**: active vs inactive split
|
|
660
|
+
- Each bar colored by `var(--brand-accent)`, with value labels
|
|
661
|
+
|
|
662
|
+
#### 4. Documentation Grade
|
|
663
|
+
Overall documentation grade (A-F) displayed prominently:
|
|
664
|
+
- A (>90%): All fields complete — exemplary documentation
|
|
665
|
+
- B (70-90%): Most fields complete — good standing
|
|
666
|
+
- C (50-70%): Significant gaps — needs attention
|
|
667
|
+
- D (30-50%): Major gaps — remediation required
|
|
668
|
+
- F (<30%): Documentation critically incomplete
|
|
669
|
+
|
|
670
|
+
Breakdown progress bars:
|
|
671
|
+
- Serial Number coverage: X%
|
|
672
|
+
- Manufacturer coverage: X%
|
|
673
|
+
- Model coverage: X%
|
|
674
|
+
- Type assignment: X%
|
|
675
|
+
- Notes/description: X%
|
|
676
|
+
|
|
677
|
+
#### 5. Server Inventory
|
|
678
|
+
Full table of all server-type configurations:
|
|
679
|
+
- Name, Manufacturer, Model, Serial Number, Status, Last Updated
|
|
680
|
+
- Missing fields highlighted with `badge-medium` "Missing" badge
|
|
681
|
+
- Sorted by name
|
|
682
|
+
|
|
683
|
+
#### 6. Workstation Fleet
|
|
684
|
+
- **Summary stats**: total, active, inactive, naming convention detected
|
|
685
|
+
- **Table**: Name, Serial, Status, Last Updated (truncate to first 25, note remaining count)
|
|
686
|
+
- **Naming Convention Analysis**: detect common prefixes/patterns, note outliers
|
|
687
|
+
|
|
688
|
+
#### 7. Network Infrastructure
|
|
689
|
+
Table of all network devices (firewalls, switches, APs, routers):
|
|
690
|
+
- Name, Type, Manufacturer, Model, Serial, Status
|
|
691
|
+
- Flag any network device missing manufacturer or serial (these are critical for warranty/support)
|
|
692
|
+
|
|
693
|
+
#### 8. Asset Staleness Analysis
|
|
694
|
+
- **Staleness donut chart**: fresh (<90d) vs stale (90-180d) vs very stale (>180d)
|
|
695
|
+
- **Staleness by type**: bar chart showing stale % per configuration type
|
|
696
|
+
- **Most Stale Assets table**: top 10 by days since last update
|
|
697
|
+
|
|
698
|
+
#### 9. Warranty & Lifecycle (if data available)
|
|
699
|
+
- Assets with warranty data: count and %
|
|
700
|
+
- Expiring soon (<90 days): list
|
|
701
|
+
- Expired: list
|
|
702
|
+
- No warranty data: count
|
|
703
|
+
- If no warranty data exists at all, note this as a gap and recommend tracking
|
|
704
|
+
|
|
705
|
+
#### 10. Location Distribution
|
|
706
|
+
If locations available:
|
|
707
|
+
- Card per location showing asset count at each
|
|
708
|
+
- Flag locations with 0 documented assets (potential gap)
|
|
709
|
+
|
|
710
|
+
#### 11. Recommendations
|
|
711
|
+
Prioritized action items for improving asset documentation:
|
|
712
|
+
- Missing serial numbers (by asset type)
|
|
713
|
+
- Missing manufacturer/model
|
|
714
|
+
- Stale assets needing review
|
|
715
|
+
- Warranty tracking gaps
|
|
716
|
+
- Documentation grade improvement path (current grade → target grade with specific actions)
|
|
717
|
+
|
|
718
|
+
#### 12. Footer
|
|
719
|
+
- "Built for Productivity by sully"
|
|
720
|
+
- Generation timestamp
|
|
721
|
+
- Total assets in scope
|
|
722
|
+
|
|
723
|
+
---
|
|
724
|
+
|
|
725
|
+
## Step 5: Save the Report
|
|
726
|
+
|
|
727
|
+
Save the HTML file to the `reports/` directory:
|
|
728
|
+
|
|
729
|
+
```
|
|
730
|
+
Write to: reports/[org-short-name]-[report-type].html
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
Examples:
|
|
734
|
+
- `reports/acme-corp-security.html`
|
|
735
|
+
- `reports/contoso-asset-inventory.html`
|
|
736
|
+
|
|
737
|
+
Use lowercase, hyphenated organization name. If the org has a short_name in ITGlue, prefer that.
|
|
738
|
+
|
|
739
|
+
Inform the user the file can be:
|
|
740
|
+
1. Opened in any browser
|
|
741
|
+
2. Embedded in a ConnectWise/Autotask ticket HTML body
|
|
742
|
+
3. Printed to PDF via browser print dialog (Ctrl+P / Cmd+P)
|
|
743
|
+
|
|
744
|
+
## Step 6: Summarize Findings
|
|
745
|
+
|
|
746
|
+
Present a concise summary after generating:
|
|
747
|
+
|
|
748
|
+
```markdown
|
|
749
|
+
## Report Generated: [Report Type] — [Organization Name]
|
|
750
|
+
|
|
751
|
+
**Report**: reports/[filename].html ([size]KB)
|
|
752
|
+
**Type**: [Security Assessment / Asset Inventory]
|
|
753
|
+
|
|
754
|
+
### Key Metrics
|
|
755
|
+
| Metric | Value | Status |
|
|
756
|
+
|--------|-------|--------|
|
|
757
|
+
| [metric 1] | X | [badge] |
|
|
758
|
+
| [metric 2] | Y | [badge] |
|
|
759
|
+
| ... | ... | ... |
|
|
760
|
+
|
|
761
|
+
### Top 3 Findings
|
|
762
|
+
1. [Most critical finding]
|
|
763
|
+
2. [Second most critical]
|
|
764
|
+
3. [Third most critical]
|
|
765
|
+
|
|
766
|
+
### Recommended Next Steps
|
|
767
|
+
1. [First action]
|
|
768
|
+
2. [Second action]
|
|
769
|
+
3. [Third action]
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
---
|
|
773
|
+
|
|
774
|
+
## Example Workflows
|
|
775
|
+
|
|
776
|
+
### Security Assessment
|
|
777
|
+
```
|
|
778
|
+
User: "Generate a security report for QC Graphics"
|
|
779
|
+
|
|
780
|
+
1. ToolSearch(query="+itglue", max_results=5)
|
|
781
|
+
|
|
782
|
+
2. itglue_search_organizations(name="QC Graphics")
|
|
783
|
+
→ ID: 5717181
|
|
784
|
+
|
|
785
|
+
3. [Parallel - 5 queries:]
|
|
786
|
+
a. itglue_generate_report(organization_id="5717181", report_type="full", include_sensitive=true)
|
|
787
|
+
b. itglue_compliance_check(organization_id="5717181", checks=["passwords","configurations","documentation","warranties"])
|
|
788
|
+
c. itglue_detect_staleness(organization_id="5717181", thresholds={"passwords_days":180,"configurations_days":90,"documents_days":365})
|
|
789
|
+
d. itglue_list_passwords(organization_id="5717181", limit=100)
|
|
790
|
+
e. itglue_list_configurations(organization_id="5717181", limit=100)
|
|
791
|
+
|
|
792
|
+
4. Compute: NIST CSF scores, CIS Controls assessment, risk matrix, credential analysis
|
|
793
|
+
|
|
794
|
+
5. Generate HTML → reports/qcg-security.html
|
|
795
|
+
|
|
796
|
+
6. Present summary with NIST maturity tier + top 3 findings
|
|
797
|
+
```
|
|
798
|
+
|
|
799
|
+
### Asset Inventory
|
|
800
|
+
```
|
|
801
|
+
User: "Create an asset inventory for Crebrid"
|
|
802
|
+
|
|
803
|
+
1. ToolSearch(query="+itglue", max_results=5)
|
|
804
|
+
|
|
805
|
+
2. itglue_search_organizations(name="Crebrid")
|
|
806
|
+
→ ID: 5717166, Short Name: Wildcat Lending
|
|
807
|
+
|
|
808
|
+
3. [Parallel - 5 queries:]
|
|
809
|
+
a. itglue_generate_report(organization_id="5717166", report_type="full", include_sensitive=false)
|
|
810
|
+
b. itglue_list_configurations(organization_id="5717166", limit=100)
|
|
811
|
+
c. itglue_compliance_check(organization_id="5717166", checks=["configurations","warranties"])
|
|
812
|
+
d. itglue_detect_staleness(organization_id="5717166", thresholds={"configurations_days":90})
|
|
813
|
+
e. itglue_list_locations(organization_id="5717166")
|
|
814
|
+
|
|
815
|
+
4. Compute: fleet composition, documentation grade, staleness analysis, warranty coverage
|
|
816
|
+
|
|
817
|
+
5. Generate HTML → reports/wildcat-lending-asset-inventory.html
|
|
818
|
+
|
|
819
|
+
6. Present summary with documentation grade + fleet stats
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
---
|
|
823
|
+
|
|
824
|
+
## Design Quality Standards
|
|
825
|
+
|
|
826
|
+
- **File size target**: <50KB per report
|
|
827
|
+
- **Zero JavaScript**: all visualizations CSS-only
|
|
828
|
+
- **Zero external dependencies**: no CDN links, no Google Fonts, no external images
|
|
829
|
+
- **WCAG AA**: 4.5:1 contrast ratios on all text, semantic HTML, ARIA labels on charts
|
|
830
|
+
- **Responsive**: works on desktop (1100px) and mobile (320px+)
|
|
831
|
+
- **Print-ready**: @media print styles with page-break controls
|
|
832
|
+
- **Dark mode**: automatic via `prefers-color-scheme` CSS custom property overrides
|
|
833
|
+
- **Professional tone**: enterprise-quality typography, spacing, and color usage
|
|
834
|
+
|
|
835
|
+
## Error Handling
|
|
836
|
+
|
|
837
|
+
- **Organization not found**: Try partial name search. If still ambiguous, list matches and ask user.
|
|
838
|
+
- **Missing data sections**: Render the section with "No data available" message instead of omitting it.
|
|
839
|
+
- **Large orgs (>100 configs)**: Note "Results limited to first 100 items" in report. Suggest filtered follow-up queries.
|
|
840
|
+
- **API errors**: Report which data source failed, generate report with available data, note gaps.
|
|
841
|
+
|
|
842
|
+
## Success Metrics
|
|
843
|
+
|
|
844
|
+
- **Traditional manual report**: 2-6 hours depending on type
|
|
845
|
+
- **With this skill**: 5-15 minutes automated
|
|
846
|
+
- **Time savings**: 80-90% reduction
|
|
847
|
+
- **Consistency**: Standardized sections ensure no critical areas missed across clients
|