MCP server exposing App Store keyword intelligence — difficulty, popularity, and live rank — to any MCP client. The GUI-free companion to the Kranked ASO app.
Project description
Kranked MCP
An MCP server that exposes App Store keyword intelligence — keyword difficulty, popularity, and live rank — as tools any MCP client (Claude, etc.) can call. It's the headless companion to the Kranked ASO app: same scoring, no GUI.
Stateless and zero-config: every tool is a live call to Apple's public endpoints (the
iTunes Search API and search-hints). No database, no API keys. Runs locally via uvx
or as a hosted server.
Tools (free / open core)
| Tool | What it answers |
|---|---|
search_apps |
Find apps (and their app_id) matching a term |
check_keyword |
One-shot report: difficulty + popularity + KEI + competitors, and your app's rank |
keyword_difficulty |
How hard a keyword is to rank for (0–100), with the top-10 competitors |
keyword_popularity |
How searched a keyword is (suggest-based 20/50/80) |
keyword_suggestions |
Apple's autocomplete hints for a seed term |
All tools take a two-letter country (default us).
Premium (hosted):
popular_keywords— top most-searched keywords by category with real Apple Search Ads popularity (0–100) — is available on the hosted service, not in this open-source package.
How the scores work
- Difficulty (0–100) — analyzes the top-10 ranking apps' review volume and rating quality. More established competitors = harder. Labeled Very Easy → Very Hard.
- Popularity (20/50/80) — whether Apple auto-suggests the term (exact / related /
neither). For real ASA popularity numbers, use
popular_keywords. - KEI — Keyword Efficiency Index = popularity / difficulty. Higher is a better bet.
Install
Once published to PyPI, no clone needed — uvx runs it on demand. Add to your MCP
client config:
{
"mcpServers": {
"kranked": {
"command": "uvx",
"args": ["kranked-mcp"]
}
}
}
For Claude Code: claude mcp add kranked -- uvx kranked-mcp
Local / development
git clone https://github.com/akoskomuves/kranked-mcp
cd kranked-mcp
uv sync
Point your client at the local checkout:
{
"mcpServers": {
"kranked": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/kranked-mcp", "run", "kranked-mcp"]
}
}
}
Run the tests (they hit live APIs, so they can be flaky under rate limiting):
uv run pytest
Self-hosting (remote MCP)
Kranked runs in two modes from the same code:
| Mode | Transport | Use | Command |
|---|---|---|---|
| Local | stdio | one user, on your machine | kranked-mcp |
| Hosted | streamable-HTTP at /mcp |
shared server, many users | kranked-mcp-serve |
The hosted server is stateless (stateless_http), so it scales horizontally. Deploy the
included Dockerfile to any container host (Railway, Fly, Render, …); it reads PORT from
the environment and exposes GET /health for liveness checks.
Deploy to Railway
The repo ships a railway.toml (Dockerfile build, /health healthcheck). To deploy:
# one-time
npm i -g @railway/cli && railway login
# from the repo root
railway init # create/select a project
railway up # build the Dockerfile and deploy
railway domain # get a public https URL
Or connect the GitHub repo in the Railway dashboard — it picks up railway.toml automatically.
Set KRANKED_CACHE_TTL in the service's Variables if you want a longer/shorter cache.
Then point a client at the URL:
claude mcp add --transport http kranked https://your-app.up.railway.app/mcp
Config
| Env var | Default | Purpose |
|---|---|---|
PORT / HOST |
8000 / 0.0.0.0 |
bind address |
KRANKED_CACHE_TTL |
3600 |
seconds to cache upstream responses (0 disables) |
KRANKED_CACHE_MAX |
2000 |
max cached entries |
Caching is not optional for a hosted deployment. All users' requests leave from one IP, so without it you hit Apple's/Astro's per-IP throttle immediately. Difficulty/popularity change slowly, so cached results stay useful for hours. For multiple instances, move the cache to Redis.
Roadmap (paid tier): the hosted server is free and open at launch. API-key auth + usage metering are the intended gate for a paid tier. The popularity data source is isolated in
popularity.pyso it can be swapped to a first-party Apple Search Ads feed before monetizing.
Rate limiting
The iTunes API throttles unauthenticated callers per IP with a 403/429 and a non-JSON body. The server serializes requests through a global throttle and retries throttles with exponential backoff + jitter, so it degrades gracefully instead of surfacing bogus decoding errors.
License
MIT © Akos Komuves
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kranked_mcp-0.1.0.tar.gz.
File metadata
- Download URL: kranked_mcp-0.1.0.tar.gz
- Upload date:
- Size: 15.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d7ac7fdac377142c85489f8ff9f7d744144b3333da424958207409af1cc85c9
|
|
| MD5 |
540fd3aa2b43c7d7d4d3109f74fd3817
|
|
| BLAKE2b-256 |
5846a862114ed4d6a3149cb220a519259b158cf1ef8e7418478080ccaf6189ce
|
File details
Details for the file kranked_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: kranked_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e23641e60f54f01f25b164f089f23ebea12d0d31585501f07dc85c1eb553cdb9
|
|
| MD5 |
157322cf10934876d0a74f6ec4a257cf
|
|
| BLAKE2b-256 |
3811c57b4fa22457810856a1f899748a9e3b44a1cd4703825ce2e154d697529d
|