GroupDocs.Assembly MCP Server

GroupDocs.Assembly MCP server lets AI agents like Claude, Cursor, and Copilot generate documents from templates and data — a contract from a JSON object, a letter per customer, a report with tables and charts from a CSV — in Word, Excel, PowerPoint, PDF and email, locally on your machine. The agent supplies the data; the template controls the document.

Run it with one command. The Docker image is self-contained — the runtime and every native dependency the engine needs are inside it:

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

With the .NET 10 SDK installed, the same server also runs without Docker:

dnx GroupDocs.Assembly.Mcp --yes

Both are the .NET build of the server and run on Windows, Linux, and macOS. Other platforms will each get their own launcher — see Install for your platform.

Or use the guided installer to register the server in your AI client, verify the setup, and configure shared folders in one pass.

Then ask your agent, in plain language:

What data does contract-template.docx need? Fill it for Contoso Pharma with the three services below and save it as a PDF.

What you can do

Six tools (full details in the tools reference):

The user asks…The agent callsIt gets back
“What does this template need?”get_template_fieldstags, data names, a JSON skeleton to fill
“Make the contract / invoice / report”assemble_documentthe generated document, in the template’s format or PDF, HTML, Markdown…
“One letter per customer”assemble_per_recordone file per record, named by a field; failed records listed
“What’s in this data file?”get_document_infofamily, tags, JSON shape, spreadsheet tables and columns
“Can it save an Excel template as PDF?”get_supported_formatstemplate, save and data formats
“Why does it say Evaluation Only?”get_license_statusthe licensing mode

Ask the template, fill the data, render

The pattern behind every scenario — captured from the server:

user              agent                        Assembly MCP server
 |  "Make the contract for this order: Contoso Pharma, 12 months ..."  |
 |---------------->|                                                   |
 |                 |-- get_template_fields ------------------------->|
 |                 |   {"template":{"filePath":                        |
 |                 |     "contract-template.docx"}}                    |
 |                 |<- {"dataSourceNames":["contract","customer",      |
 |                 |    "items"], "dataSkeleton":{"customer":{"Name":  |
 |                 |    ""...}, "items":[{"Title":"","Quantity":0}]}} -|
 |                 |   the agent fills the skeleton from the order     |
 |                 |-- assemble_document --------------------------->|
 |                 |   {"template":{...},"dataJson":"{...}",           |
 |                 |    "format":"pdf"}                                |
 |                 |<- "Assembled 'contract-template.docx' with inline |
 |                 |    JSON (JSON object) as PDF" --------------------|
 |<- "Contract SA-2026-118 is ready: 3 services, total 75500 EUR."     |
   the model writes the data; layout, tables and wording come from the template

The model never composes the document. It reads the template’s data contract — the skeleton from get_template_fields — and fills it; the engine renders tables, totals, conditional paragraphs, charts, images and barcodes exactly as the template defines them. The same data gives the same document every time, and a reviewer checks a JSON object instead of re-reading prose.

How data reaches the template

data you give            what the template sees               how to name it
-----------------------  -----------------------------------  ----------------
JSON object              its keys: contract, customer, items  nothing to do
JSON array / XML / CSV   one collection                       worked out from
spreadsheet / Word table   (columns are the members)            the template, or
                                                                dataSourceName
"2026-11-12T00:00:00"    a date - format it in the template   :"d MMMM yyyy"
{{name}} in a template   left as text - not Assembly syntax   use <<[name]>>

JSON (inline or a file), XML, CSV and the tables of Excel, Word and PowerPoint documents all work. Details and the template language in one table: tools reference.

Scenarios

Install for your platform

Installation, prerequisites, and client configuration are platform-specific; the tools and licensing model are the same everywhere.

PlatformStatusInstall and setup
.NETAvailableMCP server for .NET
JavaPlannedTell us you need it
PythonPlannedTell us you need it
Node.jsPlannedTell us you need it

Supported AI clients

ClientHow it connects
Claude Desktopclaude_desktop_config.json
Claude Codeclaude mcp add CLI
VS Code / GitHub Copilotuser-level or workspace mcp.json
Visual Studio 2022 (17.14+).mcp.json in the solution root
Cursor~/.cursor/mcp.json
Windsurf~/.codeium/windsurf/mcp_config.json
ClineCline MCP settings
Codex CLIcodex mcp add CLI
JetBrains Ridermanual registration (Settings → AI Assistant → MCP)

Exact config blocks for every client: Register in AI clients.

Delivery channels

NuGet (dnx)Docker
Prerequisites.NET 10 SDK (+ libgdiplus on Linux/macOS for presentation templates and charts)Docker only
Native dependenciesinstalled by you (or the setup script)bundled in the image
PackageGroupDocs.Assembly.Mcp on NuGetghcr.io/groupdocs-assembly/assembly-net-mcp · groupdocs/assembly-net-mcp
Time zonethe machine’s — see the date note in the tools referenceUTC

How it works

The server uses MCP’s local stdio transport: your AI client starts the server as a child process and talks to it over standard input/output. No inbound ports, no external endpoints, no telemetry — the data path is agent → local server → local filesystem. Templates and data are read from your storage folder; generated documents are written next to them. Details: On-premise architecture.

Resources