Tool reference

All 183 tools, grouped by what they do — reads, device control, entries, scripting, settings, and more.

Every tool the Busymate MCP server exposes, grouped by what it does. There are 188 tools in total — a one-to-one mirror of the dashboard's read/write surface.

How to read this page

Each tool carries permission gating, enforced server-side on every call:

  • section:view / section:edit — a capability check against your RBAC role. You need the named capability (e.g. devices:edit) for the call to run. Built-in admin grants all; built-in viewer is read-only.
  • confirm-gated — a destructive action that requires an explicit confirm: true (or confirm: "all") argument. The agent must opt in deliberately; a stray call is rejected.
  • admin-only — restricted to admin roles regardless of capabilities.

Tools are scoped to your account and RLS — you only ever see and touch your own devices, entries, and settings.


Generic CRUD — db_* (5)

Low-level PostgREST access to allowlisted tables. The section gate is per-table: each table maps to a capability section, and db_select/db_rpc need view, the mutators need edit. Update and delete reject empty filters.

ToolWhat it doesGating
db_selectGeneric select against an allowlisted table (columns, filters, order, limit, offset).per-table :view
db_insertGeneric insert / upsert (with onConflict).per-table :edit
db_updateGeneric update; empty filters rejected.per-table :edit
db_deleteGeneric delete; empty filters rejected.per-table :edit
db_rpcCall an allowlisted Postgres function.per-table :view

Realtime & introspection (2)

ToolWhat it doesGating
realtime_broadcastSend a Broadcast message on a Realtime channel (the same fan-out the dashboard uses).global:edit
list_tablesList the tables / RPCs available to the generic CRUD tools.global:view

Device reads (3)

ToolWhat it doesGating
list_devicesList every paired device with metadata.devices:view
get_deviceFetch one device by uuid or name.devices:view
get_device_statusLive status / heartbeat for a device.devices:view

Device realtime control (8)

Control flows delivered over Realtime to a paired device. The destructive ones are confirm-gated.

ToolWhat it doesGating
rename_deviceRename a device.devices:edit
delete_deviceDelete a device record.devices:edit · confirm-gated
unpair_deviceUnpair / revoke a device.devices:edit · confirm-gated
vpn_on_deviceTurn the on-device VPN tunnel on.devices:edit
vpn_off_deviceTurn the on-device VPN tunnel off.devices:edit
open_sheet_deviceRemotely open the iOS app's settings / cert / pac sheet (foreground only).devices:edit
set_device_connection_typeSet a device's connection type (e.g. VPN vs PAC).devices:edit
set_live_activity_messageSet or clear the per-device Live Activity lock-screen pill text.devices:edit

External / upstream proxy control (2)

Route a device's egress through an upstream proxy so its public IP and country become the proxy's.

ToolWhat it doesGating
list_proxiesList available proxies from the MyPrivateProxy pool (filter by country / free-text). Credentials never returned.devices:view
set_device_external_proxySet or clear a device's upstream proxy — by country (auto-select a healthy proxy) or explicit host+port.devices:edit · confirm-gated

Remote browser / CDP control (7)

Drive a real Chrome that a bmc (cdp-connector) device controls. Every command needs the per-device remote-control opt-in to be ON; the raw escape hatch is admin-only.

ToolWhat it doesGating
set_device_cdp_controlTurn the per-device remote-browser opt-in on / off (off by default).devices:edit
browser_targetsList the open browser targets / tabs the device controls.devices:edit
browser_openOpen a URL in the controlled Chrome.devices:edit
browser_evalEvaluate JavaScript in a target (resolves {{VAR}} env refs server-side).devices:edit
browser_screenshotCapture a screenshot of a target.devices:edit
browser_snapshotCapture an accessibility / DOM snapshot of the page.devices:edit
browser_cdpSend a raw Chrome DevTools Protocol command (arbitrary-code power).devices:edit · admin-only

Named CDP device daemon (5)

Lifecycle of named CDP "devices" (Chrome instances on a bmc machine), plus hot-updating the daemon itself. The mutators are confirm-gated.

