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
Readsclient_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 withfind_configurationsand 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,SERVERorUNKNOWN.psa_company_idand the resolvedcompany_name.
returned and truncated, which is true when more devices matched than limit returned.
The company_counts view
- Per company:
workstations,servers,unknownandtotal, 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) andstatus_name(ConnectWise’s company status label;nullon other PSAs). On ConnectWise a label such asClientcan 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 theircompany_nameis empty. A report names these as a caveat.
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, thedevices view names the machines behind it.
How to Use
- Pass
name_containsin thedevicesview 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. Addpsa_company_idto search one company. - Pass
psa_company_idto read one company. Omit it for every company. unmapped_only(devicesview) lists only the devices Neo could not match to a PSA company.include_unmapped(company_countsview, default true) adds the “Unmapped” bucket as a row. The totals include it either way.limit(devicesview, default 1000, maximum 5000) caps the list. Whentruncatedis true, narrow the scope or raiselimit.- State
data_as_ofin a report, and name a largeunmapped_devicescount or a non-zerounknownbucket as a coverage caveat.
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_requesttools. The synced record leaves volatile state out.
