GroupDocs.Assembly.Mcp 26.11.0

Prefix Reserved
{
  "inputs": [
    {
      "type": "promptString",
      "id": "storage_path",
      "description": "Base folder for input and output files. Defaults to the current working directory.",
      "password": false
    },
    {
      "type": "promptString",
      "id": "output_path",
      "description": "Optional — separate folder for output files. Defaults to GROUPDOCS_MCP_STORAGE_PATH.",
      "password": false
    },
    {
      "type": "promptString",
      "id": "license_path",
      "description": "Path to a GroupDocs license file (GroupDocs.Assembly or GroupDocs.Total). Omit to run in evaluation mode.",
      "password": false
    },
    {
      "type": "promptString",
      "id": "metered_public_key",
      "description": "Metered (pay-per-use) public key. Requires GROUPDOCS_METERED_PRIVATE_KEY as well. Takes precedence over GROUPDOCS_LICENSE_PATH. Metered mode reports usage to GroupDocs servers, so it needs outbound connectivity.",
      "password": false
    },
    {
      "type": "promptString",
      "id": "metered_private_key",
      "description": "Metered (pay-per-use) private key. Treat as a secret: supply it via an environment variable or a secret store, never hardcoded in a committed MCP client config.",
      "password": true
    }
  ],
  "servers": {
    "GroupDocs.Assembly.Mcp": {
      "type": "stdio",
      "command": "dnx",
      "args": ["GroupDocs.Assembly.Mcp@26.11.0", "--yes"],
      "env": {
        "GROUPDOCS_MCP_STORAGE_PATH": "${input:storage_path}",
        "GROUPDOCS_MCP_OUTPUT_PATH": "${input:output_path}",
        "GROUPDOCS_LICENSE_PATH": "${input:license_path}",
        "GROUPDOCS_METERED_PUBLIC_KEY": "${input:metered_public_key}",
        "GROUPDOCS_METERED_PRIVATE_KEY": "${input:metered_private_key}"
      }
    }
  }
}
                    
This package contains an MCP Server. The server can be used in VS Code by copying the generated JSON to your VS Code workspace's .vscode/mcp.json settings file.
dotnet tool install --global GroupDocs.Assembly.Mcp --version 26.11.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local GroupDocs.Assembly.Mcp --version 26.11.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=GroupDocs.Assembly.Mcp&version=26.11.0
                    
nuke :add-package GroupDocs.Assembly.Mcp --version 26.11.0
                    

GroupDocs.Assembly MCP Server

Let Claude, Cursor, GitHub Copilot and any other MCP agent generate Word, Excel, PowerPoint, PDF and e-mail documents from templates and data — contracts, invoices, letters, reports and certificates — by filling a template's <<[field]>>, <<foreach>>, <<if>>, table, chart, image and barcode tags with JSON, XML, CSV or spreadsheet data. One document, or one per record. Locally: your templates and data never leave your machine.

NuGet NuGet downloads Docker pulls MCP Registry Integration tests License: MIT

Install in 60 seconds

Install in VS Code Install in VS Code Insiders Add to Cursor Codex CLI setup Windsurf setup

One-click installs pre-fill every supported setting: edit the placeholder documents folder after install (output defaults to the same folder); an empty GROUPDOCS_LICENSE_PATH runs in evaluation mode - point it at your license to lift limits.

More clients - ready-made configs for Claude Code, Codex CLI, Visual Studio 2022, Cursor, Windsurf, Cline, and JetBrains Rider live in install/generated/.

Requires the .NET 10 SDK for native runs — or skip straight to Docker.

Run directly with dnx (recommended — no install step):

dnx GroupDocs.Assembly.Mcp --yes

Pulls the latest stable release on every invocation. To pin a version (recommended for shared configs and CI), append @<version>:

dnx GroupDocs.Assembly.Mcp@26.11.0 --yes

The server reads templates and data from GROUPDOCS_MCP_STORAGE_PATH (default: the current directory) and writes generated documents there too. It never overwrites an existing file: a name that is taken gets a (1) suffix.

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "groupdocs-assembly": {
      "type": "stdio",
      "command": "dnx",
      "args": ["GroupDocs.Assembly.Mcp", "--yes"],
      "env": {
        "GROUPDOCS_MCP_STORAGE_PATH": "/path/to/documents"
      }
    }
  }
}

