Profile
Back to NewsBack
GitHub Trending 4 min
Reader Mode
semihcihan/App-Store-Optimization-CLI: Research ASO keywords and analyze competitors using a CLI and dashboard

semihcihan/App-Store-Optimization-CLI: Research ASO keywords and analyze competitors using a CLI and dashboard

13 hours ago

App Store Optimization CLI

ASO icon

npm version License: MIT Node.js CI

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

ASO dashboard

MCP

The dashboard keywords shown above were discovered and added automatically by an agent using the MCP tool.

ASO MCP workflow

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

  1. Create/sign in: https://searchads.apple.com
- If your country is not available during signup, select United States.
  1. Open Apple Search Ads Advanced: https://searchads.apple.com/advanced
  2. Click your account name in the top-left corner.
  3. Under Campaign Groups, click Settings.
  4. Click Link Accounts.
  5. 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.
  1. Copy an App ID from your App Store URL (number after id)
Example App Store URL:
https://apps.apple.com/us/app/example-app/id123456789
App ID is 123456789 in this example.
  1. Run aso auth and complete Apple ID + password + 2FA in terminal
Notes:

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 | Sets primary App ID used for popularity requests |

Supported flags

  • --country : currently US only
  • --primary-app-id : saved locally for future runs
  • --min-popularity : filters out low-popularity keywords before enrichment
  • --max-difficulty : filters out high-difficulty keywords after enrichment
  • --app-id : associates keywords to this local app id (default: research)
  • --exclude-existing: skips keywords already associated with the target app/country before evaluation
  • --no-associate: skips app-keyword association writes for the current aso keywords run
Association behavior for aso keywords:
  • Association writes happen only after a successful command return.
  • Without filters, requested keywords are associated.
  • With --min-popularity and/or --max-difficulty, only accepted items are associated.
  • With --exclude-existing, already associated keywords are returned in filteredOut with reason="already_associated" and are not re-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 "" --stdout is the machine-readable contract.

  • Success: exit code 0, stdout contains exactly one JSON object with:
- items - failedKeywords - filteredOut
  • Failure: exit code != 0, stdout contains exactly one JSON object with:
- error.code (CLI_VALIDATION_ERROR or CLI_RUNTIME_ERROR) - error.message - optional error.help
  • In --stdout mode, CLI logs and prompts are kept off stdout so 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 when omitted; accepts explicit values from 0 to 100
  • maxDifficulty = 70
  • excludeExisting = false; set true to return only keywords not already associated with the target app/country
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

NeshDevTech

NeshDevTech is a professional technology firm passionate about creating innovative, high-performance web and mobile solutions.

Core Services
  • Custom Laravel Apps
  • SPA (React & Vue.js)
  • Flutter Mobile Apps
  • SEO & Performance Opt
Get in Touch
Available for Projects

Need a high-performing system? Let's discuss your project.


© 2026 NeshDevTech. All rights reserved.

Built with

Chat with me