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

prompteye-mcp

Official

Rank the brands answering alongside yours

list_competitors
Read-only

Identify which competitor brands AI assistants name on your prompts, ranked by visibility and average position to show who you are losing to. Filter by model, prompt, or category.

Instructions

Every brand the assistants named on the active project's prompts, measured the same way the project's own brand is and ranked by visibility, then by average position. Call this for 'who are we losing to' and for how a market splits between brands.

The order is not share of voice. The ranking is cut to the strongest brands by visibility first, so re-sorting what it returns by share of voice does not give the strongest brands by share of voice.

Changes are signed so that positive always means improvement. For average position that means the brand was named earlier in the answer, so a positive change goes with a lower position number.

shareOfVoice is how much of all the naming that happened on the project's prompts went to one brand, so the brands in a ranking describe one pie. It answers a different question from visibility: visibility is how often a brand was named at all, and every brand can score high at once, while share of voice is what each took from the others. citedAnswers counts the answers that cited at least one domain assigned to the brand, its own or an alternative one, each domain at most once per answer, and citationShare is the share of answers carrying sources that did. It is a count of answers, not of sources, so it is not comparable with sourceOccurrences from list_sources, which counts every source on one host. Being cited can diverge from being named — a brand can be recommended without being linked, and linked without being recommended. The project's own brand is in the ranking and marked with ownBrand, so it can be read against the rest.

visibility is the share of answers that named the brand, 0 to 100; reachIndex is that figure weighted by how much of the market each assistant carries; averagePosition is where in the answer the brand was named, counting from 1. Each is null until it is measured.

The ranking answers with the strongest brands rather than a list to walk to the end of, so raise limit to see further down. model narrows it to one assistant, which is how to tell a brand that dominates everywhere from one that owns a single assistant.

Narrow the ranking to one prompt (promptId), one prompt group (groupId), or one category — categoryId alone, or categoryId with subcategoryId — the same way the app's own visibility screen narrows it. Give at most one of these; combining them fails. There is no single call for 'which prompts does competitor X outrank us on' — call list_prompts for the prompt ids, then this tool once per promptId, and keep the ones where the named competitor's position beats the brand's.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoHow many brands to return, at most 200.
modelNoReport on this assistant alone instead of all of them.
endDateNoLast day to report on, inclusive. Defaults to today, and must be within 366 days of startDate.
groupIdNoRank this prompt group alone instead of every prompt in the project.
promptIdNoRank this prompt alone instead of every prompt in the project.
startDateNoFirst day to report on, inclusive. Defaults to 30 days before today.
categoryIdNoRank only the prompts filed under this category, subcategories included.
subcategoryIdNoNarrow `categoryId` further, to one of its subcategories. Needs `categoryId` alongside it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataYes
brandYes
modelYesThe assistant the ranking is narrowed to. null = all assistants.
nextCursorYesPass as cursor to read the next page. null = this was the last page.
projectNameYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changedv1.0.22
    • addedInput schema / properties / categoryId
      Added value: +{
      +  "description": "Rank only the prompts filed under this category, subcategories included.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / groupId
      Added value: +{
      +  "description": "Rank this prompt group alone instead of every prompt in the project.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / promptId
      Added value: +{
      +  "description": "Rank this prompt alone instead of every prompt in the project.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / subcategoryId
      Added value: +{
      +  "description": "Narrow `categoryId` further, to one of its subcategories. Needs `categoryId` alongside it.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": false,
      +  "properties": {
      +    "brand": {
      +      "type": "string"
      +    },
      +    "data": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "brand": {
      +            "type": "string"
      +          },
      +          "change": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "averagePosition": {
      +                    "description": "Places moved, signed so positive = named earlier (an improvement). null = either period could not measure it.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "reachIndex": {
      +                    "description": "Points reachIndex moved by; negative = fell. null = either period could not measure it.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "visibility": {
      +                    "description": "Percentage points visibility moved by; negative = fell. null = either period could not measure it.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  }
      +                },
      +                "required": [
      +                  "visibility",
      +                  "reachIndex",
      +                  "averagePosition"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "Movement against the period of the same length directly before this one. null = no figure could be compared."
      +          },
      +          "citationShare": {
      +            "description": "Share of the answers carrying any sources that cited this brand, in whole percent 0-100; brands do not add up to 100. null = no answer carried sources.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "citedAnswers": {
      +            "description": "Answers citing at least one domain of this brand, each domain once per answer; a count of answers, not sources. null = no figure for the period.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "metrics": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "averagePosition": {
      +                "description": "Mean place the brand was named at in the answers that named it, counting from 1; lower is earlier. null = not measured.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "reachIndex": {
      +                "description": "Visibility weighted by how much of the market each assistant carries, 0-100, whole number. null = not measured.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              },
      +              "visibility": {
      +                "description": "Share of answers that named the brand in the period, in percent 0-100. null = not measured.",
      +                "type": [
      +                  "number",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "visibility",
      +              "reachIndex",
      +              "averagePosition"
      +            ],
      +            "type": "object"
      +          },
      +          "ownBrand": {
      +            "description": "True for the project's own brand, ranked alongside the rest.",
      +            "type": "boolean"
      +          },
      +          "shareOfVoice": {
      +            "description": "How much of the naming this brand took, in whole percent 0-100; all brands in the period add up to 100. null = no figure for the period.",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "brand",
      +          "ownBrand",
      +          "metrics",
      +          "change",
      +          "shareOfVoice",
      +          "citedAnswers",
      +          "citationShare"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "model": {
      +      "description": "The assistant the ranking is narrowed to. null = all assistants.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "nextCursor": {
      +      "description": "Pass as cursor to read the next page. null = this was the last page.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "projectName": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "data",
      +    "nextCursor",
      +    "projectName",
      +    "brand",
      +    "model"
      +  ],
      +  "type": "object"
      +}
  2. First observedv1.0.5

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only give readOnlyHint and openWorldHint; the description carries far more: ranking is cut to strongest-by-visibility so re-sorting is not equivalent to share-of-voice ranking, changes are sign-normalized (positive = improvement, including the lower-position-number inversion), metrics are null until measured, and ownBrand marks the project's brand in the results.

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?

Front-loaded with the core purpose, then grouped by concern (ordering, metric definitions, filters, workaround). It is long and dense, and the metric exposition (shareOfVoice vs citedAnswers vs citationShare) borders on reference documentation, but nearly every sentence prevents a concrete misinterpretation.

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?

For an 8-parameter, zero-required, open-world analytical tool with an output schema, this covers the ordering logic, metric semantics, filter exclusivity, and cross-tool workflow. An agent can call it correctly and interpret the result without further probing.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds semantics the schema does not contain: that `limit` matters because the ranking is truncated rather than exhaustive, that `model` distinguishes a universally dominant brand from a single-assistant one, and the hard constraint that at most one of promptId/groupId/categoryId(+subcategoryId) may be supplied since combining them fails.

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 a precise verb+resource+scope: 'Every brand the assistants named on the active project's prompts, measured the same way the project's own brand is and ranked by visibility, then by average position.' It is unmistakably a competitor-brand ranking and cannot be confused with siblings like list_prompts or list_sources, both of which it explicitly references.

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?

States the questions it answers ('who are we losing to', how a market splits), names the narrowing filters and their exclusivity rule, and pre-empts a likely misuse case by explaining that no single call answers 'which prompts does competitor X outrank us on' — use list_prompts then call this per promptId. Explicit when, when-not, and alternatives.

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