To use a license, add "GROUPDOCS_LICENSE_PATH": "/path/to/GroupDocs.Assembly.lic" to env — omit it to run in evaluation mode.

Claude Code

claude mcp add groupdocs-assembly -- dnx GroupDocs.Assembly.Mcp --yes

VS Code / GitHub Copilot

Use the Install in VS Code button above, or copy the ready-made snippet from the NuGet package page into .vscode/mcp.json, or take install/generated/vscode-mcp.json from this repo.

Visual Studio 2022 (17.14+)

Create .mcp.json in your solution root with the contents of install/generated/vs2022-mcp.json.

Cursor · Windsurf · Cline · Rider · Codex

Docker

docker run --rm -i \
  -v "$(pwd)/documents:/data" \
  ghcr.io/groupdocs-assembly/assembly-net-mcp:latest

Images are published to GHCR (ghcr.io/groupdocs-assembly/assembly-net-mcp) and Docker Hub (groupdocs/assembly-net-mcp) for linux/amd64 + linux/arm64, tagged latest plus an immutable version tag matching each NuGet release (e.g. :26.11.0). The image includes every native library and font the engine needs.

Docker on Linux: run the container as your user

The image runs as a non-root user (uid 1654), and a bind mount keeps its host owner — so on a Linux host every document the server writes into /data fails with Permission denied unless the container runs as you:

docker run --rm -i --user "$(id -u):$(id -g)" \
  -v "$(pwd)/documents:/data" \
  ghcr.io/groupdocs-assembly/assembly-net-mcp:latest

JSON client configs run no shell, so put the numbers in: "args": ["run", "--rm", "-i", "--user", "1000:1000", …]. Docker Desktop on Windows and macOS does not need this.

Global dotnet tool

dotnet tool install -g GroupDocs.Assembly.Mcp
groupdocs-assembly-mcp

Available MCP Tools

Tool What it does
assemble_document Fills a template with data and saves the result — in the template's format, another format of its family, or PDF. Data inline (dataJson) or from a .json, .xml, .csv/.tsv file or a document's table (data)
assemble_per_record Mail merge: one document per element of a JSON array — a letter per customer, an invoice per order — named by a running number or a record field
get_template_fields Lists a template's tags, the names it uses for its data, the fields it reads, and a JSON skeleton of the data to fill in — no engine run, no data needed (JSON)
get_document_info A file as a template (family, tag count, data names, save targets) and as data (JSON keys, CSV header, the tables of a spreadsheet, Word or presentation document) (JSON)
get_supported_formats Template formats, what each family can be saved as, and the data formats (JSON)
get_license_status Licensing mode, metered consumption and engine version (shipped by GroupDocs.Mcp.Core)

Every failure sets isError and starts with the tool's prefix, e.g. Document assembly failed for 'invoice.docx': …, so a client needs one check. A field the data lacks is named in the message.

