Last updated: September 22, 2026
The ChiliASO by Lovemobile MCP server connects your ChiliASO account to an AI assistant that supports the Model Context Protocol. Once connected, you ask about apps, keywords, search positions, ratings and reviews in plain language, and the assistant retrieves the data through the server.
This page covers what the server does, how to connect it, every tool it exposes, and the limits of the data it returns.
MCP server URL
You need two things:
You do not need an API key. Access is granted through OAuth when you connect.
You do not need to add your apps first. Apps and search terms enter your account through the connector itself, as a side effect of the questions you ask — see What the connector writes.
https://chiliaso.lovemobile.com/.The server uses OAuth 2.0 with PKCE (S256). You authorise access on a ChiliASO by Lovemobile page, so your password is never passed to the assistant. The client receives an access token and a refresh token and uses them to call the server on your behalf.
To disconnect, remove the server in your client. The tokens it holds stop being used, and the assistant can no longer call the server for you. Data already shown in past conversations stays with your assistant's provider under that provider's terms.
| Item | Value |
|---|---|
| Server URL | https://chiliaso.lovemobile.com/ |
| Protocol | Model Context Protocol, remote server |
| Transport | Streamable HTTP |
| Authorisation | OAuth 2.0 Authorization Code + PKCE (S256) |
| Client registration | Dynamic client registration |
| Scope | One ChiliASO account per connection |
The server supports four stores. They are referred to by store_type in every tool:
store_type |
Store |
|---|---|
ios |
Apple App Store |
android |
Google Play |
app_gallery |
Huawei AppGallery |
rustore |
RuStore |
The four are not equivalent. Each supports a different subset of the data:
| Store | App metadata | Positions | Search volume | Suggestions | Rating history | Reviews |
|---|---|---|---|---|---|---|
| App Store | yes | top 100 | popularity index 0–100 | yes | yes | yes |
| Google Play | yes | top 250 | monthly searches | yes | yes | yes |
| AppGallery | yes | top 250 | not collected | not collected | yes | not collected |
| RuStore | yes | top 250 | not collected | not collected | yes | yes |
Where a cell says “not collected”, the tool returns an empty result for that store. That empty result describes the store's coverage, not the app.
Stores are combined with countries, given as ISO 3166-1 alpha-2 codes in lowercase: ca, us, gb, de. Uppercase codes are rejected. The same app can rank differently in different countries, and each app × store × country combination is handled separately.
Apps are identified by store_id: a numeric string on the App Store (284882215), the package name on Google Play and RuStore (com.spotify.music), and a C-prefixed code on AppGallery.
The server exposes seven tools. Every tool requires country, and every tool except search_apps requires a store: pass store_type. (platform is accepted as a deprecated alias for store_type and will be removed — use store_type in new integrations.)
Dates are YYYY-MM-DD calendar dates in the server's time zone, UTC+03:00.
search_appsFinds apps already present in your account, by name or bundle ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
query |
string | no | Bundle ID, app name or part of a name, case-insensitive. Omit to list everything in the account |
offset |
integer | no | Pagination offset, default 0. Pass next_offset from the previous response for the next page |
Returns: total_records, total_apps_count, next_offset (absent on the last page) and apps[], each carrying app_id, store_id, bundle_id, name, category, country and store_type.
Results come 10 per page. Pagination counts records, where one record is one app × store × country — an app tracked in three countries is three records, one app.
Use store_id when passing an app to another tool. app_id is internal and no other tool accepts it.
This tool searches your account, not the store. To look up an app you have never asked about, call get_app with its store_id.
get_appReturns store metadata for one app.
| Parameter | Type | Required | Description |
|---|---|---|---|
store_id |
string | yes | The app's identifier in the store |
country |
string | yes | ISO 3166-1 alpha-2, lowercase |
store_type |
string | yes | ios, android, app_gallery or rustore |
Returns: store_id, bundle_id, name, developer_name, category, description, rating_value, rating_count, app_url, store_icon_url, size, price, currency, in_store, country, store_type and data_collected_at.
in_store: false means the app has been removed from the store or banned. Such an app will have no fresh positions, reviews or rating data.size is the download size in bytes. It is not collected on Google Play, where the field is always 0.price and currency are the app's own store price; price: 0 means free.data_collected_at is when the metadata — title, description, developer, category, icon — was last collected. rating_value and rating_count refresh on their own schedule, so a data_collected_at older than the rating is normal.description is the full store description and can run to several kilobytes.list_keywordsReturns the search terms tracked for one app in one country and store.
| Parameter | Type | Required | Description |
|---|---|---|---|
store_id |
string | yes | The app's identifier in the store |
country |
string | yes | ISO 3166-1 alpha-2, lowercase |
store_type |
string | yes | ios, android, app_gallery or rustore |
Returns: keywords[], each with id, name, country, store_type, frequency, popularity, historic_frequency and historic_popularity.
frequency and popularity are the latest available snapshot, not an average over a period. See Metrics and scales for the historic_* fields.keywords[] means either that nothing is tracked for this app, or that the app is not listed on this store at all.get_positionsReturns search positions and volume over a date range.
| Parameter | Type | Required | Description |
|---|---|---|---|
keywords |
array of strings | yes | Search terms, 100 maximum per request |
country |
string | yes | ISO 3166-1 alpha-2, lowercase |
from_date |
string | yes | Range start, YYYY-MM-DD |
to_date |
string | yes | Range end, YYYY-MM-DD |
store_type |
string | yes | ios, android, app_gallery or rustore |
store_id |
string | no | When given, the response also includes this app's own position even if it falls outside the requested top. When omitted, top is required |
top |
integer | no | How many top positions to return per term, 1 to 25 |
Returns: positions[], one row per term per date, each with name, parsed_at (the date), frequency, popularity and positions — a map of store_id to position. Terms that have no position data yet come back separately in added_keywords.
store_id is given, requested terms that are not yet tracked are added automatically, and the app is added too if it is not in the account. Newly added terms come back in added_keywords; their position data becomes available within a few minutes.positions even though history exists. Repeat the call.positions map contains store IDs only, with no names. Your own app appears in the same map alongside the others. Resolving the other IDs through get_app will add those apps to your account.top above 25 is clamped to 25, and the response does not say so.store_type. When results from several stores are in play, track which call each set came from.fetch_suggestionsReturns the store's own autocomplete suggestions for one seed term.
| Parameter | Type | Required | Description |
|---|---|---|---|
keyword |
string | yes | Seed search term |
country |
string | yes | ISO 3166-1 alpha-2, lowercase |
store_type |
string | yes | ios or android — see note |
Returns: suggestions[] — the terms the store proposes around the seed.
get_positions or list_keywords.get_app_rating_historyReturns daily rating snapshots over a date range.
| Parameter | Type | Required | Description |
|---|---|---|---|
store_id |
string | yes | The app's identifier in the store |
country |
string | yes | ISO 3166-1 alpha-2, lowercase |
from_date |
string | yes | Range start, YYYY-MM-DD |
to_date |
string | yes | Range end, YYYY-MM-DD |
store_type |
string | yes | ios, android, app_gallery or rustore |
Returns: one row per date with date, rating (rounded to hundredths) and rating_by_stars.
rating_by_stars is the store's own counter of how many ratings sit at each star value, snapshotted daily. It is a running total, not the count for that day: the difference between two dates is what came in between them.
list_reviewsReturns the most recent user reviews for one app.
| Parameter | Type | Required | Description |
|---|---|---|---|
store_id |
string | yes | The app's identifier in the store |
country |
string | yes | ISO 3166-1 alpha-2, lowercase |
store_type |
string | yes | ios, android or rustore — see note |
limit |
integer | no | Number of most recent reviews, 1 to 200. Default 30 |
Returns: reviews[], each with id, rating, title, text, author_name, country, language, first_known_published_at, actual_published_at, external_deleted_at and developer_response (an object with text, external_id and external_updated_at, or null).
external_deleted_at is set when the review has been deleted in the store. Deleted reviews stay in the response on purpose: that a review existed and was then removed is information in itself.first_known_published_at and actual_published_at are usually identical. They diverge when a review has been edited — the store then reports the edit date as the publication date, and that is what actual_published_at carries, while first_known_published_at keeps the date the review was first seen. A gap between them means the review was edited after publication.The connector does not change anything in the stores, does not act on your behalf outside ChiliASO, and never deletes anything. It does add records to your own ChiliASO account, and three tools do so:
| Tool | What it adds |
|---|---|
get_app |
Registers the app if it is not already in your account |
get_positions |
Registers requested search terms that are not tracked, and the app if needed |
list_keywords |
Adds search terms that were not being tracked at the time of the request |
This is how data collection starts: an app or a term has to be registered before ChiliASO can collect data for it and return it to you. Registration is what makes the next question about that app answerable.
Two consequences worth knowing:
get_positions returns for the apps ranking around yours.search_apps, fetch_suggestions, get_app_rating_history and list_reviews only read.
The rank of an app in store search results for a term on a date, tracked daily. Lower is better; position 1 is the first result.
Tracking depth differs by store: top 100 on the App Store, top 250 on the other three. A position beyond that depth, or null, means the app was not visible in search for that term on that date — not that the term has no data.
How often people search for a term. It is reported differently by store:
popularity, an index from 0 to 100.frequency, an estimate of monthly searches.Both trace back to the same source: keyword popularity as Apple Search Ads reports it. On Google Play the monthly-search figure is computed from it.
In October 2025 Apple stopped reporting popularity for low-popularity keywords. For a term affected by that change, the live popularity and frequency fields lose their meaning, and the last value from before the change is kept separately — historic_popularity on the App Store, historic_frequency on Google Play. A term with a historic value and no live value is a low-volume term, and its historic figure describes the past, not today.
Search volume is not collected on AppGallery or RuStore.
rating_value in get_app is the app's current store rating. get_app_rating_history returns the same value day by day, plus rating_by_stars — the store's own counters per star value, snapshotted daily.
These work on a fresh account, with nothing set up in advance.
Where an app ranks, and how the position moved
Where does Duolingo rank for "learn spanish" in the US App Store, and how did the position move over the last two weeks?
What reviewers complain about
Read the latest reviews of app 1609833428 in the US App Store and tell me what people complain about repeatedly. Note anything that was deleted.
Competitors on the same query
For the query "language learning" in the US App Store, show me the top 10 apps day by day over the last month, and tell me which of them gained or lost ground.
| Limit | Value |
|---|---|
Search terms per get_positions call |
100 |
top per get_positions call |
25 (higher values are clamped) |
Reviews per list_reviews call |
200 (default 30) |
Apps per search_apps page |
10 |
| Position tracking depth | top 100 (App Store), top 250 (other stores) |
| Country code format | ISO 3166-1 alpha-2, lowercase only |
| Date format | YYYY-MM-DD, calendar dates in UTC+03:00 |
There is no request quota and no per-call charge on the connector.
Errors come back as messages describing what was wrong with the request — an unknown store, a malformed country code, an app that could not be found in the store.
An empty response is not an error, and it rarely means “there is nothing there”. What it usually means:
| Tool | Empty response | What it can mean |
|---|---|---|
search_apps |
apps: [] |
The account has no apps yet, or none match the query |
list_keywords |
keywords: [] |
Nothing tracked for this app, or the app is not on this store |
get_positions |
positions: [] with added_keywords |
The terms were just linked. Repeat the call |
get_positions |
positions: [] without added_keywords |
No data for the range, or the dates were malformed |
get_app_rating_history |
empty rows | No rating data for the range, or the dates were malformed |
fetch_suggestions |
suggestions: [] |
The store returned nothing, or suggestions are not collected for this store |
list_reviews |
reviews: [] |
Reviews not collected for this store, or collection not connected for this app |
Malformed dates are not rejected. A date in the wrong format, or a range whose start is later than its end, returns an empty result rather than an error. If a date-ranged call comes back empty, check the dates first.
Check that the URL is exactly https://chiliaso.lovemobile.com/ and that the sign-in window completed. Removing and re-adding the server restarts the authorisation.
Asking about an app registers it — see What the connector writes. This includes competitors you asked about and apps whose store IDs were resolved from a positions response.
Terms added during a call need a few minutes before position data is available. Ask again.
Check the store and country in the question. Positions are tracked per app, per country, per store, and a term tracked in one country has no data in another. Also check the tracking depth: beyond the top 100 on the App Store, or the top 250 elsewhere, the app is reported as not visible.
Low-volume terms have not been reported by the source since October 2025. The last known figure is kept in historic_popularity or historic_frequency. See Metrics and scales.
Reviews are not collected on AppGallery. On the other stores, review collection may not yet be connected for that app — contact support.
That is the client's permission model, not a server setting. Clients treat tools that write differently from tools that only read, and three of these tools register apps and search terms.
Your assistant sends the server the parameters of each request — app identifiers, search terms, store, country and date ranges — and receives the results. The server does not receive the text of your conversation, and does not read your assistant's memory, chat history, summaries or uploaded files.
The apps and search terms your requests refer to are recorded in your ChiliASO account, which is what allows data to be collected for them.
Reviews returned by list_reviews are published by the app stores and can include the display name the store shows for the review's author.
Full details: Privacy Policy.
Write to us for account or data deletion, to remove an app or a search term from your account, or to connect review collection for an app.