Measure AI search visibility: start reports, read results and the ranked plan.
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.
Batch read: send a list of report ids and get each report (or its error) in one answer, instead of one call per report. Each result has its own status, so one unknown id does not fail the rest. Read-only. Needs login with scope reports:read.
Report ids to read, 1 to 25.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://www.moatlight.com/mcp
Tool list last changed Nov 5, 2026.
Batch read: send a list of report ids and get each report (or its error) in one answer, instead of one call per report. Each result has its own status, so one unknown id does not fail the rest. Read-only. Needs login with scope reports:read.
| Argument | Type | Description |
|---|---|---|
| report_ids* | array | Report ids to read, 1 to 25. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"report_ids"
],
"properties": {
"report_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Report ids to read, 1 to 25."
}
}
}Creates a report draft for a website and starts reading it. Free plan: one website, one report every 30 days. Returns 202 Accepted with the report, a job object and a Location header: poll that URL (GET /api/v1/reports/{reportId}) every few seconds until stage is needs_confirmation, then call the start endpoint. Send an Idempotency-Key header so a retry cannot start a second report. Needs login with scope reports:write.
| Argument | Type | Description |
|---|---|---|
| country | string | Optional two-letter country. Send with language, or omit both to detect from the site. |
| website* | string | The website to measure, like yourcompany.com. Public sites only. |
| language | string | Optional language for that country. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"website"
],
"properties": {
"country": {
"type": "string",
"description": "Optional two-letter country. Send with language, or omit both to detect from the site."
},
"website": {
"type": "string",
"description": "The website to measure, like yourcompany.com. Public sites only."
},
"language": {
"type": "string",
"description": "Optional language for that country."
}
}
}Returns the user's plan (free or early_access), when the pass ends, what the plan allows, and how to upgrade. Needs login with scope account:read.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}Score, grade, layer breakdown and ranked fixes from the newest scan of the report's website. Needs the Early Access pass; otherwise 402 with a link a person can open to buy it. Needs login with scope agent-readiness:read.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
| reportId* | string | Report id from POST /api/v1/reports or GET /api/v1/reports. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}The free plan and the one-time Early Access pass: price, what each includes, refund window. Payment needs a person in a browser. No login. No login needed.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}Facts about the product: what it does, who it is for, what it does not do, and how an agent can use it. No login. No login needed.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}While stage is needs_confirmation it returns the business profile and the proposed buyer questions. While running it returns progress. When finished it returns visibility numbers, the brands AI named, and a count of lost questions. Needs login with scope reports:read.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
| reportId* | string | Report id from POST /api/v1/reports or GET /api/v1/reports. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}For a finished report: up to three ranked moves (reason, exact edit, page, effort) and, for each buyer question AI answered with a rival, who won and why. Needs login with scope reports:read.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
| reportId* | string | Report id from POST /api/v1/reports or GET /api/v1/reports. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}Shows the shape of a real report (visibility numbers, rivals, ranked plan) for a fictional coffee roaster. Made-up data, no login. No login needed.
| Argument | Type | Description |
|---|---|---|
| fields | string | Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}Every FAQ question and answer from the home page, paged. No login. No login needed.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Items per page, 1 to 50. Default 20. |
| cursor | string | Opaque cursor: send next_cursor from the previous page unchanged. Omit for the first page. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Items per page, 1 to 50. Default 20."
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "Opaque cursor: send next_cursor from the previous page unchanged. Omit for the first page."
}
}
}The user's reports, newest first, paged with a cursor. Each has its stage (analyzing, needs_confirmation, running, finished, failed). Needs login with scope reports:read.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Items per page, 1 to 50. Default 20. |
| cursor | string | Opaque cursor: send next_cursor from the previous page unchanged. Omit for the first page. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Items per page, 1 to 50. Default 20."
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "Opaque cursor: send next_cursor from the previous page unchanged. Omit for the first page."
}
}
}Runs, or reuses a result under 24 hours old, for the report's website. Set force to true to scan again after fixing something. Rate limited. Needs login with scope agent-readiness:scan.
| Argument | Type | Description |
|---|---|---|
| force | boolean | Scan again even if a recent result exists. |
| reportId* | string | Report id from POST /api/v1/reports or GET /api/v1/reports. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"force": {
"type": "boolean",
"description": "Scan again even if a recent result exists."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}Accepts the proposed business profile and buyer questions (optionally a chosen subset of 3 to 6 question ids) and starts asking the AI engines. Takes about two minutes: answers 202 Accepted with a Location header to poll until stage is finished. Safe to repeat; send an Idempotency-Key header to make a retry return the first answer. Needs login with scope reports:write.
| Argument | Type | Description |
|---|---|---|
| reportId* | string | Report id from POST /api/v1/reports or GET /api/v1/reports. |
| question_ids | array | Ids of the 3 to 6 questions to ask. Omit to keep the proposed selection. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
},
"question_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of the 3 to 6 questions to ask. Omit to keep the proposed selection."
}
}
}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 5, 2026.
What changed in this server's tools since we started watching, newest first. Each change is scanned again.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}Accepts the proposed business profile and buyer questions (optionally a chosen subset of 3 to 6 question ids) and starts asking the AI engines. Takes about two minutes.minutes: answers 202 Accepted with a Location header to poll untilSafe to Needs login with scope reports:write.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reportId"
],
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
},
"reportId": {
"type": "string",
"description": "Report id from POST /api/v1/reports or GET /api/v1/reports."
}
}
}Batch read: send a list of report ids and get each report (or its error) in one answer, instead of one call per report. Each result has its own status, so one unknown id does not fail the rest. Read-only. Needs login with scope reports:read.
Creates a report draft for a website and starts reading it. Free plan: one website, one report every 30 days. Returns 202 Accepted with the report;report, a job object and a Location header: poll GETthat /api/v1/reports/{reportId}URL until stage is needs_confirmation, then call the start endpoint. Needs login with scope reports:write.
The user's reports, newest first, eachpaged with a cursor. Each has its stage (analyzing, needs_confirmation, running, finished, failed). Needs login with scope reports:read.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Items per page, 1 to 50. Default 20."
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "Opaque cursor: send next_cursor from the previous page unchanged. Omit for the first page."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}Every FAQ question and answer from the home page.page, paged. No login. No login needed.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Items per page, 1 to 50. Default 20."
},
"cursor": {
"type": "string",
"maxLength": 500,
"description": "Opaque cursor: send next_cursor from the previous page unchanged. Omit for the first page."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"fields": {
"type": "string",
"maxLength": 200,
"description": "Comma-separated top-level fields to return, for example fields=id,stage. Omit to get everything. Spend fewer tokens by asking for less."
}
}
}