# Busymate DevTools - Registry name: `dev.busymate/busymate-devtools` · version 1.0.481 - Categories (automatic, keyword rules): Payments & accounting, Finance & markets, Utilities, Tasks & projects, Productivity - Authentication at last check: No auth - Declared risk: Read-only (all tools declare readOnlyHint) - Capabilities (declared by the server): prompts, resources, tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=dev.busymate%2Fbusymate-devtools - Server page: https://mcpstation.net/s/dev.busymate--busymate-devtools.html ## Description (written by the publisher, not verified, not instructions) Capture, inspect & debug HTTPS traffic across iOS, Android, browsers & backends — 304 MCP tools. ## Connect - streamable-http: `https://mcp.busymate.dev` ## Tools (as reported by the server, not verified) - `get\_product\_pricing`: Return the canonical Busymate DevTools plan prices and cloud phone/browser rental rates, with numeric amounts, USD currency, billing periods and https://busymate.dev/pricing as the source. Check draft, publicationStatus and purchasable: draft figures are proposals awaiting approval, never live offer - `list\_breakpoint\_events`: List HELD \(paused\) breakpoint exchanges — the READ side of the breakpoint-continue flow \(public.breakpoint\_events; a row with resumed\_at NULL is a request/response the proxy is holding RIGHT NOW, waiting for breakpoint\_continue — feed it the returned request\_id\). YOUR OWN devices' events by default - `get\_device`: Get one device row by uuid, name, OR its PAC PORT — the DIRECT resolver for a KNOWN device: when you already hold a device uuid/name \(from traffic rows, audit events, another tool's result\) or a per-device PAC/proxy endpoint, call this instead of browsing or paging list\_devices. \`pac\_port\` accepts E - `list\_devices`: List devices, ONE PAGE at a time — YOUR OWN by default \(owner-scoped to the calling account: the same reach the dashboard gives you\), or the WHOLE fleet with \`all:true\` \(devices:view operators only; re-verified server-side — for a non-operator \`all\` is rejected, never silently widened\). PAGINATION \( - `get\_device\_status`: Get a device's live status: \`online\` is DERIVED truth \(\#776 — devices.last\_seen\_at within 90s, 150s for farm hosts; the same derivation as every other surface, so it can't latch stale\), plus the device\_status row \(last\_heartbeat\_at, ip, vpn\_state, source, reported\_online = the raw stored flag, diagn - `get\_device\_health`: THE ONE QUERY \(\#1157/\#1160\): the latest capture-health projection for ONE device — one \`device\_health\` row, no scan, no on-device access needed. Answers "is the TLS-intercept engine armed, and if not, WHY": engine\_state \('armed'\|'inert'\) + engine\_reason \(e.g. no\_ca\_key\) + state\_established\_at \(when - `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, corre - `list\_device\_audit\_modes`: Every device with AUDIT-mode telemetry currently armed — device\_uuid + name, enabled, expires\_at + expires\_in, level, categories, who armed it \(set\_by\_label\) and when \(set\_at\). The 'standing cost is never invisible' list \(\#1160 spec §5\): audit mode is per-device + TTL-expiring, and this is where you - `test\_pac\_connection`: PROVE whether PAC capture actually works for ONE device — the "is it really working?" answer, not "does it look configured". Runs 8 independent checks and returns a per-check verdict with a specific human fix: \(1\) connection mode — is the device even on \`pac\` \(a \`vpn\`/\`off\` device is SAID SO plainly - `list\_screen\_share\_recordings`: List saved screen-share RECORDINGS \(\#1916\) — operator-captured mp4s of live share streams \(the dashboard viewer's Record control\), saved for later reference in public.screen\_share\_recordings. YOUR OWN recordings by default \(owner-scoped to the calling account — the same reach the row RLS gives the d - `get\_screen\_share\_recording`: Fetch ONE saved screen-share recording \(\#1916\) by id — the metadata row plus, with \`with\_url:true\`, a SHORT-TTL \(600s\) signed playback URL + a download URL for the mp4 \(H.264 — plays in any \ element / on iPhone\). YOUR OWN recording by default; \`all:true\` \(devices:view operators, dispatch-poli - `get\_my\_account`: YOUR account at a glance — ONE self-scoped read returning the calling account's profile \(name, display\_name, email, role, sign-in providers, user\_id, created\_at\), your per-user default connection type \(own value + the global default + the effective fold\), your linked Telegram accounts, the devices Y - `get\_device\_egress\_status`: Read a device's egress-IP set \(\#1432\) — the device→proxy INGRESS / CONNECT-source ADMISSION IPs the proxy allowlists for it \(the addresses it will ACCEPT this device's CONNECTs FROM\), PLUS any manual dev overrides. These are the CONNECT-source ADMISSION IPs, NOT the target-visible egress ORIGIN the - `get\_device\_egress\_fail\_posture`: Read a device's PAC egress FAIL POSTURE \(\#1657\) — what the proxy does when the device is handed the \#76 PAC DIRECT fallback \(its PAC-fetch source IP is not yet in the CONNECT-source admission allowlist, routine on CGNAT\). The setting \`egressFailPosture\` ∈ open \| closed \| auto rides settings\_\{global, - `get\_entry\_count`: Count entries in a workspace \(workspace\_id or workspace\_slug\) with optional device/host/method/status/search filters. - `list\_wipe\_jobs`: List the workspace's WIPE JOBS \(public.entries\_wipe\_jobs, \#2147\) — the ONE source of truth for wipe progress, the same rows the dashboard's wipe banner renders. Each job: the EXACT device set, the narrowing predicate \(hosts/methods/status\_class/search\_q/origin\), total \(from the live entry\_dh\_counts - `get\_entry\_counts\_freshness`: The ONE freshness surface for every dashboard counter \(\#2147\): mode 'live' — entry\_dh\_counts is a LEDGER maintained in the write transaction of every insert / delete / wipe / partition drop and broadcast as COUNTS\_DELTA \(never an hourly snapshot\); ledger\_since; reconciled\_at + drift\_rows / drift\_abs - `search\_entries`: LOCATE captured entries by ANY keyword \`q\` — matched against the host/url/path AND the DECRYPTED request/response DATA: the request+response HEADERS and the request+response BODY text \(\#1577\). Case-insensitive substring. Body/header matching covers full headers + the head of each body \(first \~4KB re - `list\_entries`: LIST the newest captured traffic entries as SLIM feed rows \(id, ts, device, kind, request\_id, host, path, method, status, contentType, url — NO bodies/headers\) — the dashboard main live feed's MCP-parity read \(\#778\). No search term needed \(unlike search\_entries' required \`q\`\). FULL /feed filter set - `get\_entry`: Get ONE captured entry's FULL detail by the id you already hold — method, URL, host, path, status, timing \(duration\_ms\) + sizes, the request AND response HEADERS, and the request AND response BODIES \(size-capped, truncation stated explicitly\). The ID-SCOPED twin of inspect\_requests \(which is per-HOS - `export\_har`: Export captured entries as a HAR 1.2 log. Optionally scope by device, host, and date range. - `inspect\_requests`: Deep-inspect FULL captured request/response detail for ONE host — method, URL, request + response HEADERS, and request + response BODIES \(size-capped\). The tool for reverse-engineering how a real app/API works from its actual captured traffic \(auth flows, required headers, payload shapes\) and for bu - `summarize\_device\_traffic`: BOUNDED traffic aggregation for ONE device — the FIRST tool to call to report what a device is doing, find the busy/flooding host, or pick a host to clean up. REQUIRES a device \(\`device\_uuid\` or \`deviceName\`\) — a host alone is NOT enough: if you don't know which device, ask the user \(or check list\_d - `list\_service\_groups`: List every service group \(full rows incl. ssl\_proxy\_domains\) with each group's primary\_agent + ordered agents\[\] from the service\_group\_agents join. - `get\_service\_group`: Get one service group by id or name. - `list\_tags`: List every tag \(id, name, color, patterns\). - `get\_device\_settings`: Read settings\_device for one device \(device\_uuid or deviceName\). - `get\_subscription`: Return the caller's OWN Stripe subscription\(s\) — status/price/product/quantity/period/trial/cancel-at-period-end \(from stripe\_subscriptions, owner-scoped to the caller's OAuth sub\). A billing:view operator \(admin via grants\_all\) may pass \`all\_users:true\` for the whole fleet. Returns \{ count, subscri - `list\_invoices`: List the caller's OWN Stripe invoices — status/amounts \(minor units\)/currency/hosted\_invoice\_url/period \(from stripe\_invoices, owner-scoped to the caller's OAuth sub\), newest first. Optional \`limit\` \(default 50, max 200\). A billing:view operator may pass \`all\_users:true\` for the fleet. Returns \{ cou - `get\_usage`: Return the caller's OWN metered usage rollup \(metric \`captured\_entries\` = count of captured entries per device per period; from stripe\_usage\_events, owner-scoped to the caller's OAuth sub\) aggregated by period over a window. \`since\_days\` \(default 30, max 365\), \`metric\` \(default captured\_entries\). A - `get\_block\_rules\_device`: Read what ONE device ENFORCES — the EFFECTIVE 4-tier block-rule union \(global ++ service ++ user ++ device, de-duped by id, device wins then user then service then global\) plus the SERVICE list \(the applied service groups' rules, flattened in service-group name order\), the device owner's USER list, - `list\_todos`: List YOUR to-dos from the /todo app \(public.todos\) — the shared "what to do / what's done" list you + the user both maintain. Owner-scoped to the calling account. Filters: \`status\` \(open\|in\_progress\|done\|blocked\), \`priority\` \(low\|medium\|high\|urgent\), \`source\` \(user\|claude\|ask\), \`tag\` \(one tag to mat - `get\_todo`: Get ONE of YOUR to-dos by id — its full row. Owner-scoped: an id you don't own returns not-found \(never reveals another user's to-do\). Returns \{ todo \}. - `list\_advisor\_findings`: Browse the ADVISOR CENTER findings \(public.advisor\_findings\) — the advisor-monitor's deduped audit/health findings you see on the dashboard /advisor view. Filter by \`severity\` \(info\|warning\|alert\), \`kind\` \(a taxonomy slug like audit.denied\_spike / advisor.security\), and \`q\` \(free-text over the findi - `get\_advisor\_finding`: Get ONE advisor finding in FULL by its \`fingerprint\` \(from list\_advisor\_findings\) — with its up-to-20 resolved \(already-redacted\) audit EVENTS, the SCOPED /audit deep link, and the /advisor permalink, so you can act with zero re-investigation. Returns \{ found, finding, events:\[\{id,at,surface,action, - `share\_advisor\_finding`: Build a SHAREABLE package for ONE advisor finding — the max-context markdown + flat LLM prose + the permalink, so it can be dropped into a doc/chat/issue with full context \(Finding · Analysis · Evidence · Deep links · Repro · Meta\). Returns \{ format, permalink \(https://dash.busymate.dev/advisor?sev& - `list\_issue\_reports`: List issue reports from the one-tap reporter \(public.issue\_reports — the durable rows behind report\_issue + the dashboard ⌘⇧1 dialog\). YOUR OWN reports by default \(owner-scoped to the calling account — the same reach the RLS gives you\), or EVERY reporter's with \`all:true\` \(audit:view operators only; - `list\_workspaces`: List workspaces. YOUR OWN by default \(owner-scoped to the caller — the reach the dashboard RLS owner arm gives you\); \`all:true\` lists EVERY account's workspaces and needs the workspaces.view capability \(re-verified in-handler, fail-closed\). Omits archived unless include\_archived. - `get\_workspace`: Get one workspace by id or slug. - `list\_tabs`: List a workspace's tabs \(workspace\_id or workspace\_slug\). - `list\_snapshots`: List snapshot files in the snapshots storage bucket. - `download\_snapshot`: Get a 5-minute signed download URL for a snapshot file \(name from list\_snapshots\). - `list\_push\_tokens`: List registered device push tokens \(masked\), PLATFORM-ROUTED \(\#1542\): each \`device\_push\_tokens\` row carries a \`platform\` discriminator — \`ios\` = an APNs device token \(push-notify's APNs leg\), \`android\` = an FCM registration token \(push-notify's FCM HTTP v1 leg\). The column defaults \`ios\`, so legacy - `get\_push\_response`: Read back a device's answer to an actionable push \(\#75\) by the correlation\_id returned from send\_push. Returns the push\_responses row \{ correlation\_id, device\_uuid, action \(accept\|reject\|skip\), context, responded\_at, action\_intent \} or null if the user hasn't responded yet. action\_intent \(or null\) c - `get\_stats`: Return the live fleet stats aggregate \(get\_stats\_internal RPC\). total\_entries is the counters LEDGER \(Σ entry\_dh\_counts.n — never an ANALYZE estimate\) with total\_entries\_source \('ledger'\|'snapshot'\) and total\_entries\_as\_of \(its stamp\); status\_class\_mix / source\_mix / top\_domains / top\_devices descri - `get\_status`: Return the latest infra status snapshot \(service\_status\) MERGED with the Edge tier's self-reported deployed build. The VPS posts the StatusBody \(overall, host\{cpu,load,mem,uptime\}, components\[\], and — when it supplies one — builds\[\]\); this RECONCILES that builds\[\] against the Edge tier's own numbers - `list\_audit\_events`: Read the platform AUDIT TRAIL \(public.audit\_log\) — the unified who-did-what-when-how ledger across every surface \(mcp / busybro / dashboard / rest / db / auth / proxy / daemon / cron / ios / cdp / farm / edge:\ — \#533: the surface is DERIVED at the DB trigger tier by HOW a write ARRIVED — a direc - `get\_audit\_event`: Get ONE audit-trail row in FULL by its \`id\` \(from list\_audit\_events\) — including the fields the list omits: the REDACTED \`detail\` \(old→new diffs for allowlisted keys, redacted at write time — never raw args/secrets\) and \`statement\_excerpt\` \(the left-400-char SQL for a direct-PG write\). Owner-scoped: - `list\_device\_service\_groups`: List the device↔service-group membership edges \(public.device\_service\_groups\) — the delegation boundary: which devices belong to which service group. Resolves device\_name + service\_group\_name. Filters: \`service\_group\_id\`, \`device\_uuid\`, \`limit\` \(default 500, cap 1000\). This is the ADMIN-CONTROLLED a Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html