Before you begin
For the dashboard, sign in to the intended workspace and select an available Meta ad account. For MCP, connect a Read or Write workspace key with an active grant covering the inventory tools. The issuer must still have the required workspace role. Both tools requireaccount_id: the internal Plainrouter account ID, not Meta’s external act_… identifier. The account must be available to the authorized workspace. An older account-bound key can name only its bound account. Retained data may remain readable for a disconnected account; that does not authorize live provider operations or revive revoked credentials.
Browse Campaigns
- Open Campaigns and select the intended account.
- Check the connection indicator, structure-sync time, metrics-sync time and any last-read issue.
- Expand a campaign to inspect its ad sets and ads. Use Load more campaigns and the child load-more control when available; the first visible page is not the complete inventory.
- Inspect object status and any undo warning before deciding what needs attention.
Read objects with MCP
Callget_account_inventory with tool arguments such as:
account, sync, staleness, objects and next_cursor. Verify the returned account first.
When
next_cursor is non-null, repeat the same request with that value as after_id. Stop when it is null. Keep filters unchanged between pages. An object’s internal id is not its external Meta external_id.
Objects include configured/effective status, hierarchy, available budget fields, sync timestamps and related Plainrouter receipt fields. Budget fields ending in _minor use integer currency minor units; unavailable values remain null.
Read retained metrics and changes
Callget_inventory_metrics:
campaign_id, adset_id and ad_id filters use external Meta IDs. Dates use YYYY-MM-DD; the end cannot precede the start.
The response contains metrics, changes, effective_range, account details and freshness. Daily rows include currency, spend, impressions, clicks, inline link clicks, Meta action data and fetch time. Spend is a decimal string in the account currency; do not interpret it as an integer minor-unit budget field.
Date bounds are inclusive in the account timezone, with UTC as the fallback. Plainrouter clips the requested range to the workspace’s customer-visible retention cutoff and today. Inspect effective_range rather than assuming the full request was returned. If no range remains, it is null and both arrays are empty. changes is populated only when include_changes is true; it records observed field changes, not a complete causal audit of every Meta edit.
These are stored Meta-reported metrics, separate from Signals reconciliation. They do not establish attribution accuracy, causal lift or admissible quantitative proposal evidence by themselves.
What do freshness and undo warnings mean?
Follow Inbox and current disposition and Audit before retrying uncertain or failed recovery. Reading this inventory never performs an undo.
Troubleshoot access and incomplete results
- Account not found or outside key binding: check the internal account ID, workspace access and older key binding. Trying another workspace’s ID cannot widen access.
- Missing tool or insufficient scope: inspect discovery and the active grant; replace a credential with the intended permitted scope if necessary. Read-only inventory does not require the separate Write-only Actions record-read grant.
- Only some objects appear: follow
next_cursor; remove unintended status/parent filters and check freshness. - Dates return less history: inspect
effective_rangeand the workspace retention limit. Empty retained results are not proof of zero provider activity.