Skip to content
Agentmart
Submit a tool

agent-readiness-audit

Audit agent readiness by script: AI-crawler rules, product schema, no-JS HTML, feeds.

Skill by indranilbanerjee

IndexedMIT★ 909
Write a review

Chalk Labs

Need help deploying agent-readiness-audit?

Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.

Book a call

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/indranilbanerjee-agent-readiness-audit

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Audit agent readiness by script: AI-crawler rules, product schema, no-JS HTML, feeds. "can AI agents use our site"

Use cases: frontend, security, agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/agent-readiness-audit

What's inside

Skill name
agent-readiness-audit
Description
Audit agent readiness by script: AI-crawler rules, product schema, no-JS HTML, feeds. "can AI agents use our site"
License
MIT
Instructions
154 lines in SKILL.md · view on GitHub

Before installing

  • Instructions call the network

Agent Skills spec issues

  • files: referenced but missing: scripts/agent-readiness-audit.py

Files (1)

  • SKILL.md

SKILL.md (first lines)

# /digital-marketing-pro:agent-readiness-audit

> **Script location.** If your host does not set `${CLAUDE_PLUGIN_ROOT}`, the scripts are in this plugin's `scripts/` folder, next to `skills/`. Run them with Python 3.10 or newer: `python`, or `python3` where `python` is not found (macOS, many Linux systems).

## Purpose

Answer one question with evidence: **can AI agents and AI crawlers use this site?** Concretely, the audit checks five things:
- AI crawlers are allowed to reach the content.
- The content is in the HTML the server sends, so it does not depend on JavaScript running.
- Structured data says what the page is.
- The product feed is complete enough for AI shopping surfaces.
- Optionally, the site exposes agent tools (WebMCP).

Every check is deterministic and runs in `scripts/agent-readiness-audit.py`. The skill adds interpretation and the brand's policy decisions on top of the script's output; it never replaces that output with judgment.

## What the primary sources say (checked 2026-10-04)

From Google's [AI optimization guide](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) (last updated 2026-07-10):
- **No special files.** Under the heading "Mythbusting generative AI search", Google lists "LLMS.txt files and other 'special' markup". It says "You don't need to create new machine readable files, AI text files, markup, or Markdown to appear in Google Search (including its generative AI capabilities), as Google Search itself doesn't use them." **This skill never recommends llms.txt for Google.**
- **Structured data:** "Structured data isn't required for generative AI search, and there's no special schema.org markup you need to add." The audit checks JSON-LD because it powers **rich results** (merchant listings, organization info), not because AI features require it.
- **JavaScript:** "Google is able to process content within JavaScript as long as it isn't blocked." The no-JS check is a robustness test: content that is already in the server HTML can be read by every crawler and agent, whether or not it runs JavaScript.
- **Agents:** browser agents may analyze screenshots, inspect the DOM structure, and interpret the accessibility tree. Hence the accessibility-basics check. Google names the Universal Commerce Protocol (UCP) as an emerging protocol.

### AI crawler tokens (each verified on the vendor's own page)

