Releases: groupdocs-merger/GroupDocs.Merger.Mcp
Release list
26.7.2
26.7.2 — 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.1...26.7.2
26.7.1
26.7.1 — 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.0 apart from the version stamp.
Full Changelog: 26.7.0...26.7.1
26.7.0
26.7.0 — Shared ToolError formatter + version alignment
What changed
- Extracted the per-tool
FormatExceptionhelper duplicated acrossMergeTool,SplitTool, andGetDocumentInfoToolinto a single sharedTools/ToolError.cs(ToolError.Format(op, file, ex, subjectSuffix = null)). Every tool'scatchblock now calls it, so the descriptive-failure contract is defined once.Merge→ToolError.Format("Merge", names, ex).Split→ToolError.Format("Split", file, ex, " (pages='<pages>')")— the optionalsubjectSuffixpreserves the(pages='…')context that Split reported before.GetDocumentInfo→ToolError.Format("Document-info lookup", file, ex).
- Bumped the MCP package version
26.5.1 → 26.7.0(CalVer) acrossbuild/dependencies.props,.mcp/server.json(bothversionfields),README.md, andllms.txt.
Why
Three tools carried byte-identical inner-exception-chain formatting loops. A single shared formatter removes the duplication, guarantees the "<op> failed for '<file>': …" prefix stays consistent, and matches the cross-product convention already used by the Metadata / Conversion MCPs.
Migration / impact
No behaviour change. The failure-text prefixes (Merge failed for, Split failed for, Document-info lookup failed for) and the (pages='…') suffix on Split are byte-for-byte identical to 26.5.1, so integration tests that pattern-match those prefixes keep passing. The engine (GroupDocs.Merger 26.4.0) is unchanged. No tool-name or input-schema changes.
Full Changelog: 26.5.1...26.7.0
26.5.1
26.5.1 — Stream-based tools: no temp files, no masked cleanup failures
What changed
Merge,Split, andGetDocumentInfono longer route document content through temporary files. Each tool now drivesGroupDocs.Merger.Mergerdirectly from the resolved inputStreamand collects results inMemoryStreams:GetDocumentInfo—new Merger(stream).Merge—new Merger(stream1)+Join(stream)per extra input +Save(MemoryStream).Split—new Merger(stream)+SplitOptions(CreateSplitStream, ReleaseSplitStream, pages); each extracted page is written to its own in-memory stream.
- The temp-file / temp-directory cleanup
finallyblocks are gone — there is nothing left to clean up.
Why
The tools previously copied each input to %TEMP%/gd_mcp_<guid>.<ext>, opened Merger by file path, and deleted the temp file in a finally. GroupDocs.Merger.Merger releases its input file handle lazily — not on Dispose() — so on Windows File.Delete in the finally raced the handle release and threw IOException. An exception thrown from a finally propagates past every catch, so ModelContextProtocol wrapped it as An error occurred invoking '<tool>' with IsError = true — reporting failure even though the merge / split / info had succeeded and the output was already written. Driving the engine from streams removes the temp file entirely, eliminating the handle leak, the cleanup race, and the masked failure.
Migration / impact
Drop-in replacement for 26.5.0. No public-API, tool-name, or input-schema changes. Output file naming is unchanged (<stem>_merged<ext>, <stem>_<page><ext>). The server no longer writes to the system temp directory.
Full Changelog: 26.5.0...26.5.1
26.5.0
Initial public release of GroupDocs.Merger MCP Server
What changed
- NuGet package
GroupDocs.Merger.Mcppublished withMcpServerpackage type. - Three MCP tools exposed:
Merge— merge 2–4 documents into a single file and save the result to storage.Split— extract specific pages (1-based, comma-separated) from a document, saving each extracted page as its own document.GetDocumentInfo— return the file type, page count, size, and per-page dimensions of a document as JSON, without modifying it.
- Installable via
dnx GroupDocs.Merger.Mcp@26.5.0 --yes(.NET 10 SDK required) ordotnet tool install -g. - Docker image published to
ghcr.io/groupdocs-merger/merger-net-mcpanddocker.io/groupdocs/merger-net-mcp. - Environment variables:
GROUPDOCS_MCP_STORAGE_PATH, optionalGROUPDOCS_MCP_OUTPUT_PATH,GROUPDOCS_LICENSE_PATH. - Linux native graphics deps wired up:
SkiaSharp.NativeAssets.Linux.NoDependencies(3.119.2) is referenced becauseGroupDocs.Merger26.4.0 (via theGroupDocs.Merger.Net100runtime package) transitively requires SkiaSharp ≥ 3.119.2.libgdiplus+libfontconfig1are installed in the Docker image because Merger's image-format paths useSystem.Drawing.Common(transitively pulled at 6.0.0); theSystem.Drawing.EnableUnixSupportruntime flag is set in the csproj for the same reason.ttf-mscorefonts-installeris NOT installed — Merger does structural page operations, not text-glyph rendering (Pitfall #17 tier 1).
Tool surface note
The framework subproject (groupdocs-mcp-framework/src/GroupDocs.Merger.Mcp/) ships only Merge and Split. GetDocumentInfo was added at clone time per the cross-product MCP standard (every GroupDocs MCP server exposes GetDocumentInfo) — modelled on the upstream BasicUsage/GetDocumentInformation.cs example.
Pre-shipped pitfall remediations
- Pitfall #18 (engine exceptions surface diagnostically) — all three tools wrap their engine calls in
try/catch (Exception ex)and return per-tool descriptive failure strings (Merge failed for '<files>': <ExceptionType>: <message> | inner(0): ..., etc.) instead of letting them bubble up to MCP's canned"An error occurred invoking '<tool>'"wrapper. The framework'sMergeTool/SplitToolshipped with atry/finally(cleanup) but nocatch— the catch was added at clone time. - Pitfall #16 (JSON tools return raw JSON) —
GetDocumentInfoToolreturnsJsonSerializer.Serialize(...)directly, never throughOutputHelper.TruncateText. - License class — the framework's
MergerLicenseManager.csusesnew GroupDocs.Merger.License().SetLicense(licensePath)with no caveats; used verbatim (Metadata pattern).
Why
Seventh product MCP server in the GroupDocs MCP framework family (after Metadata, Conversion, Comparison, Viewer, Watermark, Parser). Exposes GroupDocs.Merger for .NET as AI-callable tools for Claude, Cursor, VS Code / GitHub Copilot, and other MCP-compatible agents.
Migration / impact
First release — no migration required.
TODO before MCP registry publish
- Polish
[Description("...")]strings on the 3 tools after first dogfooding with AI clients. - Consider additional Merger tools (e.g. page rearrange, rotate, remove pages, extract page range) — deferred per the initial-clone scope.
Full Changelog: https://github.com/groupdocs-merger/GroupDocs.Merger.Mcp/commits/26.5.0