{"name":"io.github.Buoy-gg/mcp","slug":"buoy-gg-mcp","title":null,"description":"Let AI agents read and drive a running React Native or Flutter app through Buoy's devtools.","url":"https://mcp.market/server/buoy-gg-mcp","rating":null,"grade":"A","score":91,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":58,"stars":692,"forks":5,"downloads_week":361,"last_push_at":"2026-10-01T11:20:37.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Buoy-gg/buoy","website":"https://buoy.gg/buoy/latest/docs/mcp","version":"7.0.41","remotes":[],"packages":[{"registryType":"npm","identifier":"@buoy-gg/mcp","version":"7.0.41","transport":{"type":"stdio"}}],"tools":[{"name":"asset_action","description":"Drive the assets tool: rescan (re-walk the registry + merge the Metro bundle graph + refresh fonts + measure sizes \\u2014 run this first if the inventory looks stale or empty), measure_sizes (re-measure byte sizes only), detail (full metadata for one asset by id: source dir, per-scale sizes, resolved URI, per-file graph paths), save_baseline (persist the current inventory for before/after comparis","write_action":false,"price_micros":0,"input_schema":null},{"name":"call_action","description":"Invoke any action a tool exposes (see list_tool_actions) and return its result. This is the generic escape hatch that works for every Buoy tool.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_devices","description":"List booted simulators and the apps installed on one. Use this to find the bundle id `camera_launch` needs, or the udid to pass when more than one simulator is booted. Lists every app on the simulator, not just Buoy-integrated ones \\u2014 the camera works on any of them.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_diagnose","description":"Work out why the simulator camera is not working. Checks that the pieces are present, a simulator is booted, something is publishing, SOMETHING IS READING IT, the library is loaded in the target app, no other tool owns the injection, and no camera library in the project disables simulator cameras at compile time.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_inputs","description":"List what this Mac can point the simulator camera at: its webcams (the uniqueId for `camera_source` with kind `camera`) and the windows the screen source can film (the id for `window:<id>`). Call this before choosing a `camera` or windowed `screen` source \\u2014 those ids cannot be guessed.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_launch","description":"Relaunch a simulator app with the camera attached. A camera can only be attached when a process starts, so an app that is already running cannot be given one \\u2014 this terminates and relaunches it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_source","description":"Give the iOS Simulator a camera, and choose what it shows. Use this before testing anything that opens a camera \\u2014 a QR or barcode scanner, document capture, an avatar picker. `barcode` generates the code from text, so testing a scanner needs no printed code and no second device; pdf417 is the barcode on a driver's licence. `screen` points the phone's camera at this Mac's screen. Needs no Buoy","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_status","description":"Check what the simulator camera is doing and what it is currently decoding. Use this to confirm a scanner test is actually seeing a code before concluding the app is broken.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_stop","description":"Turn the simulator camera off and stop publishing frames. The camera stays on until stopped \\u2014 across app relaunches and after a test finishes \\u2014 so call this when done, or the next thing that opens a camera will still see the last source.","write_action":false,"price_micros":0,"input_schema":null},{"name":"camera_zero_setup","description":"Make every app the simulator launches get a camera, however it was launched \\u2014 `expo start`, `react-native run-ios`, Xcode, a test runner. Use this when you are not the one starting the app, so `camera_launch` is not an option. It loads Buoy's library into every process in that simulator, SpringBoard included, so turn it off when finished.","write_action":false,"price_micros":0,"input_schema":null},{"name":"clear_js_thread_stats","description":"Reset the js-top task table, freeze history, and busy history on the device (fresh measurement window).","write_action":false,"price_micros":0,"input_schema":null},{"name":"compare_reports","description":"Compare two saved benchmark runs head-to-head: avg + p95 for FPS/CPU/memory, jank, AND render counts \\u2014 total, commits, and wasted (parent cascades + identity-only prop churn) \\u2014 each with deltas. Use comparable workloads and inspect available metrics together. A wasted-render delta alone does not prove a fix.","write_action":false,"price_micros":0,"input_schema":null},{"name":"describe_screen","description":"List elements exposed by the app React-fiber inspection integration, with available names, text, roles, testIDs, positions and native tags. This is not a complete native accessibility tree or a visual screenshot. Use the returned controls to select a target for tap_element; refresh after navigation or state changes. Empty results can reflect unavailable inspection. Requires Buoy Pro and the highli","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_assets","description":"Inspect assets reported by the configured manifest, runtime registry and available Metro bundle graph. Includes available dimensions, scale coverage, byte sizes, observed load history, audit findings and saved-baseline differences. Size measurement and coverage depend on setup; not observed loading does not mean unused. Use get_images for instrumented runtime image loads. Requires @buoy-gg/assets ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_automation_status","description":"Get the perf-monitor automation batch status (current phase + last completed batch) without waiting.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_batch_report","description":"Re-rank a previously-run benchmark batch by its batchId (from the saved recordings index).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_benchmark_settings","description":"Read the device's saved benchmark settings (per-page duration, runs, cooldown, reload, shuffle) in plain English with a time estimate. Call this before run_benchmark_batch so you can tell the user what the run will do \\u2014 run_benchmark_batch inherits these unless you override them.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_console","description":"Read retained captured console output as a compact tail of timestamps, levels and messages. Filter by minimum level or a case-insensitive message substring. Fatal JavaScript errors may be included when supported hooks captured them; post-crash availability is not guaranteed. Missing entries do not establish that no error occurred. Use get_snapshot for available full entry details. Requires configu","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_events","description":"Read retained events from connected Buoy sources. Filter with sources, such as ['network'], ['redux'], ['react-query'], ['storage'] or ['route']. Returns compact summaries by default; use includeData:true for available payload details. Coverage depends on integrations and retention. An empty timeline does not prove an event never happened. Use get_network_requests for request IDs and get_snapshot ","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_images","description":"Inspect image loads reported through the Buoy image integration, including available cache origin, load timing, size estimates, errors and simulation overrides. Coverage depends on instrumented components and platform support. Requires @buoy-gg/images on the device.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_jotai_state","description":"Read watched Jotai atoms and their available labels, change counts and writable status. includeValues:true requests values. Use get_events with sources:[\"jotai\"] for retained changes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_js_thread_origin_detail","description":"Inspect one js-top task origin in depth: schedules vs runs, avg/max/total exclusive ms, a 5s activity sparkline, freeze attribution, and the captured scheduling site (caller function + stack frames). Pass a row `key` from get_js_thread_top's JSON (e.g. \"interval|pollFeed\" or \"unattributed\" for the system row).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_js_thread_top","description":"Sample instrumented JavaScript task origins and return available timing, busy percentage and freeze attribution. Coverage depends on installed hooks; unattributed work can remain. Requires @buoy-gg/js-top and Buoy Pro. The call waits for the sample: arrange the interaction during that window using an available concurrent driver or a person, rather than starting it after this call returns. clearFir","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_network_requests","description":"List captured HTTP requests with IDs, available status/timing/size fields and pinned or saved markers. Capture depends on supported transports, installed hooks and recording timing; requests made before capture starts may be absent. Use IDs for network actions and flagged to inspect retained records. A flag does not establish who created it or the cause of a problem. Filter by status or URL patter","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_react_query","description":"Read queries reported by the connected React Query integration, including available status, observer counts, timestamps and errors. includeData:true requests cached payloads; staleOnly:true filters stale queries. Use each returned hash with react_query_action. History depends on retained events.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_redux_state","description":"Read available state from the connected Redux integration. Lists top-level slices by default; includeValues:true requests state values. Use get_events with sources:[\"redux\"] for retained action history.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_routes","description":"Read reported current navigation state and stack. includeSitemap:true includes available configured route paths; it does not establish complete application route coverage. Use get_events with sources:[\"route\"] for retained navigation history.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_scenarios","description":"List saved scenarios, configured steps, available durability labels and the reported active scenario. Inspect these settings when app behavior may be simulated. A scenario covers its supported steps, not every source of app or backend state.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sentry_cost","description":"Inspect captured session usage and the tool's configured monthly extrapolation and quota assumptions. These estimates do not establish Sentry ingestion, current plan limits or an actual bill. Check the account's current terms and usage before making cost decisions.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sentry_drops","description":"Why events never reached Sentry. Answers 'I called captureException but the event isn't in Sentry' \\u2014 the single most common Sentry problem \\u2014 by naming the layer that discarded it: a beforeSend callback returning null, a sample-rate roll, dedupe or another event processor, React Native tracing discarding an empty transaction, or a native rate limit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_sentry_envelopes","description":"Inspect retained captured Sentry envelopes and available item types, sizes, spans and payload details. Coverage depends on supported hooks. Local capture does not prove successful delivery, ingestion or billing impact. Filter by item type to investigate the available evidence.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_snapshot","description":"Read a tool's current state (its sync snapshot) from a device. Starts watching the tool and returns the next fresh snapshot.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_storage","description":"Read the app's storage keys across ALL backends: AsyncStorage, MMKV (per instance), and Expo SecureStore. Data wrong or missing after an app restart \\u2192 read the persisted values here FIRST \\u2014 the bug is usually a stale, missing, or malformed stored value, and reading it beats hunting for it in code. Compact by DEFAULT \\u2014 keys only \\u2014 so it's token-cheap; pass includeValues:true for","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_time_machine","description":"List the app's Time Machine state snapshots (restore points) and which state sources (storage/redux/zustand/jotai/react-query) can currently be captured/restored. Each snapshot also records the route it was captured on (shown as `route`), which a restore can navigate back to. Use time_machine_action to capture a snapshot before driving a flow, then restore supported sources to repeat the flow. Unc","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_triage","description":"Summarize available runtime observations for a connected app: captured console errors, recent network requests, configured storage and screen information. Use the returned sections and errors to choose follow-up tools. Missing data or an unresponsive app does not prove a crash; crash output may be unavailable. Requires Buoy Pro.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_zustand_state","description":"Read registered Zustand stores, available state keys, change counts and persistence metadata. includeValues:true requests values. Use get_events with sources:[\"zustand\"] for retained changes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"image_action","description":"Request an action for a registered image ID: hard_reload, retry, evict_disk, flash, prove_savings or a supported simulation override. swap_url requires url; restore removes the override. Support depends on the component and platform. prove_savings attempts a WebP conversion at displayed size and reports available byte comparisons and a device-local URI; inspect visual quality and originalBytesSour","write_action":false,"price_micros":0,"input_schema":null},{"name":"jotai_action","description":"Set the value of a writable Jotai atom (by label, from get_jotai_state). Read-only/derived atoms cannot be set (you'll get a clear error). Use for tweaking state during debugging.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_devices","description":"List the React Native devices connected to the Buoy broker and the dev tools each one exposes (toolId, version, available actions). Start here.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_tool_actions","description":"List the actions a given tool exposes, and which connected devices offer it. Use the action names with call_action.","write_action":false,"price_micros":0,"input_schema":null},{"name":"measure_renders","description":"Measure captured component renders during supplied interaction steps or an idle window. Returns available timings, render counts, reported reasons and changed props. The wasted count is a diagnostic classification, not proof a render can be removed. Check interaction warnings before comparing runs. Use the same steps and comparable conditions with compareToPrevious:true after editing; the comparis","write_action":false,"price_micros":0,"input_schema":null},{"name":"navigate","description":"Navigate the app to a route path (e.g. '/pokemon/25' or '/settings'). Use a concrete path \\u2014 resolve any dynamic segments (like [id]) to real values first. See get_routes with includeSitemap:true for valid paths. Pushes by default (back still works); pass replace:true to leave the current screen instead of stacking on top of it (e.g. resetting to '/').","write_action":false,"price_micros":0,"input_schema":null},{"name":"network_action","description":"Pin or save captured requests as retained records, or remove records and clear lists. Bodies may be truncated or omitted by storage budgets. Records are kept separately from the live list; availability after restart depends on successful device persistence. Get request IDs from get_network_requests. remove uses a retained-record key from flagged results. An action acknowledgement does not confirm ","write_action":false,"price_micros":0,"input_schema":null},{"name":"network_conditions","description":"Read or set the device's network conditions. Offline blocks new intercepted HTTP requests; slow adds 500 ms and verySlow adds 2000 ms before dispatch. Normal clears conditions. State resets on JS reload. Check app and server observations to verify the effect.","write_action":false,"price_micros":0,"input_schema":null},{"name":"network_override","description":"Configure response, failure or delay rules for supported requests intercepted by the app integration. Coverage depends on transport, hooks and rule-loading timing; early startup requests may bypass a rule. Inspect existing rules before editing, trigger the intended request and check observed results. Simulated offline behavior does not disconnect the device. Remove rules created for this task afte","write_action":false,"price_micros":0,"input_schema":null},{"name":"react_query_action","description":"Mutate the app's React Query cache: invalidate / refetch / reset / remove a single query (by queryHash, from get_react_query), or clear the entire query cache. Use this to fix stale data, force a refetch, or reset state during debugging.","write_action":false,"price_micros":0,"input_schema":null},{"name":"redux_dispatch","description":"Dispatch a Redux action to the app's store (e.g. to trigger a state change while debugging). Provide the action type and optional payload \\u2014 they're sent as { type, payload }.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reload_app","description":"Request a JS reload for a supported app using DevSettings in development or installed expo-updates where available. For an unresponsive app, can try its known dev server when reachable. Recovery is not guaranteed. Reload can discard in-memory state and evidence; collect needed observations first when possible. By default waits for reconnection up to timeoutMs. Requires configured @buoy-gg/core sup","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_benchmark_batch","description":"Run a perf-monitor benchmark batch and return per-metric leaders, risk flags and a comparison of available case results. Give it a target route and a matrix of cases (each a name + query params that select a variant on that route); it navigates, records, and benchmarks each case on the device, then ranks them. This blocks until the batch completes (can be minutes for large batches). The app must h","write_action":true,"price_micros":0,"input_schema":null},{"name":"run_flow","description":"Run supported UI actions and element checks in sequence, with per-step results. Stops on the first failed step unless continueOnFailure is true. Depending on include, attempts to return the final element tree and newly observed captured network/console entries. Background activity can appear in that output; it does not establish causation. Actions use exposed app handlers, not physical gestures. R","write_action":true,"price_micros":0,"input_schema":null},{"name":"scenario_action","description":"Preview, run, deactivate, save, organize or delete a scenario. Preview unfamiliar scenarios before running; inspect applied steps, failures and unrestored effects afterward. Storage changes need suitable undo steps. Saved scenarios are drafts requiring acceptance on the device before running. Reuse existing folders when appropriate. A completed scenario does not guarantee a deterministic app or ba","write_action":false,"price_micros":0,"input_schema":null},{"name":"screenshot_component","description":"Locate a supported React Native component and attempt a cropped iOS Simulator screenshot. Select by query or an exact nativeTag. Uses measured bounds or an available fiber-walk fallback and can attempt scrolling. Inspect the match and crop before treating it as visual evidence. Requires Buoy Pro, a compatible highlight-updates integration, and the MCP server on the same Mac as the booted iOS Simul","write_action":false,"price_micros":0,"input_schema":null},{"name":"sentry_action","description":"Act on the Sentry inspector. 'clear' drops every captured envelope and drop record \\u2014 use it to get a clean window before driving a flow you want to measure.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_benchmark_settings","description":"PERSIST benchmark settings on the device so they stick across runs. Only use when the user explicitly wants to save a change (\"always\", \"save this\"). For a one-off, pass overrides to run_benchmark_batch instead \\u2014 don't change their saved profile.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_image_simulation","description":"Configure supported instrumented image loads: offline simulates network-load failures while bundled assets can still load; cold requests cache bypass; normal resets the network mode. Reload or remount existing images as needed. blankImages removes sources from integrated images; massAction targets registered mounted images. Can also clear the registry or supported Expo caches. These modes do not c","write_action":false,"price_micros":0,"input_schema":null},{"name":"storage_action","description":"Modify the app's AsyncStorage: set a key, remove a key, or clear supported app AsyncStorage keys (Buoy's own devtool keys are preserved). Values are stored as strings \\u2014 JSON-encode objects yourself.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tap_element","description":"Invoke a supported element handler in JavaScript: onPress/onLongPress, onValueChange or onChangeText. This does not reproduce native hit testing, keyboard entry or a physical gesture. Select an exposed element by nativeTag, testID or fuzzy query; inspect the matched target and resulting behavior. value sets a supported toggle or slider, text invokes a text-input handler, and longPress selects onLo","write_action":false,"price_micros":0,"input_schema":null},{"name":"time_machine_action","description":"Manage snapshots of supported registered state sources: capture, preview, restore, capture_baseline, delete or rename. Preview affected items before restoring. Live mode replaces supported state in place; reload mode restores supported persisted storage and requests a JS reload. Baselines clear providers that support clearing and request a reload; they do not reset backend state or reproduce a com","write_action":false,"price_micros":0,"input_schema":null},{"name":"wait_for_automation","description":"Block until the in-flight perf-monitor batch finishes, then return its ranked comparison. Use this if a batch was started another way (e.g. on the device).","write_action":false,"price_micros":0,"input_schema":null},{"name":"zustand_action","description":"Set the state of a Zustand store (time-travel / reset / tweak during debugging). Targets a store by name (from get_zustand_state). By default replaces the whole state; pass replace:false to merge a partial.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":91,"grade":"A","scanned_at":"2026-10-01T13:50:01.432Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-01T13:50:01.358Z","components":{"code":{"score":25,"max":25,"notes":["7 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@buoy-gg/mcp","version":"7.0.41","found":true,"hasInstallScripts":false,"dependencyCount":6,"publishedAt":"2026-09-28T19:34:55.094Z","repositoryUrl":"git+https://github.com/Buoy-gg/buoy.git","weeklyDownloads":361}],"repo":{"found":true,"owner":"Buoy-gg","repo":"buoy","archived":false,"pushedAt":"2026-10-01T11:20:37Z","stars":692,"forks":5,"openIssues":4,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/249623048?v=4","ownerCreatedAt":"2025-12-14T18:51:26Z","license":"NOASSERTION"},"icon":{"url":"https://avatars.githubusercontent.com/u/249623048?v=4&s=128","source":"github"},"presence":{"stars":692,"forks":5,"downloadsWeek":361,"license":"NOASSERTION","lastPushAt":"2026-10-01T11:20:37.000Z","score":58}}}},"grade_history":[],"reviews":[]}