From liongard
Provides Liongard platform context: terminology, capabilities, authentication patterns, API structure, environments, agents, inspectors, launchpoints, systems, detections, MSP workflows.
npx claudepluginhub wyre-technology/msp-claude-plugins --plugin liongardThis skill uses the workspace's default tool permissions.
Liongard is an automated IT documentation and configuration management platform built for Managed Service Providers (MSPs). It continuously inspects and documents IT environments across hundreds of technology platforms, providing:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Compresses source documents into lossless, LLM-optimized distillates preserving all facts and relationships. Use for 'distill documents' or 'create distillate' requests.
Liongard is an automated IT documentation and configuration management platform built for Managed Service Providers (MSPs). It continuously inspects and documents IT environments across hundreds of technology platforms, providing:
Liongard replaces manual documentation processes with automated, scheduled inspections that capture the state of servers, firewalls, cloud services, and more.
Environments represent customer organizations or sites being monitored. Each environment contains agents, launchpoints, systems, and detections. Environments can be organized into groups and tiers for logical management.
| Field | Type | Description |
|---|---|---|
ID | int | Unique environment identifier |
Name | string | Environment display name |
Description | string | Optional description |
Status | string | Active or Inactive |
Visible | boolean | Visibility in UI |
Tier | string | Service tier classification |
CreatedOn | datetime | Creation timestamp |
UpdatedOn | datetime | Last update timestamp |
Agents are lightweight software deployed to customer sites that execute inspections. Each agent connects back to the Liongard platform and runs configured inspection tasks on a schedule.
Inspectors are templates defining what to inspect. Liongard provides hundreds of built-in inspectors for common platforms:
Launchpoints are configured inspection instances that tie together an inspector template, a target environment, an agent, credentials, and a schedule. They represent "run this inspector against this target on this schedule."
| Component | Description |
|---|---|
| Inspector | What to inspect (template) |
| Environment | Where it belongs (customer) |
| Agent | Who runs it (deployed software) |
| Credentials | How to authenticate to the target |
| Schedule | When to run (cron expression) |
Systems are discovered items from inspections. When a launchpoint runs, it discovers systems such as servers, firewalls, cloud services, user accounts, and other entities. Each system contains detailed configuration data captured during inspection.
Detections are automated change and anomaly alerts generated when inspections find differences from previous runs. They enable MSPs to:
Custom metrics allow MSPs to define and track specific values across systems and environments. Metrics can be evaluated per-system or aggregated across environments.
The timeline provides an audit trail of all events and changes within Liongard, including inspection runs, detection triggers, user actions, and system events.
Dataprints provide JMESPath-evaluated data extraction from system details. They allow precise querying of nested configuration data captured during inspections.
Asset Inventory (v2) provides identity and device profile management across all inspected environments, aggregating user accounts and devices discovered through inspections.
Liongard uses API key authentication via the X-ROAR-API-KEY header:
GET /api/v1/environments
X-ROAR-API-KEY: YOUR_API_KEY
Content-Type: application/json
Required Headers:
| Header | Value | Description |
|---|---|---|
X-ROAR-API-KEY | {api_key} | API key from Liongard portal |
Content-Type | application/json | For POST/PUT requests |
Liongard uses instance-based URLs where each customer has a unique subdomain:
https://{instance}.app.liongard.com/api/v1
https://{instance}.app.liongard.com/api/v2
For example, if your instance is acmemsp:
https://acmemsp.app.liongard.com/api/v1/environments
export LIONGARD_INSTANCE="yourcompany"
export LIONGARD_API_KEY="your-api-key-here"
Liongard provides two API versions with different entity coverage:
Most entities are accessed through v1:
| Endpoint | Methods | Description |
|---|---|---|
/api/v1/environments | GET, POST, PUT, DELETE | Environment management |
/api/v1/environments/count | GET | Environment count |
/api/v1/agents | GET, DELETE | Agent management |
/api/v1/inspectors | GET | Inspector templates |
/api/v1/launchpoints | GET, POST, PUT, DELETE | Configured inspections |
/api/v1/launchpoints/{id}/run | POST | Trigger inspection |
/api/v1/systems | GET | Discovered systems |
/api/v1/systems/{id}/detail | GET | System detail data |
/api/v1/detections | POST | Query detections |
/api/v1/alerts | GET, POST, PUT, DELETE | Alert rules |
/api/v1/alerts/triggered | GET | Triggered alerts |
/api/v1/metrics | GET, POST, PUT, DELETE | Custom metrics |
/api/v1/timeline | GET | Timeline events |
/api/v1/users | GET | User management |
/api/v1/groups | GET | Group management |
/api/v1/accesskeys | GET, POST, DELETE | API key management |
Newer and enhanced endpoints are available through v2:
| Endpoint | Methods | Description |
|---|---|---|
/api/v2/environments | GET, POST, PUT, DELETE | Enhanced environment management |
/api/v2/environment-groups | GET, POST, PUT, DELETE | Environment grouping |
/api/v2/agents | GET, DELETE | Enhanced agent management |
/api/v2/agents/installer | POST | Dynamic installer generation |
/api/v2/detections | POST | Enhanced detection queries |
/api/v2/metrics | GET, POST, PUT, DELETE | Enhanced metrics |
/api/v2/metrics/evaluate | POST | Metric evaluation |
/api/v2/metrics/evaluate-systems | POST | Per-system metric evaluation |
/api/v2/timelines-query | POST | Enhanced timeline queries |
/api/v2/inventory/identities | GET | Identity profiles |
/api/v2/inventory/devices | GET | Device profiles |
/api/v2/dataprints-evaluate-systemdetailid | POST | JMESPath data extraction |
/api/v2/webhooks | GET, POST, PUT, DELETE | Webhook management |
For GET requests, use page and pageSize query parameters:
GET /api/v1/environments?page=1&pageSize=100
X-ROAR-API-KEY: {api_key}
For POST-based queries (detections, timelines), include a Pagination object in the request body:
{
"Pagination": {
"Page": 1,
"PageSize": 100
},
"conditions": []
}
| Parameter | Type | Default | Max | Description |
|---|---|---|---|---|
page / Page | int | 1 | - | Page number (1-indexed) |
pageSize / PageSize | int | 50 | 2000 | Items per page |
{
"Data": [...],
"TotalRows": 1500,
"HasMoreRows": true,
"CurrentPage": 1,
"TotalPages": 15,
"PageSize": 100
}
async function fetchAllItems(endpoint) {
const allItems = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const response = await fetch(
`https://${instance}.app.liongard.com/api/v1/${endpoint}?page=${page}&pageSize=500`,
{
headers: {
'X-ROAR-API-KEY': process.env.LIONGARD_API_KEY
}
}
);
const data = await response.json();
allItems.push(...data.Data);
hasMore = data.HasMoreRows;
page++;
// Respect rate limits
if (hasMore) {
await sleep(200);
}
}
return allItems;
}
For POST-based endpoints, Liongard supports JSON condition filters:
{
"conditions": [
{
"path": "Status",
"op": "eq",
"value": "Active"
},
{
"path": "Tier",
"op": "eq",
"value": "Premium"
}
]
}
| Operator | Description | Example |
|---|---|---|
eq | Equals | {"op": "eq", "value": "Active"} |
ne | Not equals | {"op": "ne", "value": "Inactive"} |
gt | Greater than | {"op": "gt", "value": 100} |
lt | Less than | {"op": "lt", "value": 50} |
gte | Greater than or equal | {"op": "gte", "value": 10} |
lte | Less than or equal | {"op": "lte", "value": 100} |
contains | String contains | {"op": "contains", "value": "Acme"} |
in | Value in list | {"op": "in", "value": [1, 2, 3]} |
Use fields[] to limit returned fields:
{
"fields": ["ID", "Name", "Status"],
"conditions": []
}
Use orderBy[] to control result ordering:
{
"orderBy": [
{
"path": "Name",
"direction": "asc"
}
]
}
Liongard does not publicly document specific rate limits. A conservative default of 300 requests per minute is recommended to avoid throttling.
async function requestWithRetry(url, options, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = parseInt(response.headers.get('Retry-After')) || 30;
const jitter = Math.random() * 1000;
console.log(`Rate limited. Waiting ${retryAfter}s...`);
await sleep(retryAfter * 1000 + jitter);
continue;
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
} catch (error) {
if (attempt === maxRetries - 1) throw error;
const delay = Math.pow(2, attempt) * 1000 + Math.random() * 1000;
console.log(`Attempt ${attempt + 1} failed. Retrying in ${delay}ms...`);
await sleep(delay);
}
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
| Code | Meaning | Action |
|---|---|---|
| 200 | Success | Process response |
| 201 | Created | Entity created successfully |
| 400 | Bad Request | Check request format/values |
| 401 | Unauthorized | Verify API key |
| 403 | Forbidden | Check permissions |
| 404 | Not Found | Entity doesn't exist |
| 429 | Rate Limited | Implement backoff |
| 500 | Server Error | Retry with backoff |
async function handleLiongardRequest(endpoint, options = {}) {
const baseUrl = `https://${process.env.LIONGARD_INSTANCE}.app.liongard.com/api/v1`;
const response = await fetch(`${baseUrl}/${endpoint}`, {
...options,
headers: {
'X-ROAR-API-KEY': process.env.LIONGARD_API_KEY,
'Content-Type': 'application/json',
...options.headers
}
});
if (!response.ok) {
const error = await response.json().catch(() => ({}));
switch (response.status) {
case 401:
throw new Error('Invalid API key. Check LIONGARD_API_KEY.');
case 403:
throw new Error('Permission denied. Check API key permissions.');
case 404:
throw new Error(`Resource not found: ${endpoint}`);
case 429:
throw new Error('Rate limit exceeded. Implement backoff.');
default:
throw new Error(error.Message || `API error: ${response.status}`);
}
}
return response.json();
}
Environment (ID)
|
+-- Agents (AgentID)
| +-- Installer Generation
|
+-- Launchpoints (LaunchpointID)
| +-- Inspector (InspectorID)
| +-- Schedule (Cron)
| +-- Systems (SystemID)
| +-- System Details
| +-- Dataprints
| +-- Inspections (InspectionID)
|
+-- Detections (DetectionID)
|
+-- Metrics (MetricID)
| +-- Metric Evaluations
|
+-- Timeline Events
|
+-- Asset Inventory
+-- Identities
+-- Device Profiles