Citead GEO Score
Free GEO score of a web page or text: how easily AI assistants can quote it, with fixes. No key.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"score": {
"url": "https://mcp.citead.com/public/mcp/"
}
}
}Remote endpoints
https://mcp.citead.com/public/mcp/streamable-httpWhat it can do
Tool inventory
Tools (2)
🟢score_url(url)
Fetch a public web page and compute its GEO score with Citead. Returns the overall score (0 to 100), the score of each criterion (semantic richness, AI citability, freshness, content organization, authority and citations, and naturalness, which does not count in the score), the main fixes to apply, and a citead.com link that shows the analysis again. The GEO score (0 to 100) measures how easy the content is for a language model to understand, reuse and cite: information density, quotable sentences, self-contained paragraphs, sourced and dated facts, clear structure, freshness. Naturalness is returned as a criterion but does not count in the score. It is computed by deterministic rules, without a language model: the same content always gets the same score. It does not guarantee that an AI assistant will cite the page. Free, no API key. Citead does not store the page content or its score; it keeps only daily counts of outcomes, the domain name of sites that block its fetcher (45 days) and per-IP rate-limit counters. The details_url page does not publish the result to the public leaderboard. Pages behind a login or rendered only by JavaScript may not be fetchable: use score_text with the page text instead.
Input Schema
{
"type": "object",
"properties": {
"url": {
"description": "Public http(s) URL of the page to score.",
"maxLength": 2048,
"minLength": 4,
"title": "Url",
"type": "string"
}
},
"required": [
"url"
],
"title": "score_urlArguments"
}Output Schema
{
"type": "object",
"properties": {
"geo_score": {
"description": "Overall GEO score, 0 to 100.",
"title": "Geo Score",
"type": "number"
},
"criteria": {
"description": "Score of each criterion, 0 to 100, in this order: semantic richness, AI citability, freshness, content organization, authority and citations, and naturalness, which does not count in the score. The overall score is computed from sub-signals of the first five, with caps for very short content, so it is not their plain average.",
"items": {
"$ref": "#/$defs/Criterion"
},
"title": "Criteria",
"type": "array"
},
"top_fixes": {
"description": "Main corrections, most important first.",
"items": {
"$ref": "#/$defs/Fix"
},
"title": "Top Fixes",
"type": "array"
},
"word_count": {
"title": "Word Count",
"type": "integer"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Url"
},
"details_url": {
"description": "Citead page that shows this analysis again, without publishing it to the public leaderboard. Give it to the user.",
"title": "Details Url",
"type": "string"
},
"score_meaning": {
"title": "Score Meaning",
"type": "string"
},
"remaining_quota": {
"$ref": "#/$defs/RemainingQuota",
"description": "Free scores left for this IP address in the current windows."
}
},
"required": [
"geo_score",
"criteria",
"top_fixes",
"word_count",
"details_url",
"score_meaning",
"remaining_quota"
],
"$defs": {
"Criterion": {
"properties": {
"id": {
"title": "Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"score": {
"description": "0 to 100, higher is better.",
"title": "Score",
"type": "number"
}
},
"required": [
"id",
"name",
"score"
],
"title": "Criterion",
"type": "object"
},
"Fix": {
"properties": {
"priority": {
"description": "high, medium or low.",
"title": "Priority",
"type": "string"
},
"problem": {
"title": "Problem",
"type": "string"
},
"fix": {
"title": "Fix",
"type": "string"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Location"
}
},
"required": [
"priority",
"problem",
"fix"
],
"title": "Fix",
"type": "object"
},
"RemainingQuota": {
"properties": {
"minute": {
"title": "Minute",
"type": "integer"
},
"hour": {
"title": "Hour",
"type": "integer"
},
"day": {
"title": "Day",
"type": "integer"
}
},
"required": [
"minute",
"hour",
"day"
],
"title": "RemainingQuota",
"type": "object"
}
},
"title": "GeoScoreResult"
}🟢score_text(content, title, language)
Compute the GEO score of a text with Citead: an article draft, a page copy, markdown, plain text or HTML. Returns the overall score (0 to 100), the score of each criterion (semantic richness, AI citability, freshness, content organization, authority and citations, and naturalness, which does not count in the score), the main fixes to apply, and a link to Citead's free live editor. The GEO score (0 to 100) measures how easy the content is for a language model to understand, reuse and cite: information density, quotable sentences, self-contained paragraphs, sourced and dated facts, clear structure, freshness. Naturalness is returned as a criterion but does not count in the score. It is computed by deterministic rules, without a language model: the same content always gets the same score. It does not guarantee that an AI assistant will cite the page. Free, no API key, the text is not stored. Texts under 300 words get a capped score (at most 65).
Input Schema
{
"type": "object",
"properties": {
"content": {
"description": "The text to score: markdown, plain text or HTML.",
"maxLength": 200000,
"minLength": 1,
"title": "Content",
"type": "string"
},
"title": {
"anyOf": [
{
"maxLength": 300,
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Page title. Defaults to the first heading.",
"title": "Title"
},
"language": {
"anyOf": [
{
"enum": [
"en",
"fr"
],
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Language of the text. Omit to detect it. Only English and French have dedicated rules; other languages use the English ones.",
"title": "Language"
}
},
"required": [
"content"
],
"title": "score_textArguments"
}Output Schema
{
"type": "object",
"properties": {
"geo_score": {
"description": "Overall GEO score, 0 to 100.",
"title": "Geo Score",
"type": "number"
},
"criteria": {
"description": "Score of each criterion, 0 to 100, in this order: semantic richness, AI citability, freshness, content organization, authority and citations, and naturalness, which does not count in the score. The overall score is computed from sub-signals of the first five, with caps for very short content, so it is not their plain average.",
"items": {
"$ref": "#/$defs/Criterion"
},
"title": "Criteria",
"type": "array"
},
"top_fixes": {
"description": "Main corrections, most important first.",
"items": {
"$ref": "#/$defs/Fix"
},
"title": "Top Fixes",
"type": "array"
},
"word_count": {
"title": "Word Count",
"type": "integer"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Url"
},
"details_url": {
"description": "Citead page that shows this analysis again, without publishing it to the public leaderboard. Give it to the user.",
"title": "Details Url",
"type": "string"
},
"score_meaning": {
"title": "Score Meaning",
"type": "string"
},
"remaining_quota": {
"$ref": "#/$defs/RemainingQuota",
"description": "Free scores left for this IP address in the current windows."
}
},
"required": [
"geo_score",
"criteria",
"top_fixes",
"word_count",
"details_url",
"score_meaning",
"remaining_quota"
],
"$defs": {
"Criterion": {
"properties": {
"id": {
"title": "Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"score": {
"description": "0 to 100, higher is better.",
"title": "Score",
"type": "number"
}
},
"required": [
"id",
"name",
"score"
],
"title": "Criterion",
"type": "object"
},
"Fix": {
"properties": {
"priority": {
"description": "high, medium or low.",
"title": "Priority",
"type": "string"
},
"problem": {
"title": "Problem",
"type": "string"
},
"fix": {
"title": "Fix",
"type": "string"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Location"
}
},
"required": [
"priority",
"problem",
"fix"
],
"title": "Fix",
"type": "object"
},
"RemainingQuota": {
"properties": {
"minute": {
"title": "Minute",
"type": "integer"
},
"hour": {
"title": "Hour",
"type": "integer"
},
"day": {
"title": "Day",
"type": "integer"
}
},
"required": [
"minute",
"hour",
"day"
],
"title": "RemainingQuota",
"type": "object"
}
},
"title": "GeoScoreResult"
}Community
Evidence