MCP-Server

serp-metrics

com.toolsthatrank/serp-metrics
Daten & Analytik Marketing & Werbung Öffentlich und erreichbar MCP 2026-07-28

Was dieses MCP kann

Calculates weighted search rankings, projected clicks using a supplied CTR curve, and keyword-set share of voice.

impression_weighted_position
Impression-weighted average position
Compute the impression-weighted average SERP position for a set of query rows, alongside the plain arithmetic mean and the gap between them. The arithmetic mean lets a 3-impression query count as much as a 30,000-impression one; the weighted figure describes where a typical impression actually happened. A positive weighting_shift means your high-volume queries rank worse than the unweighted average suggests.
Eingabeschema
{'type': 'object', 'required': ['rows'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'required': ['position', 'impressions'], 'properties': {'query': {'type': 'string', 'description': 'Optional label for the row.'}, 'clicks': {'type': 'number', 'description': 'Optional observed clicks, used to calibrate the curve.'}, 'position': {'type': 'number', 'description': 'Average SERP position for the row, 1-based.'}, 'impressions': {'type': 'number', 'description': 'Impressions the row received.'}, 'target_position': {'type': 'number', 'description': 'Optional per-row target position, overriding the global target.'}}}, 'description': 'Query rows.'}}, 'additionalProperties': False}
project_clicks_from_ctr_curve
Project clicks against a supplied CTR curve
Project how many clicks a set of query rows would earn at a target position instead of their current position, using a CTR curve THAT YOU SUPPLY. This server deliberately ships no built-in CTR table: every published average-CTR-by-position table is a third-party estimate over someone else's traffic, so applying one silently would disguise a guess as a measurement. Pass your own measured curve (Search Console clicks/impressions by position is the honest source). Positions between curve points are linearly interpolated; positions beyond the curve clamp to the last point rather than extrapolate, and are counted in clamped_row_count. If any row carries observed clicks, the output also reports how far the supplied curve is from your reality.
Eingabeschema
{'type': 'object', 'required': ['rows', 'ctr_curve'], 'properties': {'rows': {'type': 'array', 'items': {'type': 'object', 'required': ['position', 'impressions'], 'properties': {'query': {'type': 'string', 'description': 'Optional label for the row.'}, 'clicks': {'type': 'number', 'description': 'Optional observed clicks, used to calibrate the curve.'}, 'position': {'type': 'number', 'description': 'Average SERP position for the row, 1-based.'}, 'impressions': {'type': 'number', 'description': 'Impressions the row received.'}, 'target_position': {'type': 'number', 'description': 'Optional per-row target position, overriding the global target.'}}}, 'description': 'Query rows.'}, 'ctr_curve': {'type': 'object', 'description': 'Required. Map of position to click-through rate as a 0-1 fraction, e.g. {"1":0.28,"2":0.15,"3":0.10,"10":0.02}. Supply your own measured values.', 'additionalProperties': {'type': 'number'}}, 'target_position': {'type': 'number', 'description': 'Target position applied to every row that does not carry its own.'}}, 'additionalProperties': False}
share_of_voice
Share of voice across a keyword set
Compute share of voice across competing entities over a keyword set. Reports impression share always, and, if you supply a CTR curve, a weighted visibility share that accounts for the fact that an impression at position 1 is not worth an impression at position 9. Impression share is share of the supplied set only and says nothing about keywords you did not supply.
Eingabeschema
{'type': 'object', 'required': ['entities'], 'properties': {'entities': {'type': 'array', 'items': {'type': 'object', 'required': ['impressions'], 'properties': {'entity': {'type': 'string', 'description': 'Competitor name or domain.'}, 'position': {'type': 'number', 'description': 'Average position, required only when a ctr_curve is supplied.'}, 'impressions': {'type': 'number'}}}, 'description': 'One entry per competitor per keyword, or pre-aggregated per competitor.'}, 'ctr_curve': {'type': 'object', 'description': 'Optional caller-supplied position-to-CTR map, for weighted visibility.', 'additionalProperties': {'type': 'number'}}}, 'additionalProperties': False}
Hinzugefügt
share_of_voice
17. September 2026 12:38
Hinzugefügt
project_clicks_from_ctr_curve
17. September 2026 12:38
Hinzugefügt
impression_weighted_position
17. September 2026 12:38