Skip to main content
Glama
PROMPTEYE-SP-Z-O-O

prompteye-mcp

Official

List which bot asked for which page

list_crawls
Read-only

One row per path and bot: when that bot first and last asked for the path, how many times, and the status it got the last time.

Instructions

One row per path and bot: when that bot first and last asked for the path, how many times, and the status it got the last time. Unlike list_bot_visits this covers everything since tracking began rather than a period, and is ordered by the last visit.

Coverage rather than volume. A page a bot has never fetched does not appear here at all, and cannot be quoted by that bot however well it answers the question. A lastStatusCode outside the 2xx range is worse than silence: the last thing that bot recorded about the page is that it was broken, and it carries that until it comes back.

Paths are in the same form get_sitemap reports, so an address listed there with no row here is a page nothing has ever come for.

Only the 3 000 most recently visited rows are searched, unless path names one page, which reads all of its rows.

A bot visit is a machine fetching a page, not a person reading one. It is the supply side of visibility: an assistant can only quote a page its bot was able to fetch, so this says whether the site is reachable and readable to them at all. It is a different measurement from being named in an answer (list_prompts, list_competitors), from being cited as a source (list_sources), and from somebody arriving afterwards (get_ai_traffic). kind=ai is the assistants; kind=seo is classic search engines and SEO tools.

A project whose integration is not connected answers this with zeros and empty lists, which reads exactly like a site nobody visits. Call get_integrations_status before reporting a zero or an empty list as a finding: it says whether Search Console, Google Analytics, the bot tracker and the sitemap are connected, and a sync that is failing. Not connected means the figures say nothing about the site, never that it had no traffic; say the integration is missing and that it can be connected in the PromptEye app.

Input Schema

NameRequiredDescriptionDefault
kindNo`ai` for AI assistants and their bots, `seo` for search engines and SEO tools. Omit it for both.
pathNoOnly this exact path, without the domain and starting with `/`, e.g. `/pricing`.
botIdNoOnly this one bot, by the id the other traffic tools report — `chatgpt-user`, `gptbot`, `googlebot` and so on. An unknown id is rejected by the API rather than ignored.
limitNoHow many entries to return, at most 200. Defaults to 50.
cursorNoThe nextCursor of the previous page. Omit it to start from the first one.
vendorNoOnly bots run by this company, spelled as the API spells it: OpenAI, Anthropic, Google, Perplexity, Meta, Amazon, Apple, Microsoft, ByteDance, Yandex, DuckDuckGo, Ahrefs, Semrush, Moz, CommonCrawl, Mistral, Cohere and others. This is not the `assistant` of get_ai_traffic, which matches a referrer instead.
projectIdYesThe project to work on — its id from list_projects. Required on every call, so that parallel conversations never read or write each other's project.

Output Schema

NameRequiredDescriptionDefault
dataYes
nextCursorYesPass as cursor to read the next page. null = this was the last page.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv1.0.28
    • addedInput schema / properties / projectId
      Added value: +{
      +  "description": "The project to work on — its id from list_projects. Required on every call, so that parallel conversations never read or write each other's project.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / required
      Added value: +[
      +  "projectId"
      +]
  2. Changed1 schema field changedv1.0.22
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": false,
      +  "properties": {
      +    "data": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "botId": {
      +            "type": "string"
      +          },
      +          "botType": {
      +            "type": "string"
      +          },
      +          "firstVisitAt": {
      +            "description": "When the bot first asked for the path, ISO 8601 in UTC.",
      +            "type": "string"
      +          },
      +          "kind": {
      +            "description": "ai = an AI assistant's bot, seo = search engines and SEO tools.",
      +            "enum": [
      +              "ai",
      +              "seo"
      +            ],
      +            "type": "string"
      +          },
      +          "lastStatusCode": {
      +            "description": "HTTP status the site answered with the last time. null = none reported.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "lastVisitAt": {
      +            "description": "When the bot last asked for the path, ISO 8601 in UTC.",
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "path": {
      +            "type": "string"
      +          },
      +          "vendor": {
      +            "type": "string"
      +          },
      +          "visitCount": {
      +            "description": "How many times the bot asked for the path since tracking began, not over a period.",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "path",
      +          "botId",
      +          "name",
      +          "vendor",
      +          "botType",
      +          "kind",
      +          "firstVisitAt",
      +          "lastVisitAt",
      +          "visitCount",
      +          "lastStatusCode"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "nextCursor": {
      +      "description": "Pass as cursor to read the next page. null = this was the last page.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "data",
      +    "nextCursor"
      +  ],
      +  "type": "object"
      +}
  3. Addedv1.0.16

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and openWorldHint, but the description adds substantive behavior: results are ordered by last visit, only the 3 000 most recently visited rows are searched unless `path` names a single page, and a disconnected integration returns zeros/empty lists that mimic a dead site. The `lastStatusCode` outside 2xx caveat explains how a stale error persists, which is real interpretive guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core definition and the sibling contrast are front-loaded, and each later paragraph carries a distinct caveat (coverage gap, stale status, row-search window, integration zeros). It is on the long side for a list tool, with a few sentences (the 'supply side of visibility' framing, the enumeration of other measurements) that inform but could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape needs no explanation. Given that, the description covers everything an agent needs to call it correctly and interpret it honestly: coverage semantics, the row-scan limit, ordering, status-code interpretation, and the disconnected-integration failure mode.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond it: filtering by `path` reads all of that page's rows rather than the 3 000-row window, and `vendor` is explicitly not the `assistant` field of get_ai_traffic. `kind=ai`/`kind=seo` are glossed. It says nothing extra about `limit` or `cursor` beyond what the schema already documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line names a concrete verb and resource ('one row per path and bot') and immediately pins down the grain of the result plus the exact fields returned (first/last visit, count, last status). It explicitly contrasts with list_bot_visits, get_sitemap, list_prompts, list_competitors, list_sources and get_ai_traffic, so the agent can place it precisely among siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use it ('coverage rather than volume'), what it cannot tell you (a page never fetched has no row), and names the alternative for the period-scoped question. It also gives an explicit precondition: call get_integrations_status before reporting a zero or empty list as a finding, and say the integration is missing rather than that there was no traffic.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.