Metered licensing, get_license_status, and the shared error contract from Core 26.9.0
What changed
- Bumped
GroupDocsMcpCore26.4.1 -> 26.9.0 and the MCP package version previous -> 26.9.0
(bothversionfields in.mcp/server.json, the README/llms.txtpins, and the regenerated
install/generated/snippets). The engine pin is unchanged. ViewerLicenseManagerimplements the two new Core members:SetMeteredKeyCore
(new GroupDocs.Viewer.Metered().SetMeteredKey(...)) andReadConsumptionCore
(Metered.GetConsumptionQuantity()/GetConsumptionCredit()), and declares
EngineMarkerTypesoget_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 '<tool>'- while the tool descriptions told callers to pass
exactly that form.- 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 - no
Program.cschange.
Why
The external audit of all 12 MCP servers (2026-08-16) confirmed three defects living in
GroupDocs.Mcp.Core and therefore present on every product: fileName crashed every tool, the
available-files listing never reached the client, and isError meant "we crashed" rather than
"the operation failed". This release picks up all three. Product-specific findings are tracked
separately in 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.
The metered path was verified end to end on GroupDocs.Comparison with a live key pair: mode
reported correctly, no evaluation markers in output, consumption moving, and the private key
absent from all output. The same Core code path serves every product.
Full Changelog: 26.7.2...26.9.0