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

prompteye-mcp

Official

Read how the site does in Google Search

get_search_performance
Read-only

Clicks, impressions, click-through rate and average position of the project's site in ordinary Google results, with the daily timeline behind them.

Instructions

Clicks, impressions, click-through rate and average position of the project's site in ordinary Google results, with the daily timeline behind them.

Pass by to rank the period instead of totalling it: query for the phrases people found the site with, page for the pages Google sends them to. A ranking is built by adding the period up, so it answers with the strongest entries rather than a list to walk to the end of — raise limit to see further down.

Google's figures answer a different question from everything else here: visibility counts the answers that named the brand, and this counts the people who then arrived. Search Console covers ordinary Google results — ctr is a rate between 0 and 1, and position counts from 1, so lower is better. AI traffic is Google Analytics sessions whose referrer was recognised as an assistant, which undercounts by design: an assistant that names the brand without linking it sends nobody, and somebody who reads an answer and then types the domain arrives as direct traffic. Its engagementRate is a rate between 0 and 1 too. Read a rise here as people acting on the answers, never as how often the brand is named. Mind the two senses of the phrase: the aiTraffic field on a prompt is the demand behind that question, while get_ai_traffic counts sessions that reached the site.

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
byNoRank the period along this axis instead of reporting its totals.
limitNoHow many entries to return, at most 200. Ignored without `by`.
endDateNoLast day to report on, inclusive. Defaults to today, and must be within 366 days of startDate.
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.
startDateNoFirst day to report on, inclusive. Defaults to 30 days before today.

Output Schema

NameRequiredDescriptionDefault
byYesThe axis the period is ranked along. null = totals in summary.
dataYesThe ranking, most clicked first. null when by is not set.
summaryYesThe period's totals. null when by is set.
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": {
      +    "by": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "query",
      +            "page"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The axis the period is ranked along. null = totals in summary."
      +    },
      +    "data": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "clicks": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/clicks"
      +                  },
      +                  "ctr": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/ctr"
      +                  },
      +                  "impressions": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/impressions"
      +                  },
      +                  "position": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/position"
      +                  },
      +                  "query": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "query",
      +                  "clicks",
      +                  "impressions",
      +                  "ctr",
      +                  "position"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "clicks": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/clicks"
      +                  },
      +                  "ctr": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/ctr"
      +                  },
      +                  "impressions": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/impressions"
      +                  },
      +                  "page": {
      +                    "type": "string"
      +                  },
      +                  "position": {
      +                    "$ref": "#/properties/summary/anyOf/0/properties/position"
      +                  }
      +                },
      +                "required": [
      +                  "page",
      +                  "clicks",
      +                  "impressions",
      +                  "ctr",
      +                  "position"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The ranking, most clicked first. null when by is not set."
      +    },
      +    "nextCursor": {
      +      "description": "Pass as cursor to read the next page. null = this was the last page.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "summary": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "clicks": {
      +              "type": "number"
      +            },
      +            "ctr": {
      +              "description": "Clicks divided by impressions, a rate from 0 to 1, not a percentage.",
      +              "type": "number"
      +            },
      +            "impressions": {
      +              "type": "number"
      +            },
      +            "position": {
      +              "description": "Average position in Google results weighted by impressions, counting from 1; lower is better.",
      +              "type": "number"
      +            },
      +            "timeline": {
      +              "description": "Clicks and impressions for each day of the period, oldest first.",
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "clicks": {
      +                    "type": "number"
      +                  },
      +                  "date": {
      +                    "description": "The day, YYYY-MM-DD.",
      +                    "type": "string"
      +                  },
      +                  "impressions": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "date",
      +                  "clicks",
      +                  "impressions"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "clicks",
      +            "impressions",
      +            "ctr",
      +            "position",
      +            "timeline"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The period's totals. null when by is set."
      +    }
      +  },
      +  "required": [
      +    "by",
      +    "summary",
      +    "data",
      +    "nextCursor"
      +  ],
      +  "type": "object"
      +}
  3. Addedv1.0.16

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavioral context beyond them — disconnected integrations return zeros and empty lists that mimic a genuinely unvisited site, rankings answer with strongest entries rather than a walkable list, and ctr/position value ranges and direction are stated. This is exactly the failure mode an agent needs warned about.

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

Conciseness3/5

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

Front-loaded and organized into clear paragraphs, but the middle section drifts into AI-traffic and engagementRate semantics that belong to get_ai_traffic, plus a digression on the two senses of aiTraffic. Useful guardrails, yet roughly a third of the text is not about invoking this tool.

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?

With an output schema present and 100% parameter coverage, the description supplies the remaining operational gaps: the zero-vs-not-connected ambiguity, metric units and direction, and aggregation behavior. Nothing an agent needs to call this correctly or to avoid a false finding is missing.

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 baseline is 3, but the description adds interpretation the schema lacks: `by` changes the shape from totals to an aggregated ranking, and raising `limit` is framed as how far down the ranking to look. It does not add anything for date parameters, which the schema already covers well.

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?

Opens with the exact metrics returned (clicks, impressions, CTR, average position) scoped to 'ordinary Google results', and explicitly contrasts itself against the other visibility figures in the product. An agent can distinguish this from get_ai_traffic and get_google_status 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?

Gives explicit conditional routing for `by` (query vs page), explains that the ranking is cumulative rather than exhaustive so `limit` governs depth, and adds a hard prerequisite: call get_integrations_status before reporting zeros or empty lists as findings. When-to-use and when-not-to-use are both spelled out.

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