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 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** (largely from [specification.website](https://specification.website)). These surfaces let agents discover and consume a site without scraping HTML.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glippy-mcp",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "MCP server for GEO (Generative Engine Optimization) analysis — check any domain's AI-readiness",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -430,8 +430,8 @@ function analyseRobotsTxt(text) {
430
430
  blocksCrawlers: {},
431
431
  hasWildcardDisallow: false,
432
432
  sitemapUrls: [],
433
- // Content-Signal directive (specification.website / Cloudflare content
434
- // signals). Parsed into { search, ai-input, ai-train } -> 'yes'|'no'.
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 (specification.website)' });
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" (specification.website)' });
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 (specification.website)' });
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 (specification.website)' });
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 (specification.website)' });
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 (specification.website Agent Readiness)
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 (specification.website)' });
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 (specification.website)' });
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 (specification.website)' });
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"> (specification.website)' });
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 (specification.website)' });
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 (specification.website Agent Readiness).
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 (specification.website / Agent Readiness).
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
@@ -1609,7 +1609,7 @@ function bulkHTMLScript() {
1609
1609
 
1610
1610
  const server = new McpServer({
1611
1611
  name: "glippy-geo",
1612
- version: "0.4.0",
1612
+ version: "0.4.1",
1613
1613
  });
1614
1614
 
1615
1615
  // ---------------------------------------------------------------------------