Skip to content

Releases: groupdocs-merger/GroupDocs.Merger.Mcp

26.7.2

Choose a tag to compare

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

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 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.1...26.7.2

26.7.1

Choose a tag to compare

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

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 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.0 apart from the version stamp.

Full Changelog: 26.7.0...26.7.1

26.7.0

Choose a tag to compare

@github-actions github-actions released this 22 Jul 22:20

26.7.0 — Shared ToolError formatter + version alignment

What changed

  • Extracted the per-tool FormatException helper duplicated across MergeTool, SplitTool, and GetDocumentInfoTool into a single shared Tools/ToolError.cs (ToolError.Format(op, file, ex, subjectSuffix = null)). Every tool's catch block now calls it, so the descriptive-failure contract is defined once.
    • MergeToolError.Format("Merge", names, ex).
    • SplitToolError.Format("Split", file, ex, " (pages='<pages>')") — the optional subjectSuffix preserves the (pages='…') context that Split reported before.
    • GetDocumentInfoToolError.Format("Document-info lookup", file, ex).
  • Bumped the MCP package version 26.5.1 → 26.7.0 (CalVer) across build/dependencies.props, .mcp/server.json (both version fields), README.md, and llms.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

Choose a tag to compare

@github-actions github-actions released this 18 May 20:45

26.5.1 — Stream-based tools: no temp files, no masked cleanup failures

What changed

  • Merge, Split, and GetDocumentInfo no longer route document content through temporary files. Each tool now drives GroupDocs.Merger.Merger directly from the resolved input Stream and collects results in MemoryStreams:
    • GetDocumentInfonew Merger(stream).
    • Mergenew Merger(stream1) + Join(stream) per extra input + Save(MemoryStream).
    • Splitnew Merger(stream) + SplitOptions(CreateSplitStream, ReleaseSplitStream, pages); each extracted page is written to its own in-memory stream.
  • The temp-file / temp-directory cleanup finally blocks 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

Choose a tag to compare

@github-actions github-actions released this 17 May 19:08

Initial public release of GroupDocs.Merger MCP Server

What changed

  • NuGet package GroupDocs.Merger.Mcp published with McpServer package 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) or dotnet tool install -g.
  • Docker image published to ghcr.io/groupdocs-merger/merger-net-mcp and docker.io/groupdocs/merger-net-mcp.
  • Environment variables: GROUPDOCS_MCP_STORAGE_PATH, optional GROUPDOCS_MCP_OUTPUT_PATH, GROUPDOCS_LICENSE_PATH.
  • Linux native graphics deps wired up: SkiaSharp.NativeAssets.Linux.NoDependencies (3.119.2) is referenced because GroupDocs.Merger 26.4.0 (via the GroupDocs.Merger.Net100 runtime package) transitively requires SkiaSharp ≥ 3.119.2. libgdiplus + libfontconfig1 are installed in the Docker image because Merger's image-format paths use System.Drawing.Common (transitively pulled at 6.0.0); the System.Drawing.EnableUnixSupport runtime flag is set in the csproj for the same reason. ttf-mscorefonts-installer is 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's MergeTool / SplitTool shipped with a try/finally (cleanup) but no catch — the catch was added at clone time.
  • Pitfall #16 (JSON tools return raw JSON)GetDocumentInfoTool returns JsonSerializer.Serialize(...) directly, never through OutputHelper.TruncateText.
  • License class — the framework's MergerLicenseManager.cs uses new 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