Connect Claude Code
claude mcp add --scope user visualaso -- "/Applications/VisualASO.app/Contents/MacOS/VisualASO" --mcp
In VisualASO, Help → Copy MCP Install Command copies the same line with the path of the copy you run.
Connect Codex
codex mcp add visualaso -- "/Applications/VisualASO.app/Contents/MacOS/VisualASO" --mcp
Or add it to ~/.codex/config.toml:
[mcp_servers.visualaso]
command = "/Applications/VisualASO.app/Contents/MacOS/VisualASO"
args = ["--mcp"]
What agents can and cannot do
- Agents read and change your local VisualASO data, start checks and draft listings, as the app can (Pro).
- Publishing is off. An agent can write to App Store Connect only after you turn on Allow agents to publish for that app in Optimize, and even then it starts as a dry run that writes nothing.
- No agent can submit a version for review. VisualASO cannot do that either.
- The app and the server can run at the same time; changes an agent makes show up in the app.
Every tool
69 tools, generated from the server's own list. read reads only; writes changes your local data or starts a check; store write can change App Store Connect and only does so when you allow it.
Start here
| Tool | What it does | Kind |
|---|---|---|
ai_status | Shows which AI CLIs (Claude Code, Codex, OpenCode, Ollama) are installed and their models. | read |
markets_list | Lists every storefront code with its country, language, locales, market size and payments flag. | read |
overview | One line per tracked entry with markets, keyword counts, check status, audit stage, and running jobs. | read |
settings_save | Saves app-wide settings for the AI tool, checks, display, and default markets. | writes |
status | Lists tracked apps, markets, connections, and recent jobs. Start here. | read |
Apps and folders
| Tool | What it does | Kind |
|---|---|---|
app_add | Starts tracking an app from its App Store URL or ID and kicks off background work. | writes |
app_addAll | Starts tracking every App Store Connect app that isn't tracked yet, as your own apps. | writes |
app_autoCheck | Sets how often an app is automatically re-checked. | writes |
app_context | Saves or replaces an app's product brief, which later AI work uses. Empty clears it. | writes |
app_fetch | Re-reads an app's name, subtitle, description and (with App Store Connect) keyword field for each locale. | writes |
app_kind | Moves an app between My Apps and Competitors. | writes |
app_markets | Sets an app's tracked countries and their display order. | writes |
app_move | Moves an entry to a sidebar folder, optionally above another entry. | writes |
app_playPackage | Sets (or clears, with an empty value) the app's Google Play package, which turns on Google Play checks. | writes |
app_remove | Stops tracking an app and deletes its keywords. Destructive. | writes (removes data) |
folder_create | Creates a sidebar folder and returns its ID. | writes |
folder_remove | Deletes a folder; its entries move back to their default lists. | writes (removes data) |
folder_rename | Renames a sidebar folder. | writes |
session_create | Starts a keyword brainstorm from a topic, without an app. | writes |
store_search | Finds the top 8 App Store apps for a name, niche, or App Store link. | read |
Keywords
| Tool | What it does | Kind |
|---|---|---|
board_get | Returns the keyword grid with ranks, demand, difficulty, and verdicts per market, plus competitors and chat. | read |
coverage_get | Which listing words each tracked phrase relies on per market, which localizations each market reads, and wasted characters. | read |
keyword_add | Tracks a new English keyword, with optional per-market phrases. | writes |
keyword_hide | Hides or shows a keyword without deleting it. | writes |
keyword_localize | Writes a native phrase for every tracked market missing one (English-first language check), then checks it. | writes |
keyword_remove | Stops tracking a keyword in every market. Destructive. | writes (removes data) |
keyword_update | Renames a keyword's English phrase. | writes |
term_get | Returns one keyword's rank history, demand and difficulty breakdown, and top apps for one market. | read |
term_set | Sets the phrase one market uses for a keyword. Empty text removes the override; "-" stops tracking it there. | writes |
Checks and jobs
| Tool | What it does | Kind |
|---|---|---|
check_resume | Continues a stopped or interrupted check run from its next unchecked cell (cells saved since the run began are skipped). Without jobId, the app's last resumable run. | writes |
check_run | Searches every keyword in each market for rank, demand and difficulty (true App Store order), or Google Play ranks with store=play. Paced for Apple's and Google's limits; resumable. | writes |
job_stop | Stops a running job for an app. | writes |
probe_plan | Plans an index probe: one unique word per localization (plus negative controls) to plant in the next version's keyword fields. | writes |
probe_run | Reads which storefronts rank each planted probe word and saves the app's own index map. | writes |
wait | Waits until a job changes state or the time runs out, then returns. Call again while jobs run. | read |
Competitors and opportunities
| Tool | What it does | Kind |
|---|---|---|
opportunities | Ranks the best starting points: high demand, low difficulty, few strong incumbents. | read |
Optimize (listing audit)
| Tool | What it does | Kind |
|---|---|---|
audit_choose | Sets the final main-listing name, subtitle, and keywords, plus core phrases. | writes |
audit_clear | Deletes the app's listing audit. Destructive. | writes (removes data) |
audit_english | Audit step 1: proposes three main-listing options in the main locale. | writes |
audit_get | Returns the app's listing audit, or its Markdown export when export is true. | read |
audit_locale_pick | Swaps a locale's core keyword for another tested phrase; the AI rewrites that locale. | writes |
audit_locale_set | Manually edits one locale's proposed fields. | writes |
audit_localize | Audit step 2: writes listings for each App Store locale from tested phrases, keyword fields allocated per storefront. | writes |
audit_measure | Searches each phrase in the main listing's store and saves the results. | writes |
audit_more | Generates additional main-listing options, keeping existing ones. | writes |
audit_option_add | Adds your own main-listing option to the audit. | writes |
audit_option_remove | Removes one main-listing option from the audit. Destructive. | writes (removes data) |
audit_option_update | Edits an existing audit option in place. | writes |
audit_publish | Writes the audit into App Store Connect as an unsubmitted version. Refused unless the app allows agent publishing. Never submits for review. Destructive. | store write |
next_version | Shows the editable App Store Connect version and the next version number. | read |
History, changes and funnel
| Tool | What it does | Kind |
|---|---|---|
change_record | Records a listing change made outside the app, so it gets a 21-day verdict. | writes |
changes_get | The listing change log with 21-day verdicts, and per-tactic hit rates. | read |
funnel_get | Impressions → page views → downloads per source (search, browse, referrers) from App Store Connect analytics. | read |
Researcher and brainstorm
| Tool | What it does | Kind |
|---|---|---|
agent_ask | Sends a message to the in-app keyword researcher, which may propose keyword or audit actions. | writes |
agent_clear | Clears the researcher chat for an app. Destructive. | writes (removes data) |
keywords_brainstorm | Has the AI rebuild an app's keyword list from its listing plus ideas, then checks new phrases. | writes |
session_update | Renames a brainstorm or changes its topic. | writes |
Imports and outside readings
| Tool | What it does | Kind |
|---|---|---|
appleads_connect | Saves an Apple Ads API account for the read-only popularity pull; the key goes to the Keychain. Pass a JSON file with the ids and the key's path, or the four ids and the key file. | writes |
appleads_popularity | Apple's search popularity (5-100) for any terms in one storefront, read from the user's own signed-in Apple Ads account (one allow-listed read request; nothing can be created or spent). 5 is Apple's floor: below what Apple shows, not measured. Uses today's stored readings first. Refuses when not signed in or the sign-in expired. | writes |
appleads_pull | Reads Apple's weekly search popularity charts (top 500 per country × genre) into the database as a background job. Read-only insight queries: nothing can spend. Defaults to every tracked app's markets and genres, newest complete week. | writes |
asc_apps | Lists every app visible to the connected App Store Connect accounts. | read |
asc_connect | Saves an App Store Connect API key as a developer account (key stored in the Keychain). | writes |
asc_disconnect | Removes one App Store Connect account, or all if none is given. Destructive. | writes (removes data) |
asc_test | Checks saved App Store Connect keys with Apple and reports the apps they can see. | writes |
astro_get | Returns the Astro data saved for an app's phrases: popularity (raw and calibrated) and difficulty. | read |
import_appleads | Imports Apple Ads search popularity rows from a JSON Lines file, one row per term and country: Apple's own 1-100 scale, and the chart floor that caps phrases absent from it. | writes |
import_aso | Imports keyword, rank and listing-change history from a folder of JSON files: keywords, ranks, change logs and Apple Ads popularity. | writes |
import_astro | Imports keyword evidence from an Astro export (CSV or JSON), optionally as a preview only. | writes |
revenue_get | Revenue per market from RevenueCat (read-only), used to weight opportunities. pull=true fetches a fresh reading first. | read |
Something unclear or out of date? Write to hello@musthaveappscorp.com.