About
Local App Store Optimization CLI
README
App Store Optimization CLI
Research ASO keywords, inspect competition, and manage results from one local-first CLI.
What Is It?
- Fast, free keyword research and visibility tracking
- Keyword scoring with popularity + difficulty + brand classification in one command
- Local ASO dashboard for reviewing keyword/app data
- MCP tool (
aso_evaluate_keywords) for agent workflows and automated keyword research
ASO Dashboard
MCP
The dashboard keywords shown above were discovered and added automatically by an agent using the MCP tool.
Install
npm install -g aso-cli
Note: requires Node.js >=18.14.1.
Apple Search Ads Setup
ASO commands require Apple Search Ads setup.
Prerequisites
- App Store Connect account
- App ID of a published app you can access
- No campaign creation required
- No billing information required
Setup
- Create/sign in: https://searchads.apple.com
- If your country is not available during signup, select
United States.
- If your country is not available during signup, select
- Open Apple Search Ads Advanced: https://searchads.apple.com/advanced
- Click your account name in the top-left corner.
- Under Campaign Groups, click Settings.
- Click Link Accounts.
- Select your App Store Connect account and save.
- If this is your first time using Apple Search Ads, you will usually have only one campaign group.
- Copy an App ID from your App Store URL (number after
id) Example App Store URL:
App ID ishttps://apps.apple.com/us/app/example-app/id123456789123456789in this example. - Run
aso authand complete Apple ID + password + 2FA in terminal
Notes:
- You may see a missing billing information warning; this can be safely ignored.
- Ensure all campaign groups are linked to a valid App Store Connect account.
- Troubleshoot App Store Connect account linking
Quick Start
# Authenticate once
aso auth
# Fetch keyword metrics
aso keywords "meditation,sleep sounds,white noise"
# Open dashboard
aso
Command Reference
| Command | What it does |
|---|---|
aso |
Starts the local dashboard (default command) |
aso keywords "k1,k2,k3" |
Fetches keyword popularity/difficulty and prints JSON |
aso keywords "k1,k2" --stdout |
Machine-readable mode for automation/agents |
aso auth |
Reauthenticates Apple Search Ads session |
aso reset-credentials |
Clears saved credentials/cookies |
aso --primary-app-id <id> |
Sets primary App ID used for popularity requests |
Supported flags
--country <code>: currentlyUSonly--primary-app-id <id>: saved locally for future runs--min-popularity <number>: filters out low-popularity keywords before enrichment--max-difficulty <number>: filters out high-difficulty keywords after enrichment--app-id <id>: associates keywords to this local app id (default:research)--no-associate: skips app-keyword association writes for the currentaso keywordsrun
Association behavior for aso keywords:
- Association writes happen only after a successful command return.
- Without filters, requested keywords are associated.
- With
--min-popularityand/or--max-difficulty, only accepteditemsare associated. - With
--no-associate, no association write occurs.
Output Example (aso keywords "meditation")
{
"items": [
{
"keyword": "meditation",
"popularity": 45,
"difficultyScore": 62,
"minDifficultyScore": 38,
"isBrandKeyword": false
}
],
"failedKeywords": [],
"filteredOut": []
}
--stdout Contract
aso keywords "<comma-separated-keywords>" --stdout is the machine-readable contract.
- Success: exit code
0,stdoutcontains exactly one JSON object with:itemsfailedKeywordsfilteredOut
- Failure: exit code
!= 0,stdoutcontains exactly one JSON object with:error.code(CLI_VALIDATION_ERRORorCLI_RUNTIME_ERROR)error.message- optional
error.help
- In
--stdoutmode, CLI logs and prompts are kept offstdoutso parsers can read one JSON payload safely.
Failure example:
{
"error": {
"code": "CLI_RUNTIME_ERROR",
"message": "Primary App ID is missing. Run 'aso --primary-app-id <id>' or run 'aso' in a terminal to set it, then retry this command with --stdout."
}
}
MCP
This package also installs aso-mcp with tool: aso_evaluate_keywords.
aso_evaluate_keywords runs aso keywords ... --stdout with default filters:
minPopularity = 6(floor:6)maxDifficulty = 70
MCP returns only accepted rows (keyword, popularity, difficulty, minDifficultyScore, isBrandKeyword).
Example MCP config:
{
"mcpServers": {
"aso": {
"command": "aso-mcp"
}
}
}
Current Scope
- Storefront support:
US - Multi-storefront support is planned
Project Docs
- Contribution guide: CONTRIBUTING.md
- Website architecture: docs/website-architecture.md
Install Aso Cli in Claude Desktop, Claude Code & Cursor
unyly install aso-cliInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add aso-cli -- npx -y aso-cliFAQ
Is Aso Cli MCP free?
Yes, Aso Cli MCP is free — one-click install via Unyly at no cost.
Does Aso Cli need an API key?
No, Aso Cli runs without API keys or environment variables.
Is Aso Cli hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Aso Cli in Claude Desktop, Claude Code or Cursor?
Open Aso Cli on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Aso Cli with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
