glippy-mcp 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/geo-checker.js +15 -15
- package/src/index.js +1 -1
package/README.md
CHANGED
|
@@ -497,7 +497,7 @@ The analysis evaluates 16 categories, each with a weight reflecting its importan
|
|
|
497
497
|
|
|
498
498
|
## Agent-Readiness Discovery
|
|
499
499
|
|
|
500
|
-
Alongside the established checks, the server probes a set of **emerging agent-readiness standards
|
|
500
|
+
Alongside the established checks, the server probes a set of **emerging agent-readiness standards**. These surfaces let agents discover and consume a site without scraping HTML.
|
|
501
501
|
|
|
502
502
|
These checks are **bonus-scored**: a site gets credit when a surface is present, but absence is reported as informational guidance rather than a penalty. This keeps the long tail of sites that have not adopted these new standards from being unfairly marked down, while still rewarding early adopters.
|
|
503
503
|
|
package/package.json
CHANGED
package/src/geo-checker.js
CHANGED
|
@@ -430,8 +430,8 @@ function analyseRobotsTxt(text) {
|
|
|
430
430
|
blocksCrawlers: {},
|
|
431
431
|
hasWildcardDisallow: false,
|
|
432
432
|
sitemapUrls: [],
|
|
433
|
-
// Content-Signal directive (
|
|
434
|
-
//
|
|
433
|
+
// Content-Signal directive (Cloudflare content signals).
|
|
434
|
+
// Parsed into { search, ai-input, ai-train } -> 'yes'|'no'.
|
|
435
435
|
contentSignals: null,
|
|
436
436
|
};
|
|
437
437
|
|
|
@@ -2109,7 +2109,7 @@ function checkMachineReadability($, robotsTxtData, llmsTxtData, responseHeaders,
|
|
|
2109
2109
|
checks.push({ status: 'pass', label: 'robots.txt Content-Signal present', detail: `Machine-readable AI usage preferences: ${summary}`, found: [summary] });
|
|
2110
2110
|
}
|
|
2111
2111
|
} else if (robotsTxtData && robotsTxtData.exists) {
|
|
2112
|
-
checks.push({ status: 'info', label: 'No Content-Signal directive in robots.txt', detail: 'Add a Content-Signal line (e.g. "Content-Signal: search=yes, ai-input=yes, ai-train=no") to declare AI usage preferences
|
|
2112
|
+
checks.push({ status: 'info', label: 'No Content-Signal directive in robots.txt', detail: 'Add a Content-Signal line (e.g. "Content-Signal: search=yes, ai-input=yes, ai-train=no") to declare AI usage preferences' });
|
|
2113
2113
|
}
|
|
2114
2114
|
|
|
2115
2115
|
// HTTP Link header discovery (rel=describedby / api-catalog / sitemap / mcp / service-desc).
|
|
@@ -2122,7 +2122,7 @@ function checkMachineReadability($, robotsTxtData, llmsTxtData, responseHeaders,
|
|
|
2122
2122
|
score += 4;
|
|
2123
2123
|
checks.push({ status: 'pass', label: `HTTP Link header discovery: ${foundRels.join(', ')}`, detail: 'Agents can discover resources from response headers without parsing HTML', found: foundRels });
|
|
2124
2124
|
} else {
|
|
2125
|
-
checks.push({ status: 'info', label: 'No agent-discovery HTTP Link headers', detail: 'Expose discovery via Link headers, e.g. Link: </llms.txt>; rel="describedby"; type="text/markdown"
|
|
2125
|
+
checks.push({ status: 'info', label: 'No agent-discovery HTTP Link headers', detail: 'Expose discovery via Link headers, e.g. Link: </llms.txt>; rel="describedby"; type="text/markdown"' });
|
|
2126
2126
|
}
|
|
2127
2127
|
}
|
|
2128
2128
|
|
|
@@ -2137,7 +2137,7 @@ function checkMachineReadability($, robotsTxtData, llmsTxtData, responseHeaders,
|
|
|
2137
2137
|
score += 4;
|
|
2138
2138
|
checks.push({ status: 'pass', label: 'Markdown source endpoint advertised', detail: mdLink ? `<link rel="alternate" type="text/markdown" href="${mdLink}">` : 'Served via content negotiation (Vary: Accept + Content-Location .md)', found: mdLink ? [mdLink] : undefined });
|
|
2139
2139
|
} else {
|
|
2140
|
-
checks.push({ status: 'info', label: 'No Markdown source endpoint', detail: 'Serve a .md version of each page and advertise it with <link rel="alternate" type="text/markdown"> for clean agent ingestion
|
|
2140
|
+
checks.push({ status: 'info', label: 'No Markdown source endpoint', detail: 'Serve a .md version of each page and advertise it with <link rel="alternate" type="text/markdown"> for clean agent ingestion' });
|
|
2141
2141
|
}
|
|
2142
2142
|
}
|
|
2143
2143
|
|
|
@@ -2158,7 +2158,7 @@ function checkMachineReadability($, robotsTxtData, llmsTxtData, responseHeaders,
|
|
|
2158
2158
|
maxScore += 4;
|
|
2159
2159
|
checks.push({ status: 'warn', label: 'llms-full.txt served as HTML', detail: 'Serve llms-full.txt as text/markdown or text/plain, not HTML' });
|
|
2160
2160
|
} else {
|
|
2161
|
-
checks.push({ status: 'info', label: 'No llms-full.txt found', detail: 'Add /llms-full.txt with the concatenated markdown of pages in llms.txt for full-context AI ingestion
|
|
2161
|
+
checks.push({ status: 'info', label: 'No llms-full.txt found', detail: 'Add /llms-full.txt with the concatenated markdown of pages in llms.txt for full-context AI ingestion' });
|
|
2162
2162
|
}
|
|
2163
2163
|
}
|
|
2164
2164
|
|
|
@@ -2173,7 +2173,7 @@ function checkMachineReadability($, robotsTxtData, llmsTxtData, responseHeaders,
|
|
|
2173
2173
|
feeds.each((_, el) => { const h = $(el).attr('href'); if (h) hrefs.push(h); });
|
|
2174
2174
|
checks.push({ status: 'pass', label: `Feed discovery: ${feeds.length} feed(s)`, detail: 'RSS/Atom/JSON feeds give agents a machine-readable content stream', found: hrefs.slice(0, 5) });
|
|
2175
2175
|
} else {
|
|
2176
|
-
checks.push({ status: 'info', label: 'No discoverable feed', detail: 'Advertise an RSS/Atom/JSON feed via <link rel="alternate"> for machine-readable content updates
|
|
2176
|
+
checks.push({ status: 'info', label: 'No discoverable feed', detail: 'Advertise an RSS/Atom/JSON feed via <link rel="alternate"> for machine-readable content updates' });
|
|
2177
2177
|
}
|
|
2178
2178
|
}
|
|
2179
2179
|
|
|
@@ -3987,7 +3987,7 @@ function checkWebMCP($, pageType, ucpData, responseHeaders = null, agentReadines
|
|
|
3987
3987
|
}
|
|
3988
3988
|
|
|
3989
3989
|
// ══════════════════════════════════════════════════════
|
|
3990
|
-
// AGENT DISCOVERY SURFACES (
|
|
3990
|
+
// AGENT DISCOVERY SURFACES (Agent Readiness)
|
|
3991
3991
|
// Emerging standards: bonus scoring (credit when present, info when absent).
|
|
3992
3992
|
// ══════════════════════════════════════════════════════
|
|
3993
3993
|
let hasDiscoverySurface = false;
|
|
@@ -4006,7 +4006,7 @@ function checkWebMCP($, pageType, ucpData, responseHeaders = null, agentReadines
|
|
|
4006
4006
|
maxScore += 5; score += 2;
|
|
4007
4007
|
checks.push({ status: 'warn', label: 'MCP server card invalid JSON', detail: '/.well-known/mcp/server-card.json was reachable but did not parse as JSON' });
|
|
4008
4008
|
} else {
|
|
4009
|
-
checks.push({ status: 'info', label: 'No MCP server card', detail: 'Publish /.well-known/mcp/server-card.json (name, version, transport, endpoint, tools) so agents can discover your MCP server
|
|
4009
|
+
checks.push({ status: 'info', label: 'No MCP server card', detail: 'Publish /.well-known/mcp/server-card.json (name, version, transport, endpoint, tools) so agents can discover your MCP server' });
|
|
4010
4010
|
}
|
|
4011
4011
|
}
|
|
4012
4012
|
|
|
@@ -4021,7 +4021,7 @@ function checkWebMCP($, pageType, ucpData, responseHeaders = null, agentReadines
|
|
|
4021
4021
|
maxScore += 4; score += 2;
|
|
4022
4022
|
checks.push({ status: 'warn', label: 'A2A agent card incomplete', detail: 'agent-card.json is missing required fields (name, description, version) or skills' });
|
|
4023
4023
|
} else {
|
|
4024
|
-
checks.push({ status: 'info', label: 'No A2A agent card', detail: 'Publish /.well-known/agent-card.json to let other agents discover and call your services
|
|
4024
|
+
checks.push({ status: 'info', label: 'No A2A agent card', detail: 'Publish /.well-known/agent-card.json to let other agents discover and call your services' });
|
|
4025
4025
|
}
|
|
4026
4026
|
}
|
|
4027
4027
|
|
|
@@ -4036,7 +4036,7 @@ function checkWebMCP($, pageType, ucpData, responseHeaders = null, agentReadines
|
|
|
4036
4036
|
maxScore += 4; score += 2;
|
|
4037
4037
|
checks.push({ status: 'warn', label: 'Agent Skills index incomplete', detail: 'index.json should set $schema to the agentskills discovery schema and list skills with digests' });
|
|
4038
4038
|
} else {
|
|
4039
|
-
checks.push({ status: 'info', label: 'No Agent Skills discovery', detail: 'Publish /.well-known/agent-skills/index.json to expose reusable agent skills
|
|
4039
|
+
checks.push({ status: 'info', label: 'No Agent Skills discovery', detail: 'Publish /.well-known/agent-skills/index.json to expose reusable agent skills' });
|
|
4040
4040
|
}
|
|
4041
4041
|
}
|
|
4042
4042
|
|
|
@@ -4049,7 +4049,7 @@ function checkWebMCP($, pageType, ucpData, responseHeaders = null, agentReadines
|
|
|
4049
4049
|
maxScore += 3; score += 3;
|
|
4050
4050
|
checks.push({ status: 'pass', label: 'NLWeb endpoint advertised', detail: nlwebLink ? `<link rel="nlweb" href="${nlwebLink}">` : 'Advertised via Link: rel="nlweb"' });
|
|
4051
4051
|
} else {
|
|
4052
|
-
checks.push({ status: 'info', label: 'No NLWeb endpoint', detail: 'Expose a natural-language query endpoint (by convention /ask) and advertise it with <link rel="nlweb">
|
|
4052
|
+
checks.push({ status: 'info', label: 'No NLWeb endpoint', detail: 'Expose a natural-language query endpoint (by convention /ask) and advertise it with <link rel="nlweb">' });
|
|
4053
4053
|
}
|
|
4054
4054
|
}
|
|
4055
4055
|
|
|
@@ -4065,7 +4065,7 @@ function checkWebMCP($, pageType, ucpData, responseHeaders = null, agentReadines
|
|
|
4065
4065
|
: `Advertised via <link rel="schemamap" href="${schemamapLink}">`;
|
|
4066
4066
|
checks.push({ status: 'pass', label: 'Schemamap found', detail });
|
|
4067
4067
|
} else {
|
|
4068
|
-
checks.push({ status: 'info', label: 'No schemamap', detail: 'Publish /schemamap.xml listing per-resource JSON-LD (.jsonld) endpoints for agent-friendly structured data
|
|
4068
|
+
checks.push({ status: 'info', label: 'No schemamap', detail: 'Publish /schemamap.xml listing per-resource JSON-LD (.jsonld) endpoints for agent-friendly structured data' });
|
|
4069
4069
|
}
|
|
4070
4070
|
}
|
|
4071
4071
|
|
|
@@ -5423,7 +5423,7 @@ async function checkGEO(domain, options = {}) {
|
|
|
5423
5423
|
content: null,
|
|
5424
5424
|
error: null,
|
|
5425
5425
|
},
|
|
5426
|
-
// Agent-readiness discovery surfaces (
|
|
5426
|
+
// Agent-readiness discovery surfaces (Agent Readiness).
|
|
5427
5427
|
agentReadiness: {
|
|
5428
5428
|
llmsFullTxt: { exists: false, url: null, sizeBytes: 0, isHtml: false },
|
|
5429
5429
|
mcpServerCard: { exists: false, url: null, valid: false },
|
|
@@ -5475,7 +5475,7 @@ async function checkGEO(domain, options = {}) {
|
|
|
5475
5475
|
const homepageUrl = `${baseUrl}/`;
|
|
5476
5476
|
const sitemapUrl = `${baseUrl}/sitemap.xml`;
|
|
5477
5477
|
const ucpUrl = `${baseUrl}/.well-known/ucp`;
|
|
5478
|
-
// Agent-readiness discovery resources (
|
|
5478
|
+
// Agent-readiness discovery resources (Agent Readiness).
|
|
5479
5479
|
const llmsFullUrl = `${baseUrl}/llms-full.txt`;
|
|
5480
5480
|
const mcpCardUrl = `${baseUrl}/.well-known/mcp/server-card.json`;
|
|
5481
5481
|
const agentCardUrl = `${baseUrl}/.well-known/agent-card.json`;
|
package/src/index.js
CHANGED