Skip to content

26.7.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 23:53

26.7.0 — descriptive error handling + Dockerfile MS core fonts

What changed

  • Added a shared Tools/ToolError.cs (ToolError.Format(op, file, ex)) that renders engine failures as descriptive text — "<op> failed for '<file>': <ExceptionType>: <message>[ | inner(n): …]" — instead of MCP's opaque "An error occurred invoking '<tool>'". AI agents and integration tests can now read the actual cause.
  • GetViewInfo now wraps the engine call in try/catch; on failure it returns text starting with View-info lookup failed for '<file>':.
  • RenderPage now catches engine exceptions and returns a CallToolResult with IsError = true and a TextContentBlock starting with Rendering failed for '<file>': (previously an engine throw surfaced as MCP's generic wrapper, hiding the native-deps / font-resolution cause).
  • Tool [Description]s now document the failure prefix.
  • docker/Dockerfile now installs ttf-mscorefonts-installer (with EULA acceptance via debconf-set-selections + fc-cache refresh) alongside libgdiplus/libfontconfig1. The integration Tests repo already installed MS core fonts on its Linux runners; the server image was missing them, so glyph-heavy rendering (Arial / Times New Roman) could fail font resolution inside the container.
  • Version bumped to 26.7.0 (MCP CalVer). Engine GroupDocs.Viewer stays at 26.4.0 (already the latest stable on NuGet); SkiaSharp pin unchanged at 3.119.1.

Why

Both tools historically lacked a try/catch wrapper, so any engine-side failure (missing native deps, unsupported format, font resolution) surfaced as MCP's opaque invocation error — undiagnosable by an AI agent or a CI log. Routing every tool through the shared ToolError.Format matches the contract already used by the Metadata / Conversion MCP servers and lets the integration suite match a stable per-tool prefix.

Migration / impact

Drop-in replacement for 26.5.1. No public-API or wire-name changes; success-path responses are byte-for-byte identical. Only failure responses change shape — they now carry descriptive text (and, for RenderPage, IsError = true).

Full Changelog: 26.5.1...26.7.0