| Token | Vendor | Role in the audit | What blocking it means (vendor's words, paraphrased) | Source |
|---|---|---|---|---|
| `OAI-SearchBot` | OpenAI | search: **must be allowed** | Site not surfaced in ChatGPT search features | [OpenAI bots](https://developers.openai.com/api/docs/bots) |
| `ChatGPT-User` | OpenAI | user fetch: **must be allowed** | User-initiated visits. OpenAI: robots.txt "may not apply" to these | same |
| `OAI-AdsBot` | OpenAI | ads: **must be allowed** if the brand runs ChatGPT Ads | Validates the safety of pages submitted as ChatGPT ads | same |
| `GPTBot` | OpenAI | training: **policy** | Content excluded from foundation-model training | same |
| `Claude-SearchBot` | Anthropic | search: **must be allowed** | Content not indexed for Claude's search results | [Anthropic](https://support.claude.com/en/articles/8896518) |
| `Claude-User` | Anthropic | user fetch: **must be allowed** | Claude can't retrieve the page for a user's question. Anthropic honors robots.txt for all three of its bots | same |
| `ClaudeBot` | Anthropic | training: **policy** | Future content excluded from training datasets | same |
| `PerplexityBot` | Perplexity | search: **must be allowed** | Not surfaced or linked in Perplexity results (Perplexity says it is not used for model training) | [Perplexity bots](https://docs.perplexity.ai/guides/bots) |
| `Perplexity-User` | Perplexity | user fetch: **must be allowed** | Perplexity says this fetcher "generally ignores robots.txt rules" | same |
| `Google-Agent` | Google | user fetch: **must be allowed** | Agents on Google infrastructure that browse and act on a user's request. Google: user-triggered fetchers "generally ignore robots.txt rules"; Google is testing Web Bot Auth with the `https://agent.bot.goog` identity | [Google user-triggered fetchers](https://developers.google.com/crawling/docs/crawlers-fetchers/google-user-triggered-fetchers) (checked 2026-10-27) |
| `Google-GeminiNotebook` | Google | user fetch: **must be allowed** | Fetches URLs a user adds as sources in a Gemini Notebook project. It replaces `Google-NotebookLM`, "supported until August 2026": the audit warns when robots.txt still names the old token | same |
| `Google-Extended` | Google | training: **policy** | Controls use for Gemini training and grounding. It "does not impact a site's inclusion in Google Search nor is it used as a ranking signal", and it has no separate user-agent string | [Google crawlers](https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers) |
| `Applebot-Extended` | Apple | training: **policy** | Controls use in Apple foundation-model training. It does not crawl, and pages that disallow it "can still be included in search results" | [Apple](https://support.apple.com/en-us/119829) |

"Policy" means that blocking training crawlers is the brand's choice. The audit reports it as info unless the brand sets `--training-policy allow|block`, in which case a mismatch fails the check.

## Inputs

All checks run **offline** on files the user exports. The script fetches over the network only with `--fetch`.

- **robots.txt**: `--robots FILE`, or `--site URL --fetch`. Add `--path /products/` (repeatable) to test the paths that matter, beyond `/`. On Windows, Claude Code's Bash tool is Git Bash, which rewrites `/products/` into a Windows folder: set `MSYS_NO_PATHCONV=1` for the command (as below) or write `//products/`. The script refuses a `--path` that doesn't start with `/`.
- **Server HTML**: `--html FILE` (repeatable). Save it as the server sends it, for example with `curl -L URL > page.html`, **not** "Save as" from a browser, which saves the post-JavaScript DOM. Add `--expect "Product name"` (repeatable) for text that must be in that HTML, such as a product name or price.
- **Merchant Center feed export**: `--feed FILE` (TSV, CSV, or RSS/Atom XML with `g:` attributes).
- **Agentic-commerce product feed (optional)**: `--acp-feed FILE`. Accepts JSONL in OpenAI's product file format or the Google-compatible CSV/TSV ([spec](https://developers.openai.com/commerce/specs/file-upload/products)).
- **Discovery feed first; checkout is partner-gated on both platforms.** OpenAI onboards product feeds into ChatGPT for approved partners only (apply at chatgpt.com/merchants) and recommends a full snapshot at least daily ([get started](https://developers.openai.com/commerce/guides/get-started), read 2026-10-28). On 2026-03-24 OpenAI said the first Instant Checkout "did not offer the level of flexibility" it wanted and now lets merchants use their own checkout while it focuses on discovery (OpenAI, "Powering Product Discovery in ChatGPT"). Google's UCP-powered checkout in AI Mode and the Gemini app is for select merchants, with products eligible in the US, Canada and Australia (see `native_commerce` below). So the audit scores the feed; checkout is an application the merchant makes, not a field to fill.
- **WebMCP (optional, experimental)**: `--webmcp`.
- **Brand policy**: `--training-policy either|allow|block`. The default, `either`, reports training-crawler rules without judging them.
- **Access logs (optional)**: the site's server or CDN logs, for `scripts/crawler-log-report.py` (step 5). Combined format or JSON lines (Cloudflare Logpush keys work), `.gz` allowed.

## Process

1. **Load brand context.** Read `~/.claude-marketing/brands/_active-brand.json`, then `~/.claude-marketing/brands/{slug}/profile.json`.
   - From the profile, take the domain, whether the brand sells products (feed checks apply), and any stated AI-training policy (sets `--training-policy`).
   - If no brand exists, ask: "Set up a brand first (/digital-marketing-pro:brand-setup)?" or proceed with the inputs the user gives.
2. **Collect inputs.** Ask for exports first. If the user only has a URL, confirm they want a live fetch before using `--fetch`.
3. **Run the audit.** Create the output folder first; nothing else creates it.
   ```bash
   mkdir -p "${CLAUDE_PLUGIN_DATA}/{brand}/seo/agent-readiness/{date}"
   MSYS_NO_PATHCONV=1 python "${CLAUDE_PLUGIN_ROOT}/scripts/agent-readiness-audit.py" \
       --robots robots.txt --path /products/ \
       --html home.html --html product.html --expect "Acme Anvil" \
       --feed products.tsv --acp-feed openai-feed.jsonl --webmcp \
       --training-policy either --format json > "${CLAUDE_PLUGIN_DATA}/{brand}/seo/agent-readiness/{date}/02-audit.json"
   ```
   Live variant, used only when the user agreed to network access:
   ```bash
   python "${CLAUDE_PLUGIN_ROOT}/scripts/agent-readiness-audit.py" --site https://example.com --fetch \
       --page https://example.com/products/anvil --format json
   ```
   Exit codes:
   - `0`: no check failed (warnings allowed)
   - `1`: at least one check failed
   - `2`: bad input (nothing to audit, a missing or unparseable file, a bad flag)

   On `2`, fix the input and re-run. Do not interpret a partial run.
4. **Interpret each check.** Report the script's status per check: `pass`, `warn`, `fail`, `info` or `skipped`.
   - **robots_ai_crawlers**: a blocked search, user-fetch or ads bot is a **fail**. Name the bot and quote what blocking it costs, from the table above.
   - **structured_data**:
     - an unparseable JSON-LD block is a **fail**
     - a Product without `offers` is a **warn**, because merchant-listing rich results require name, image and offers ([Google](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing))
     - no Organization markup anywhere is a **warn**
     - FAQPage is fine to keep, but Google shows FAQ rich results only for "well-known, authoritative government and health websites" ([Google](https://developers.google.com/search/docs/appearance/structured-data/faqpage))
   - **no_js_render**: a **fail** when visible text is below the floor (`--min-text`, default 250 characters), when an app-shell root (`#root`, `#__next`, `#app`, ...) holds little text, or when an `--expect` phrase is missing from the server HTML.
   - **accessibility_basics**: **warn** only. Covers a missing `<html lang>`, images without alt, unlabelled inputs, and unnamed buttons.
   - **merchant_feed**:
     - **Fail** conditions:
       - any required attribute is missing: `id`, `title`, `description`, `link`, `image_link`, `availability`, `price` ([product data spec](https://support.google.com/merchants/answer/7052112))
       - an `availability` value is outside `in_stock`, `out_of_stock`, `preorder`, `backorder`
       - a `native_commerce(checkout_eligibility)` value is not TRUE/FALSE
     - **`native_commerce`**: report how many products opt into checkout on Google. Only listings with `native_commerce(checkout_eligibility)` = TRUE show the "Buy" button. The feature is for select merchants, with products eligible in the US, Canada and Australia ([Merchant Center help](https://support.google.com/merchants/answer/16837055); [UCP guide](https://developers.google.com/merchant/ucp/guides/merchant-center)). The account-level return policy and customer-support contact can't be checked from a feed, so list them as manual checks.
     - **Conversational attributes** (`question_and_answer`, `document_link`, `related_product`, `item_group_title`, `variant_option`, `popularity_rank`) are optional ([help](https://support.google.com/merchants/answer/17085370)). Report their coverage; never fail on them.
   - **acp_feed**: optional. If supplied, missing required fields are a **fail**. Report the `is_eligible_search` / `is_eligible_checkout` counts.
   - **webmcp**: always `info`. WebMCP is a Chrome origin trial (from Chrome 149) and "under active discussion and subject to change" ([Chrome docs](https://developer.chrome.com/docs/ai/webmcp)). Report the declarative `toolname` / `tooldescription` forms and the inline `registerTool` calls found. Recommend nothing beyond "optional experiment".
5. **See what the crawlers actually did (optional; needs the site's access logs).** robots.txt says what a crawler may fetch; the logs say what it fetched. Anyone can send a crawler's user-agent string, so the report checks each request against the addresses the vendor publishes.
   ```bash
   python "${CLAUDE_PLUGIN_ROOT}/scripts/crawler-log-report.py" --refresh-ranges   # downloads the vendors' lists; the only network call
   python "${CLAUDE_PLUGIN_ROOT}/scripts/crawler-log-report.py" --log access.log --log access.log.1.gz \
       > "${CLAUDE_PLUGIN_DATA}/{brand}/seo/agent-readiness/{date}/02b-crawler-log.json"
   ```
   - The logs never leave the machine, and the report prints no full IP address. Ask the user before reading logs they haven't offered, and say they contain visitors' addresses.
   - Each crawler is counted as **verified** (from a published address), **spoofed** (its name from an address the vendor does not list: robots.txt won't stop it, a firewall or CDN rule will) or **unverified** (the lists are not downloaded, or not all of them). Never call an unverified request genuine.
   - Read it beside step 4: a search or user-fetch bot that robots.txt allows but that made no verified request may not have the site in its index yet; a bot that gets many 4xx/5xx needs those paths fixed before its visits mean interest.
   - Lists older than 14 days are flagged; run `--refresh-ranges` again before a report you will act on.
6. **Decide policy questions with the user, not for them.** Two are the brand's call: whether to block training crawlers, and whether to opt products into checkout on Google. Present the trade-off and the source.
7. **Prioritize fixes.** Use the script's `recommendations` array as the backbone.
   - Order by impact: blocked answer engines → content missing from server HTML → broken JSON-LD → feed required attributes → everything else.
   - Route the work: rendering to `/digital-marketing-pro:tech-seo-audit`, markup to `/digital-marketing-pro:entity-audit`, and visibility follow-up to `/digital-marketing-pro:aeo-geo`.

## Numbered output convention

All outputs go to `${CLAUDE_PLUGIN_DATA}/{brand}/seo/agent-readiness/{YYYY-MM-DD}/`:

From indranilbanerjee/digital-marketing-pro, MIT.

More from indranilbanerjee/digital-marketing-pro

Signals

Stars
909
Forks
146
Open issues
0
Last commit (this folder)
Oct 11, 2026 (21 days ago)
Last release
Jul 29, 2026 (3 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from indranilbanerjee

Done for you

Rather not set it up yourself?

Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.

See how we build AI agents →Read the case studies

Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.

launches shipped
50+
launches shipped
media placements
500+
media placements
founders on every account
2
founders on every account

Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block

Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.

Get agent-readiness-audit running in your business

Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.

Goes to the Chalk Labs founders, not the newsletter. Privacy

Need help deploying agent-readiness-audit?

CallGet help
Cite this page

agent-readiness-audit skill. Agent Mart. https://agentmart.dev/skills/indranilbanerjee-agent-readiness-audit (last updated 2026-10-24)