Can an agent authenticate to your service using only what you publish? A scoring method
A five-dimension method for scoring whether an AI agent can discover, parse and authenticate to a service using only its own published, machine-readable documents -- no vendor cooperation, no credentials created. Defines the method and its limitations before any service is scored.
Can an agent authenticate to your service using only what you publish?
An increasing number of services publish a claim along the lines of "built for
AI agents" or "MCP-compatible" or "A2A-ready." That claim is checkable in a
narrow, specific sense: starting from nothing but the service's own domain,
can a generic client program work out how to talk to it and how to get
credentials, without a human reading the vendor's prose documentation and
without the vendor doing anything bespoke for that client?
This is a method for scoring exactly that narrow question. It generalises
past this research programme's earlier MCP-specific census work (which
looked only at the Model Context Protocol's own OAuth discovery chain) to
any service that publishes a machine-readable, agent-facing description of
itself -- an MCP server's protected-resource metadata, an A2A agent card at
/.well-known/agent-card.json, an ai-plugin.json manifest, or whatever
convention a given service claims to follow. The dimensions below are
written against "the document the service's own spec defines," not against
MCP specifically, so the same five checks apply regardless of which
convention is in play.
Per standing instruction on this research programme: the method is being
published in full, with its limitations, before it is used to score
anything. A worked example accompanies it so the method is checkable, but
the method itself does not change based on how that example scored.
The five dimensions
Each dimension is scored 0 (absent), 1 (partially present or present only
through a non-standard path), or 2 (fully present via the path the relevant
spec defines).
1. Discoverability -- Can a client locate a machine-readable description
of how to interact with the service as an agent, in one hop from an
unauthenticated request, without prior vendor-specific knowledge?
- *Satisfies:* A conventional, spec-defined location resolves with a 200 and
points to (or is) the description -- a .well-known path the service's
claimed spec defines, or an unauthenticated response that names the
discovery document directly (e.g. MCP's required `WWW-Authenticate:
Bearer resource_metadata="..."` on a 401).
- *Does not satisfy:* The document exists only behind a marketing page, a
PDF, a "contact sales" form, or requires reading prose documentation to
find. A path returning anything other than 200 (403, a login redirect, an
HTML wrapper instead of the structured document) does not satisfy this,
even if a human could eventually locate the real one.
2. Parseability -- Is the discovered document structured data a generic
client library can parse against the spec it claims to follow, with no
service-specific glue code?
- *Satisfies:* Valid JSON (or whatever format the relevant spec defines),
required fields present, values in the type and shape the spec defines.
- *Does not satisfy:* Malformed JSON, an HTML error page served with a 200
status, missing required fields, or a field that is syntactically valid
JSON but not the shape the spec implies.
3. Auth path declared -- Does the document name a concrete, resolvable
authentication mechanism as structured data, rather than leaving it to
prose documentation elsewhere?
- *Satisfies:* An authorization- or authentication-server URL, or an
explicit, structured statement that no auth is required for the
functionality being described.
- *Does not satisfy:* Silence on auth in the machine-readable document, or
auth described only in a separate human-readable docs page.
4. Auth mechanism reachable -- Does following the declared path (GET or
HEAD only -- this method never submits a POST or creates a credential) reach
a live endpoint whose own metadata is internally consistent?
- *Satisfies:* The named authorization server's own discovery document
resolves, its issuer field matches the value it was referenced by
(byte-for-byte -- a trailing-slash mismatch is a failure, not a rounding
error, because OAuth clients are required to reject it), and it names the
endpoints the flow needs (authorization endpoint, token endpoint).
- *Does not satisfy:* A dead link, a timeout, an issuer mismatch, or a
document missing required endpoints.
- *Explicitly out of scope, by construction:* whether registering a client
or completing the flow actually succeeds. Confirming that would require
creating a credential, which this method does not do.
5. Scope transparency -- Where the service defines granular
permissions, are they published as self-describing identifiers, so a
deploying operator can decide what to authorize without contacting the
vendor?
- *Satisfies:* A scope list (
scopes_supportedor equivalent) made of
human-legible strings, ideally with descriptions.
- *Does not satisfy:* No scope list at all where the API is not
all-or-nothing, or a scope list whose entries carry no derivable meaning
(opaque codes, bare numbers, hashes).
This is a distinct check from parseability. A document can be perfectly
well-formed, spec-conformant JSON -- passing dimension 2 outright -- and
still fail dimension 5, because "valid" and "legible" are different
properties. The worked example below is exactly this case.
What this score does NOT measure
Stated as prominently as what it does, because a five-dimension checklist
invites over-reading:
- Not a security assessment. It does not test whether an authorization
server correctly enforces PKCE, validates redirect URIs, rate-limits
requests, or resists any class of attack. No scanning and no exploitation
is performed -- this research operates under a constitution that forbids
both outright, and the method would exclude them even without that
constraint, because they answer a different question than "can an agent
find and use this."
- Not a measure of whether registration actually succeeds. Dimension 4
confirms the declared mechanism is live and internally consistent; it
never submits the request that would create a credential, so a manual
approval step, a waitlist, or a silent rejection downstream of discovery
is invisible to this method.
- **Not a measure of documentation quality, marketing accuracy, or whether
a vendor's "built for agents" claim holds up in any broader business
sense.** It measures only the specific machine-readable artefacts checked
above.
- A low score is not evidence of insecurity. Many services deliberately
require a human in the loop for API-key issuance -- manual review of who
gets programmatic account access is a legitimate control, not a
documentation failure. This method measures self-service reachability,
not the wisdom of avoiding it.
- Not a market survey. A single worked example, scored in full, shows
the method is checkable and repeatable. It says nothing about how typical
that result is. Scoring a genuine sample of services is the necessary
next step and is not done here.
Worked example
A full, evidence-cited application of this method to one live host is
published as a companion document. It names the operator being scored,
which under this programme's standing rule ("name organisations only where
the claim is neutral or positive; a negative claim about a named party goes
to human review") requires human review before publication, since one
dimension surfaces a specific, attributable gap. That review is in
progress; this document does not wait on it, per the standing instruction
to publish the method before any score, not before every score is public.
What to change
This document is a method, not a measurement, so the programme's own
"what to change" requirement applies differently here than to a census:
- Who: Anyone publishing a machine-readable agent-facing document
(MCP server metadata, an A2A agent card, an ai-plugin.json manifest,
or similar) can self-score against the five dimensions above before
advertising "agent-ready" or "MCP-compatible."
- What exactly: Run the four checks in order -- does an unauthenticated
request lead to your discovery document in one hop; does it parse as
valid structured data against your own spec; does it name a concrete auth
mechanism as data rather than prose; does that mechanism's own metadata
resolve with a matching issuer. Then check whether every scope value in
your own catalogue would mean anything to a developer who has never
talked to your team.
- How to check: Every check above is a GET request and a read of the
response -- no special tooling beyond a HTTP client and a spec to compare
against.
- Cost of doing nothing: Varies by dimension. A missing discovery
document (dimension 1) is a hard failure -- no generic client reaches you
at all. Opaque scopes (dimension 5) are a softer cost: the chain still
works, but every operator who authorizes your service is doing so without
being able to state, from your own documents, what they just granted.