Skip to main content
Glama
prompteye-mcp

prompteye-mcp

Official

Read the visits that came from AI assistants

get_ai_traffic
Read-only

The sessions Google Analytics attributes to AI assistants for the project's site: how many arrived, how engaged they were, and how many key events they triggered. This is the tool for 'is any of this visibility turning into visits'.

Instructions

The sessions Google Analytics attributes to AI assistants for the project's site: how many arrived, how engaged they were, and how many key events they triggered. This is the tool for 'is any of this visibility turning into visits'.

Pass by to rank the period instead of totalling it: source for the assistants that sent the visitors, page for the pages they land on. assistant narrows any of the three to one assistant. A ranking answers with the strongest entries rather than a list to walk to the end of.

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.
assistantNoOnly sessions from this AI assistant, matched without regard to case against the referrer: `openai` also matches chatgpt, `anthropic` matches claude, `google` matches gemini, and `microsoft` matches copilot and bing.
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 sessions first. null when by is not set.
summaryYesThe period's totals. null when by is set.
assistantYesThe assistant the figures are narrowed to. null = all assistants.
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": {
      +    "assistant": {
      +      "description": "The assistant the figures are narrowed to. null = all assistants.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "by": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "source",
      +            "page"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The axis the period is ranked along. null = totals in summary."
      +    },
      +    "data": {
      +      "anyOf": [
      +        {
      +          "items": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "keyEvents": {
      +                    "type": "number"
      +                  },
      +                  "sessions": {
      +                    "type": "number"
      +                  },
      +                  "source": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "source",
      +                  "sessions",
      +                  "keyEvents"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "keyEvents": {
      +                    "type": "number"
      +                  },
      +                  "page": {
      +                    "type": "string"
      +                  },
      +                  "sessions": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "page",
      +                  "sessions",
      +                  "keyEvents"
      +                ],
      +                "type": "object"
      +              }
      +            ]
      +          },
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The ranking, most sessions 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": {
      +            "averageSessionDuration": {
      +              "description": "Average session length in seconds.",
      +              "type": "number"
      +            },
      +            "engagedSessions": {
      +              "type": "number"
      +            },
      +            "engagementRate": {
      +              "description": "Engaged sessions divided by sessions, a rate from 0 to 1, not a percentage.",
      +              "type": "number"
      +            },
      +            "keyEvents": {
      +              "type": "number"
      +            },
      +            "sessions": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "sessions",
      +            "engagedSessions",
      +            "engagementRate",
      +            "averageSessionDuration",
      +            "keyEvents"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The period's totals. null when by is set."
      +    }
      +  },
      +  "required": [
      +    "assistant",
      +    "by",
      +    "summary",
      +    "data",
      +    "nextCursor"
      +  ],
      +  "type": "object"
      +}
  3. Addedv1.0.16

TDQS

A4.6/5.0
Behavior4/5

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

Beyond readOnlyHint and openWorldHint, the description discloses that the count undercounts by design (no-link answers, direct-typed traffic), that engagementRate is a 0-1 rate, and that an unconnected integration returns zeros indistinguishable from no traffic. That is substantial context annotations cannot carry. The main omission is any mention of date-range defaults or result volume behavior, which stay in the schema.

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?

Purpose is front-loaded in the first sentence and each paragraph has a job. It is nonetheless long, and the aside explaining Search Console's ctr and position ranges belongs to a sibling tool and pads the middle section without helping an agent invoke this one.

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, the description needn't explain return shape, and it covers the remaining risks an agent would hit: silent zeros from a missing integration, the undercount caveat, mode selection via `by`, and the name collision with the aiTraffic prompt field.

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 genuine semantics: `by` switches from totalling to ranking, `assistant` narrows any of the three modes, and a ranking returns only the strongest entries rather than a walkable list — a truncation behaviour not stated in the schema's `limit` description.

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 sentence names a specific verb and resource — Google Analytics sessions attributed to AI assistants — and enumerates the three measures returned (arrivals, engagement, key events). It is clearly separable from visibility counting and from Search Console performance in the siblings list.

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 the exact question this tool answers ('is any of this visibility turning into visits') and explicitly contrasts it with brand visibility counting and Search Console, including the aiTraffic field on a prompt. It also gives a hard prerequisite: call get_integrations_status before reporting a zero or empty list as a finding.

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