How data reaches the template

  • A JSON object's keys are the template's names. {"customer": {…}, "items": […]} fills <<[customer.Name]>> and <<foreach [i in items]>> — the shape get_template_fields returns as dataSkeleton.
  • An array, XML, CSV or table is one collection; the server names it after the collection the template uses (<<foreach [c in customers]>> → customers), or pass dataSourceName.
  • JSON values keep their JSON types: "007" stays text (the engine's default would make it 7).

Example prompts for AI agents

Fill invoice-template.docx with this order and save it as a PDF: …
What data does contract-template.docx need? Give me a JSON skeleton.
Generate a welcome letter for every customer in customers.json, named after the customer.
Build the quarterly report from report-template.xlsx and sales.csv.
Turn the rows of attendees.xlsx into one certificate each from certificate.pptx.

Evaluation mode

The MCP server itself is MIT; the GroupDocs.Assembly engine requires a license for production use. Without one every tool still works, with these limits (measured on GroupDocs.Assembly 26.7.0):

  • Generated documents start with an "Evaluation Only. Created with GroupDocs.Assembly …" line.
  • A saved workbook gains an extra worksheet.
  • E-mail messages keep only their plain-text body: the HTML body (where an MSG template usually keeps its tables) is replaced by the evaluation line, and so is the text of an e-mail saved as a document.

No row, page or document-count limit was found (200-row tables, 25 documents in a row). Responses of the generating tools start with one Evaluation mode: line. Call get_license_status to see which mode is active.

Licensing

There are two ways to license the server.

License file — point GROUPDOCS_LICENSE_PATH at your GroupDocs.Assembly (or GroupDocs.Total) license file. Works offline.

Metered (pay-per-use) — set both GROUPDOCS_METERED_PUBLIC_KEY and GROUPDOCS_METERED_PRIVATE_KEY. You pay for what you process, which suits agent workloads. If both a metered key pair and a license file are configured, metered wins and the file is ignored.

Metered mode needs outbound connectivity. Usage is reported to GroupDocs servers, so air-gapped or firewalled deployments must allow that egress — or use a license file instead.

Keeping the private key out of your config

The metered private key is a secret. MCP client configs are plain files, and a project-scoped .mcp.json is committed by convention, so prefer, in order:

  1. Set the variables in your OS environment and leave them out of the config entirely — an stdio MCP server inherits its client's environment. On macOS an app launched from Finder does not inherit shell exports; use launchctl setenv or launch the client from a terminal.
  2. Reference them indirectly if your client supports it (Claude Code expands ${VAR}; VS Code uses ${env:VAR} and ${input:...}).
  3. A literal value in a user-scoped config (for example ~/.claude.json) is acceptable for a single developer.
  4. Never commit a literal key in a project-scoped .mcp.json.

For Docker, forward the values without writing them into any file:

docker run --rm -i \
  -e GROUPDOCS_METERED_PUBLIC_KEY -e GROUPDOCS_METERED_PRIVATE_KEY \
  -v /path/to/documents:/data \
  ghcr.io/groupdocs-assembly/assembly-net-mcp:latest

Configuration

Variable Description Default
GROUPDOCS_MCP_STORAGE_PATH Base folder for templates, data and generated documents current directory
GROUPDOCS_MCP_OUTPUT_PATH (Optional) separate folder for generated documents GROUPDOCS_MCP_STORAGE_PATH
GROUPDOCS_LICENSE_PATH Path to a GroupDocs license file (evaluation mode)
GROUPDOCS_METERED_PUBLIC_KEY Metered public key. Requires the private key too; takes precedence over the license file (unset)
GROUPDOCS_METERED_PRIVATE_KEY Metered private key. Secret — see Licensing (unset)

Native prerequisites

Word, spreadsheet and e-mail templates draw through Aspose.Drawing and SkiaSharp, whose native libraries ship inside the package. Presentation templates (PPTX, PPT, ODP — and slides saved as PDF) draw through System.Drawing.Common, which on Linux and macOS needs the GDI+ library. PDF and XPS output lay text out, so Linux needs real fonts too:

Platform Setup
Windows Nothing.
Linux sudo apt-get install -y libgdiplus libfontconfig1 ttf-mscorefonts-installer
macOS brew install mono-libgdiplus (presentation templates only)
Docker Nothing — the image bundles all of it.

Without libgdiplus, a presentation template fails with "The type initializer for 'Gdip' threw an exception"; the server's message names the fix.

Limits

  • Templates are trusted input. A template's image and document tags load the file path or URL their expression returns, from wherever the server process can reach. Expressions cannot call .NET APIs outside the data (no file or environment access), but run the server with access only to the folders it should see — the Docker image with one mounted folder does exactly that.
  • {{name}} placeholders are not GroupDocs.Assembly syntax and are left as text; templates use <<[name]>>. get_template_fields flags them.
  • Empty lists. A list that is empty in the data has no fields, so a template that reads one fails unless allowMissingMembers=true.
  • Binary templates (DOC, XLS, PPT, MSG) work, but their tags cannot be listed without generating them, so with an array, XML, CSV or table as data pass dataSourceName.
  • Per-record assembly reads JSON. Convert CSV or spreadsheet rows to a JSON array first, or use assemble_document with a <<foreach>> template for one document listing every row.
  • macOS CI. Integration tests gate on Linux and Windows; the family-wide macOS runner hang is tracked separately.

Usage with Docker Compose

cd docker
docker compose up

Edit docker/docker-compose.yml to point the volume at your documents folder.

Documentation & guides

Step-by-step deployment guides and a published-package integration test suite live in the companion repo GroupDocs.Assembly.Mcp.Tests:

That repo exercises every advertised tool against the published package (dnx on Linux, Windows and macOS) and the Docker image, reading every generated document back.

License

MIT — see LICENSE

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
26.11.0 68 11/9/2026