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 +4 -2
- package/dist/mcp-server.mjs +113 -7
- package/package.json +2 -2
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).
|
|
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
|
|
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
|
|
package/dist/mcp-server.mjs
CHANGED
|
@@ -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
|
-
>
|
|
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
|
-
>
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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).
|
|
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": {
|