Metered licensing, get_license_status, and the shared error contract from Core 26.9.0
What changed
- Bumped
GroupDocsMcpCore26.4.1 → 26.9.0 in build/dependencies.props,
and the MCP package version 26.8.0 → 26.9.0 (including bothversionfields in
.mcp/server.json, the README/llms.txtpins, and the regeneratedinstall/generated/
snippets). The engine pin (GroupDocsComparison26.8.0) is unchanged. ComparisonLicenseManagerimplements the two new Core members:
SetMeteredKeyCore(new GroupDocs.Comparison.Metered().SetMeteredKey(...)) and
ReadConsumptionCore(Metered.GetConsumptionQuantity()/GetConsumptionCredit()).- It also declares
EngineMarkerType => typeof(GroupDocs.Comparison.Comparer)so
get_license_statusreports the real engine version rather than the server's own. .mcp/server.jsongainedGROUPDOCS_METERED_PUBLIC_KEYandGROUPDOCS_METERED_PRIVATE_KEY,
the latter markedisSecret: true.- README: a rewritten Licensing section covering both licensing routes, the metered egress
requirement, and how to keep the private key out of client configs; two new rows in the
Configuration table.
Inherited from Core 26.9.0 with no code change here:
fileNamenow resolves. It previously threw, and the client saw only
An error occurred invoking 'get_document_info'— while the tool descriptions told callers to
pass exactly that.- Missing files return the available-files listing instead of the opaque invoke error, and the
listing is no longer silently cut off at 20 entries. - A missing required parameter is reported rather than swallowed.
isError: trueis set on real failures, not just crashes.- New
get_license_statustool, shipped by Core and registered automatically.
Why
The external audit of all 12 MCP servers (2026-08-16) rated Comparison the cleanest product in
the family and found no product-library defects here — its only issues were the three shared
Mcp.Core ones, which this release picks up wholesale. See
docs/backlog-and-issues.md.
Metered licensing suits agent workloads, which are bursty and hard to size up front, and one key
pair works across every platform's server.
Migration / impact
No breaking change for callers. Existing filePath calls behave exactly as before; fileName
now works where it previously failed.
Clients that inferred success from the absence of isError will now correctly see
isError: true on engine failures that previously came back success-shaped. That is the intended
fix, but it is a behaviour change worth noting for anything that was string-matching on error
prose instead.
Verification
Run against the built server over stdio (see the evidence in the Core 26.9.0 changelog for the
protocol-level detail):
| Check | Result |
|---|---|
tools/list |
compare, analyze_changes, get_license_status, get_document_info |
get_document_info via fileName |
resolves — previously an opaque error |
get_document_info via filePath |
unchanged |
| missing file | full Available files: listing, isError: true |
| missing required parameter | message surfaced, isError: true |
analyze_changes |
2 changes detected on a known pair |
get_license_status (no config) |
mode: evaluation, engine GroupDocs.Comparison 26.8 |
get_license_status (invalid metered keys) |
falls back to evaluation and says the keys were rejected rather than claiming none were configured |
Metered mode itself is not yet verified against real keys — the engine authenticates the pair
inside SetMeteredKey, so a placeholder is rejected by design. The fallback path is verified; the
success path needs a real key pair.
Full Changelog: 26.8.0...26.9.0