IT Glue Configurations — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited IT Glue Configurations (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Configurations in IT Glue represent trackable assets such as servers, workstations, network devices, printers, and more. They serve as the central repository for asset documentation, enabling technicians to quickly find device information, network details, warranty status, and related documentation.
field schema is a flexible asset, not a configuration; use itglue-flexible-assets.
autotask-configuration-items.
Glue stores what was documented, not what is true now; use datto-rmm-devices and datto-rmm-audit.
Configuration types classify assets at the highest level:
| Type | Description | Examples |
|---|---|---|
| Server | Physical or virtual servers | Domain controllers, file servers, application servers |
| Workstation | End-user devices | Desktops, laptops |
| Network Device | Network infrastructure | Routers, switches, firewalls, access points |
| Printer | Print devices | Network printers, multifunction devices |
| Mobile Device | Portable devices | Tablets, phones |
| Domain | Internet domains | Primary domains, subdomains |
| SSL Certificate | Security certificates | Web certificates, code signing |
| Cloud Service | Cloud subscriptions | Microsoft 365, AWS, Azure |
| Software | Software licenses | Application licenses |
| Other | Miscellaneous | UPS, cameras, IoT devices |
| Status | Description | Business Logic |
|---|---|---|
| Active | Currently in use | Standard operational state |
| Inactive | Not currently in use | Spare or standby equipment |
| Decommissioned | End of life | Historical record only |
| Missing | Cannot locate | Requires investigation |
Network interfaces associated with a configuration:
Configuration: DC-01 (Server)
├── Interface: Ethernet0 (192.168.1.10, AA:BB:CC:DD:EE:01)
├── Interface: Ethernet1 (10.0.0.10, AA:BB:CC:DD:EE:02)
└── Interface: iLO (192.168.100.10, AA:BB:CC:DD:EE:03)Fields cover identification, hardware, network, lifecycle, documentation, and PSA/RMM integration. See references/fields.md for the complete field reference.
Configurations support the standard list/get/create/update/delete verbs, plus organization-scoped listing (/organizations/:id/relationships/configurations), search by hostname/serial-number/primary-ip/psa-id, nested configuration-interfaces, and related-items relationships for linking assets to each other (e.g. VM to host). See references/api.md for full request/response examples of every operation.
async function onboardAsset(orgId, assetData) {
// Step 1: Create configuration
const config = await createConfiguration({
'organization-id': orgId,
name: assetData.name,
hostname: assetData.hostname,
'configuration-type-id': assetData.typeId,
'configuration-status-id': ACTIVE_STATUS,
'primary-ip': assetData.ip,
'serial-number': assetData.serialNumber,
'asset-tag': assetData.assetTag,
'purchased-at': assetData.purchaseDate,
'warranty-expires-at': assetData.warrantyDate,
notes: assetData.notes
});
// Step 2: Add network interfaces
for (const iface of assetData.interfaces || []) {
await createInterface({
'configuration-id': config.id,
name: iface.name,
'ip-address': iface.ip,
'mac-address': iface.mac,
primary: iface.primary
});
}
// Step 3: Create relationships if applicable
if (assetData.hostServer) {
await createRelatedItem({
'resource-id': config.id,
'resource-type': 'Configuration',
'destination-id': assetData.hostServer,
'destination-type': 'Configuration',
notes: 'Hosted on this server'
});
}
return config;
}IT Glue doesn't support date-range filters directly, so warranty lookups fetch active configurations and filter client-side:
async function getExpiringWarranties(daysAhead = 90) {
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + daysAhead);
const today = new Date().toISOString().split('T')[0];
const future = futureDate.toISOString().split('T')[0];
const configs = await fetchConfigurations({
filter: { 'configuration-status-id': ACTIVE_STATUS }
});
return configs
.filter(c => {
const warranty = c.attributes['warranty-expires-at'];
return warranty && warranty >= today && warranty <= future;
})
.map(c => ({
name: c.attributes.name,
organization: c.relationships.organization.data.id,
warrantyExpires: c.attributes['warranty-expires-at'],
daysRemaining: Math.ceil(
(new Date(c.attributes['warranty-expires-at']) - new Date()) / (1000 * 60 * 60 * 24)
)
}))
.sort((a, b) => a.daysRemaining - b.daysRemaining);
}async function decommissionAsset(configId, reason) {
// Update status
await updateConfiguration(configId, {
'configuration-status-id': DECOMMISSIONED_STATUS,
notes: `<p><strong>Decommissioned:</strong> ${new Date().toLocaleDateString()}</p>
<p><strong>Reason:</strong> ${reason}</p>`
});
// Add note about decommissioning
return { status: 'decommissioned', configId, reason };
}async function generateNetworkInventory(orgId) {
const configs = await fetchConfigurations({
filter: {
'organization-id': orgId,
'configuration-status-id': ACTIVE_STATUS
},
include: 'configuration-interfaces'
});
return configs.map(config => ({
name: config.attributes.name,
hostname: config.attributes.hostname,
type: config.relationships['configuration-type']?.data?.id,
primaryIp: config.attributes['primary-ip'],
interfaces: config.relationships['configuration-interfaces']?.data?.map(iface => ({
name: iface.attributes.name,
ip: iface.attributes['ip-address'],
mac: iface.attributes['mac-address']
})) || []
}));
}configuration-type-id and configuration-status-id are references to org-specific lookup tables, not fixed enums — query /configuration-types and /configuration-statuses before creating, since an unrecognized ID returns a 422 rather than a clear "invalid type" message.See references/errors.md for the common error/validation tables and an error-recovery pattern that queries valid types on 422.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.