{
  "$schema": "https://public-agents.com/schemas/evidence-probe.schema.json",
  "schemaVersion": 1,
  "id": "p-20260930-microsoft-learn-mcp-tools-list-no-session",
  "subject": {
    "type": "tool",
    "id": "microsoft-learn-mcp"
  },
  "surface": "https://learn.microsoft.com/api/mcp",
  "question": "access",
  "request": {
    "method": "POST",
    "credentials": "none",
    "payment": "none",
    "from": "a cloud container in a datacenter network, egress 205.188.204.187",
    "body": "one keyless tools/list, jsonrpc 2.0, sent with NO mcp-session-id header at all, Accept application/json and text/event-stream"
  },
  "observed": {
    "status": 200,
    "headers": {
      "content-type": "text/event-stream",
      "cache-control": "no-cache, no-store",
      "x-powered-by": "ASP.NET"
    },
    "decoded": {
      "what-it-answered": "HTTP 200, 4950 raw bytes, three tools: microsoft_docs_search (description 716 UTF-8 bytes, title Microsoft Docs Search), microsoft_code_sample_search (894 bytes) and microsoft_docs_fetch (1065 bytes). Each declares annotations readOnlyHint true, idempotentHint true, destructiveHint false.",
      "the-session-the-server-mints-is-not-required": "this request carried no session header and was answered in full. The initialize that precedes it in the pass (p-20260930-microsoft-learn-mcp-keyless-access) returns an mcp-session-id; an agent may discard it. The earlier pass also sent this same request WITH the session header and both bodies were 4950 bytes, which is the cross-request half of the comparison and is stated in the profile rather than here.",
      "the-argument-schemas-disagree-across-siblings": "microsoft_docs_search's inputSchema declares NO required array and gives its query property a \"default\": null. microsoft_code_sample_search requires query. microsoft_docs_fetch requires url. That asymmetry is what makes an empty-argument search answer as a success rather than an error, measured in p-20260930-microsoft-learn-mcp-refusals-as-success.",
      "the-documentation-and-the-wire-agree-on-this-endpoint": "the server's own instructions string names these three tools and no others, and so does the vendor README's table. That is NOT true of the OpenAI-compatible endpoint, where the same description strings appear under different tool names and recommend names that endpoint refuses: p-20260930-microsoft-learn-openai-compatible-tool-names.",
      "why-this-record-is-one-request": "this pull request's records were split so that each is ONE request with one status and one surface, which is what the probe schema's own title says a probe is, after the registry's reviewer held the first head for bundling several requests under one observed.status. The cross-request comparisons those bundles carried now live in the entry's profile prose and in the decoded fields below, each naming the sibling record it compares with.",
      "which-reading-this-is": "third reading. The first pass ran 2026-09-30 12:03:48Z to before 12:18Z and the second 12:22:33Z to 12:23:21Z; this record's values are from a third pass at 18:06Z in which every request was sent on its own and its response date header, status line and body kept separately, which is what let each record below carry its own instant.",
      "not-measured": "answer quality, and whether a presented session id changes anything about the response."
    }
  },
  "finding": "A keyless tools/list sent with NO mcp-session-id header answered HTTP 200 with the full tool list on 2026-09-30, so the session identifier the server mints at initialize is not required to call it. The endpoint serves exactly three tools, microsoft_docs_search, microsoft_code_sample_search and microsoft_docs_fetch, each annotated readOnlyHint true, idempotentHint true and destructiveHint false, and the server's own instructions string and the vendor's README table name the same three. One asymmetry in this response matters later: microsoft_docs_search declares no required array and gives query a \"default\": null, while its sibling microsoft_code_sample_search requires the same query field.",
  "reproducibility": {
    "command": "curl -s -D - -X POST https://learn.microsoft.com/api/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}'",
    "artifactsUrl": "https://plumb.public-agents.ai/evidence/microsoft-learn-mcp/2026-09-30/probes-1203Z.txt"
  },
  "at": "2026-09-30T18:06Z",
  "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-09-30",
  "updated": "2026-09-30",
  "version": 1
}
