Skip to content

Releases: groupdocs-annotation/GroupDocs.Annotation.Mcp

26.7.4

Choose a tag to compare

@github-actions github-actions released this 25 Jul 19:08

26.7.4 — Full configuration surface in install snippets (docs/infra only)

What changed

No server code changes — the bump republishes so the refreshed README (install
buttons above the fold, Codex/Windsurf guides, fixed one-click links) reaches the
NuGet package page, Docker/GHCR, and the MCP Registry.

  • Every install snippet and one-click deeplink (VS Code / Cursor buttons, Claude
    Desktop/Code, VS Code, VS 2022, Cursor, Windsurf, Cline, Rider, Codex) now
    pre-fills all supported environment variables so users see the full
    configuration surface in the install dialog:
    • GROUPDOCS_MCP_STORAGE_PATH — placeholder documents folder
    • GROUPDOCS_MCP_OUTPUT_PATH — same folder as storage by default
    • GROUPDOCS_LICENSE_PATHempty by default (evaluation mode)
  • Verified in GroupDocs.Mcp.Core's LicenseManager: an empty license path is
    handled identically to an unset one (string.IsNullOrEmpty guard → evaluation
    mode with a log warning; a wrong path only logs; SetLicenseFromPath is wrapped
    in try/catch) — an empty value can never fail the server.

Migration / impact

Drop-in — the server binary is identical apart from the version stamp.

Full Changelog: 26.7.3...26.7.4

26.7.3

Choose a tag to compare

@github-actions github-actions released this 24 Jul 18:33

26.7.3 — Discoverability & one-click install uplift (docs/infra only)

What changed

Rollout of the org-wide MCP repo improvement plan (piloted on GroupDocs.Conversion.Mcp
26.7.1). No server code changes — the bump ships the new README to the NuGet package page.

  • README: badge row (NuGet version/downloads, Docker pulls, MCP Registry, Tests-repo CI,
    MIT), demo placeholder, one-click VS Code / Cursor install buttons, pointer to
    ready-made client configs (Claude Code, VS 2022, Cursor, Windsurf, Cline, Rider), and a
    Licensing section documenting the product's evaluation-mode limits with temporary
    license / purchase links.
  • install/config.json + install/generate-install-links.ps1: canonical install config;
    the generator emits install/generated/ (per-client snippets + deeplinks) and rewrites
    the README install-buttons block idempotently. CI drift guard added to
    build_packages.yml (-Check fails the build when generated content is stale).
  • Hygiene: SECURITY.md, CONTRIBUTING.md, issue templates, smithery.yaml,
    docker/README.hub.md, llms.txt licensing section, .vscode/mcp.json published-package
    entry, GitHub topics.

Why

AI-agent users find MCP servers through registries, GitHub topics, and READMEs; installers
copy the first snippet they see. One canonical config keeps every rendered snippet correct
permanently, and licensing up front removes the main evaluation-mode surprise.

Migration / impact

Drop-in — the server binary is identical to 26.7.2 apart from the version stamp.

Full Changelog: 26.7.2...26.7.3

26.7.2

Choose a tag to compare

@github-actions github-actions released this 24 Jul 12:04

26.7.2 — Revert the GDI+ resolver added in 26.7.1 (regression)

What changed

  • Removed GdiPlusResolver and its GdiPlusResolver.Register() call from Program.cs. This reverts the change shipped in 26.7.1.
  • Bumped the MCP package version from 26.7.1 to 26.7.2, including .mcp/server.json (both version fields).

Why

