{
  "name": "seoaio-visibility",
  "displayName": "SEOAIO",
  "version": "0.1.0",
  "protocolVersion": "2024-11-05",
  "description": "Read a customer's own measured AI-visibility data: scores with provenance, answer share with its sample size and interval, citations, findings and recommendations. Write tools only queue a change request for a human to approve. Per-customer authentication required; nothing is exposed without it.",
  "url": "https://app.seoaio.ai/api/mcp",
  "transport": "streamable-http",
  "endpoints": {
    "streamable_http": "https://app.seoaio.ai/api/mcp"
  },
  "capabilities": {
    "tools": true,
    "prompts": false,
    "resources": false
  },
  "authentication": {
    "required": true,
    "methods": [
      "oauth2",
      "api_key"
    ],
    "oauth2": {
      "authorization_server": "https://app.seoaio.ai",
      "authorization_server_metadata": "https://app.seoaio.ai/.well-known/oauth-authorization-server",
      "protected_resource_metadata": "https://app.seoaio.ai/.well-known/oauth-protected-resource"
    }
  },
  "instructions": "Call list_assets first; every other tool needs an assetId from it. Then call get_measurement_status to learn how fresh the data is and whether anything is queued, running or already awaiting approval. 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. The only writes are propose_competitor, propose_fact, propose_measurement, propose_prompt and propose_remove_competitor, and every one of them queues a change request for a human to approve rather than changing anything. Nothing here sends email, charges a card, edits your site, or spends money on an engine call. No tool starts a run, reads history, or subscribes to anything; propose_measurement only queues a request for a human. Do not invent a tool name: the list from tools/list is complete. Read the skill at https://seoaio.ai/SKILL.md before quoting a number.",
  "tools": [
    {
      "name": "get_answer_share",
      "description": "Get the north-star Answer Share for an asset (share of AI-engine answers citing the brand), aggregate + per engine, each with provenance (measured / estimated / mixed).",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_citation_metrics",
      "description": "Citation headline metrics for an asset over a trailing window: total citations, cited-run counts and owned-citation counts from real engine answers. Raw measured aggregates; absent inputs mean not measured.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_crawler_activity",
      "description": "Observed AI-crawler hits on an asset over the last 30 days (FI-262): which bots fetched which pages, aggregated per day. Real server-reported hits, never estimated; empty means no collector data, not zero traffic.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_measurement_status",
      "description": "How fresh an asset's data is and whether anything is in flight: the age of the latest analysis and citation snapshots, the last real answer per engine, jobs queued or running now, and the change requests already waiting for a human. Call it before quoting a number as current, and before proposing anything, so you do not propose the same thing twice. A null snapshot means not measured, never zero.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_visibility_score",
      "description": "Get the latest Visibility Score for an asset, with its component breakdown and each value's provenance (measured / estimated / derived).",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_assets",
      "description": "List the Visibility Assets in YOUR organization, with their id and hostname. Call this first: every other tool needs an assetId.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_cited_passages",
      "description": "The passages AI engines actually quoted from the brand's own pages in sampled answers: passage, URL, title, how many times it was quoted, on which engines, best position. Most quoted first. This is what engines quote FROM you; how they describe you in their own words is not stored, so it is not measured here.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_competitors",
      "description": "The competitors tracked on an asset and, per engine, how many sampled answers cited the rival where the brand was not cited, as a share with its n and Wilson interval. Call it before propose_competitor, so you do not propose one that is already tracked. An empty list is a fact about the tracked set, not a measurement.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_findings",
      "description": "List the findings from the latest analysis of an asset (what is happening and why).",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_prompt_outcomes",
      "description": "Per tracked question, what the engines did in the current sweep: cited (used one of your pages as a source), named (mentioned you, sourced elsewhere), category-only (answered the category and named a competitor instead of you) or absent. Each question carries n (answers pooled), the counts, the cited share with its Wilson interval, and the split per engine. Worst first, so the questions you lose come first. No sweep means not measured, never zero.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_recommendations",
      "description": "List the ranked Action Plan for an asset: each recommendation with its Predicted Visibility Gain, confidence, and status.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_sources",
      "description": "The domains and pages AI answers cite for this asset's questions inside a trailing window, yours and everyone else's: classification (target_owned, competitor_owned, neutral_third_party, unknown), citations, the answers citing the domain as a share of sampled answers with n and a Wilson interval, a URL, a title, best position, engines. Most cited first. Filters: a domain substring, a classification. No sampled answer in the window means not measured, never zero.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "propose_competitor",
      "description": "Propose adding a competitor domain to this asset's tracked set. QUEUES A REQUEST FOR HUMAN APPROVAL; it does not add the competitor. Returns applied:false and a change-request id.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "propose_fact",
      "description": "Propose an owner-declared fact for Answer Accuracy to check AI answers against (e.g. a price, a founding year, a service area). QUEUES A REQUEST FOR HUMAN APPROVAL. A fact nobody with authority confirmed is not a fact.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "propose_measurement",
      "description": "Propose running a fresh measurement for this asset. QUEUES A REQUEST FOR HUMAN APPROVAL; it does not start a run. A sweep spends real money with AI vendors, so a person decides.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "propose_prompt",
      "description": "Propose adding a prompt to the sampled set for this asset. QUEUES A REQUEST FOR HUMAN APPROVAL. Prompts cost money to run on every sweep, which is part of why a person decides.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "propose_remove_competitor",
      "description": "Propose removing a competitor from this asset's tracked set. QUEUES A REQUEST FOR HUMAN APPROVAL; it does not remove anything.",
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    }
  ],
  "skills": [
    {
      "id": "seoaio",
      "url": "https://seoaio.ai/SKILL.md"
    },
    {
      "id": "seoaio-report",
      "url": "https://seoaio.ai/report/SKILL.md"
    },
    {
      "id": "seoaio-fix-loop",
      "url": "https://seoaio.ai/fix-loop/SKILL.md"
    },
    {
      "id": "seoaio-content",
      "url": "https://seoaio.ai/content/SKILL.md"
    }
  ],
  "documentation": "https://seoaio.ai/mcp",
  "toolsDocumentation": "https://seoaio.ai/docs/tools",
  "contact": "contact@seoaio.ai"
}