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 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
- - 5 pre-built Skills that automate common MSP workflows
20
- - Standalone HTML report generation for QBRs and account reviews
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 **5 Skills** - guided workflows that Claude follows to complete common MSP tasks. Skills are optional but dramatically speed up repetitive work.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "itglue-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Model Context Protocol server for ITGlue - enables Claude Code to access MSP documentation through natural language queries",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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
- *No recent activity*
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
- *No recent activity*
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
- *No recent activity*
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,7 @@
1
+ <claude-mem-context>
2
+ # Recent Activity
3
+
4
+ <!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
5
+
6
+ *No recent activity*
7
+ </claude-mem-context>
@@ -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