Halo Asset Context
Review an asset in Halo together with the tickets and CMDB/CI relationships around it — entirely read-only. Halo is HaloPSA / HaloITSM (the same product and REST API); assets are called "Devices" in Halo's API vocabulary. Use this to build a full operational picture of a device before acting on it, correlating its history and dependencies.
MCP Server
- Server:
halo-mcp(NetClaw-authored,mcp-servers/halo-mcp/) - Command:
python3 -u mcp-servers/halo-mcp/halo_mcp_server.py(stdio transport) - Auth: OAuth2 client-credentials —
HALO_CLIENT_ID/HALO_CLIENT_SECRETagainstHALO_BASE_URL - Python: 3.10+ · Dependencies:
fastmcp,httpx,python-dotenv - Read/write posture: The whole server is read-only except one gated write (
halo_create_change_request, in the halo-change-request skill). Every tool in this skill is read-only and makes no changes to Halo.
Available Tools
| Tool | Parameters | What It Does |
|---|---|---|
halo_list_assets |
customer?, assettype_id?, search? |
List/search assets ("Devices"), optionally scoped by customer, asset type, or free text |
halo_get_asset |
asset (name / inventory-number / id) |
Read one asset — detail, fields, and ticket counts |
halo_get_asset_tickets |
asset, open_only? |
List the tickets related to an asset — the core context tool |
halo_get_asset_relationships |
asset |
An asset's CMDB/CI hierarchy and relationship context |
halo_list_clients |
search? |
Resolve a Halo Client name to its id (the customer param) |
halo_list_sites |
customer?, search? |
Narrow to a site within a client |
Key Concepts
- Halo == HaloPSA == HaloITSM. Same API for both editions.
- Assets are "Devices."
halo_list_assets/halo_get_assetaccept an asset name, inventory number, or numeric id — you do not need the id up front. - The Halo "Client" is the customer. Scope asset queries to an org with the
customerparam (a client name or id); the server resolves it to aclient_id. In an MSP (HaloPSA) tenant this is essential to avoid crossing client boundaries. - Two context dimensions: tickets (what has gone wrong / changed on this device) via
halo_get_asset_tickets, and relationships (what this device depends on or supports) viahalo_get_asset_relationships. Use both for a complete picture. - Read-only. Nothing here writes to Halo. If the review concludes a change is needed, hand off to halo-change-request.
Workflow
Review an asset and everything around it:
Locate the asset. If you only have a description or partial name, search first:
halo_list_assets(customer="<client>", search="<name/serial/model>")Scope by
customer(the Halo Client) in multi-client tenants to disambiguate.Read the asset detail:
halo_get_asset(asset="<name / inventory number / id>")Note its type, key fields, owning client/site, and ticket counts.
Pull its related tickets (the core step):
halo_get_asset_tickets(asset="<asset>") # all history halo_get_asset_tickets(asset="<asset>", open_only=true) # active issues onlyLook for recurring faults, recent changes, and open work.
Map its CMDB/CI relationships:
halo_get_asset_relationships(asset="<asset>")Understand upstream dependencies and downstream impact before anyone touches it.
Report an asset-context summary: identity, owning client/site, open vs historical tickets, notable recurring issues, and CI dependencies — plus a recommendation (e.g. "raise a change via halo-change-request" or "no action").
Integration with Other Skills
| Skill | Integration |
|---|---|
| gait-session-tracking | Mandatory. Record every asset/ticket/relationship query in the GAIT audit trail |
| halo-change-request | Hand off here when the review concludes a change is warranted — pass the affected asset into the asset param |
| halo-ticket-context | Drill into any individual ticket surfaced by halo_get_asset_tickets for its full action history |
| nautobot-sot / netbox-reconcile | Cross-reference Halo's asset record against the network source of truth; ticket any drift |
| memory | Recall prior findings about the same device across sessions |
Environment Variables
| Variable | Required | Description |
|---|---|---|
HALO_BASE_URL |
Yes | Halo host, e.g. https://<tenant>.halopsa.com |
HALO_CLIENT_ID |
Yes | OAuth2 client-credentials application id |
HALO_CLIENT_SECRET |
Yes | OAuth2 client secret |
HALO_TENANT |
Optional | Tenant identifier |
HALO_SCOPE |
Optional | OAuth2 scope (default all) |
HALO_AUTH_URL |
Optional | Override the auth-server URL for self-hosted layouts |
HALO_VERIFY_SSL |
Optional | true/false TLS verification (default true) |
HALO_TIMEOUT |
Optional | Per-request timeout in seconds (default 30) |
HALO_PAGE_SIZE / HALO_MAX_PAGES |
Optional | Pagination tuning (defaults 50 / 20) |
HALO_RATE_LIMIT |
Optional | Requests/minute cap (0 = disabled) |
Important Rules
- Read-only skill. None of these tools change Halo. The only write in the entire
halo-mcpserver ishalo_create_change_request(halo-change-request skill). - Scope by the Halo Client. Pass the customer org via the
customerparam to keep queries inside client boundaries — critical in MSP (HaloPSA) tenants. - Assets resolve by name, inventory number, or id — no need to look up the numeric id first.
- Halo == HaloPSA == HaloITSM — identical behavior for both editions.
- GAIT logging is mandatory for all queries.
- Escalate, don't mutate. If the context implies a change, route it through halo-change-request (preview -> confirm -> submit); never try to write from this skill.