About search
An AppFollow skill for finding apps through store search and optionally adding selected results to a tracking collection. It is for teams maintaining app lists, and includes deduplication, user approval, and a read-only fallback when writes fail.
Key features
- 01Search stores by app name
- 02Present candidates and confirm matches
- 03Check collections for duplicates
- 04Add apps to tracking with approval
- 05Report added and unadded results
Use cases
- 01Find store listings for apps to analyze
- 02Add owned apps to an AppFollow collection
- 03Track explicitly designated competitors
- 04Keep candidate references when writes are blocked
MCP support
The skill uses AppFollow MCP tools to search apps and read collections and app lists, then adds collections or apps after user approval. Search and deduplication can be completed without writes.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ appfollow/ appfollow-ai-toolkit --skill searchAfter installing, type/searchin Claude Code to confirm it loaded.
Details
From the project READMEsearch — find + track apps
Read using-appfollow first (session opening, write ritual, error codes).
Inputs
query: app name (free-text search keywords).store: the short store code —as(App Store) orgp(Google Play) for the search;add_apptakes all ten codes (using-appfollow→references/tool-map.md).country(defaultus),collection(name; created if new),locale.
Flow
- Session:
whoami(seeusing-appfollow). - Normalize input. Search takes free-text keywords only — the ASO search endpoints do not accept
a store URL or an
ext_id. Trim the query to the app name (strip any pasted URL down to the app name/title before searching). - Search (read-only, any plan). Call
aso_search_results(optionallyaso_search_suggestions, 12 cr). Present numbered candidates. Auto-pick only a single exact-title match; otherwise the user picks. - Resolve collection.
list_collections. If the target collection is new, runadd_collection_preview→ user approval →add_collection. - Dedupe (read-only).
list_apps(apps_id= the target collection'scollectionId); if the app'sextIdis already there, record it underskipped_existingand skip the add.list_appsreportsstoreas the long name (itunes=as,googleplay=gp). - Add (write — may be plan-gated).
add_app_preview→ explicit user approval →add_appwith identical args:store(short code),ext_id,apps_id,locale(two-letter country code). Passis_competitor: trueonly when the user says the app is a rival (default: one of their own). - Verify.
list_appsagain; confirm the app'sextIdnow appears; keep the collection'sapps_idwith it — the report skills address the app byapps_id+ext_id. - Emit the JSON block (below).
Read-only degrade path (plan-gated writes)
add_collection requires an Advanced API / Custom plan; neither it nor add_app carries a
feature gate — so a plan block does not arrive as FEATURE_DISABLED. It can surface as
ACCESS_DENIED, VALIDATION_ERROR (on add_app, a full apps or competitors limit), or
UPSTREAM_ERROR. Therefore:
- Always complete search + dedupe (read-only — works on any plan).
- Attempt the
add_*confirm. - On any error code from the add, do not assert a specific code. Report the candidate refs you
found, state plainly that the add could not be completed (likely a plan limitation), and list the
found refs under
not_addedso the report skills can still target them (they may already be tracked).
Output (fenced JSON)
{
"added": [{"store": "as", "ext_id": "389801252", "apps_id": 12345, "collection": "Core apps", "locale": "us", "title": "Example App"}],
"skipped_existing": [],
"not_added": [],
"collection_created": null,
"credits_spent_estimate": 13
}