ToolWhat it doesGating
list_cdp_instancesList the named CDP instances a machine runs.devices:view
start_deviceStart a named CDP device.devices:edit · confirm-gated
stop_deviceStop a named CDP device.devices:edit · confirm-gated
create_deviceProvision a new named CDP device (fresh port + profile, pairs its JWT).devices:edit · confirm-gated
update_cdp_hostHot-update the bmc daemon on a machine to the latest build and recycle its supervisor — running captures keep capturing (re-adopted), remote control is briefly unavailable while it reconnects.devices:edit · confirm-gated

Custom browser profiles (4)

CRUD over the browser_profiles table of custom Chromium-family launch profiles authored in the dashboard (Settings → CDP) and synced to the bmc CLI. The five built-ins (chrome / brave / edge / godbrowser / chromium) live in the CLI code — they're reserved slugs and never appear here.

ToolWhat it doesGating
list_browser_profilesList custom browser profiles (slug, display name, binaries, default flags, flag catalog, CDP notes).devices:view
get_browser_profileGet one custom profile by slug or id — full detail.devices:view
upsert_browser_profileCreate or update a custom profile (matched by slug); reserved built-in slugs are rejected.devices:edit · confirm-gated
delete_browser_profileDelete a custom profile by slug or id.devices:edit · confirm-gated

Entries (9)

Read, tag, search, and inspect captured request / response pairs. summarize_device_traffic is the one to reach for first on a busy device — a bounded, index-only profile of which hosts/endpoints dominate, without scanning raw rows. inspect_requests is the deep one — full headers and bodies for reverse-engineering an API. delete_entries is the precise, targeted counterpart to the whole-device wipe_entries.

ToolWhat it doesGating
search_entriesSearch captured entries (host, status, method, date).devices:view
get_entry_countCount entries matching a filter.devices:view
summarize_device_trafficBounded, index-only traffic profile for ONE device — top hosts by request count, or (with host) the top path-bases on that host with per-path count + last-seen. Never scans or returns raw rows; fast on 17k+ rows. The first tool to call to find the busy/flooding host.devices:view
inspect_requestsDeep-inspect FULL request + response headers and bodies for ONE host (requires a full hostname with a dot).devices:view
export_harExport matching entries as a HAR 1.2 log (scope by device / host / date).devices:view
tag_entryAdd a tag to an entry.tags:edit
untag_entryRemove a tag from an entry.tags:edit
wipe_entriesDelete captured entries (per-device, or every device with all: true). Requires confirm: true (irreversible).devices:edit
delete_entriesTargeted filter-then-delete on ONE device (host / path_contains / method / time range; at least one filter required). Optional keep_latest_n keeps the N newest matching rows and deletes the rest — trim a flooding endpoint while keeping recent samples. Destructive + irreversible.devices:edit + admin + confirm

inspect_requests and export_har return real captured headers and bodies — treat any tokens, cookies, or credentials in them as secrets.

Service groups (5)

