Agent-readiness is the new SEO. This Action gates your site's agent-readiness level on every deploy, so regressions never reach production. Drop it into your workflow β works with Cloudflare Pages, Vercel, GitHub Pages, or any public URL.
- name: Check Agent Readiness
uses: lingzhong/agent-readiness-action@v0.1
with:
url: https://example.com
min-level: 2| Level 1 Β· Basic Web Presence | Level 5 Β· Agent-Native |
![]() |
![]() |
AI agents discover your site through well-known artifacts:
/.well-known/agent-card.json, MCP server cards, A2A descriptors, and
Agent Skills index files. If those regress β a 404 on the agent card, a
missing transport field, a stale skills index β agent traffic silently
drops. Catch it in CI, not in production.
This action calls an external agent-readiness scanner (default
isitagentready.com) against your freshly
deployed URL and fails CI if the detected level drops below a threshold.
The scanner reports one of six levels based on which well-known artifacts are present and valid:
| Level | Name | Means |
|---|---|---|
| 0 | Not Ready | No agent-discovery artifacts detected. |
| 1 | Basic Web Presence | robots.txt + sitemap.xml. |
| 2 | Bot-Aware | Level 1 + Content-Signal directives. |
| 3 | Agent-Readable | Level 2 + Accept: text/markdown content negotiation. |
| 4 | Agent-Integrated | Level 3 + API Catalog + MCP Server Card + Agent Skills index. |
| 5 | Agent-Native | Level 4 + OAuth Protected Resource Metadata + valid A2A Agent Card. |
- uses: lingzhong/agent-readiness-action@v0.1
with:
url: https://example.comDefault min-level: 2 requires at least Content-Signal directives
(the Bot-Aware tier). Ratchet up as you build out .well-known/.
jobs:
deploy:
runs-on: ubuntu-latest
outputs:
url: ${{ steps.publish.outputs.url }}
steps:
- id: publish
# ...your deploy step, setting `url` output
agent-readiness:
needs: deploy
runs-on: ubuntu-latest
steps:
- name: Check Agent Readiness
uses: lingzhong/agent-readiness-action@v0.1
with:
url: ${{ needs.deploy.outputs.url }}
min-level: 4See examples/ for full workflows for Cloudflare Pages,
Vercel, GitHub Pages, and custom servers.
This is the default: if the scanner API is unreachable or returns a
malformed response, the step emits a ::warning:: and passes. Your
deploy isn't blocked by a third-party outage. Set
fail-on-scanner-unavailable: true to flip to hard-fail.
If you want the step to never fail the workflow β even on a real level regression β use the native GitHub Actions knob:
- uses: lingzhong/agent-readiness-action@v0.1
continue-on-error: true
with:
url: https://example.comcontinue-on-error is native GitHub Actions. We intentionally don't
re-implement it.
| Input | Required | Default | Purpose |
|---|---|---|---|
url |
yes | β | Target URL to scan. |
min-level |
no | 2 |
Fail if detected level is below this (0β5; default 2 = Bot-Aware). |
wait-for-url |
no | true |
Poll target until reachable before scanning. |
wait-timeout |
no | 60 |
Max seconds to wait for target availability. |
wait-interval |
no | 3 |
Seconds between target-URL reachability polls. |
scanner-endpoint |
no | https://isitagentready.com/api/scan |
Override for self-hosted or alternative scanners. |
scanner-retries |
no | 3 |
Retries on scanner API call. |
scanner-retry-delay |
no | 5 |
Seconds between scanner retries. |
fail-on-scanner-unavailable |
no | false |
If true, hard-fail when the scanner is unreachable or returns malformed output. Default false warns and passes. |
annotations |
no | true |
Emit ::error:: / ::warning:: workflow commands. |
wait-for-url polls the target URL. scanner-retries retries the
scanner API call. Two separate retry loops; they don't overlap.
| Output | Type | Meaning |
|---|---|---|
level |
integer or empty | Parsed level from scanner; empty if the scan didn't complete. |
passed |
'true' / 'false' |
Whether the gate passed. |
response |
JSON string | Raw scanner response (truncated at ~900 KB to stay under GitHub's step-output limit). |
- Level regression (
level < min-level): hard fail. - URL unreachable within
wait-timeout: hard fail. - Scanner unavailable or malformed response: governed by
fail-on-scanner-unavailable. Defaultfalsewarns and passes (so a third-party outage doesn't block your deploy). - Soft-fail on everything: set
continue-on-error: trueon the step.
ubuntu-latestormacos-latestrunners β both preinstall the only two runtime dependencies,curlandjq.- Windows runners: best-effort. The bash script runs under Git Bash
and
curlis available, butjqis not preinstalled. Install it in a prior step (e.g.choco install jq -y) if you need Windows. Windows is not exercised in our CI matrix.
Read the ::error:: annotation on the failing step β it names the
detected level (e.g. level 2 (Bot-Aware)) and enumerates the specific
checks to fix to reach the next level, pulled from the scanner's
nextLevel.requirements guidance. For example:
::error title=Agent Readiness regression: level 2 (Bot-Aware) < min 4::
Detected level 2 (Bot-Aware) (expected >= 4).
To reach level 3 (Agent-Readable), fix:
- markdownNegotiation: Support Accept: text/markdown content negotiation...
Raw response in step output 'response'.
The guidance always points to the next level above the detected one
(here, level 3), not straight to min-level. Re-run after each fix to
climb one tier at a time. The full raw scanner response is in the step
output response for downstream tools to consume. Open the scanner's web UI at
isitagentready.com with your URL to see
full evidence per check.
Default behavior: the step emits a ::warning::, passes, and your
deploy proceeds. Set fail-on-scanner-unavailable: true to flip to
hard-fail.
Yes β set scanner-endpoint to your own API. Response shape must match
what isitagentready.com returns (a JSON object with a numeric level
field, at minimum).
No. This is a post-deploy gate against a live URL. Pre-flight local
linting of .well-known/ files is a separate tool (not currently
shipped; may appear in the future).
scripts/check-readiness.sh can be invoked outside GHA for local
debugging:
URL=https://example.com ./scripts/check-readiness.shThis is best-effort for local development. The supported surface is the composite Action.
See CONTRIBUTING.md. By participating, you agree to
the CODE_OF_CONDUCT.md.
MIT.

