Skip to content

26.7.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 13:56

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 (use ReadMetadata for the full dump).
  • Mirrors the cross-product GetDocumentInfo convention (e.g. GroupDocs.Watermark.Mcp),
    including the Document-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> bumped 26.1.026.6.0.
  • 26.6.0 is the first TFM-split release. The GroupDocs.Metadata metapackage is now
    a thin façade over per-TFM runtime sub-packages (.Net472 / .Net60 / .Net80). Under
    our net10.0 target NuGet resolves the GroupDocs.Metadata.Net80 runtime assemblies.
  • That sub-package now declares its native/graphics dependencies itself:
    • SkiaSharp 3.119.2 + SkiaSharp.NativeAssets.Win32 + SkiaSharp.NativeAssets.Linux
      (so libSkiaSharp.so is now delivered transitively), and
    • Aspose.Drawing / Aspose.Drawing.Common 26.4.0 — a fully managed, cross-platform
      GDI+ replacement — alongside System.Drawing.Common 8.0.0.

Removed the manual SkiaSharp Linux workaround

  • Dropped the SkiaSharp.NativeAssets.Linux.NoDependencies PackageReference 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 .Net80 sub-package brings
    the native asset transitively, so the workaround is now redundant (and, pinned at a different
    version, risked double-placing libSkiaSharp.so).
  • Note the engine pulls the full SkiaSharp.NativeAssets.Linux (which dlopens
    libfontconfig at runtime), not the self-contained NoDependencies variant. libfontconfig1
    is already installed in docker/Dockerfile and the Tests repo's integration.yml, so no new
    gap on Linux.

Descriptive tool errors (previously "Pitfall #18")

  • ReadMetadataTool and RemoveMetadataTool now wrap the engine call in
    try/catch (Exception ex) { return FormatException(...); }. Failures (corrupted input,
    unsupported formats, missing native deps, and — for RemoveMetadata — evaluation-mode
    Save()) now return a descriptive string instead of MCP's opaque
    "An error occurred invoking '<tool>'":
    • ReadMetadataMetadata read failed for '<file>': <Type>: <msg>[ | inner(...)]
    • RemoveMetadataMetadata 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 .Net80 runtime declares the native graphics assets it needs — the
    right long-term footing for cross-platform (Linux/macOS) runs via dnx.
  • 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 == true for the eval-mode RemoveMetadata path must
    pivot to matching the "Metadata removal failed for" prefix (done in the Tests repo, changelog 003).
  • System.Drawing.EnableUnixSupport is kept in the csproj but is now inert — it was removed
    in System.Drawing.Common 7.0+, and 26.6.0 pulls 8.0.0. Whether libgdiplus / 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