Developers · Model Context Protocol

Your coding agent,
reading your crawl results.

FlyTrap runs your real Android or iOS build on real devices and records what happened: screens, bugs with screenshots and logs, network traffic, SDKs and permissions. The FlyTrap MCP server hands that evidence to the agent you already code with, so "why does onboarding break?" gets answered from a run id and a screenshot, not a guess.

15 project tools 4 catalog tools Open source

Two-minute setup

  1. Sign in to dashboard.flytrap.dev, open Settings > API keys and create a key. Pick read unless you want the agent to queue crawls.
  2. Add the server to your agent. Cursor, Claude Desktop and Windsurf use the JSON form (other clients: see the README):
{
  "mcpServers": {
    "flytrap": {
      "command": "npx",
      "args": ["-y", "@flytrap-qa/mcp@latest"],
      "env": {
        "FLYTRAP_API_KEY": "ft_live_..."
      }
    }
  }
}

Claude Code:

claude mcp add flytrap -e FLYTRAP_API_KEY=ft_live_... -- npx -y @flytrap-qa/mcp@latest

Then ask. Without a key the public catalog tools still work. Node 20 or newer is the only requirement; nothing else is installed on your machine.

What it looks like

"Why does onboarding break in my app?"

Calls list_projects, list_bugs, get_bug_evidence

"In run 992, BUG-102 fails at step 1 (Start the app): a system error dialog blocks the screen. Logcat shows the crash in the launch activity; see screenshot 0001_post_launch_launchApp.png." The agent then opens the stack frame in your code.

"Which third parties get data before the consent screen?"

Calls get_network_hosts, get_sdks, lookup_sdk

Hosts with call counts and the screen they were first seen on, matched to the SDK that owns them. Pre-consent analytics traffic stands out.

"What changed between build 1180 and 1184?"

Calls list_builds, compare_builds

New SDKs and permissions, hosts added or removed, bugs that appeared or disappeared, screen and size deltas. A release gate in one answer.

Every answer carries the crawl run id, the bug id and the artifact path it came from, so you can open the same evidence in the dashboard. The shipped SKILL.md tells the agent exactly that: cite the run, quote the log line, say when evidence is missing instead of filling the gap.

Tools

Thin wrappers over the FlyTrap REST API. Access control stays on the server: a key sees exactly the projects its owner can see.

Your projects (API key)

15 tools

list_projects

read scope

Apps the key owner can read, with the selected crawl run for each.

Parameters
  • q : string. Substring of name or package id.
  • platform : android | ios. Filter by platform.
Returns
id, name, package_name, platform, active build, selected crawl run, dashboard URL.

get_build_summary

read scope

One-screen state of the selected crawl run.

Parameters
  • project_id (required) : number. Project id from list_projects.
Returns
Version, size, binary SHA-256, SDK and permission counts, bugs by severity, test pass/fail, screens crawled, network and performance totals.

list_bugs

read scope

Bugs FlyTrap found in the selected run, sorted by severity.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • status : open | resolved. Filter by status.
  • severity : critical | high | medium | low. Filter by severity.
Returns
Bug id, title, severity, surface, affected flow, first seen, scenario link.

get_bug_evidence

read scope

Everything recorded for one bug, ready to paste into a fix.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • bug_id (required) : string. Bug id from list_bugs, e.g. BUG-102.
Returns
Scenario and failed step, screenshots and UI XML (short-lived signed URLs), logcat error window, failed network calls, performance peaks, a compiled ai_prompt.

get_screen_graph

read scope

Screens reached and the tap edges between them.

Parameters
  • project_id (required) : number. Project id from list_projects.
Returns
Screens with element counts, edges (from, to, via element), unreachable or dead-end screens.

get_network_hosts

read scope

Hosts the build talked to during the crawl.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • limit : number. Max hosts, default 50.
Returns
Host, call count, bytes, error rate, first seen screen, plus FlyTrap's network insight. Query strings, headers and bodies are stripped.

get_sdks

read scope

What the build ships: SDKs, permissions, deep links.

Parameters
  • project_id (required) : number. Project id from list_projects.
