Publishing /.well-known/ai-catalog.json is one way to list MCP servers, A2A agents, and OpenAPI schemas for agent discovery. The shape is simple: specVersion, host, and an entries array.
The failure mode is quieter than a missing file. A catalog can stay up while an entry still points at a moved MCP URL, a renamed skill, or an OpenAPI document that no longer matches the live API.
DIY checks that catch this without new tooling:
- curl each entry URL in CI and require a non-error response
- diff listed names against what the live MCP or schema endpoint actually returns
- fail the job when the catalog and runtime disagree
When you change an MCP mount path or ship a breaking schema edit, what process updates the ARD manifest, and what check do you run so agents do not keep discovering the stale entry?
Top comments (3)
The asymmetry I'd add to your three checks: curling each entry URL only catches entries that are wrong, it never catches entries that are missing. A manifest can be perfectly green while the runtime exposes an MCP server nobody declared, which is the more dangerous direction for anything downstream trusting the catalog as a complete inventory. So the assert has to be set equality both ways - manifest subset of runtime AND runtime subset of manifest - not just liveness.
Answering your question directly: the only process that held up for us was generating the manifest from the runtime in CI instead of hand-editing it, so a moved mount path shows up as a build diff and a stale entry becomes a reviewable change. The moment someone can edit the file by hand, it drifts. Do you treat the generated-vs-committed diff as the gate, or is the manifest authored on purpose?
That set-equality correction is important: liveness proves declared entries exist, but says nothing about inventory completeness.
I'd treat the generated-vs-committed diff as the gate. The process would be:
Canonicalization matters because otherwise ordering noise trains reviewers to ignore the diff.
For fields that cannot be derived from runtime state - descriptions, ownership, documentation links - I'd keep a small human-authored metadata overlay keyed by a stable server ID, then fail generation if either side contains an unmatched key. That preserves reviewable editorial content without allowing the inventory itself to drift.
So yes: runtime-derived inventory, committed artifact, generated diff as the merge gate feels like the safest split.
Some comments may only be visible to logged-in visitors. Sign in to view all comments.