New Your team’s decisions, in one playbook every coding agent works from. Never answer your agent twice

list_device_events

The MULTI-PRODUCER device TELEMETRY event stream (#1160/#1208) — every DECISION and STATE TRANSITION reported about the capture pipeline by the iOS app OR by the PAC/proxy server (public.device_events, 14-day retention, weekly-partitioned). iOS kinds — this list is what the app ACTUALLY emits, co...

SERVERBusymate DevTools SOURCEhttps://mcp.busymate.dev
Low RISK CLASS
Category Read
Parameters 120 required
Recommended Allowedsee the rule below
Registry record Grade F, identity unverified Pull the record →

This record as markdown: /tools/dev-busymate-busymate-devtools/list-device-events.md

What list_device_events does on Busymate DevTools

AI agents call list_device_events to retrieve information from Busymate DevTools without modifying anything. It is typically the context-gathering step in research, monitoring, and reporting workflows, before the agent takes action elsewhere.

ParameterTypeRequiredDescription
host string Exact bare host.
level string Telemetry tier.
limit number Max events (default 50, cap 200).
since string ISO — only events with at >= this.
until string ISO — only events with at <= this.
action string Exact action verb (the dotted kind is category.action, e.g. capture + health).
reason string Exact machine reason slug (e.g. no_ca_key).
boot_id string One process lifetime — pair with seq to walk a single boot's ordered stream.
outcome string Exact outcome (armed|inert|ok|fail|deny|start|stop|decrypted|…).
user_id string auth.users.id (#1160) stamped AT EMIT — 'everything this user did on the device', across an account switch (never re-attributed to the current owner).
category string Exact category, ACROSS ALL PRODUCERS. iOS emits: capture|cert|config|tunnel|app|auth|device|permission|control|applink|mitm|push. PAC/proxy emits: process|net|c
failures boolean true → only outcome ∈ fail|deny|inert (the indexed failure path).

Parameters from the server's own tool schema.

Why list_device_events is rated Low

Even though list_device_events only reads data, uncontrolled read access leaks sensitive information and racks up API costs: an agent caught in a retry loop can make thousands of calls a minute without anyone noticing.

Risk signalsAccepts URL/endpoint input (host) · High parameter count (22 properties) · Bulk/mass operation — affects multiple targets

Questions about list_device_events

What does the list_device_events tool do? +

The MULTI-PRODUCER device TELEMETRY event stream (#1160/#1208) — every DECISION and STATE TRANSITION reported about the capture pipeline by the iOS app OR by the PAC/proxy server (public.device_events, 14-day retention, weekly-partitioned). iOS kinds — this list is what the app ACTUALLY emits, corrected in #1232 after SEVEN of the fifteen declared categories turned out to have zero emit sites and zero rows while this description told operators they existed. BASELINE (always on, no flag): capture.health (armed|inert + why + decrypt counters), cert.state, config.applied / config.fetch, tunnel.lifecycle, app.launch / app.phase, auth.signin / auth.switch / auth.signout / auth.token_refresh, device.pair, permission.vpn_consent / permission.notifications, control.channel / control.recovery, applink.open / applink.replay (query parameter NAMES only, fragment PRESENCE only — never a value), push.received (the RESOLVED action, so the deliberate broadcast+wake double delivery reads as stop-then-noop). AUDIT TIER (opt-in, TTL-expiring): mitm.decision, and it is FAULT-ONLY by design — only no_engine / leaf_mint_failed / ca_untrusted / upstream_failed ever produce a row, so a healthy device emits NONE however long audit mode is armed; the per-host answer for decrypted / out_of_scope / no_sni / pinned lives on entries.payload.mitmDecision under owner-scoped RLS, which is the right home for browsing-shaped data. Plus the server-authored telemetry.rate_clipped / audit_mode.ended breadcrumbs. The iOS app does NOT emit ui.*, net.* or process.* — those three were retired from its vocabulary in #1232 (see the category filter below: net and process are still live, from the PAC/proxy producer). PAC/proxy kinds (#1208): process.lifecycle, push.realtime, config.settings / config.port_allocation / config.port_release / config.pac_serve, capture.entry / capture.flush / capture.drop, net.forward / net.retry / net.dead_letter, tunnel.connect / tunnel.close, mitm.decision / mitm.handshake. Newest-first slim rows { id, at (server receive time), device_uuid, level (baseline|debug), category, action (the dotted kind = category.action), outcome, reason, host, ts (device clock), boot_id, seq, app_build, ios_version, process_role, user_id, session_id, auth_provider, install_id, tenant_id, request_id, producer }. The identity block (#1160) + request_id (#1390) are FIRST-CLASS columns, not buried in detail: process_role (app|tunnel|proxy-server), the user/session/provider/install/tenant the event was emitted under, and request_id — which JOINs public.audit_log.request_id so a device event and its server-side audit consequence link into ONE incident. producer is the PROCESS DISCRIMINATOR, hoisted out of detail into EVERY slim row (no with_detail needed) because the whole isolation contract rests on it: 'proxy-server' for PAC/proxy rows; NULL for legacy rows that carry no producer key at all, and 'ios' where the app stamps one — null is a real fact about the row and is NEVER normalised to 'ios'. iOS-authored rows carry ts/boot_id/seq/app_build/ios_version; PAC/proxy rows leave those five NULL by construction and carry transport / proxy_build / node_version / process_boot_id / producer_seq inside detail. with_detail:true adds the redacted detail jsonb (≤4 KB, redacted at write — parameter NAMES only, never query values/bodies/keys). A gap in (boot_id, seq) = a dropped iOS event; a gap in detail.producer_seq = a dropped proxy event (both detectable at read time even when the drop counter itself was lost). Filters: category / action / outcome / reason / host / boot_id / process_role / user_id / session_id / install_id / request_id (exact), level, producer, failures:true (outcome ∈ fail|deny|inert — the partial-index fast path), since / until (ISO, on at). DEFAULT WINDOW (#1390): with no since and no cursor the read is bounded to the last 48h (so an unfiltered fleet sweep can never time out); the response echoes since_applied + default_window:true — pass an explicit since to reach older telemetry, or a keyset cursor (which is exempt from the default). producer:'ios' means the PROJECTION-ELIGIBLE set — producer IS NULL or 'ios', byte-identical to the device_events_project_health trigger's WHEN clause — so it never hides pre-#1208 rows; any other slug is an exact match, so a FUTURE producer is filterable the day it starts emitting. Producer gating applies ONLY to the iOS-only device_health projection (see get_device_health): the broadcast trigger is unconditional, so device_events:<uuid> and device_events:all carry EVERY producer's row live, and so does this tool when producer is omitted. KEYSET pagination: when a page is full, feed next_cursor's before_at + before_id back verbatim (both together — a bulk insert lands a whole batch on ONE timestamp, so at-only paging would skip batches). ONE device by device_uuid/deviceName (owner-scoped: without devices:view you may read YOUR OWN device), or omit the selector for the FLEET-WIDE stream (devices:view operators only, re-verified server-side). limit default 50, cap 200. It is categorised as a Read tool in the Busymate DevTools MCP Server, which means it retrieves data without modifying state.

What parameters does list_device_events accept? +

list_device_events accepts 12 parameters: host, level, limit, since, until, action, reason, boot_id, outcome, user_id, category, failures. The full parameter table on this page comes from the server's own tool schema.

How do I enforce a policy on list_device_events? +

Register the Busymate DevTools MCP server in PolicyLayer and add a rule for list_device_events: allow, deny, rate-limit, or require approval. Point your MCP client at the PolicyLayer proxy URL and the rule is enforced on every call, before it reaches Busymate DevTools. Nothing to install.

What risk level is list_device_events? +

list_device_events is a Read tool with low risk. Read-only tools are generally safe to allow by default.

Can I rate-limit list_device_events? +

Yes. Add a rate_limit block to the list_device_events rule in your PolicyLayer policy. For example, setting max: 10 and window: 60 limits the tool to 10 calls per minute. Rate limits are tracked per agent session and reset automatically.

How do I block list_device_events completely? +

Set action: deny in the PolicyLayer policy for list_device_events. The AI agent will receive a policy violation error and cannot call the tool. You can also include a reason field to explain why the tool is blocked.

What MCP server provides list_device_events? +

list_device_events is provided by the Busymate DevTools MCP server (https://mcp.busymate.dev). PolicyLayer sits as a proxy in front of this server to enforce policies before tool calls reach the server.

More on Busymate DevTools, and thousands of servers like it.

// THE MCP REGISTRY

PolicyLayer tracks 44,603 MCP servers and 515,000+ tools.

Every server has a live record: who publishes it, whether it answers without auth, its risk grade, every tool classified, the recommended policy. This page is one line of Busymate DevTools's. Pull the full record:

Teams ship this data inside their own products. See what a licence covers →

// GET IN TOUCH

Have a question or want to learn more? Send us a message.

Message sent.

We'll get back to you soon.