Skip to main content
This is an always-on, read-only tool. Every agent has it, on the native tool surface and inside the code sandbox (from neo.client import list_synced_devices, get_synced_device_counts). There is nothing to enable.

What It Does

Reads client_rmm_devices, the RMM inventory Neo already syncs from every connected RMM and maps to PSA companies. Neo resolves the RMM-to-PSA company mapping and the workstation/server type at sync time, and data_as_of says when that sync ran. The agent picks one of two views per call: Both views return data_as_of, the time of the latest device sync.

The devices view

For each device:
  • rmm_device_id: the RMM’s device ID, which works with find_configurations and the RMM tools.
  • rmm_vendor: the RMM the device came from. Device IDs are per-vendor, so a tenant with several RMMs needs this before it sends an ID to one vendor’s API.
  • name: the device hostname as synced.
  • device_type: WORKSTATION, SERVER or UNKNOWN.
  • psa_company_id and the resolved company_name.
Plus returned and truncated, which is true when more devices matched than limit returned.

The company_counts view

  • Per company: workstations, servers, unknown and total, with the PSA company name.
  • Per company, the PSA account status and type: is_active, account_types (for example ["Client"] on ConnectWise, ["Customer"] on Autotask and ServiceNow) and status_name (ConnectWise’s company status label; null on other PSAs). On ConnectWise a label such as Client can be a company type, a company status, or both, so a report filters on the one the MSP means and says which.
  • Totals for the whole tenant.
  • The mapped and unmapped split: how many devices Neo matched to a PSA company.
  • unresolved_companies: companies mapped to a PSA company ID whose PSA record did not resolve, so their company_name is empty. A report names these as a caveat.
On a row for a mapped company whose PSA record resolved, the company name is the PSA account name, resolved through Neo’s company hub and never an RMM-side label, and the row carries the PSA account status and type. So the agent answers a “clients only” or “active only” report from this view without a live RMM pull. The Unmapped row and the unresolved companies have no name, status or type; a report names them as caveats.

Why It Exists

Reporting and reconciliation agents (billing reconciliation, seat true-ups, asset audits) used to pull the live RMM and match hundreds of company names by hand on every run, and the same monthly report could change between runs. This tool gives them the inventory Neo has already mapped. When a count looks wrong, the devices view names the machines behind it.

How to Use

  • Pass name_contains in the devices view to find a device by hostname. It is a case-insensitive substring match that runs server-side, so the agent gets only the matching devices. Add psa_company_id to search one company.
  • Pass psa_company_id to read one company. Omit it for every company.
  • unmapped_only (devices view) lists only the devices Neo could not match to a PSA company.
  • include_unmapped (company_counts view, default true) adds the “Unmapped” bucket as a row. The totals include it either way.
  • limit (devices view, default 1000, maximum 5000) caps the list. When truncated is true, narrow the scope or raise limit.
  • State data_as_of in a report, and name a large unmapped_devices count or a non-zero unknown bucket as a coverage caveat.
The sandbox helpers return the same data with the same arguments: neo.client.list_synced_devices for the devices view and neo.client.get_synced_device_counts for the company_counts view. Use them when the agent builds the report in Python.

Notes

  • Read-only and tenant-scoped. It reads only data Neo has already synced, and never calls the RMM or PSA.
  • Device type comes from each RMM’s metadata. A device with no clear type signal counts as unknown, so it does not add to the workstation total.
  • For live device state (online or offline, last check-in, patch or antivirus status), use the live *_rmm_request tools. The synced record leaves volatile state out.