Releases: groupdocs-annotation/GroupDocs.Annotation.Mcp
Release list
26.7.4
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 folderGROUPDOCS_MCP_OUTPUT_PATH— same folder as storage by defaultGROUPDOCS_LICENSE_PATH— empty by default (evaluation mode)
- Verified in
GroupDocs.Mcp.Core'sLicenseManager: an empty license path is
handled identically to an unset one (string.IsNullOrEmptyguard → evaluation
mode with a log warning; a wrong path only logs;SetLicenseFromPathis 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
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 emitsinstall/generated/(per-client snippets + deeplinks) and rewrites
the README install-buttons block idempotently. CI drift guard added to
build_packages.yml(-Checkfails 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.jsonpublished-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
26.7.2 — Revert the GDI+ resolver added in 26.7.1 (regression)
What changed
- Removed
GdiPlusResolverand itsGdiPlusResolver.Register()call fromProgram.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(bothversionfields).
Why
26.7.1 registered a DllImportResolver on System.Drawing.Common to map gdiplus.dll to libgdiplus. That was wrong on two counts:
- Wrong assembly.
SetDllImportResolveris per-declaring-assembly. Thegdiplus.dllP/Invoke is declared inSystem.Private.Windows.Core(System.Drawing.Common 9.x's CsWin32 interop layer), not inSystem.Drawing.Common. - It broke the type initializer.
System.Drawing.Commonregisters its own resolver inside theSystem.Drawing.Gdipstatic constructor. Because 26.7.1 claimed that slot first, Gdip's cctor threwInvalidOperationException: 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
26.7.1 — Linux/macOS GDI+ resolver (gdiplus.dll DllNotFoundException)
What changed
- Added
GdiPlusResolverand registered it (GdiPlusResolver.Register()) at the top ofProgram.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(bothversionfields).
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
Bump engine to 26.6.0, extract shared ToolError, patch NU1903
What changed
- Engine bump:
GroupDocs.Annotation25.11.0 → 26.6.0 (a ~7-minor jump). The
net10.0 build resolves theGroupDocs.Annotation.Net80sub-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(bothversionfields), README and llms.txt@-pins. - Shared
Tools/ToolError.csextracted. All 10 tools previously carried a
duplicated privateFormatExceptionhelper; they now route theircatch
throughToolError.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.Jit1.0.2 (viaMicrosoft.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 patchedlibSkiaSharp.soand 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
Initial release of GroupDocs.Annotation.Mcp
What changed
- New MCP server exposing GroupDocs.Annotation for .NET as AI-callable tools, packaged as
GroupDocs.Annotation.Mcpon NuGet (PackageType=McpServer, ToolCommandName=groupdocs-annotation-mcp) and asghcr.io/groupdocs-annotation/annotation-net-mcp+docker.io/groupdocs/annotation-net-mcpDocker 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 viaOutputHelper.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 toAnnotator.ExportAnnotationsFromXMLFile(XML) orAnnotator.ImportAnnotationsFromDocument(.pdf/.docx/etc.). The engine's naming is inverted from the English sense — the wrapper hides that.ExportAnnotations— XmlSerializer dump of theList<AnnotationBase>to<name>.annotations.xml.GetDocumentInfo(Step 11 mandatory) — JSON with fileType / pageCount / size / per-page width+height via reflection overIDocumentInfo.Pages.GeneratePagesPreview— returnsCallToolResultwith oneTextContentBlock(summary, with eval-mode prefix when unlicensed) plus oneImageContentBlock.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 viaAnnotator.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>'".GeneratePagesPreviewreturnsCallToolResult { IsError = true }in the catch path. - Environment variables:
GROUPDOCS_MCP_STORAGE_PATH, optionalGROUPDOCS_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.EnableUnixSupportis set in the csproj. - SkiaSharp explicit pin (3.119.4) + matching
SkiaSharp.NativeAssets.Linux.NoDependencies 3.119.4.GroupDocs.Annotation 25.11.0pins 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)—Licenseis 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