The descriptor
GET /v1/servers/{name} (or the get_server tool) returns the official server.json verbatim plus enrichment under _meta, so the registry stays a compliant subregistry of the official one. The namespace prefix is dev.protogrid/, the reverse-DNS form of protogrid.dev.
{ "server": { /* verbatim official server.json: name, description, version, packages[], remotes[] … */ }, "_meta": { "io.modelcontextprotocol.registry/official": { "status": "active", "isLatest": true, "publishedAt": "…", "updatedAt": "…" }, "dev.protogrid/connectability": { "class": "R1", "autonomous": true, "human_steps": [], "preferred": { "kind": "remote", "idx": 0 }, "remotes": [{ "idx": 0, "url": "https://api.example/mcp", "transport": "streamable-http", "templated": false, "headers": [{ "name": "Authorization", "required": true, "secret": true, "value": null, "secret_names": ["EXAMPLE_TOKEN"] }], "auth": { "type": "api_key", "location": { "header": "Authorization", "scheme": "Bearer" }, "secret_name": "EXAMPLE_TOKEN", "oauth": null }, "protocol": { "supported_versions": ["2026-07-28"], "stateless": true }, "health": { "reachable": true, "uptime_30d": 0.99, "latency_ms_p50": 120, "consecutive_failures": 0, "last_probe_at": "…", "last_ok_at": "…" } }], "packages": [{ "idx": 0, "registry_type": "npm", "identifier": "@example/mcp", "version": "1.2.3", "runtime_hint": "npx", "transport": "stdio", "secrets": ["EXAMPLE_TOKEN"], "requires_execution": true }] }, "dev.protogrid/tools": [{ "name": "search", "title": null, "description": "…", "annotations": { "readOnlyHint": true }, "source": "probe", "observed_at": "…" }], "dev.protogrid/trust": { "score": 91, "components": { "provenance": 85, "liveness": 100, "freshness": 85, "hygiene": 100 }, "drivers": ["+repository", "+reachable", "+uptime-99%"], "flags": [], "blocked": false, "computed_at": "…", "disclaimer": "Derived from observable signals …; no code audit performed." }, "dev.protogrid/quality": { "score": 88, "label": "good", "components": { "protocol": 88, "auth": null, "hygiene": 92, "stability": null }, "checks": [{ "id": "protocol.modern", "category": "protocol", "status": "pass", "detail": "supports 2026-07-28 (server/discover)" }], "drivers": ["~protocol.list_ttl"], "tool_count": 12, "token_estimate": 2100, "tools_hash": "…", "tools_changed_at": null, "computed_at": "…", "disclaimer": "…" }, "dev.protogrid/identity": { "canonical_id": "io.github.example/mcp", "aliases": [], "alias_count": 0, "repository_key": "github:example/mcp", "owner": { "verified": true, "method": "github", "since": "…" } } }, "next_actions": [ /* list_tools, get_connection, search with ready arguments */ ]}- Tools omit
input_schema/output_schemain the descriptor to keep it small; pass?schemas=true, or uselist_tools, which always returns full schemas and paginates by tool name. preferredis the remote or packageget_connectionwill pick: reachable no-auth remote, then api_key remote not known dead, then OAuth remote not known dead, then any non-templated remote, then a package with a known runtime, then the first package.- Secret names are placeholders. Publisher-declared secret variables win; otherwise a non-Authorization header becomes its env-style name (
X_API_KEY), and a bare bearer becomes<KEY>_TOKENwhereKEYis the last segment of the server name. - Blocked or deleted servers still answer with 200 so an agent can see why: remotes, packages and tools are emptied,
autonomousis false, and the trust flags sayblockedordeleted.get_connectionrefuses with 403 or 410. - Quality is described on the quality score page.
- Identity lists other active names that share the same repository, a common form of duplicate listing.
- Owner says whether someone proved control of the server’s namespace, by GitHub login (
io.github.<login>) or by a DNS TXT record on the domain, and since when. It never says who, it is not an audit, and no score depends on it. Unclaimed servers answer{ "verified": false, "method": null, "since": null }.