---
name: seoaio-report
description: >-
  Write the measured AI-visibility brief for a brand from its live SEOAIO MCP data: what
  is cited, what is held, what to change next, every number with its sample size and
  interval. Use when the user wants a summary, a weekly recap, or asks how visible they
  are in AI search. Trigger on "AI visibility brief", "summarize our answer share", "tldr
  our seoaio report", or when the user asks you to fetch or follow https://seoaio.ai/report/SKILL.md.
version: 2.0.0
homepage: https://seoaio.ai/report/SKILL.md
metadata:
  site: https://seoaio.ai
  setup: https://seoaio.ai/SKILL.md
  mcp: https://app.seoaio.ai/api/mcp
  docs: https://seoaio.ai/docs/tools
---

# SEOAIO: the measured brief

**Start here.** You are reading `https://seoaio.ai/report/SKILL.md`. This file is complete only if its
**last line** is `END SKILL v2.0.0`. If that line is missing, fetch it again.

This is the same job as the dashboard's summary: tell someone how visible their brand is
in AI answers, from their own measured data, without one number that cannot show its
basis. Synthesize the evidence. Invent nothing.

## If MCP is not connected

Fetch `https://seoaio.ai/SKILL.md` and follow its "Connect MCP" section, then come back here.

## Call order (do not skip)

1. `list_assets`: pick the site the user named, by hostname. Never invent an `assetId`.
2. `get_measurement_status`: if `analysis` and `citations` are both `null`, stop.
   Nothing has been measured for this site; say so and point at the dashboard. Otherwise
   note the `ageHours` of each block, `inFlight.count`, and `pendingChangeRequests`.
3. `get_visibility_score`: the composite, or `held: true` with `heldExplanation` and
   `coverage`. The `components` list carries each pillar with its `provenance`.
4. `get_answer_share`: `aggregate` and `engines[]`, each with `value`, `n`,
   `cited`, `interval` and `provenance`.
5. `get_citation_metrics`: the trailing-window counts (`windowDays`, `totalCitations`,
   `ownedCitations`, `citedRuns`, `totalRuns`).
6. `list_findings` and `list_recommendations`: what is happening and what to change
   next.

Do not call any `propose_*` tool from this skill. The brief reads; it does not ask.

## Build REPORT DATA from tool JSON only

Fill this block. A line whose source is `null` reads `not measured`. Never write 0 for
a value that was not measured, and never write a share without its n and interval.

```
REPORT DATA:
Site: <hostname> (<assetId>)
As of: <get_measurement_status.asOf>
Analysis age: <analysis.ageHours>h, or not measured | Citations age: <citations.ageHours>h, or not measured
In flight: <inFlight.count> job(s) | Awaiting approval: <pendingChangeRequests.length>
Stale: true if inFlight.count > 0, else false
Composite: <visibilityScore> (derived), or HELD: <heldExplanation> (<coverage.measured> of <coverage.total> measured)
Pillars, one line each:
- <components[].key>: <value> (<provenance>)
Answer Share:
- aggregate: <value>% (n=<n> prompts, <cited> cited, 95% CI <interval.low> to <interval.high>, <provenance>), or "interval not defined across engines; see engines"
- <engines[].engine>: <value>% (n=<n>, <cited> cited, 95% CI <interval.low> to <interval.high>, <provenance>)
- an engine absent from engines[]: not measured
Citations, trailing <windowDays> days: <totalCitations> total | <ownedCitations> owned | <citedRuns> of <totalRuns> answers cited the site
Findings: <findings.length>; top: <severity> <title> (<provenance>)
Next: <recommendations[0].title> (predicted gain <predictedImpact>, confidence <confidence>)
```

Include the raw tool JSON after the block only if the user asked for it.

## Voice

- Plain, short sentences. Every number sits next to its basis: "cited in <cited> of <n>
  prompts on <engine>, <value>%, 95% CI <low> to <high>".
- Every share arrives with its sample size and a 95% Wilson interval; quote both or quote nothing. Absent is not zero: a value that was not measured says so, and the composite Visibility Score is held until at least 5 of its 7 pillars are measured.
- Say **held** when the composite is held, and quote the measured pillars individually.
  The composite is held until at least 5 of its 7
  pillars are measured.
- Say **not measured** for any `null`; never 0, and never "no visibility".
- Say **estimated** where the provenance says so. An estimate is a model's opinion, not an
  observation, and the reader must be able to tell.
- Say what to change next from `list_recommendations`, and nothing you inferred yourself.
- If `inFlight.count` is above 0, say a run is queued or running and the numbers may be
  about to change. If `pendingChangeRequests` is not empty, say what is already waiting
  for approval at `https://app.seoaio.ai/dashboard/requests`.
- No persona. No greeting. Do not be creative with a measurement.

## Do not

- Convert any share, count or citation into traffic, revenue or a dollar figure. Nothing
  here measures those.
- Project an outcome, promise a ranking, or invent a delta against a period you did not
  read from a tool.
- Quote a share without its n and interval, or an estimate as if it were measured.
- Treat a `null` block as zero, or as a broken connection.
- Call a `propose_*` tool from this skill.
- Paste raw tool JSON as the answer.

## Check before you send

- [ ] Every share line has n and a 95% interval
- [ ] Every value has a provenance
- [ ] Held reported as held; nulls as not measured
- [ ] No dollars, no traffic, no projections, no invented deltas
- [ ] Nothing proposed

END SKILL v2.0.0
