{
  "$schema": "https://public-agents.com/schemas/evidence-probe.schema.json",
  "schemaVersion": 1,
  "id": "p-20260930-microsoft-learn-mcp-max-token-budget-200",
  "subject": {
    "type": "tool",
    "id": "microsoft-learn-mcp"
  },
  "surface": "https://learn.microsoft.com/api/mcp?maxTokenBudget=200",
  "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/call of microsoft_docs_search, query \"Azure Functions durable orchestration\", to the endpoint with maxTokenBudget=200, jsonrpc 2.0, Accept application/json and text/event-stream"
  },
  "observed": {
    "status": 200,
    "headers": {
      "content-type": "text/event-stream",
      "cache-control": "no-cache, no-store"
    },
    "decoded": {
      "what-it-answered": "HTTP 200, 5310 raw bytes, 2341 content bytes (2341 characters, equal here because this content is pure ASCII), 10 results, content sha256 prefix 34252473d0cdb713.",
      "the-vendor-claim-under-test": "the vendor README, under Token Budget Control: \"To manage token usage and control costs, you can append the maxTokenBudget query parameter to the MCP endpoint URL. This parameter limits the token count in search tool responses by truncating the content to meet your specified budget\", marked experimental and \"subject to change\".",
      "what-the-two-byte-counts-mean": "two byte counts are reported because they measure different things: CONTENT bytes is the UTF-8 length of result.content[0].text, the documentation actually delivered, and RAW is the whole event-stream response. The content sha256 prefix is published so a reader can compare responses across these records without trusting a length. Only bytes were measured; the vendor's claim is about TOKENS and this record does not convert between them.",
      "the-parameter-scales": "2,341 content bytes against 12,675 at maxTokenBudget=2000 and 28,958 unbudgeted, one query, one pass. Three points on a curve, each in its own record, which is why they are filed separately rather than as one.",
      "and-the-result-count-still-does-not-change": "ten results at a budget of 200, the same ten as unbudgeted. At this budget each result is roughly 234 bytes, so what an agent receives is ten fragments. This is the sharpest point on the curve for the finding that truncation is per chunk and not per result set.",
      "not-measured": "whether any budget value returns fewer than ten results; the three tried do not, and the boundary was not searched for.",
      "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 five different endpoint URLs under one observed.status and one surface. The comparison across budgets lives in the entry's profile and in the decoded fields here, each naming the sibling record it compares with.",
      "which-reading-this-is": "third reading. The five budget requests were sent once at about 12:15Z, again at 12:22:33Z when the raw byte counts were added, and again at 18:06Z as five separately captured requests. Every content and raw figure is identical across all three readings, six hours apart, so the search index behind this query did not move today."
    }
  },
  "finding": "With maxTokenBudget=200 the same keyless query returned 2,341 UTF-8 content bytes on 2026-09-30, against 12,675 at maxTokenBudget=2000 and 28,958 with no parameter: three points on one curve, so the documented cap scales as a caller would expect. The result count is still TEN, the same ten as the unbudgeted response, which at this budget means roughly 234 bytes per result. That is the sharpest evidence that the parameter truncates each chunk rather than returning fewer whole results, and it is not stated on any vendor page read this day. Whether some budget value does return fewer than ten results was not searched for; none of the three tried does.",
  "reproducibility": {
    "command": "curl -s -X POST 'https://learn.microsoft.com/api/mcp?maxTokenBudget=200' -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{\"jsonrpc\":\"2.0\",\"id\":10,\"method\":\"tools/call\",\"params\":{\"name\":\"microsoft_docs_search\",\"arguments\":{\"query\":\"Azure Functions durable orchestration\"}}}' | sed -n 's/^data: //p' | python3 -c 'import json,sys,hashlib;t=json.load(sys.stdin)[\"result\"][\"content\"][0][\"text\"];print(len(t.encode()),len(json.loads(t)[\"results\"]),hashlib.sha256(t.encode()).hexdigest()[:16])'",
    "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
}
