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"] |
How it is decided
Section titled “How it is decided”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.
What the descriptor says
Section titled “What the descriptor says”_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.