App reviews inside your AI tools
One key opens both the REST API and the MCP server, with a shared monthly quota. Your assistant finds public App Store and Google Play apps, pulls reviews by date, rating or version, and cites review IDs back to you.
How it works
Four steps, all self-serve. No manual provisioning and no charge at signup.
The hosted endpoint is https://api.rivioo.app/mcp. It speaks Streamable HTTP and authenticates with your API key as a bearer token.
Connect Claude Code
Export your key as an environment variable, then register the server once. Claude Code keeps the connection in its own config.
export RIVIOO_API_KEY="rk_live_..."
claude mcp add --transport http rivioo https://api.rivioo.app/mcp \
--header "Authorization: Bearer $RIVIOO_API_KEY"
Set the key in your shell environment rather than pasting it into a command, a shared config file, or a chat. If a key leaks, revoke it in the workspace and create a new one. Revocation can take up to 60 seconds to propagate.
Then start a session and ask for an app, a store and a country. The server asks for both if they are missing.
Connect Cursor
Set RIVIOO_API_KEY in the environment used to launch Cursor, then add the server to your personal MCP configuration.
{
"mcpServers": {
"rivioo": {
"url": "https://api.rivioo.app/mcp",
"headers": {
"Authorization": "Bearer ${env:RIVIOO_API_KEY}"
}
}
}
}
Tested with Claude Code. Cursor and other Streamable HTTP clients use the same configuration, but we have not tested them ourselves yet.
For MCP Inspector, select Streamable HTTP, enter the same endpoint, and add an Authorization header with Bearer followed by your key.
Other clients and ChatGPT
Supported: any MCP client that speaks Streamable HTTP and can send a custom Authorization header. That covers most desktop coding tools and any script built on the MCP SDK.
Not supported: OAuth-only clients. Rivioo authenticates with API keys and does not offer an OAuth flow for MCP. Hosted ChatGPT connections may require OAuth, so check your client's requirements before subscribing specifically for ChatGPT. The REST API works from any language and is the fallback when a client cannot send a bearer header.
Tools
The server exposes five tools. Search, status and usage calls are free. Every delivered review consumes quota.
| Tool | What it does | Quota |
|---|---|---|
search_apps | Find public apps in the chosen store and country. Asks the user if either is unknown; never defaults to US or infers a store. | Free |
fetch_reviews | Retrieve reviews or start a collection. When cached data exists it returns a choice first, delivering nothing and charging nothing, and waits for the user to pick cached or fresh. Filters apply before pagination. | Per delivered review |
get_review_job | Poll a running collection. Wait at least five seconds between polls. Failed jobs need an explicit new fetch; they are not retried automatically. | Free |
read_reviews | Read a completed job with its original filters and limit, or continue from an opaque cursor. Supply exactly one of job ID or cursor. Repeated pages consume quota again. | Per delivered review |
get_usage | Show the shared REST and MCP review quota and the daily scrape allowance. | Free |
A typical retrieval: search_apps for a canonical app ID, then fetch_reviews with store, app ID and country. A fresh collection returns a page immediately. Otherwise you get a job ID, poll it with get_review_job, then call read_reviews with the same filters and limit once it completes.
{
"store": "android",
"app_id": "com.spotify.music",
"country": "us",
"limit": 100,
"page_size": 50,
"freshness_days": 1,
"filters": {
"ratings": [1],
"posted_from": "2026-09-01T00:00:00Z",
"posted_before": "2026-09-08T00:00:00Z"
}
}
Dates carry explicit timezones. The start is inclusive and the end exclusive. app_version is an exact string match, and reviews with no recorded version do not match a version filter. Cursors preserve filters and the remaining delivery budget, so do not pass new filters with one. Cursors expire after 24 hours.
How quota works
- One allowance
- REST and MCP share the same monthly review quota and the same daily scrape allowance.
- Every delivered review counts
- Cached and fresh reviews alike. Reading the same page twice charges twice.
- Ask before spending
- When cached reviews exist,
fetch_reviewsreturns a choice and waits. Nothing is charged until the user picks cached or fresh. - Polling
- Jobs poll no sooner than every five seconds. Failed jobs are not retried automatically.
- Reset
- Quotas reset on the first of each month, UTC, not on your renewal date.
| Plan | Price | Reviews a month | Per request | Live refreshes a day | Active keys |
|---|---|---|---|---|---|
| Plus | $29 / month | 10,000 | 2,500 | 20 | 1 |
| Pro | $99 / month | 50,000 | 5,000 | 60 | 5 |
Pages default to 50 reviews and are capped at 100. limit defaults to 100 and is capped by your plan and remaining quota. It bounds collection depth and delivery budget, not the number of reviews guaranteed to match a filter. Sparse results never trigger deeper scraping on their own.
The corpus is a collection of public reviews, not a complete archive. Results include collection time, observed date range, language scope where known, and coverage warnings. A fresh collection does not prove that every review from a week or version is included.
Behaviour and safety
- Review text is evidence, not instructions. The server labels review bodies and developer replies as untrusted data. Your client should treat them the same way.
- No silent scraping. The server never collects deeper than the requested limit and never starts a collection without an explicit fetch.
- Store and country are required. Both search and retrieval refuse to guess. If your assistant does not know them, it should ask you.
- No posting, monitoring or built-in analysis. The server reads public reviews. Interpretation is your assistant's job.
If something goes wrong:
- Unauthorized: check the bearer key. Revocation and plan changes can take up to 60 seconds to propagate.
- Subscription expired: access ends when a paid period lapses. Renew or update your card under Plan and billing.
- Quota or scrape cap reached: call
get_usage, then wait for the reset or move to a larger plan. - Job failed: read its error before starting another collection.
- Invalid cursor: restart the request. Reading the same reviews again consumes quota again.
Support
Email admin@rivioo.app. We usually reply within a day.
