26.7.0
26.7.0 — Engine bump to GroupDocs.Metadata 26.6.0 (TFM-split package), new GetDocumentInfo tool + descriptive tool errors
What changed
New tool: GetDocumentInfo
- Adds a third MCP tool (
get_document_info) that returns a document's file type, MIME type,
page count, byte size, and encryption status as JSON — a lightweight structural check that
does not enumerate metadata properties (useReadMetadatafor the full dump). - Mirrors the cross-product
GetDocumentInfoconvention (e.g. GroupDocs.Watermark.Mcp),
including theDocument-info lookup failed for '<file>': ...error contract. - Returns fields
fileName,fileFormat,mimeType,pageCount,sizeBytes,isEncrypted.
Engine: GroupDocs.Metadata 26.1.0 → 26.6.0
build/dependencies.props:<GroupDocsMetadata>bumped26.1.0→26.6.0.- 26.6.0 is the first TFM-split release. The
GroupDocs.Metadatametapackage is now
a thin façade over per-TFM runtime sub-packages (.Net472/.Net60/.Net80). Under
ournet10.0target NuGet resolves theGroupDocs.Metadata.Net80runtime assemblies. - That sub-package now declares its native/graphics dependencies itself:
SkiaSharp3.119.2 +SkiaSharp.NativeAssets.Win32+SkiaSharp.NativeAssets.Linux
(solibSkiaSharp.sois now delivered transitively), andAspose.Drawing/Aspose.Drawing.Common26.4.0 — a fully managed, cross-platform
GDI+ replacement — alongsideSystem.Drawing.Common8.0.0.
Removed the manual SkiaSharp Linux workaround
- Dropped the
SkiaSharp.NativeAssets.Linux.NoDependenciesPackageReference and the
<SkiaSharp>version property. They existed only because the pre-split engine's nuspec
declared managed SkiaSharp with no native Linux asset. 26.6.0's.Net80sub-package brings
the native asset transitively, so the workaround is now redundant (and, pinned at a different
version, risked double-placinglibSkiaSharp.so). - Note the engine pulls the full
SkiaSharp.NativeAssets.Linux(which dlopens
libfontconfigat runtime), not the self-containedNoDependenciesvariant.libfontconfig1
is already installed indocker/Dockerfileand the Tests repo'sintegration.yml, so no new
gap on Linux.
Descriptive tool errors (previously "Pitfall #18")
ReadMetadataToolandRemoveMetadataToolnow wrap the engine call in
try/catch (Exception ex) { return FormatException(...); }. Failures (corrupted input,
unsupported formats, missing native deps, and — forRemoveMetadata— evaluation-mode
Save()) now return a descriptive string instead of MCP's opaque
"An error occurred invoking '<tool>'":ReadMetadata→Metadata read failed for '<file>': <Type>: <msg>[ | inner(...)]RemoveMetadata→Metadata removal failed for '<file>': <Type>: <msg>[ | inner(...)]
Why
- Keeps the server on the current engine and, more importantly, moves it onto the modern
TFM-split package whose.Net80runtime declares the native graphics assets it needs — the
right long-term footing for cross-platform (Linux/macOS) runs viadnx. - Descriptive errors make native-dependency and eval-mode failures diagnosable by AI agents
and integration tests instead of surfacing as a generic MCP invocation error.
Migration / impact
- Drop-in for consumers. No public-API or wire-name changes (
read_metadata,remove_metadata). - Integration tests that asserted
IsError == truefor the eval-modeRemoveMetadatapath must
pivot to matching the"Metadata removal failed for"prefix (done in the Tests repo, changelog 003). System.Drawing.EnableUnixSupportis kept in the csproj but is now inert — it was removed
inSystem.Drawing.Common7.0+, and 26.6.0 pulls 8.0.0. Whetherlibgdiplus/ the flag can be
dropped entirely (relying on Aspose.Drawing) is tracked as an open item in
assets/2026-07-01.md, pending confirmation on the 3-OS CI matrix.
Full Changelog: 26.5.1...26.7.0