A service group can link one or more BusyBro specialist agents from the busybro_agents registry, with exactly one primary (the service's lens + default run_task target) and an explicit order. list_service_groups / get_service_group return each group's primary_agent plus its ordered agents[].

ToolWhat it doesGating
list_service_groupsList service groups, each with its primary_agent + ordered linked agents[].services:view
get_service_groupFetch one service group, with its primary_agent + ordered linked agents[].services:view
upsert_service_groupCreate or update a service group.services:edit
delete_service_groupDelete a service group.services:edit
set_service_group_agentsFull-replace the agents linked to a group: pass the complete desired [{agent_id, is_primary?, position?}] set (exactly one primary; an empty set clears all links).services:edit + confirm

The legacy service_groups.ai_agent jsonb (the old single inline {enabled, name, instructions} per-service agent) and the deprecated service_groups.agent_id FK have been dropped — link agents with set_service_group_agents instead (the service_group_agents join is the single source of truth). upsert_service_group still accepts an ai_agent arg for back-compat but ignores it.

Tags (3)

ToolWhat it doesGating
list_tagsList defined tags.tags:view
upsert_tagCreate or update a tag.tags:edit
delete_tagDelete a tag.tags:edit

Settings & environment (14)

Effective settings (global / per-user / per-service / per-device), environment variables, connection types, and breakpoint patterns. Env values are masked on read and never echoed on write; reference them later as {{KEY}} in resend_request and browser_eval. The env tools gate dynamically by scopeglobal checks global:*, device checks devices:*.

ToolWhat it doesGating
get_global_settingsRead settings_global.data.global:view
get_device_settingsRead a device's settings row.devices:view
set_device_settingsPatch a device's settings_device.data.devices:edit
clear_device_settingsDelete a per-device override row.devices:edit
get_envList env vars for a scope (values masked).global / devices:view by scope
set_env_varSet one env var (value never echoed).global / devices:edit by scope
delete_env_varRemove one env var from a scope.global / devices:edit by scope
import_envBulk-import vars from .env text (merge or replace).global / devices:edit by scope
set_breakpoint_patterns_globalSet the global breakpoint patterns per direction — requestPatterns (outbound) / responsePatterns (inbound); patterns is a legacy alias for the request direction.global:edit
set_breakpoint_patterns_deviceSet a device's breakpoint patterns per direction — requestPatterns / responsePatterns; patterns is a legacy alias for the request direction.devices:edit
set_breakpoint_patterns_userSet a USER's breakpoint patterns per direction (the middle tier global → user → device). Effective per device = global ++ user ++ device.users:edit · confirm-gated
set_breakpoint_patterns_serviceSet a SERVICE GROUP's breakpoint patterns per direction (the SERVICE tier global → user → service → device); applies to every device that has applied the group. Effective per device = global ++ service ++ user ++ device.services:edit · confirm-gated
set_global_connection_typeSet the global default connection type.global:edit
set_user_connection_typeSet the per-user connection type.users:edit

Control flows (2)

Realtime control directed at the proxy-server / device handling a paused request.

ToolWhat it doesGating
resend_requestReplay a captured request (resolves {{VAR}} env refs server-side).devices:edit · confirm-gated
breakpoint_continueRelease a request paused at a breakpoint.devices:edit · confirm-gated

Pauses (1)

ToolWhat it doesGating
set_paused_domainsRead (omit domains) or replace the global paused-domains list.pauses:view / pauses:edit

Block rules (5)

Auto-block requests matching a method + host/path wildcard, before they reach upstream. The rule action is one of three variants: block returns a synthetic error response (status default 403, body, contentType); drop tears the connection down; mock returns a synthetic SUCCESS response (status default 200, optional string→string headers map, body, contentType). Stored in settings_{global,device}.data.blockRules; effective per device = global ++ device (de-duped by id).

Each rule also accepts an optional maxRuns integer — a run-count cap. Omit it (or pass a non-positive value) for unlimited (the default); maxRuns: 1 makes the rule fire once then auto-disable. The cap is set at creation right here on the rule object and applies to any action type. The count is tracked per device and persisted (it survives reconnect/restart — "once ever"), and a global rule that hits its cap is suppressed only on the device that reached it, never fleet-wide. See Block rules for the full semantics.

Example mock rule (force a JSON 200):

json
{ "id": "33333333-3333-3333-3333-333333333333", "enabled": true, "method": "GET",
  "pattern": "api.doordash.com/v3/feature_flags",
  "action": { "type": "mock", "status": 200, "headers": { "x-mocked-by": "busymate" },
    "contentType": "application/json", "body": "{\"flags\":{\"new_ui\":true}}" } }

Example one-shot mock rule (maxRuns: 1 — fire a single synthetic 401 to force a token refresh, then auto-disable):

json
{ "id": "44444444-4444-4444-4444-444444444444", "enabled": true, "method": "GET",
  "pattern": "api.example.com/v1/me",
  "action": { "type": "mock", "status": 401, "contentType": "application/json",
    "body": "{\"error\":\"token_expired\"}" },
  "maxRuns": 1 }
ToolWhat it doesGating
get_block_rulesRead the global block rules and (with device_uuid/deviceName) the owner USER's rules + that device's per-device rules + the effective 3-tier union (global ++ user ++ device).global:view
set_block_rules_globalReplace the global block rules (full list, each rule may carry maxRuns); merged into settings_global.data without clobbering other keys.global:edit
set_block_rules_userReplace a USER's block rules (the middle tier); additive (effective = global ++ user ++ device). A {type:'script'} action stays privilege-gated (scripts:edit + admin + confirm).users:edit · confirm-gated
set_block_rules_serviceReplace a SERVICE GROUP's block rules (the SERVICE tier); applies to every device that has applied the group. Additive (effective = global ++ service ++ user ++ device, device wins then user then service then global). A {type:'script'} action stays privilege-gated (scripts:edit + admin + confirm).services:edit · confirm-gated
set_block_rules_deviceReplace a device's per-device block rules (full list, each rule may carry maxRuns); additive on top of the global ++ user lists.devices:edit

Scripting engine (6)

Scripts are sandboxed JavaScript hooks (onRequest / onResponse) the proxy-server, cdp-connector, and iOS VPN run inline to mutate or synthesize matching requests/responses — the grown-up evolution of a Mock block rule. They live in settings_{global,user,device}.data.scripts; effective per device = global ++ user ++ device (de-duped by id, device wins then user then global), the same model as block rules. Writing a script is arbitrary-code power (browser_cdp-tier): the write tools need scripts:edit + admin + confirm: true at EVERY tier (the user tier does not lower the bar), enforced at the database layer (settings_{global,user,device}_scripts_gate) so no surface can smuggle a script in via a blocks write or a self-write.

A script object is { id, enabled, name, pattern, method?, phase: "request" | "response" | "both", code, version?, note? }.

ToolWhat it doesGating
get_scriptsRead the global scripts and (with device_uuid/deviceName) the owner USER's scripts + that device's per-device scripts + the effective 3-tier union (global ++ user ++ device).scripts:view
set_scripts_globalReplace the global scripts (full list); merged into settings_global.data without clobbering other keys.scripts:edit · admin-only · confirm-gated
set_scripts_userReplace a USER's scripts (the middle tier); additive (effective = global ++ user ++ device). IDENTICAL bar to the global/device writers — the user tier does NOT lower it.scripts:edit · admin-only · confirm-gated
set_scripts_serviceReplace a SERVICE GROUP's scripts (the SERVICE tier); applies to every device that has applied the group. Additive (effective = global ++ service ++ user ++ device). IDENTICAL bar — the service tier does NOT lower it (services:edit alone is not enough; the DB service_groups_scripts_gate enforces it).scripts:edit · admin-only · confirm-gated
set_scripts_deviceReplace a device's per-device scripts (full list); additive on top of the global ++ user lists.scripts:edit · admin-only · confirm-gated
dry_run_scriptStatically check a candidate script before saving — parse-only compile + contract check (no write, no live execution). Full semantic dry-run runs in the live sandbox / dashboard, not the Edge function.scripts:view

Workspaces (6)

ToolWhat it doesGating
list_workspacesList workspaces.global:view
get_workspaceFetch one workspace.global:view
create_workspaceCreate a workspace.global:edit
rename_workspaceRename a workspace.global:edit
delete_workspaceDelete a workspace.global:edit · confirm-gated
set_workspace_retentionSet a workspace's retention window.global:edit

Tabs (6)

ToolWhat it doesGating
list_tabsList tabs.global:view
create_tabCreate a tab.global:edit
rename_tabRename a tab.global:edit
delete_tabDelete a tab.global:edit
set_tab_filtersSet a tab's filters.global:edit
set_tab_selected_entrySet a tab's selected entry.global:edit

Snapshots (3)

ToolWhat it doesGating
create_snapshotCreate a snapshot of captured state.snapshots:edit
list_snapshotsList snapshots.snapshots:view
download_snapshotDownload a snapshot's contents.snapshots:view

Push (2)

ToolWhat it doesGating
list_push_tokensList registered APNs push tokens.push:view
send_pushSend a push notification via APNs.push:edit · confirm-gated

Roles & RBAC (5)

Manage capability-based roles. All mutators are confirm-gated.

ToolWhat it doesGating
list_rolesList roles and their capabilities.users:view
create_roleCreate a custom role.users:edit · confirm-gated
update_roleUpdate a role's capabilities.users:edit · confirm-gated
delete_roleDelete a custom role.users:edit · confirm-gated
set_user_roleAssign a role to a user.users:edit · confirm-gated

Stats & status (2)

ToolWhat it doesGating
get_statsLive capture / usage stats.stats:view
get_statusInfrastructure / service health.status:view

Tester (2)

The architecture-prove verdict board — read the latest test run + trigger a new one.

ToolWhat it doesGating
get_test_statusRead the latest tester run (the prove verdict + per-phase / per-suite results + recent history) or one run by id.tester:view
run_test_suiteTrigger a tester run (a tier / component); records a requested run that CI runs + reconciles. Confirm-gated.tester:run + confirm

Telegram linking (5)

Link a Busymate account to a Telegram identity for BusyBro chat.

ToolWhat it doesGating
get_telegram_linkGet your Telegram link.users:view
list_telegram_linksList Telegram links.users:view
link_telegramLink a Telegram account.users:edit
unlink_telegramUnlink your Telegram account.users:edit · confirm-gated
admin_unlink_telegramAdmin: unlink any account's Telegram link.users:edit · confirm-gated

TestFlight beta admin (13)

Manage TestFlight groups, testers, and invitations via the testflight-admin Edge Function. Reads need testflight:view; every write needs testflight:edit and is confirm-gated.

ToolWhat it doesGating
list_testflight_groupsList beta groups.testflight:view
list_testflight_testersList testers.testflight:view
get_testflight_testerGet one tester.testflight:view
list_testflight_invitationsList tester invitations.testflight:view
list_testflight_usersList App Store Connect users.testflight:view
list_testflight_user_invitationsList user invitations.testflight:view
invite_testflight_testerInvite a beta tester.testflight:edit · confirm-gated
delete_testflight_testerRemove a tester.testflight:edit · confirm-gated
add_testflight_tester_to_groupAdd a tester to a group.testflight:edit · confirm-gated
remove_testflight_tester_from_groupRemove a tester from a group.testflight:edit · confirm-gated
send_testflight_invitationSend a tester invitation.testflight:edit · confirm-gated
invite_testflight_userInvite an App Store Connect user.testflight:edit · confirm-gated
cancel_testflight_user_invitationCancel a user invitation.testflight:edit · confirm-gated

BusyBro memory & shares (4)

BusyBro's long-term memory and shared-conversation reader. The memory trio is owner-scoped — you only ever see and touch your own account's memories, the same store the dashboard and Telegram BusyBro read and write.

ToolWhat it doesGating
list_memoriesList or semantically search your own durable memories (facts / preferences / corrections / episodes).users:view
save_memorySave one durable memory about you / your work; near-duplicates merge, a correction overwrites.users:edit
forget_memoryDelete your memories — by id, by best semantic query match, or all.users:edit · confirm-gated
get_busybro_shareRead a shared BusyBro conversation by its /busybro/share/<id> id — title, context, full transcript — so you can continue it.public (by id)

BusyBro sessions (5)

Multi-session chat management — a "session" is one busybro_threads row (a resumable conversation), shared across the dashboard, iOS, and the bmc CLI. All five are owner-scoped — you only ever list / load / rename / delete your own sessions. context_key is the dashboard nav-binding find-or-create key (UUID-keyed, e.g. device:<uuid>); last_active_at is the sidebar ordering anchor.

ToolWhat it doesGating
list_busybro_sessionsList your chat sessions, newest-active first — {thread_id, title, context_key, updated_at, last_active_at, turns}.users:view
get_busybro_sessionLoad one of your sessions by id — title, context_key, and ordered turns. A session you don't own returns not-found.users:view
create_busybro_sessionCreate a new empty session; optionally seed a title + nav-binding context_key. Find-or-create: a colliding context_key returns the existing session.users:edit · confirm-gated
rename_busybro_sessionRename one of your sessions (owner-gated no-op on a foreign id).users:edit · confirm-gated
delete_busybro_sessionPermanently delete one of your sessions (owner-gated no-op on a foreign id).users:edit · confirm-gated

BusyBro global (team) memory governance (10)

The shared, non-personal team-knowledge store and its review queue — see Global (team) memory and the shareable Connect to team memory page. The shared store has no user_id and is leak-proof on the recall path; contributor identity surfaces only through list_memory_contributors, never in what an LLM recalls. Proposals land pending (not recallable) until an operator approves them.

ToolWhat it doesGating
list_global_memoriesOperator browse of the team store across all statuses (pending / approved / rejected); filter by status / kind / origin / query. Returns each row's origin + contributor_count — never contributor ids.users:view
get_memory_statsMemory dashboard counters: personal vs global totals, the global pending / approved / rejected split, and distinct_contributors (count only).users:view
list_memory_contributorsOperator attribution lookup for ONE team fact — who proposed it (joined to email / display name from the leak-proof busybro_global_contributions ledger) + who approved it (approved_by). Strictly off the recall path.users:view
propose_global_memoryPropose one candidate team fact — third-person, subject-less, ≤ 600 chars, no PII / secrets. Writes a pending row (not recallable) + records you as a contributor.users:edit · confirm-gated
approve_global_memoryPromote a pending team fact to approved (recallable); stamps approved_by = you.users:edit · confirm-gated
reject_global_memoryReject a candidate (kept for audit / dedup, never recalled).users:edit · confirm-gated
update_global_memoryEdit a team fact's content / kind / importance; editing content flags it for re-embedding.users:edit · confirm-gated
admin_list_user_memoriesAdmin / support drill-down — read ONE user's personal memories by user_id (never feeds another user's recall).users:view
admin_forget_user_memoryAdmin / support — delete ONE of a user's personal memories by id (a correction, not the full GDPR wipe).users:edit · confirm-gated
gdpr_forget_userAdmin GDPR erasure — wipe ALL of a user's personal memory + drop their global contributions; the recompute trigger then deletes any team fact that loses its last contributor.users:edit · admin-only · confirm-gated

