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.

1

Sign up

Magic link or Google. Verify your email.

Create an account
2

Choose a plan

Plus or Pro. Billed monthly, cancel renewal any time.

Plan and billing
3

Create a key

Shown once. Plus allows one active key, Pro five.

API keys and setup
4

Connect a client

Claude Code, Cursor, or any Streamable HTTP client.

Connection snippets

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.

Terminalshell
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.

Find Calm on Google Play in the US and show me this week's one-star reviews. Cite the review IDs. Compare the available Duolingo iOS reviews for versions 7.40 and 7.41. Describe the sample limits before drawing conclusions. What feature requests appear in these Spotify reviews? Count mentions only within the reviews you actually read.

Connect Cursor

Set RIVIOO_API_KEY in the environment used to launch Cursor, then add the server to your personal MCP configuration.

~/.cursor/mcp.jsonjson
{
  "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.

ToolWhat it doesQuota
search_appsFind 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_reviewsRetrieve 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_jobPoll a running collection. Wait at least five seconds between polls. Failed jobs need an explicit new fetch; they are not retried automatically.Free
read_reviewsRead 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_usageShow 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.

fetch_reviews argumentsjson
{
  "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_reviews returns 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.
PlanPriceReviews a monthPer requestLive refreshes a dayActive keys
Plus$29 / month10,0002,500201
Pro$99 / month50,0005,000605

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.