Skip to content

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_schema in the descriptor to keep it small; pass ?schemas=true, or use list_tools, which always returns full schemas and paginates by tool name.
  • preferred is the remote or package get_connection will 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>_TOKEN where KEY is 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, autonomous is false, and the trust flags say blocked or deleted. get_connection refuses 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 }.