Add agent-readiness discovery endpoints for AI agents - #478
Conversation
Publish RFC 8288 Link headers, RFC 9727 API catalog, OAuth discovery metadata, MCP server card, agent skills index, auth.md, Content Signals in robots.txt, markdown negotiation, WebMCP tools, and DNS-AID zone templates for nextflow.io agent discovery. Co-authored-by: Edmund Miller <edmundmiller@users.noreply.github.com>
✅ Deploy Preview for nextflow-staging ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Replace the local nextflow-docs stub with the four official skills from https://github.com/nextflow-io/agent-skills, synced at build time with SHA-256 digests for the discovery index. Co-authored-by: Edmund Miller <edmundmiller@users.noreply.github.com>
Co-authored-by: Edmund Miller <edmundmiller@users.noreply.github.com>
ewels
left a comment
There was a problem hiding this comment.
Contains a mixture of deployment methods, which is very confusing.
Netlify is only used for deployment previews I think, so does not need to be agent-ready. It's only used for internal review and should not be accessed by an agent.
There are also many many broken URLs referenced in here, a lot of functionality that doesn't exist. Needs self-review before going any further.
- api-catalog: drop 'status' rel pointing at feed.xml (RSS != status) - mcp/server-card.json: replace fake streamable-http /mcp endpoint with webmcp transport pointing at the homepage (WebMcpBridge uses navigator.modelContext, not an HTTP server) - oauth-authorization-server: remove authorization_endpoint, token_endpoint, jwks_uri and related fields that all 404 - Delete jwks.json empty stub (no keys, no real OAuth flow) - _headers: remove jwks.json entry
Remove the AI-generated OpenAPI spec and its references from api-catalog (service-desc), _headers Link rel, auth.md, and index.md. nextflow.io is a marketing site, not an API; the spec was unnecessary overhead that produced a dead URL.
URL validation reviewI checked every URL referenced in the changed files ( ✅ Valid / correct
|
- oauth-authorization-server: remove register_uri and claim_uri — no backing implementation, same class of hallucinated-endpoint issue - auth.md: remove 'Agent registration' section referencing /agent/register and /agent/claim; simplify to reflect anonymous read-only reality - index.md: update http://docker.io → https://www.docker.com/ and http://singularity.lbl.gov/ → https://apptainer.org/ (Singularity was renamed to Apptainer)
|
Thanks for the thorough URL audit! Addressed in c5410c9:
Generated by Claude Code |
ewels
left a comment
There was a problem hiding this comment.
I still think we should strip all the auth / oauth stuff. It's not designed for a website like this and although most of it is technically correct I guess, I think having it there at all is just going to be a red herring and do more harm than good.
Please remove it entirely..
…gests - Remove oauth-authorization-server, oauth-protected-resource, auth.md entirely — auth machinery is a red herring on a public marketing site - Revert netlify.toml edge_functions entries — Netlify config is internal - Remove sha256 digests from agent-skills/index.json and the generator script (generate-agent-skills-index.mjs) - Clean up _headers and index.md of now-deleted file references
There was a problem hiding this comment.
Can remove, as specifically for netlify
|
|
||
| The function rewrites `/` and `/index.html` to `/index.md` when `Accept: text/markdown` is present. | ||
|
|
||
| ## Netlify previews |
| "Items": [ | ||
| { | ||
| "Header": "Link", | ||
| "Value": "</.well-known/api-catalog>; rel=\"api-catalog\", </docs.seqera.io/nextflow/>; rel=\"service-doc\", </openapi.json>; rel=\"service-desc\"", |
There was a problem hiding this comment.
still referencing openai even though it's gone
There was a problem hiding this comment.
Don't want any netlify stuff so can remove this
| Disallow: /logs/ | ||
| Disallow: /tests/ | ||
| Disallow: /releases/ | ||
| Content-Signal: ai-train=no, search=yes, ai-input=yes |
There was a problem hiding this comment.
We want to be in training sets..
| Content-Signal: ai-train=no, search=yes, ai-input=yes | |
| Content-Signal: ai-train=yes, search=yes, ai-input=yes |
| training: "https://training.nextflow.io/latest/", | ||
| community: "https://community.seqera.io/tag/nextflow", | ||
| examples: "https://nextflow.io/examples.html", | ||
| api_catalog: "https://nextflow.io/.well-known/api-catalog", |
There was a problem hiding this comment.
This just links to the docs again, I think it can be dropped
| { title: "Basic pipeline", url: "https://nextflow.io/basic-pipeline.html" }, | ||
| { title: "Mixing scripting languages", url: "https://nextflow.io/mixing-scripting-languages.html" }, | ||
| { title: "BLAST pipeline", url: "https://nextflow.io/blast-pipeline.html" }, | ||
| { title: "RNA-seq pipeline", url: "https://nextflow.io/rna-seq-pipeline.html" }, | ||
| { title: "Machine learning pipeline", url: "https://nextflow.io/machine-learning-pipeline.html" }, |
There was a problem hiding this comment.
I don't love hardcoding these, could go stale easily
There was a problem hiding this comment.
How is this used? Would end users / agents have to install an MCP to use the Nextflow website? I can't ever see that happening if so tbh. If it's anything other than pure raw "better discovery" then we should cull this as unnecessary complexity.
|
|
||
| <link rel="api-catalog" href="/.well-known/api-catalog" /> | ||
| <link rel="service-doc" href="https://docs.seqera.io/nextflow/" /> | ||
| <link rel="service-desc" href="/openapi.json" /> |
| "docs": "bash build_docs.sh", | ||
| "prebuild": "node scripts/generate-agent-skills-index.mjs", | ||
| "build": "astro check && astro build && bash build_docs.sh", | ||
| "generate:agent-skills-index": "node scripts/generate-agent-skills-index.mjs", |
There was a problem hiding this comment.
It'd be good if this ran on CI somewhere to auto-update (or at least check in CI so that we force it to stay up to date).
There was a problem hiding this comment.
Either that or add it onto the build command that runs during deployment (in which case, probably don't need the file itself under source control?)

Summary
Implements the agent-readiness checks reported by isitagentready.com for nextflow.io. The site is a static Astro app on S3 + CloudFront; this PR adds the discovery artifacts, headers, and infrastructure hooks needed for AI agent discovery.
Changes
Discoverability
public/_headers—Linkresponse headers on/pointing toapi-catalog,service-doc, andservice-desc(Netlify previews)infra/cloudfront/— CloudFront Function for markdown negotiation and response headers policy template for productionscripts/set-s3-agent-metadata.sh— Sets correctContent-TypeandLinkmetadata on S3 objects during publishContent accessibility
public/index.md— Markdown homepagenetlify/edge-functions/markdown-negotiate.js— Serves markdown whenAccept: text/markdownis present (withx-markdown-tokens)Bot access control
public/robots.txt— AddedContent-Signal: ai-train=no, search=yes, ai-input=yesProtocol discovery
/.well-known/api-catalog— RFC 9727 linkset (application/linkset+json)/openapi.json— Minimal OpenAPI 3.1 spec for public endpoints/.well-known/oauth-authorization-server— RFC 8414 metadata withagent_authblock (honest stub — no protected APIs today)/.well-known/oauth-protected-resource— RFC 9728 metadata/.well-known/jwks.json— Empty JWKS (reserved)/auth.md— Agent registration discovery document/.well-known/mcp/server-card.json— MCP server card (SEP-1649)/.well-known/agent-skills/index.json— Agent skills index synced from nextflow-io/agent-skills at build time (install-nextflow,create-workflow,run-module,launch-workflow) with SHA-256 digestssrc/components/WebMcpBridge— WebMCP tools vianavigator.modelContextDNS-AID
infra/dns-aid/nextflow.io.zone— SVCB records for_index._agentsand_a2a._agents(requires DNS operator to apply + DNSSEC)Agent skills
scripts/generate-agent-skills-index.mjsshallow-clones nextflow-io/agent-skills into.cache/agent-skills, copies eachskills/*/SKILL.mdtopublic/.well-known/agent-skills/, and regeneratesindex.jsonwith digests. Runs automatically viaprebuild.Deployment notes
After merge, production needs:
make publish— runs updated metadata script automaticallymarkdown-negotiation.jsviewer-request function and response headers policy perinfra/cloudfront/README.mdinfra/dns-aid/nextflow.io.zoneand enable DNSSECNetlify PR previews get Link headers and markdown negotiation automatically via
_headersand the edge function.Testing
npx astro check && npx astro build— passesnode scripts/generate-agent-skills-index.mjs— syncs 4 skills from nextflow-io/agent-skills