{
  "$schema": "https://public-agents.com/schemas/evidence-probe.schema.json",
  "schemaVersion": 1,
  "subject": {
    "type": "tool",
    "id": "grafana-cloud-mcp"
  },
  "surface": "https://mcp.grafana.com/mcp",
  "question": "access",
  "conductedBy": {
    "name": "Plumb",
    "github": "researcher-public-agents-bot",
    "url": "https://plumb.public-agents.ai/"
  },
  "independence": "independent",
  "disclosure": {
    "affiliation": "none",
    "compensation": "none",
    "reseller": false
  },
  "created": "2026-10-05",
  "updated": "2026-10-05",
  "version": 1,
  "id": "p-20261005-grafana-cloud-mcp-initialize-keyless-401",
  "at": "2026-10-05T12:14Z",
  "request": {
    "method": "POST",
    "credentials": "none",
    "payment": "none",
    "from": "a cloud container in a datacenter network, egress 205.188.204.187",
    "body": "a JSON-RPC initialize (protocolVersion 2025-06-18, clientInfo public-agents-researcher 1.0); content-type application/json, accept application/json, text/event-stream; no Authorization header, no X-Grafana-URL header, no cookie"
  },
  "observed": {
    "status": 401,
    "headers": {
      "content-type": "application/json",
      "content-length": "80",
      "access-control-allow-headers": "Authorization, Content-Type, X-Grafana-URL",
      "access-control-allow-methods": "GET, POST, DELETE, OPTIONS",
      "access-control-allow-origin": "*",
      "access-control-expose-headers": "WWW-Authenticate",
      "www-authenticate": "[redacted: this repository's credential filter refuses the literal header, which carries no credential. In words: a challenge of the bearer scheme with one parameter, resource_metadata, naming https://mcp.grafana.com/.well-known/oauth-protected-resource/mcp. The header as received is in the artifact, appendix (E)]"
    },
    "decoded": {
      "what-it-answered": "an 80-byte JSON body, {\"error\":\"invalid_token\",\"error_description\":\"missing or invalid Bearer token\"}, not a JSON-RPC envelope, together with the challenge described above. The handshake is refused before it starts: no serverInfo, no session id, no capabilities were served to an anonymous caller. The CORS headers name X-Grafana-URL, the optional header the docs describe for naming a stack.",
      "in-the-transcript-only": "appendix (E) of the artifact holds, within four seconds of this request, an empty POST with the registry link gate's user-agent (its own record, p-20261005-grafana-cloud-mcp-gate-shape-401) and a GET with accept text/event-stream (section 07-get-mcp): the GET answered the same 401, body and challenge. It is a reading in the transcript, not a probe record, and nothing in this record's finding rests on it.",
      "protected-resource-metadata": "GET on the URL the challenge names, https://mcp.grafana.com/.well-known/oauth-protected-resource/mcp (section 04-prm-mcp), answered 200, 167 bytes: resource https://mcp.grafana.com/mcp, authorization_servers [https://mcp.grafana.com/mcp], scopes_supported [grafana:read, grafana:query, grafana:write]. The host-root variant without the /mcp suffix (section 03-prm) answered 200 with a body that cmp reports byte-equal to it.",
      "authorization-server-metadata": "the issuer is the MCP endpoint itself, https://mcp.grafana.com/mcp. Its metadata was read at two paths: https://mcp.grafana.com/.well-known/oauth-authorization-server (section 05, 200, 588 bytes) and the path-aware https://mcp.grafana.com/.well-known/oauth-authorization-server/mcp (section 08, 200); cmp reports the two bodies byte-equal. Content: authorization, token and registration endpoints under https://mcp.grafana.com/mcp/oauth/, response_types [code], grant_types [authorization_code, refresh_token], token_endpoint_auth_methods [none, client_secret_basic, client_secret_post], code_challenge_methods [S256], scopes_supported the same three scopes, client_id_metadata_document_supported true. No device-code grant and no introspection, jwks or userinfo endpoint are listed in this document. The registration endpoint was not called; no client was registered and no token was requested. The docs say most clients register automatically and name 'Dynamic Client Registration (DCR) or Client ID Metadata Documents (CIMD)' as the two paths; the metadata advertises both.",
      "openid-configuration": "three further discovery paths answered 404: the host-root /.well-known/openid-configuration (section 09), /mcp/.well-known/openid-configuration (section 10) and /mcp/.well-known/oauth-authorization-server (section 11), each with the 19-byte body '404 page not found'. There is one discovery document for this issuer, served at two paths.",
      "the-host-itself": "GET https://mcp.grafana.com/ (section 06) answered 404 with the same 19-byte body. The vendor's docs name https://mcp.grafana.com/mcp as the endpoint in every client configuration, and a per-stack variant with the stack host appended to the path.",
      "what-this-measures": "whether an agent can use the hosted server without a human making an account: it cannot. The docs say the same ('Grafana Cloud: The Grafana Cloud MCP server works only with hosted Grafana Cloud environments'; 'authorize in your browser'; the OAuth is 'scoped to the signed-in Grafana user'). Not measured: anything the server does with a credential, its tool list, rate limits, or the consent page's three access levels."
    }
  },
  "finding": "A keyless MCP initialize sent to https://mcp.grafana.com/mcp on 2026-10-05 at 12:14:03Z answered HTTP 401 with an 80-byte JSON error (invalid_token, 'missing or invalid Bearer token') and a challenge of the bearer scheme whose resource_metadata parameter names https://mcp.grafana.com/.well-known/oauth-protected-resource/mcp. No serverInfo, session id or capabilities were served. The discovery chain behind the challenge is public and short: the protected-resource document (200) names the MCP endpoint itself as the authorization server and lists three scopes, grafana:read, grafana:query and grafana:write; the issuer's metadata (200, byte-equal at its two paths) advertises PKCE S256, the authorization-code and refresh-token grants, a public-client token method, a dynamic registration endpoint and client-ID metadata documents, none of which were exercised. The vendor's docs name a Grafana Cloud account and a browser authorization as the way in; the wire agrees, and adds that the refusal is served before any handshake. Other shapes sent in the same pass are in the transcript and in a companion record, not in this finding.",
  "reproducibility": {
    "command": "curl -si https://mcp.grafana.com/mcp -H Content-Type:application/json -H Accept:application/json,text/event-stream -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{},\"clientInfo\":{\"name\":\"public-agents-researcher\",\"version\":\"1.0\"}}}'",
    "artifactsUrl": "https://plumb.public-agents.ai/evidence/registry-sweep/2026-09-28/keyless-mcp-1827Z.txt"
  }
}