26.7.1 registered a DllImportResolver on System.Drawing.Common to map gdiplus.dll to libgdiplus. That was wrong on two counts:

  1. Wrong assembly. SetDllImportResolver is per-declaring-assembly. The gdiplus.dll P/Invoke is declared in System.Private.Windows.Core (System.Drawing.Common 9.x's CsWin32 interop layer), not in System.Drawing.Common.
  2. It broke the type initializer. System.Drawing.Common registers its own resolver inside the System.Drawing.Gdip static constructor. Because 26.7.1 claimed that slot first, Gdip's cctor threw InvalidOperationException: A resolver is already set for the assembly, which escaped the type initializer and disabled System.Drawing entirely.

On Linux this replaced the pre-existing failure with a different one, so it fixed nothing and obscured the real symptom. Windows was unaffected — the resolver was a no-op there.

Note on the Linux failure

The resolver was added on the assumption that Annotation failed on Linux the same way GroupDocs.Comparison does (a gdiplus.dll DllNotFoundException). Re-checking the 26.7.0 CI logs shows Annotation's Linux integration failure is actually different — IOException: The server shut down unexpectedly — i.e. the server process terminates rather than surfacing a GDI+ error. That failure is still open and is tracked separately; this release only removes the incorrect resolver so the underlying symptom is visible again.

Unlike GroupDocs.Comparison, the Annotation engine (GroupDocs.Annotation.Net80 26.6.0) depends on Aspose.Drawing and does not pull System.Drawing.Common, so the Windows-only System.Drawing limitation documented for Comparison does not directly apply here.

Migration / impact

Drop-in replacement for 26.7.1, and the recommended upgrade from it. No tool-name, input-schema, or response-shape changes. Windows behaviour is unchanged.

Full Changelog: 26.7.1...26.7.2

26.7.1

Choose a tag to compare

@github-actions github-actions released this 23 Jul 22:03

26.7.1 — Linux/macOS GDI+ resolver (gdiplus.dll DllNotFoundException)

What changed

  • Added GdiPlusResolver and registered it (GdiPlusResolver.Register()) at the top of Program.cs, before any tool can trigger a GDI+ P/Invoke.
  • Bumped the MCP package version from 26.7.0 to 26.7.1 (CalVer), including .mcp/server.json (both version fields).

Why

GroupDocs.Annotation rasterizes annotations onto document pages through System.Drawing.Common, whose GDI+ interop P/Invokes gdiplus.dll. On Windows that's built in, but on Linux/macOS the system library is libgdiplus.so/.dylib and the .NET native-library loader does not map gdiplus.dll to it — so the annotation tools failed on non-Windows (including inside the Docker image) with DllNotFoundException: Unable to load shared library 'gdiplus.dll', even when libgdiplus was installed. The resolver intercepts that load and points it at the real libgdiplus; it is a no-op on Windows.

Migration / impact

Drop-in replacement for 26.7.0. No tool-name, input-schema, or response-shape changes. Fixes Linux/macOS runs that previously threw the gdiplus.dll error. libgdiplus must still be present (Docker installs it; native users install per the README).

Full Changelog: 26.7.0...26.7.1

26.7.0

Choose a tag to compare

@github-actions github-actions released this 17 Jul 21:44

Bump engine to 26.6.0, extract shared ToolError, patch NU1903

What changed

  • Engine bump: GroupDocs.Annotation 25.11.0 → 26.6.0 (a ~7-minor jump). The
    net10.0 build resolves the GroupDocs.Annotation.Net80 sub-package. No public
    API drift — all 10 tools compile unchanged against the new engine
    (Annotator.Add/Get/Update/Remove/Save, ImportAnnotationsFromDocument,
    ExportAnnotationsFromXMLFile, Document.GetDocumentInfo/GeneratePreview,
    PreviewOptions, and the annotation model types are all stable).
  • MCP version: 26.5.0 → 26.7.0 (CalVer). Bumped in dependencies.props,
    .mcp/server.json (both version fields), README and llms.txt @-pins.
  • Shared Tools/ToolError.cs extracted. All 10 tools previously carried a
    duplicated private FormatException helper; they now route their catch
    through ToolError.Format(op, file, ex, subjectSuffix). Failure prefixes are
    byte-identical to before (Annotation failed for, Annotation lookup failed for, Annotation removal failed for, Annotation update failed for, Reply add failed for, Reply removal failed for, Annotation import failed for,
    Annotation export failed for, Document-info lookup failed for, Preview generation failed for), so integration tests that match the prefix are
    unaffected.
  • NU1903 security fix. The 26.6.0 engine transitively pulls
    Microsoft.NETCore.Jit 1.0.2 (via Microsoft.NETCore.Portable.Compatibility),
    flagged high-severity (GHSA-xcvr-qv8h-m7xw). Added a direct
    <PackageReference Include="Microsoft.NETCore.Jit" Version="1.0.18" /> override
    to restore a 0-warning build.
  • SkiaSharp pin note. 26.6.0 (now backed by Aspose.Drawing) pulls a
    consistent SkiaSharp 3.119.0 native-asset set (Linux/macOS/Win32), so the old
    2.80.1 ABI mismatch that originally justified the manual pin is gone. The
    3.119.4 pin is kept one patch higher for a patched libSkiaSharp.so and can be
    dropped in a future pass; comments in the csproj / dependencies.props updated.

Why

Keep the server on the latest stable engine, remove ~130 lines of duplicated
error-formatting boilerplate behind one shared helper, and keep the build free
of known-vulnerable transitive packages.

Migration / impact

None for consumers — tool names, schemas, response shapes, and failure-text
prefixes are unchanged. Docker still installs libgdiplus + libfontconfig1 +
ttf-mscorefonts-installer for glyph rendering on Linux.

Full Changelog: 26.5.0...26.7.0

26.5.0

Choose a tag to compare

@github-actions github-actions released this 31 May 22:15

Initial release of GroupDocs.Annotation.Mcp

What changed

  • New MCP server exposing GroupDocs.Annotation for .NET as AI-callable tools, packaged as GroupDocs.Annotation.Mcp on NuGet (PackageType=McpServer, ToolCommandName=groupdocs-annotation-mcp) and as ghcr.io/groupdocs-annotation/annotation-net-mcp + docker.io/groupdocs/annotation-net-mcp Docker images.
  • Target framework net10.0, dnx-launchable.
  • 10 tools exposed:
    • AddAnnotation — supports text / area / point / arrow / highlight / underline / strikeout types; saves <name>_annotated.<ext>.
    • GetAnnotations — JSON: id, type, message, page (1-based), bounding box, user, replies (Pitfall #16 — raw JSON, never via OutputHelper.TruncateText).
    • UpdateAnnotation — modify message and/or bounding box by id.
    • RemoveAnnotations — by comma-separated id list or all.
    • AddReply — add a reply to an annotation by id (collaboration workflow).
    • RemoveReplies — by reply-id list, by user name, or all.
    • ImportAnnotations — auto-detects XML vs. document source by extension; dispatches to Annotator.ExportAnnotationsFromXMLFile (XML) or Annotator.ImportAnnotationsFromDocument (.pdf/.docx/etc.). The engine's naming is inverted from the English sense — the wrapper hides that.
    • ExportAnnotations — XmlSerializer dump of the List<AnnotationBase> to <name>.annotations.xml.
    • GetDocumentInfo (Step 11 mandatory) — JSON with fileType / pageCount / size / per-page width+height via reflection over IDocumentInfo.Pages.
    • GeneratePagesPreview — returns CallToolResult with one TextContentBlock (summary, with eval-mode prefix when unlicensed) plus one ImageContentBlock.FromBytes(..., "image/png") per page. Hard cap of 5 pages per call (MaxPagesPerCall) to stay under MCP client size limits. Accepts comma-separated page lists ('1,3,5') or ranges ('1-3'). Pages are rendered via Annotator.Document.GeneratePreview(PreviewOptions { PreviewFormat = PNG, PageNumbers = ... }).
  • All 10 tools wrap their engine call in try { … } catch (Exception ex) { return FormatException(...); } (Pitfall #18) so engine exceptions surface as descriptive "<Op> failed for '<file>': <Type>: <msg> | inner(0): ..." strings instead of MCP's opaque "An error occurred invoking '<tool>'". GeneratePagesPreview returns CallToolResult { IsError = true } in the catch path.
  • Environment variables: GROUPDOCS_MCP_STORAGE_PATH, optional GROUPDOCS_MCP_OUTPUT_PATH, GROUPDOCS_LICENSE_PATH.
  • Native dependencies on Linux: libgdiplus + libfontconfig1 + ttf-mscorefonts-installer (the engine rasterises annotated pages and previews with text glyphs baked in, so MS core fonts are required). System.Drawing.EnableUnixSupport is set in the csproj.
  • SkiaSharp explicit pin (3.119.4) + matching SkiaSharp.NativeAssets.Linux.NoDependencies 3.119.4. GroupDocs.Annotation 25.11.0 pins managed SkiaSharp 3.x but transitively pulls the old 2.80.1 NativeAssets, which is ABI-incompatible with managed 3.x; the explicit pin keeps the Linux runtime resolution coherent. Re-evaluate when the engine bumps its transitive.
  • License is applied via Pattern A (the cross-product License-class style): new GroupDocs.Annotation.License().SetLicense(licensePath)License is public in the engine.
  • Unit tests: xUnit + Moq, one test class per tool, 39 tests total (license manager 2 + per-tool 3-4 each).

Why

Exposes GroupDocs.Annotation for .NET as AI-callable MCP tools for Claude, Cursor, VS Code / GitHub Copilot, and other MCP-compatible agents, so document review, mark-up, comment threads, annotation import/export, and page preview can be invoked from natural-language instructions without bespoke per-agent integration. GeneratePagesPreview implements the cross-MCP roadmap of self-sufficient page rendering — users of this server don't need to attach the Viewer MCP to see what they're annotating.

Migration / impact

First release of this repository — no migration. Engine version GroupDocs.Annotation 25.11.0; CalVer 26.5.0 (YY.M.N, first month-release uses N=0).

Full Changelog: https://github.com/groupdocs-annotation/GroupDocs.Annotation.Mcp/commits/26.5.0