Returns
SDKs with vendor, category, version, confidence and evidence sources; declared permissions; deep links.

compare_builds

read scope

Diff two builds of the same project.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • base_build_id (required) : number. Older build (from list_builds).
  • head_build_id (required) : number. Newer build.
Returns
SDKs, permissions, deep links, hosts, bugs and screens added or removed; size and open-bug deltas.

search_apps

read scope

Describe an app in plain language, get the crawled apps whose observed features cover it.

Parameters
  • query (required) : string. What the app should do, e.g. budgeting with shared expenses.
  • platform : android | ios. Filter by platform.
Returns
Ranked apps with match_score, matched_features and unmatched_requirements; how the query was interpreted.

get_ux_benchmark

read scope

Your build's features next to the same feature in competitor and same-genre apps.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • match : genre | overlap. Pick apps by store genre (default) or by shared functions.
Returns
Feature rows, compared apps (pinned competitors first) with shared feature counts and screenshot URLs.

list_competitors

read scope

Competitors pinned to a project's benchmark.

Parameters
  • project_id (required) : number. Project id from list_projects.
Returns
Pinned apps with genre, downloads and feature counts.

find_competitors

read scope

Search crawled public apps and Google Play for apps to pin.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • q (required) : string. App name or package id.
Returns
crawled_apps (ready to pin) and google_play_apps (crawled on first pin).

add_competitor

mutating · crawl scope

Pin a crawled app, or create a store project from a Google Play package and pin it.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • competitor_project_id : number. A crawled app from find_competitors.
  • package_name : string. Google Play package; creates and crawls a store project first.
  • confirm : true. Required when a new project would be created.
Returns
The pinned list, plus the created project when one was made.

remove_competitor

mutating · crawl scope

Unpin a competitor.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • competitor_project_id (required) : number. Pinned project id.
Returns
The remaining pinned list.

start_crawl

mutating · crawl scope

Queue a new crawl of the current build. The only tool that changes anything.

Parameters
  • project_id (required) : number. Project id from list_projects.
  • confirm (required) : true. Must be true; the agent has to ask you first.
Returns
crawl_run_id and job_id. Takes 10 to 40 minutes; poll get_project for status.

Public app catalog (no key)

4 tools

lookup_app

no key

Search the public catalog of 1,500+ crawled store apps.

Parameters
  • q (required) : string. App name or package id.
  • sdk : string. Only apps containing these SDK ids.
Returns
package_name, platform, framework, genre, SDK and permission counts.

get_app_profile

no key

SDKs, permissions and labels for one public app.

Parameters
  • package_name (required) : string. Package or bundle id, e.g. com.booking.
Returns
App metadata, SDK list with vendors, permissions, labels, crawl-derived summary.

lookup_sdk

no key

Find SDK ids by name, vendor or category.

Parameters
  • q : string. Substring; omit to list categories.
Returns
SDK id, name, vendor, category, family.

lookup_permission

no key

Explain an Android permission or find permissions by keyword.

Parameters
  • q (required) : string. Permission id or keyword.
Returns
Permission id, name, category, protection level, description.

Keys and security

  • Keys are personal and scoped. read can only read; crawl adds the tools that change something: start_crawl, add_competitor and remove_competitor. Anything that queues a crawl also needs an explicit confirm: true from the agent. No key can manage keys, billing or team.
  • FlyTrap stores only a SHA-256 hash of the key and shows it once. Set an expiry, revoke from the dashboard at any time, up to 10 active keys per account.
  • The server sends the key only to api.flytrap.dev over HTTPS and never writes it to disk or logs. Screenshots and XML come as short-lived signed URLs.
  • Tool output is bounded (log windows, call caps, 4 MiB per response) and labelled as app data: bug titles, log lines and URLs originate from the crawled app and its traffic, so the agent treats them as data, not instructions.
  • Prefer plain HTTP? Every tool is a REST endpoint and the same key works with curl:
curl -H "Authorization: Bearer $FLYTRAP_API_KEY" \
  https://api.flytrap.dev/project/projects/1248/bugs/BUG-102/evidence

Connect your agent

Upload a build or pick a store app, let FlyTrap crawl it, then let your agent read the results. Free to start.