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}" } } } }
.vscode/mcp.json settings file.
dotnet tool install --global GroupDocs.Assembly.Mcp --version 26.11.0
dotnet new tool-manifest
dotnet tool install --local GroupDocs.Assembly.Mcp --version 26.11.0
#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.
Install in 60 seconds
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"toenv— 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
- Cursor — use the Add to Cursor button above, or paste
install/generated/claude-desktop.jsoninto~/.cursor/mcp.json. - Windsurf — follow
install/generated/windsurf.md. - Cline — paste
install/generated/cline.jsoninto Cline's MCP settings. - JetBrains Rider — follow
install/generated/rider.md. - Codex CLI —
codex mcp add groupdocs-assembly -- dnx GroupDocs.Assembly.Mcp --yes, details ininstall/generated/codex.md.
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 shapeget_template_fieldsreturns asdataSkeleton. - 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 passdataSourceName. - JSON values keep their JSON types:
"007"stays text (the engine's default would make it7).
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:
- 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 setenvor launch the client from a terminal. - Reference them indirectly if your client supports it (Claude Code expands
${VAR}; VS Code uses${env:VAR}and${input:...}). - A literal value in a user-scoped config (for example
~/.claude.json) is acceptable for a single developer. - 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_fieldsflags 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_documentwith 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:
- Install from NuGet —
dnx, global tool, pinned vs always-latest - Run via Docker
- Verify on the MCP registry
- Use with Claude Desktop
- Use with VS Code / GitHub Copilot
- Run the integration tests
- Use with Cursor
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 | Versions 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. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 26.11.0 | 68 | 11/9/2026 |