{
  "generatedAt": "2026-10-05T01:11:58.680Z",
  "schemaVersion": 1,
  "gauge": "plugin_census",
  "probes": [
    {
      "id": "npm:keywords:mcp",
      "registry": "npm",
      "query": "keywords:mcp",
      "definitionClass": "mcp-server",
      "population": "npm packages whose package.json keywords array contains 'mcp'",
      "populationSource": "https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md",
      "url": "https://registry.npmjs.org/-/v1/search?text=keywords:mcp&size=1",
      "countMode": "json-path",
      "derivation": null,
      "inScope": true,
      "rationale": "Widest plausible reading of 'MCP thing on npm'. Includes clients, SDKs and unrelated uses of the initialism.",
      "count": 77505,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 379,
      "attempts": 1,
      "deltaSincePrevious": 178,
      "previousCount": 77327,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "npm:keywords:mcp-server",
      "registry": "npm",
      "query": "keywords:mcp-server",
      "definitionClass": "mcp-server",
      "population": "npm packages whose package.json keywords array contains 'mcp-server'",
      "populationSource": "https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md",
      "url": "https://registry.npmjs.org/-/v1/search?text=keywords:mcp-server&size=1",
      "countMode": "json-path",
      "derivation": null,
      "inScope": true,
      "rationale": "Narrower reading: authors who self-declared the package as a server rather than as MCP-related.",
      "count": 9430,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 243,
      "attempts": 1,
      "deltaSincePrevious": 33,
      "previousCount": 9397,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "npm:keywords:modelcontextprotocol",
      "registry": "npm",
      "query": "keywords:modelcontextprotocol",
      "definitionClass": "mcp-server",
      "population": "npm packages whose package.json keywords array contains 'modelcontextprotocol'",
      "populationSource": "https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md",
      "url": "https://registry.npmjs.org/-/v1/search?text=keywords:modelcontextprotocol&size=1",
      "countMode": "json-path",
      "derivation": null,
      "inScope": true,
      "rationale": "Narrowest reading: the spelled-out protocol name. Closest to 'deliberately tagged for this protocol'.",
      "count": 2955,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 123,
      "attempts": 1,
      "deltaSincePrevious": 6,
      "previousCount": 2949,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "openvsx:all",
      "registry": "open-vsx.org",
      "query": "(empty search, all published extensions)",
      "definitionClass": "editor-extension",
      "population": "extensions published to the Open VSX registry, as reported by the search endpoint's totalSize",
      "populationSource": "https://open-vsx.org/swagger-ui/index.html",
      "url": "https://open-vsx.org/api/-/search?size=1",
      "countMode": "json-path",
      "derivation": null,
      "inScope": true,
      "rationale": "The one editor-extension registry with an open count endpoint. The Microsoft marketplace requires POST and is not countable by this path.",
      "count": 18908,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 479,
      "attempts": 1,
      "deltaSincePrevious": 57,
      "previousCount": 18851,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "npm:keywords:vscode-extension",
      "registry": "npm",
      "query": "keywords:vscode-extension",
      "definitionClass": "editor-extension",
      "population": "npm packages whose package.json keywords array contains 'vscode-extension'",
      "populationSource": "https://github.com/npm/registry/blob/master/docs/REGISTRY-API.md",
      "url": "https://registry.npmjs.org/-/v1/search?text=keywords:vscode-extension&size=1",
      "countMode": "json-path",
      "derivation": null,
      "inScope": true,
      "rationale": "Deliberately included as the same class as openvsx:all. The two differ by roughly two orders of magnitude, which is the point: editor extensions do not live on npm, so npm's count is a measurement of npm, not of extensions.",
      "count": 128,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 117,
      "attempts": 1,
      "deltaSincePrevious": 0,
      "previousCount": 128,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "wordpress:plugins",
      "registry": "api.wordpress.org",
      "query": "action=query_plugins (unfiltered)",
      "definitionClass": "cms-plugin",
      "population": "plugins listed in the WordPress.org plugin directory, as reported by info.results",
      "populationSource": "https://codex.wordpress.org/WordPress.org_API",
      "url": "https://api.wordpress.org/plugins/info/1.2/?action=query_plugins&request[per_page]=1&request[page]=1",
      "countMode": "json-path",
      "derivation": null,
      "inScope": true,
      "rationale": "Registry publishes info.results verbatim. Paired in class cms-plugin with drupal:project-module, which is derived from pagination rather than declared, so the class shows definition spread across both a declared count and a URL-structure count.",
      "count": 70307,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 130,
      "attempts": 1,
      "deltaSincePrevious": 64,
      "previousCount": 70243,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "drupal:project-module",
      "registry": "www.drupal.org",
      "query": "type=project_module (all modules, unfiltered)",
      "definitionClass": "cms-plugin",
      "population": "nodes of type project_module in the Drupal.org project directory. The registry does not publish a scalar count; the number is derived from the last pagination page reported in the response.",
      "populationSource": "https://www.drupal.org/drupalorg/docs/apis/rest-and-other-apis",
      "url": "https://www.drupal.org/api-d7/node.json?type=project_module&limit=1&page=0",
      "countMode": "last-page-index",
      "derivation": "The `last` field carries an RFC 5988 rel=last pagination URL of the form ...&page=N. With limit=1 pinned in the request URL and pages 0-indexed (Drupal API convention), the total count is N + 1. This is exact arithmetic, not an estimate; it is NOT a number the registry declared as a field.",
      "inScope": true,
      "rationale": "Second probe for cms-plugin so the class can show spread rather than reporting a lone count. The design cost is admitting a probe whose number is derived from URL structure instead of a declared scalar; the spec makes this visible via countMode and derivation.",
      "count": 56548,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 520,
      "attempts": 1,
      "deltaSincePrevious": 7,
      "previousCount": 56541,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    },
    {
      "id": "cratesio:all",
      "registry": "crates.io",
      "query": "summary",
      "definitionClass": "control",
      "population": "crates published to crates.io, as reported by summary.num_crates",
      "populationSource": "https://crates.io/data-access",
      "url": "https://crates.io/api/v1/summary",
      "countMode": "json-path",
      "derivation": null,
      "inScope": false,
      "rationale": "CONTROL, not a plugin population. Present so the report shows what an unambiguous registry count looks like: one registry, one definition, no query to choose. Never compared against a plugin class.",
      "count": 345526,
      "verdict": "TRUE",
      "reason": null,
      "outcome": "counted",
      "httpStatus": 200,
      "errorText": null,
      "elapsedMs": 312,
      "attempts": 1,
      "deltaSincePrevious": 476,
      "previousCount": 345050,
      "previousGeneratedAt": "2026-10-04T01:48:03.460Z"
    }
  ],
  "classes": [
    {
      "definitionClass": "mcp-server",
      "probeCount": 3,
      "countedProbes": 3,
      "naProbes": 0,
      "min": 2955,
      "max": 77505,
      "spreadRatio": 26.228426395939085,
      "minProbeId": "npm:keywords:modelcontextprotocol",
      "maxProbeId": "npm:keywords:mcp",
      "verdict": "TRUE",
      "reason": "3 probes counted; the ratio between the widest and narrowest definition is the reading"
    },
    {
      "definitionClass": "editor-extension",
      "probeCount": 2,
      "countedProbes": 2,
      "naProbes": 0,
      "min": 128,
      "max": 18908,
      "spreadRatio": 147.71875,
      "minProbeId": "npm:keywords:vscode-extension",
      "maxProbeId": "openvsx:all",
      "verdict": "TRUE",
      "reason": "2 probes counted; the ratio between the widest and narrowest definition is the reading"
    },
    {
      "definitionClass": "cms-plugin",
      "probeCount": 2,
      "countedProbes": 2,
      "naProbes": 0,
      "min": 56548,
      "max": 70307,
      "spreadRatio": 1.2433154134540567,
      "minProbeId": "drupal:project-module",
      "maxProbeId": "wordpress:plugins",
      "verdict": "TRUE",
      "reason": "2 probes counted; the ratio between the widest and narrowest definition is the reading"
    },
    {
      "definitionClass": "control",
      "probeCount": 1,
      "countedProbes": 1,
      "naProbes": 0,
      "min": null,
      "max": null,
      "spreadRatio": null,
      "minProbeId": null,
      "maxProbeId": null,
      "verdict": "N/A",
      "reason": "control class: a reference denominator with an unambiguous population, held out of every comparison"
    }
  ],
  "aggregate": {
    "verdict": "N/A",
    "reason": "No total is computed. Probes measure different populations under different definitions; several overlap (a package can be tagged mcp and mcp-server) and several are disjoint by accident of where a plugin ecosystem publishes. A sum would be a number about this probe list, not about the world, and its daily movement would track edits to this file."
  },
  "honestScope": [
    "A probe counts what its registry says it counts. Nothing here verifies that a counted package is open source, is maintained, installs, or is a plugin in any sense the reader has in mind.",
    "Probes within a class overlap by unknown amounts. The spread is a lower bound on definitional disagreement, not a partition.",
    "Registries without an open count endpoint are absent from this file entirely. Their absence is not evidence that they are small — the Microsoft VS Code marketplace requires POST and is not represented.",
    "Day-over-day delta is meaningful only within one probe id. Two probes moving in opposite directions is normal and is not a contradiction.",
    "Adding a probe changes every class reading it participates in. Probe list edits belong in the commit log, and a spread that moves on the same day the list changed should be read as an edit, not as news.",
    "Not every count is a value the registry declared. A probe whose `countMode` is not `json-path` produces its number by exact arithmetic over URL structure — see the `derivation` field for the specific formula. Changing that formula reads as an edit, not as a change in the world; the schema fingerprint on the daily inspection sheet is meant to make that visible."
  ]
}