dev.busymate/busymate-devtools

Busymate DevTools

Capture, inspect & debug HTTPS traffic across iOS, Android, browsers & backends — 304 MCP tools.

Endpointhttps://mcp.busymate.dev (streamable-http)
Registry version1.0.481
Now53 tools · grade F (46) · pin ts_6674b4ce095f0667cc0a1a68641bbc83 · protocol 2025-06-18
First / last listed2026-10-27 07:10 UTC / 2026-10-27 07:10 UTC
Grade over time2026-10-27: F (46), 53 tools

Is this your server? Own a server? ToolFit hosted watch re-checks it every 24 h ($0.25 per 30 days) or 6 h ($0.60) and sends you an HMAC-signed webhook when its tools or grade change: POST https://api.youraitools.co/toolfit/v1/watch. To opt out, see About & opt-out.

Timeline

First listing · 2026-10-27 07:10 UTC
53 tools, grade F (46)

Tools: get_product_pricing search_docs read_docs_page list_docs_sections get_setup_steps list_breakpoint_events get_device list_devices get_device_status get_device_health list_device_events list_device_audit_modes test_pac_connection list_screen_share_recordings get_screen_share_recording get_my_account get_device_egress_status get_device_egress_fail_posture get_entry_count list_wipe_jobs get_entry_counts_freshness search_entries list_entries get_entry export_har inspect_requests summarize_device_traffic list_service_groups get_service_group list_tags get_device_settings get_subscription list_invoices get_usage get_block_rules_device list_todos get_todo list_advisor_findings get_advisor_finding share_advisor_finding list_issue_reports list_workspaces get_workspace list_tabs list_snapshots download_snapshot list_push_tokens get_push_response get_stats get_status list_audit_events get_audit_event list_device_service_groups

Current tools (53)

