agent-ready-mcp 0.4.3 → 0.5.0

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
@@ -1,6 +1,6 @@
1
1
  # agent-ready-mcp
2
2
 
3
- MCP server for [Agent Ready](https://agent-ready.dev) — scan any URL for AI agent readability against the [Vercel Agent Readability Spec](https://vercel.com/kb/guide/agent-readability-spec), the [llmstxt.org](https://llmstxt.org) standard, and agent-protocol manifests (MCP server cards, A2A, agents.json, agent-permissions.json, UCP, x402, NLWeb). 68 checks across four spec families — 38 against the Vercel spec (15 site-wide + 23 per-page), 10 against llmstxt.org, and 20 against agent-protocol manifests — each with per-check fix guidance.
3
+ MCP server for [Agent Ready](https://agent-ready.dev) — scan any URL for AI agent readability against the [Vercel Agent Readability Spec](https://vercel.com/kb/guide/agent-readability-spec), the [llmstxt.org](https://llmstxt.org) standard, and agent-protocol manifests (MCP server cards, A2A, agents.json, agent-permissions.json, UCP, x402, NLWeb). 69 checks across four spec families — 38 against the Vercel spec (15 site-wide + 23 per-page), 10 against llmstxt.org, and 21 against agent-protocol manifests — each with per-check fix guidance.
4
4
 
5
5
  Hosted at `https://agent-ready.dev/api/v1/mcp` (Streamable HTTP); this package is a thin stdio wrapper around the same REST endpoints, distributed via npm for local MCP clients (Claude Desktop, Claude Code, Cursor, VS Code, Windsurf).
6
6
 
@@ -9,6 +9,7 @@ Hosted at `https://agent-ready.dev/api/v1/mcp` (Streamable HTTP); this package i
9
9
  - **`scan_site`** — fresh agent-readability scan on any URL. Polls the hosted API up to 60s; returns the full scan or a `running` placeholder.
10
10
  - **`get_scan`** — fetch a previously-run scan by id.
11
11
  - **`ask`** — natural-language (NLWeb) search over Agent Ready's own methodology, checks, and specs. Public, no API key required; returns Schema.org-typed results.
12
+ - **`validate_structured_data`** — validate a page's (or a pasted) JSON-LD against Agent Ready's structured-data checks. Public, no API key required; paste mode needs no network, so an agent can check JSON-LD it just authored.
12
13
  - **Three discovery prompts** — `scan`, `interpret_scan`, `remediation_plan`. End-to-end workflows from URL → score → fix-it plan.
13
14
  - **`SKILL.md`** — Claude Skill descriptor included under `skills/agent-ready/` for activation routing.
14
15
 
@@ -76,6 +77,7 @@ claude mcp add agent-ready \
76
77
  | `scan_site` | `url` (string, required), `pageLimit` (number, optional, max 2000 — capped by your plan) | Scan object: Vercel score 0–100, llms.txt sub-score 0–100, per-check findings with `howToFix` strings. Returns `{ id, status: "running" }` placeholder if the scan exceeds the poll deadline. |
77
78
  | `get_scan` | `id` (string, scan id from a prior `scan_site` call) | Same scan object as `scan_site`, or `not_found` if the id is unknown or doesn't belong to the authenticated user. |
78
79
  | `ask` | `q` (string, required), `itemType` (optional corpus filter), `mode` (optional, `list` or `summarize`) | NLWeb `/ask` over Agent Ready's methodology, checks, and specs. Public — no API key required. Schema.org-typed result objects. |
80
+ | `validate_structured_data` | exactly one of `url` (string) or `jsonld` (string) | D-series structured-data result: `mode`, `url`, per-check findings, and a `summary` verdict. Public — no API key required. Validates schema lint + agent-coherence the first-party validators don't. |
79
81
 
80
82
  ## Prompts
81
83
 
@@ -115,7 +117,7 @@ If you'd rather use the hosted MCP server directly (Streamable HTTP transport, n
115
117
 
116
118
  ## Methodology
117
119
 
118
- The 68 checks, their weights, and the score formula are documented at [agent-ready.dev/methodology](https://agent-ready.dev/methodology). Both `manifest.json` and `server.json` in this repo conform to the relevant registry schemas (Glama Marketplace v0.3 and MCP registry 2025-12-11 respectively).
120
+ The 69 checks, their weights, and the score formula are documented at [agent-ready.dev/methodology](https://agent-ready.dev/methodology). Both `manifest.json` and `server.json` in this repo conform to the relevant registry schemas (Glama Marketplace v0.3 and MCP registry 2025-12-11 respectively).
119
121
 
120
122
  ## Development
121
123
 
@@ -23153,6 +23153,47 @@ async function postAsk(config2, body) {
23153
23153
  }
23154
23154
  return payload;
23155
23155
  }
23156
+ async function postValidateStructuredData(config2, body) {
23157
+ const path = "/api/v1/validate/structured-data";
23158
+ const headers = {
23159
+ "Content-Type": "application/json",
23160
+ Accept: "application/json"
23161
+ };
23162
+ if (config2.apiKey) headers.Authorization = `Bearer ${config2.apiKey}`;
23163
+ let res;
23164
+ try {
23165
+ res = await fetch(`${config2.baseUrl}${path}`, {
23166
+ method: "POST",
23167
+ headers,
23168
+ body: JSON.stringify(body),
23169
+ signal: AbortSignal.timeout(config2.getTimeoutMs)
23170
+ });
23171
+ } catch (err) {
23172
+ if (err instanceof Error && err.name === "TimeoutError") {
23173
+ throw new ApiError(
23174
+ "timeout",
23175
+ `Request to ${path} timed out after ${config2.getTimeoutMs}ms.`
23176
+ );
23177
+ }
23178
+ const message = err instanceof Error ? err.message : String(err);
23179
+ throw new ApiError("network_error", `Network error calling ${path}: ${message}`);
23180
+ }
23181
+ const text = await res.text();
23182
+ let payload = null;
23183
+ if (text.length > 0) {
23184
+ try {
23185
+ payload = JSON.parse(text);
23186
+ } catch {
23187
+ }
23188
+ }
23189
+ if (!res.ok) {
23190
+ const detail = payload && typeof payload === "object" && "error" in payload ? payload.error : null;
23191
+ const code = detail?.code ?? `http_${res.status}`;
23192
+ const message = (detail?.message ?? text) || `HTTP ${res.status} from ${path}`;
23193
+ throw new ApiError(code, message, res.status);
23194
+ }
23195
+ return payload;
23196
+ }
23156
23197
 
23157
23198
  // node_modules/zod/v3/helpers/util.js
23158
23199
  var util;
@@ -31181,7 +31222,7 @@ Skip checks that already pass.`
31181
31222
  // src/resource-content.ts
31182
31223
  var METHODOLOGY_MD = `# How Agent Ready scores a site
31183
31224
 
31184
- > 68 checks across four categories, mapped to the Vercel Agent Readability Spec and the llmstxt.org standard. Every check is open and reproducible.
31225
+ > 69 checks across four categories, mapped to the Vercel Agent Readability Spec and the llmstxt.org standard. Every check is open and reproducible.
31185
31226
 
31186
31227
  ## What does Agent Ready measure?
31187
31228
 
@@ -31218,7 +31259,7 @@ Full guide: <https://agent-ready.dev/methodology>
31218
31259
  `;
31219
31260
  var CHECKS_MD = `# Agent Ready check registry
31220
31261
 
31221
- > 68 checks total across four categories. IDs are stable and referenced in every scan result's \`details\` array. Each check is implemented as a single function in \`src/lib/checks/{category}/{id}-{slug}.ts\` in the agent-ready repository.
31262
+ > 69 checks total across four categories. IDs are stable and referenced in every scan result's \`details\` array. Each check is implemented as a single function in \`src/lib/checks/{category}/{id}-{slug}.ts\` in the agent-ready repository.
31222
31263
 
31223
31264
  ## Site checks (15)
31224
31265
 
@@ -31289,7 +31330,7 @@ Run when the site has an \`llms.txt\` file. Validate against the [llmstxt.org](h
31289
31330
  | L9 | Content-Type: text/plain |
31290
31331
  | L10 | llms-full.txt available |
31291
31332
 
31292
- ## Protocol checks (20)
31333
+ ## Protocol checks (21)
31293
31334
 
31294
31335
  Discover-then-validate: when the relevant well-known endpoint returns 404, the check drops rather than failing. A marketing site doesn't score itself against agent manifests it has no reason to ship.
31295
31336
 
@@ -31315,10 +31356,11 @@ Discover-then-validate: when the relevant well-known endpoint returns 404, the c
31315
31356
  | C18 | MPP Payment challenge |
31316
31357
  | C19 | MPP challenge params |
31317
31358
  | C20 | AP2 payment protocol support |
31359
+ | C21 | ACP profile (/.well-known/acp.json) |
31318
31360
  `;
31319
31361
  var LLMS_TXT = `# Agent Ready
31320
31362
 
31321
- > Agent Ready is a free tool that scores any website against the Vercel Agent Readability Spec, the llmstxt.org specification, and agent-protocol specs (MCP, A2A, agents.json). It runs 68 checks and provides actionable fix guidance for every failing check.
31363
+ > Agent Ready is a free tool that scores any website against the Vercel Agent Readability Spec, the llmstxt.org specification, and agent-protocol specs (MCP, A2A, agents.json). It runs 69 checks and provides actionable fix guidance for every failing check.
31322
31364
 
31323
31365
  This resource mirrors agent-ready.dev's own /llms.txt so MCP clients can introspect the same surface that ChatGPT, Perplexity, and other AI agents see when discovering Agent Ready as a tool.
31324
31366
 
@@ -31363,6 +31405,7 @@ Agent Ready's checks map to the specifications below. Each entry links to the ca
31363
31405
  - **agent-permissions.json** _(pre-standard)_ \u2014 A manifest declaring per-path agent access policies, served at /.well-known/agent-permissions.json. No canonical spec document yet \u2014 defined by the discovery path. Canonical: _none published_ Checks: C7.
31364
31406
  - **UCP \u2014 Unified Capability Profile** \u2014 A composite profile at /.well-known/ucp bundling OAuth authorization-server metadata with capability declarations. Canonical: <https://ucp.dev> Checks: C8.
31365
31407
  - **OAuth Authorization Server Metadata (RFC 8414)** \u2014 The authorization-server metadata a UCP profile references so agents can complete an OAuth flow. Gated on C8. Canonical: <https://datatracker.ietf.org/doc/html/rfc8414> Checks: C9.
31408
+ - **ACP \u2014 Agentic Commerce Protocol** _(pre-standard)_ \u2014 OpenAI and Stripe's agentic-commerce standard. Sellers advertise support via a discovery document at /.well-known/acp.json declaring protocol version, transports, and capabilities (C21). Pre-standard \u2014 the discovery RFC is a Proposal. Canonical: <https://github.com/agentic-commerce-protocol/agentic-commerce-protocol/blob/main/rfcs/rfc.discovery.md> Checks: C21.
31366
31409
 
31367
31410
  ## Payments
31368
31411
 
@@ -31387,7 +31430,7 @@ function registerResources(server) {
31387
31430
  "agent-ready://methodology",
31388
31431
  {
31389
31432
  title: "Scoring methodology",
31390
- description: "How Agent Ready computes the 0\u2013100 readability score and the llms.txt sub-score. Covers the 68 checks across four categories, rating bands, weighting, and JS-rendering handling.",
31433
+ description: "How Agent Ready computes the 0\u2013100 readability score and the llms.txt sub-score. Covers the 69 checks across four categories, rating bands, weighting, and JS-rendering handling.",
31391
31434
  mimeType: "text/markdown"
31392
31435
  },
31393
31436
  async () => ({
@@ -31405,7 +31448,7 @@ function registerResources(server) {
31405
31448
  "agent-ready://checks",
31406
31449
  {
31407
31450
  title: "Check registry",
31408
- description: "Reference table of all 68 checks Agent Ready runs, grouped by category (site, page, llms.txt, protocol). Each row pairs the stable check ID (e.g. P11, S15, L9, C3) with its human-readable name. Use this to identify a check by id when interpreting scan results.",
31451
+ description: "Reference table of all 69 checks Agent Ready runs, grouped by category (site, page, llms.txt, protocol). Each row pairs the stable check ID (e.g. P11, S15, L9, C3) with its human-readable name. Use this to identify a check by id when interpreting scan results.",
31409
31452
  mimeType: "text/markdown"
31410
31453
  },
31411
31454
  async () => ({
@@ -31564,6 +31607,33 @@ async function askQuery(config2, input) {
31564
31607
  }
31565
31608
  }
31566
31609
 
31610
+ // src/tools/validateStructuredData.ts
31611
+ async function validateStructuredData(config2, input) {
31612
+ const url2 = input.url?.trim();
31613
+ const jsonld = input.jsonld?.trim();
31614
+ if (Boolean(url2) === Boolean(jsonld)) {
31615
+ throw new ToolError(
31616
+ "invalid_request",
31617
+ "Provide exactly one of `url` (fetch + validate) or `jsonld` (validate a pasted string)."
31618
+ );
31619
+ }
31620
+ try {
31621
+ const result = await postValidateStructuredData(
31622
+ config2,
31623
+ url2 ? { url: url2 } : { jsonld }
31624
+ );
31625
+ return {
31626
+ content: [{ type: "text", text: JSON.stringify(result) }],
31627
+ structuredContent: result && typeof result === "object" ? result : {}
31628
+ };
31629
+ } catch (err) {
31630
+ if (err instanceof ApiError) {
31631
+ throw new ToolError(err.code, err.message);
31632
+ }
31633
+ throw err;
31634
+ }
31635
+ }
31636
+
31567
31637
  // src/output.ts
31568
31638
  var checkResult = external_exports.object({
31569
31639
  checkId: external_exports.string(),
@@ -31597,6 +31667,17 @@ var scanOutputShape = {
31597
31667
  pollUrl: external_exports.string().optional(),
31598
31668
  message: external_exports.string().optional()
31599
31669
  };
31670
+ var validateOutputShape = {
31671
+ mode: external_exports.enum(["url", "paste"]),
31672
+ url: external_exports.string().nullable(),
31673
+ checks: external_exports.array(checkResult),
31674
+ summary: external_exports.object({
31675
+ pass: external_exports.number(),
31676
+ warn: external_exports.number(),
31677
+ fail: external_exports.number(),
31678
+ verdict: external_exports.enum(["agent-ready", "needs-work", "not-agent-readable"])
31679
+ })
31680
+ };
31600
31681
  var askResult = external_exports.object({
31601
31682
  url: external_exports.string().optional(),
31602
31683
  name: external_exports.string().optional(),
@@ -31641,11 +31722,19 @@ var askInputShape = {
31641
31722
  ),
31642
31723
  mode: external_exports.enum(["list", "summarize"]).optional().describe("'summarize' adds an extractive summary over the top results.")
31643
31724
  };
31725
+ var validateStructuredDataInputShape = {
31726
+ url: external_exports.string().url().max(2e3).optional().describe(
31727
+ "URL of a page to fetch and validate its JSON-LD. Provide either url OR jsonld, not both."
31728
+ ),
31729
+ jsonld: external_exports.string().max(1e5).optional().describe(
31730
+ "A raw JSON-LD string to validate directly (paste mode) \u2014 e.g. structured data an agent just authored. Provide either jsonld OR url, not both."
31731
+ )
31732
+ };
31644
31733
 
31645
31734
  // src/server.ts
31646
31735
  var SERVER_INFO = {
31647
31736
  name: "agent-ready",
31648
- version: "0.4.2"
31737
+ version: "0.5.0"
31649
31738
  };
31650
31739
  function createMcpServer(config2) {
31651
31740
  const server = new McpServer(SERVER_INFO);
@@ -31706,6 +31795,23 @@ function createMcpServer(config2) {
31706
31795
  }
31707
31796
  }
31708
31797
  );
31798
+ server.registerTool(
31799
+ "validate_structured_data",
31800
+ {
31801
+ title: "Validate JSON-LD structured data",
31802
+ description: "Validates a page's (or a pasted) JSON-LD against Agent Ready's structured-data checks (schema lint + agent-coherence: freshness honesty, canonical/.md coherence, entity-name consistency, extraction signal) and returns a verdict with per-check fix guidance. Provide exactly one of `url` (fetch + validate) or `jsonld` (validate a string the agent just authored \u2014 no network needed). Public, no API key required. The one structured-data check the first-party validators (validator.schema.org, Rich Results Test) don't do.",
31803
+ inputSchema: validateStructuredDataInputShape,
31804
+ outputSchema: validateOutputShape,
31805
+ annotations: READ_ONLY_OPEN_WORLD
31806
+ },
31807
+ async (args) => {
31808
+ try {
31809
+ return await validateStructuredData(config2, args);
31810
+ } catch (err) {
31811
+ return toolErrorToContent(err);
31812
+ }
31813
+ }
31814
+ );
31709
31815
  registerPrompts(server);
31710
31816
  registerResources(server);
31711
31817
  return server;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "agent-ready-mcp",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "mcpName": "io.github.mlava/agent-ready-mcp",
5
- "description": "MCP server for Agent Ready — scan any URL for AI-readability against the Vercel Agent Readability Spec, the llmstxt.org standard, and agent-protocol manifests (MCP server cards, A2A, agents.json, agent-permissions.json, UCP, x402, NLWeb). 68 checks with per-check fix guidance.",
5
+ "description": "MCP server for Agent Ready — scan any URL for AI-readability against the Vercel Agent Readability Spec, the llmstxt.org standard, and agent-protocol manifests (MCP server cards, A2A, agents.json, agent-permissions.json, UCP, x402, NLWeb). 69 checks with per-check fix guidance.",
6
6
  "license": "MIT",
7
7
  "author": "Agent Ready",
8
8
  "repository": {