Scores whether a business's Google Maps reviews are genuine. Your agent collects them, we judge.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Reserves a submission and returns an upload_url. POST the complete JSON payload (format from describe_review_source) to it from your own environment or the user's browser; the HTTP response is the trust report. The URL is a secret that completes the submission under YOUR identity whoever posts to it, so the POST needs no key. Alternatively feed the same submission_id to submit_reviews in inline chunks. Pending submissions expire after 2 hours (or are closed as superseded when you one-shot the same place instead).
Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first.
Your agent/product name, recorded as the submission's provenance (e.g. 'Muse', 'Claude Code').
Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL).
The review count the listing shows, if known.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http legitreviews https://legitreviews.ai/mcp
Reserves a submission and returns an upload_url. POST the complete JSON payload (format from describe_review_source) to it from your own environment or the user's browser; the HTTP response is the trust report. The URL is a secret that completes the submission under YOUR identity whoever posts to it, so the POST needs no key. Alternatively feed the same submission_id to submit_reviews in inline chunks. Pending submissions expire after 2 hours (or are closed as superseded when you one-shot the same place instead).
| Argument | Type | Description |
|---|---|---|
| url | string | Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first. |
| agent | string | Your agent/product name, recorded as the submission's provenance (e.g. 'Muse', 'Claude Code'). |
| place_id | string | Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL). |
| platform* | string | |
| expected_reviews | integer | The review count the listing shows, if known. |
{
"type": "object",
"required": [
"platform"
],
"properties": {
"url": {
"type": "string",
"description": "Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first."
},
"agent": {
"type": "string",
"description": "Your agent/product name, recorded as the submission's provenance (e.g. 'Muse', 'Claude Code')."
},
"place_id": {
"type": "string",
"description": "Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL)."
},
"platform": {
"enum": [
"google-maps"
],
"type": "string"
},
"expected_reviews": {
"type": "integer",
"description": "The review count the listing shows, if known."
}
}
}Call first. Resolves a Google Maps link or place_id and reports whether a trust result is cached, how fresh it is, and a recommendation: use the cached result, or collect and submit the reviews (also when a cached single-source result would benefit from your corroboration). Never contacts Google.
| Argument | Type | Description |
|---|---|---|
| url | string | Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first. |
| place_id | string | Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL). |
{
"type": "object",
"required": [],
"properties": {
"url": {
"type": "string",
"description": "Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first."
},
"place_id": {
"type": "string",
"description": "Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL)."
}
}
}Read this BEFORE scraping. Returns, per platform, the exact submission format: identity fields for the listing, the per-review fields (required vs optional; everything required is visible on the review card), where each lives on the platform's pages, the sort-by-newest and 500-most-recent rules, an example payload, and how to deliver it. Without a platform it lists the supported platforms. Only Google Maps exists today.
| Argument | Type | Description |
|---|---|---|
| platform | string | Platform to describe (default: all). |
{
"type": "object",
"required": [],
"properties": {
"platform": {
"enum": [
"google-maps"
],
"type": "string",
"description": "Platform to describe (default: all)."
}
}
}For a submission fed by inline chunks: validates, scores, stores and returns the report. For one already uploaded to its upload_url: returns the stored report. Pending with nothing uploaded yet: says so.
| Argument | Type | Description |
|---|---|---|
| submission_id* | string |
{
"type": "object",
"required": [
"submission_id"
],
"properties": {
"submission_id": {
"type": "string"
}
}
}The cached fraud analysis for a place: verdict (looks_legit / not_sure / past_manipulation / inflated / manipulated) with its label and a one-sentence summary, letter grade, 0-100 trust score, the adjusted rating credible reviewers actually give (vs the headline average), reviewer-mix tiers, review-injection statistics, cross-business duplicate-review evidence, red flags, and provenance. Cache only: on a miss, collect and submit the reviews (see check_place).
| Argument | Type | Description |
|---|---|---|
| url | string | Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first. |
| place_id | string | Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL). |
{
"type": "object",
"required": [],
"properties": {
"url": {
"type": "string",
"description": "Alternative to place_id: a Google Maps place link (long /maps/place/… URL or ?cid= link). Share short-links cannot be resolved; open them first."
},
"place_id": {
"type": "string",
"description": "Google's feature id for the place (0x…:0x…, the '!1s' segment of a /maps/place URL)."
}
}
}The ranked directory of places already analyzed for review fraud, best adjusted rating first (what the site's home and city pages show). 25 per page. Optional city or curated-list filter; the response lists the available cities/lists and their counts.
| Argument | Type | Description |
|---|---|---|
| city | string | Limit to one city's places (a slug from the `cities` field of a previous response). |
| list | string | Limit to one curated list's places. |
| page | number | Page number, 0-based. |
{
"type": "object",
"required": [],
"properties": {
"city": {
"type": "string",
"description": "Limit to one city's places (a slug from the `cities` field of a previous response)."
},
"list": {
"enum": [
"hcmc-foodies"
],
"type": "string",
"description": "Limit to one curated list's places."
},
"page": {
"type": "number",
"description": "Page number, 0-based."
}
}
}Submit the review feed inside the tool call. Without submission_id this is a one-shot submission of the whole payload (fine up to about 150 reviews). For more, call begin_submission, then send chunks of up to 150 reviews each with the same submission_id and final=false; send final=true with the last chunk (the identity fields may arrive with any chunk). Use this only when you cannot POST to the upload_url yourself (no page fetch, no curl): retyping reviews you already hold in a page or script is slow and error-prone. Returns the trust report when finalized.
| Argument | Type | Description |
|---|---|---|
| cid | string | Decimal cid from a ?cid= link, when placeId is unknown. |
| lat | number | |
| lon | number | |
| name | string | |
| sort | string | The order collected in: 'newest' (required for a window) or 'relevant'. |
| agent | string | Your agent/product name, recorded as the submission's provenance (e.g. 'Muse', 'Claude Code'). |
| final | boolean | With submission_id: true when this is the last chunk (default true). |
| capped | boolean | True when deliberately stopped at 5000+ reviews of a much larger listing. |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 3, 2026.
| address |
| string |
| mapsUrl | string |
| placeId | string | Google feature id 0x…:0x… |
| reviews | array |
| complete | boolean | True only if the review list reached its end; false for a newest-first window of the 500 most recent reviews (at least 200). |
| platform | string | Which review source the data follows (describe_review_source). |
| pulledAt | string | ISO 8601 datetime of collection (relative dates are resolved against it). |
| listedRating | number | The star rating Google displays. |
| listedReviews | integer | The review count Google displays on the listing. |
| submission_id | string | From begin_submission (omit for a one-shot submission). |
| ratingHistogram | array | The five-bar rating histogram next to the star rating, as review counts for 1, 2, 3, 4 and 5 stars IN THAT ORDER (Google draws 5 stars first; reverse what you read). Each bar's accessibility label or tooltip has the exact count. Required with a window or capped feed. |
{
"type": "object",
"required": [],
"properties": {
"cid": {
"type": "string",
"description": "Decimal cid from a ?cid= link, when placeId is unknown."
},
"lat": {
"type": "number"
},
"lon": {
"type": "number"
},
"name": {
"type": "string"
},
"sort": {
"type": "string",
"description": "The order collected in: 'newest' (required for a window) or 'relevant'."
},
"agent": {
"type": "string",
"description": "Your agent/product name, recorded as the submission's provenance (e.g. 'Muse', 'Claude Code')."
},
"final": {
"type": "boolean",
"description": "With submission_id: true when this is the last chunk (default true)."
},
"capped": {
"type": "boolean",
"description": "True when deliberately stopped at 5000+ reviews of a much larger listing."
},
"address": {
"type": "string"
},
"mapsUrl": {
"type": "string"
},
"placeId": {
"type": "string",
"description": "Google feature id 0x…:0x…"
},
"reviews": {
"type": "array",
"items": {
"type": "object",
"required": [
"rating",
"author",
"authorReviewCount"
],
"properties": {
"date": {
"type": "string",
"description": "The relative date as displayed, in English ('3 months ago', 'Edited 2 weeks ago'; translate it to that form yourself if your Google is not in English). Required unless timestamp is given."
},
"text": {
"type": "string",
"description": "Original-language text; omit for star-only reviews."
},
"author": {
"type": "string",
"description": "Reviewer display name as shown."
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 1
},
"source": {
"type": "string",
"description": "Platform the card attributes the review to, on listings that show several (hotels). Send Google reviews only; others are dropped."
},
"language": {
"type": "string"
},
"reviewId": {
"type": "string",
"description": "Optional: Google's review id (data-review-id on the card)."
},
"authorUrl": {
"type": "string",
"description": "Optional: the reviewer's /maps/contrib/<id> link."
},
"timestamp": {
"type": [
"number",
"string"
],
"description": "Optional: exact posting time, epoch µs/ms/s, when you have it (row[0][1][2])."
},
"photoCount": {
"type": "integer"
},
"isLocalGuide": {
"type": "boolean"
},
"ownerResponse": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"text": {
"type": "string"
}
}
},
"editedTimestamp": {
"type": [
"number",
"string"
],
"description": "Optional: last-edit time in the same units (row[0][1][3]), when present."
},
"authorPhotoCount": {
"type": "integer"
},
"authorReviewCount": {
"type": "integer",
"description": "Lifetime review count shown under the name ('12 reviews')."
}
}
}
},
"complete": {
"type": "boolean",
"description": "True only if the review list reached its end; false for a newest-first window of the 500 most recent reviews (at least 200)."
},
"platform": {
"enum": [
"google-maps"
],
"type": "string",
"description": "Which review source the data follows (describe_review_source)."
},
"pulledAt": {
"type": "string",
"description": "ISO 8601 datetime of collection (relative dates are resolved against it)."
},
"listedRating": {
"type": "number",
"description": "The star rating Google displays."
},
"listedReviews": {
"type": "integer",
"description": "The review count Google displays on the listing."
},
"submission_id": {
"type": "string",
"description": "From begin_submission (omit for a one-shot submission)."
},
"ratingHistogram": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0
},
"maxItems": 5,
"minItems": 5,
"description": "The five-bar rating histogram next to the star rating, as review counts for 1, 2, 3, 4 and 5 stars IN THAT ORDER (Google draws 5 stars first; reverse what you read). Each bar's accessibility label or tooltip has the exact count. Required with a window or capped feed."
}
}
}