get_product_pricingReturn 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 offers. Public read; no sign-in or account data.
params: none
search_docsSearch the public Busymate DevTools documentation (setup and how-to guides for iPhone/iPad, Android, Mac/Windows/Linux browsers and desktop apps, the dashboard, proxy, bmc CLI, MCP and API) and return the best-matching pages with a snippet and their https://docs.busymate.dev URL. Pass a natural-language question or keywords. Read a full page with read_docs_page and cite its url. Public read; no si
params: query*, limit
read_docs_pageReturn the full markdown of one public Busymate DevTools documentation page with its https://docs.busymate.dev URL. Pass the slug from search_docs or list_docs_sections, e.g. "android/install". Unknown or non-public slugs return an error. Cite the url when you use the content. Public read; no sign-in or account data.
params: slug*
list_docs_sectionsReturn the public Busymate DevTools documentation's table of contents: every section and its pages with title, slug, one-line description and https://docs.busymate.dev URL. Public read; no sign-in or account data.
params: none
get_setup_stepsReturn the official step-by-step guide for setting up devices with Busymate DevTools: account, install, sign in to pair, trust the certificate, start capture and check it works. Pass platform (iphone, ipad, ios, android, mac, windows, linux, desktop, browser, or all) to add that platform's detailed pages. Use it for any 'how do I set up / install / get started / connect my device' question and cit
params: platform
list_breakpoint_eventsList 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 (owner-scoped to the calling account — the same reach the dashboard /breakpoints page gives you), or
params: all, include_resumed, limit
get_deviceGet 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 EVERY spelling: a bare port (10807), the PAC hostname (10807.busymate.net), a full PAC URL (http://10
params: device_uuid, deviceName, pac_port
list_devicesList 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 (read this before concluding anything is absent): every response carries `total` (the EXACT count in
params: all, owner_email, limit, cursor, order, fields, max_bytes
get_device_statusGet 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, diagnostics only). Works even for a device that never wrote a status row (entries-only clients) — `online
params: device_uuid, deviceName
get_device_healthTHE 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 that state was first established, so a stale fact is visibly stale), the CA triple (ca_loaded / ca_k
params: device_uuid, deviceName
list_device_eventsThe 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
params: device_uuid, deviceName, category, action, outcome, reason, host, boot_id, level, producer, process_role, user_id, session_id, install_id, request_id, failures, since, until, before_at, before_id, with_detail, limit
list_device_audit_modesEvery 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 see everything armed right now. YOUR OWN devices by default; devices:view operators see the whole f
params: none
test_pac_connectionPROVE 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, never reported as broken PAC); (2) PAC port + URL — a pool port is allocated and http://<port>.bus
params: device_uuid, deviceName, window_minutes
list_screen_share_recordingsList 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 dashboard), or every visible recording with `all:true` (devices:view operators only; re-verified by t
params: device_uuid, session_id, all, limit
get_screen_share_recordingFetch 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 <video> element / on iPhone). YOUR OWN recording by default; `all:true` (devices:view operators, dispatch-policed) reaches any visible recording. The internal storage_path is never surfaced — the signed URL is
params: id*, with_url, all
get_my_accountYOUR 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 YOU own (uuid/name/model/last_seen_at — the uuids feed get_device / rename_device / …), your Stripe s
params: none
get_device_egress_statusRead 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 destination server sees (that origin is governed by the device's external (upstream) proxy — see set
params: device_uuid, deviceName
get_device_egress_fail_postureRead 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,device}.data and is resolved device→user→service→global by effective_settings_for_device (like the e
params: device_uuid, deviceName
get_entry_countCount entries in a workspace (workspace_id or workspace_slug) with optional device/host/method/status/search filters.
params: workspace_id, workspace_slug, device_uuids, hosts, methods, status_class, search_q, origin, after, before
list_wipe_jobsList 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 ledger; total_exact=false ⇒ an upper bound), deleted, percent, status (queued|running|done|failed|ca
params: workspace_id, workspace_slug, job_id, status, device_uuid, limit
get_entry_counts_freshnessThe 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 from the hourly RECONCILER (a bounded drift check that corrects idle groups); reconcile_stale=true
params: none
search_entriesLOCATE 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 request / ~8KB response) via a trigram index, and a body is indexed ONLY when its side's content-type
params: q*, device_uuid, after, before, order, limit
list_entriesLIST 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 (#819): scope to ONE device (device_uuid/deviceName), an EXACT `host` or a `host_contains` substring
params: device_uuid, deviceName, host, host_contains, method, status, owner_email, owner_user_id, after, before, since_id, order, limit
get_entryGet 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-HOST): when a live feed row, an audit event or another tool hands you an `entry_id` (or a `request_id`)
params: entry_id, request_id, max_body_chars
export_harExport captured entries as a HAR 1.2 log. Optionally scope by device, host, and date range.
params: device_uuid, deviceName, host, since, before, limit
inspect_requestsDeep-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 building repro (curl/fetch). `host` MUST be a full hostname containing a dot (e.g. 'identity.doordash.
params: host*, path_contains, method, status, device_uuid, deviceName, after, before, limit
summarize_device_trafficBOUNDED 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_devices) BEFORE calling. NEVER scans or returns raw rows (use it instead of search_entries/inspect_re
params: device_uuid, deviceName, host, after, before, limit
list_service_groupsList every service group (full rows incl. ssl_proxy_domains) with each group's primary_agent + ordered agents[] from the service_group_agents join.
params: none
get_service_groupGet one service group by id or name.
params: id, name
list_tagsList every tag (id, name, color, patterns).
params: none
get_device_settingsRead settings_device for one device (device_uuid or deviceName).
params: device_uuid, deviceName
get_subscriptionReturn 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, subscriptions:[…] }. Phase 1 is Stripe TEST mode.
params: all_users
list_invoicesList 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 { count, invoices:[…] }.
params: limit, all_users
get_usageReturn 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 billing:view operator may pass `all_users:true` for the fleet. Returns { metric, since, count, total
params: metric, since_days, all_users, user_id
get_block_rules_deviceRead 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, and that device's per-device list. Pass device_uuid or deviceName. A rule shadowed on this device by
params: device_uuid, deviceName
list_todosList 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 match). By DEFAULT hides completed todos (the active worklist); pass include_done:true (or an explicit
params: status, priority, source, tag, include_done, limit
get_todoGet 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 }.
params: id*
list_advisor_findingsBrowse 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 finding title + kind + fingerprint). Newest-first (last_seen_at); keyset-paginate by passing the returned
params: severity, kind, q, limit, before
get_advisor_findingGet 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,status,actor_label,target_kind,target_id,request_id}], deep_link (absolute https://dash.busymate.dev
params: fingerprint*
share_advisor_findingBuild 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&kind&f), advisor_url, markdown, llm_text } — `format` is an emphasis hint (markdown|llm|links) ECHOE
params: fingerprint*, format
list_issue_reportsList 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; re-verified server-side, fail-closed — for a non-operator `all` is rejected, never silently widened
params: all, status, limit
list_workspacesList 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.
params: include_archived, all
get_workspaceGet one workspace by id or slug.
params: id, slug
list_tabsList a workspace's tabs (workspace_id or workspace_slug).
params: workspace_id, workspace_slug
list_snapshotsList snapshot files in the snapshots storage bucket.
params: none
download_snapshotGet a 5-minute signed download URL for a snapshot file (name from list_snapshots).
params: name*
list_push_tokensList 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 rows read `ios`. Optionally scope to one device.
params: device_uuid, deviceName
get_push_responseRead 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) carries the SERVER-RECORDED action-binding + its outcome: { action_kind, params, issued_by, created_a
params: correlation_id*
get_statsReturn 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 describe the sealed 24 h rollup (rollup_sealed_to, rollup_window_hours); entries_1h / entries_24h / reques
params: none
get_statusReturn 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 and adds `buildDrift` (#987: the VPS cannot ask the Edge bundle what build it runs, so its supabase
params: none
list_audit_eventsRead 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:<fn> — #533: the surface is DERIVED at the DB trigger tier by HOW a write ARRIVED — a direct-Postgres write→db (the tamper class, also flagged by is_direct_pg), a device PostgREST write→ios/c
params: all, since, until, surface, status, actor_id, actor_q, action_q, target_q, target_kind, target_id, request_id, direct_only, q, before_at, before_id, asc, limit
get_audit_eventGet 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: a row whose actor isn't YOU returns not-found (found:false) unless you hold audit:view (operators c
params: id*, at
list_device_service_groupsList 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 authz edge (never traffic-derived); it powers "users whose devices are in group X". Gated devices:vie
params: service_group_id, device_uuid, limit

Entries describe changes in tool definitions. They are not statements about a server, its quality or its author. The grade measures how the tool definitions fit model providers (token cost, schema compatibility, confusable names) as scored by the ToolFit engine at the time of the listing. JSON: append .json. Opt-out: how or hello@youraitools.co.