> ## Documentation Index
> Fetch the complete documentation index at: https://docs.neoagent.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Synced Device Counts

> Authoritative per-company workstation/server counts from Neo's synced RMM inventory

<Info>
  This is an always-on, read-only tool — every agent has it on both the native tool surface and
  inside the code sandbox (`from neo.client import get_synced_device_counts`). There is nothing to
  enable.
</Info>

## What It Does

Returns authoritative device counts for the current tenant from `client_rmm_devices` — the RMM
inventory Neo already syncs and maps to PSA companies. Because the RMM↔PSA company mapping and the
workstation/server classification are resolved **at sync time**, the numbers are stable and
repeatable across runs.

In a single call the agent gets, scoped to the tenant:

* Per-company counts: `workstations`, `servers`, `unknown`, and `total`, with the PSA company name resolved.
* Tenant-wide totals across all companies.
* The mapped-vs-unmapped split (how many devices Neo could match to a PSA company) — a coverage signal.
* `data_as_of` — the timestamp of the latest device sync.

## Why It Exists

Recurring reporting and reconciliation agents (billing reconciliation, license/seat true-ups, asset
audits) used to re-pull the live RMM and re-match hundreds of company names by hand on every run.
That re-derivation is fragile: the same monthly report could swing between runs purely because the
hand-rolled joins landed differently. This tool removes that work — the agent reads the
already-resolved, already-mapped inventory instead.

## How to Use

Prefer this tool over a live `*_rmm_request` pull whenever you need device **counts** (not live
per-device state):

* Omit `psa_company_id` to get every company; pass it to narrow to one company.
* `include_unmapped` (default true) adds the "Unmapped" bucket as its own row; the mapped/unmapped
  totals are always returned regardless.
* Always state `data_as_of` in the report so readers know how current the figures are, and treat a
  large `unmapped_devices` count or a non-zero `unknown` bucket as a coverage caveat rather than a
  silent omission.

The sandbox helper (`neo.client.get_synced_device_counts`) returns the same data with the same
arguments — use it when you are already assembling the report in Python.

## Notes

* **Read-only** and tenant-scoped — it only reads data Neo has already synced; it never touches the RMM or PSA live.
* Device type is normalized to `workstation` / `server` / `unknown` from each RMM's metadata; devices with no clear type signal fall into `unknown` rather than inflating the workstation total.
* This is the first of a family of authoritative reads over Neo's synced internal data; the same pattern will extend to other synced tables.
