Skip to content

Connection classes

Every listing gets one class, the best way an agent can reach it right now. It is a first-class search filter (class=) and appears on every result and descriptor as connection_class, together with autonomous and human_steps.

class meaning zero-human? human_steps
R0 remote endpoint, no auth, reachable on the last probe yes []
R1 remote endpoint that needs a static secret (API key or header) the agent already holds yes, when the caller supplies the named secret []
R2 remote endpoint behind OAuth 2 after a one-time consent ["oauth_consent_once"]
L0 only local packages (npm, PyPI, OCI, NuGet, Cargo, bundles): something must run them on the caller’s side no ["run_local_package"]
unknown remotes exist but none is classified yet (not probed, or dead), or nothing to connect to no ["unknown"]

Remote endpoints are probed without credentials: protocol discovery, then a tools/list when no auth is required, or auth classification from WWW-Authenticate, the protected-resource metadata (RFC 9728) and authorization-server metadata (RFC 8414 / OIDC). Publisher-declared secret headers in server.json count as the R1 signal when the probe cannot tell.

Templated URLs (https://{tenant}.example/mcp) are never probed and never preferred. Packages are never executed: the registry stores their coordinates, runtime hint, arguments and secret names, and formats a command / args / env block.

_meta["protogrid/connectability"] carries the class, autonomous, human_steps, the preferred remote or package, every remote with its auth and health, and every package with its secrets. The descriptor page has the full shape.