The recall store (busybro_global_memories) carries no identitymatch_global_memories returns no user_id. Per-person provenance lives only in the busybro_global_contributions side-table, read only by list_memory_contributors (operator-gated), for dedup, corroboration, stats, and erasure — never on the recall path. The dashboard review queue shows a candidate's contributor count, never identities.

Stripe billing & admin (9)

Subscription + metered (captured_entries) billing (Phase 1 = Stripe TEST mode). The owner-scoped reads filter on the caller's identity; operators pass all_users:true for the fleet. The admin reads back the /billing-admin operator surface — all value-blind (get_stripe_config derives test/live mode from the publishable-key prefix and NEVER returns the secret key or webhook signing secret).

ToolWhat it doesGating
get_subscriptionThe caller's own Stripe subscription(s); operators pass all_users:true for the fleet.billing:view
list_invoicesThe caller's own invoices (amounts / hosted URL / period); all_users:true for the fleet.billing:view
get_usageThe caller's own metered usage rollup (captured_entries) by period; all_users:true for the fleet.billing:view
create_checkout_sessionOpen a Checkout (subscribe) or Customer Portal (manage) session; customer derived server-side from the caller.billing:view · confirm-gated
get_stripe_configValue-blind connection status: { mode, publishable_key } only (mode derived from the pub-key prefix; secret/whsec_ never read).billing:view
list_pricesThe Stripe Products' prices (value-blind projection: amounts, recurring/metered, lookup_key).billing:view
list_customersThe stripe_customers ↔ users mapping (fleet — the local mapping table, not the Stripe API).billing:view
get_webhook_eventsThe stripe_webhook_events idempotency ledger (fleet) — event_id / type / received.billing:view
get_billing_settingsThe billing_settings singleton (default price, quota/overage, dunning, mode, …).billing:view

Legacy aliases (4)

Older names kept for backward compatibility. Prefer the generic db_* tools or the typed reads / writes above for new work.

ToolWhat it doesGating
list_entriesPaginated entries query.devices:view
get_entryFetch one entry by id / request_id.devices:view
get_settingsEffective settings for a device.devices:view
set_global_settingsPatch settings_global.data.global:edit

Total: 188 tools.