Skip to content

Repository files navigation

GroupDocs MCP — one-command installer

Set up any subset of the GroupDocs MCP servers on a developer machine from a single config file — or a guided wizard. Registers them into your AI client(s) and/or emits a docker-compose.yml. Cross-platform (PowerShell 5.1 and 7+).

./install-groupdocs-mcp.ps1 -Interactive     # first run: wizard asks everything (incl. post-install verification), saves the config
./verify-groupdocs-mcp.ps1                   # any time later: re-verify every installed product

Fresh machine? setup/ has one-shot prerequisite bootstrappers per OS (macOS / Linux / Windows — PowerShell, Docker or the .NET 10 SDK, native deps). Ready-made configurations for common setups live in samples/.

Files

File Purpose
manifest.json Source-of-truth catalog: product → NuGet id, Docker image, server name. Update when products are added.
groupdocs-mcp.config.json Your settings — products, channel, clients, shared paths, license, verify cases. Written by the wizard or edited by hand.
install-groupdocs-mcp.ps1 Installer / uninstaller / wizard. Reads the two files above, writes client configs / compose.
verify-groupdocs-mcp.ps1 Post-install smoke tests. Reads the same config; runs the MCP handshake per server.

Shared settings (one place for all products)

storagePath, outputPath, and licensePath in groupdocs-mcp.config.json apply to every product — set them once. The installer maps them per channel: Docker mounts storagePath → /data, the license dir → /license:ro; NuGet passes them as GROUPDOCS_MCP_* env vars. Missing storage/output folders are created; a missing license file produces a warning (servers fall back to evaluation mode — an empty licensePath is always safe). The verify script reuses the same values, so a working install verifies with no extra setup.

Quick start

# 1. Wizard (or edit groupdocs-mcp.config.json by hand):
./install-groupdocs-mcp.ps1 -Interactive
# 2. Preview without touching anything:
./install-groupdocs-mcp.ps1 -DryRun
# 3. Apply, warm caches, and verify the setup in one go:
./install-groupdocs-mcp.ps1 -Verify
# 4. Restart your AI client.

Config file

{
  "channel":     "docker",          // docker | nuget
  "registry":    "ghcr",            // ghcr | dockerhub  (docker channel only)
  "clients":     ["claude-desktop", "vscode"],
  "version":     "latest",          // "latest" or a pin e.g. "26.7.2"
  "storagePath": "C:/docs",         // shared documents folder (created if missing)
  "outputPath":  "",                // optional separate output folder
  "licensePath": "",                // optional path to a .lic file ("" = evaluation mode)
  "products":    ["metadata", "conversion", "comparison"]
}
  • products is always an explicit list. Use "all" to expand to every individual product (Total is excluded — it is the bundle equivalent). List "total" alone to get the all-in-one server.
  • Any CLI switch overrides the config file: -Channel, -Registry, -Products, -Clients, -Version.

Clients

Client id How it's registered Where
claude-desktop file merge %APPDATA%\Claude\claude_desktop_config.json (Win) / ~/Library/Application Support/Claude/… (mac) / ~/.config/Claude/… (Linux) — root mcpServers
claude-code claude CLI (claude mcp add --scope user) Claude Code user scope
vscode file merge VS Code user-level mcp.json (%APPDATA%\Code\User\mcp.json etc.) — root servers; applies to every workspace
vscode-workspace file merge ./.vscode/mcp.json (current directory) — root servers
vs2022 file merge ./.mcp.json in the current directory (put it in your solution root) — root servers
cursor file merge ~/.cursor/mcp.json — root mcpServers
windsurf file merge ~/.codeium/windsurf/mcp_config.json — root mcpServers
cline file merge VS Code globalStorage …/saoudrizwan.claude-dev/settings/cline_mcp_settings.json — root mcpServers
codex codex CLI (codex mcp add) Codex CLI config

CLI-registered clients (claude-code, codex) need their CLI on PATH; if it is missing, that client is skipped with a warning and the rest proceed. JetBrains Rider has no stable config-file/CLI surface — register there manually (Settings → Tools → AI Assistant → MCP) using any generated entry as reference.

File merges preserve other servers in the file and create a timestamped .bak backup before every write. All JSON is written UTF-8 without BOM.

Channels

docker nuget
Prereqs Docker only .NET 10 SDK (+ libgdiplus/libfontconfig1 on Linux/macOS)
Native deps bundled in image you install them
Total / Parser ✅ supported ⛔ NuGet-blocked (>250 MB) — auto-skipped
Entry written docker run … <image> dnx <pkg> --yes + env

Docker is the recommended default (self-contained, verified green across the publish matrix). NuGet is convenient for .NET devs and per-product subsets.

Switches

Switch Effect
-Interactive Guided wizard; saves answers to the config file. Also auto-runs when no config exists.
-SkipPreflight Skip the prerequisite preflight. By default the installer verifies the channel's runtime (docker daemon reachable / .NET 10 SDK + dnx present) before touching anything; on failure it prints the exact setup/<os> command (and the wizard offers to run it). Dry-runs warn and continue.
-Verify After installing: warm caches, then run the verifier against the same products/channel (auto level). Exit code = verification result. The wizard offers this as its last question.
-DryRun Print everything, write nothing. Always preview first.
-Prewarm docker: docker pull each image. nuget: download and first-launch each package with stdin closed (server reads EOF and exits cleanly) — prevents the cold-cache failure where a client's first in-pipe launch of a large package dies before the download finishes.
-EmitCompose Also write a docker-compose.yml in the current dir (docker channel).
-Config <path> Use a different config file.

Uninstall / remove

uninstall-groupdocs-mcp.ps1 is the configurable removal tool. Its defaults are deliberately the "clean this machine" case: every known GroupDocs server, from every known client — regardless of what the config file says, so it also catches entries left behind after the config changed.

./uninstall-groupdocs-mcp.ps1 -DryRun                     # preview a full sweep
./uninstall-groupdocs-mcp.ps1                             # remove ALL GroupDocs servers from ALL clients
./uninstall-groupdocs-mcp.ps1 -Products metadata,conversion   # only these products
./uninstall-groupdocs-mcp.ps1 -Clients claude-desktop,cursor  # only these clients
./uninstall-groupdocs-mcp.ps1 -RemoveImages               # also docker rmi the images
./uninstall-groupdocs-mcp.ps1 -PurgeNugetCache            # also delete the cached NuGet packages (dnx re-downloads)
./uninstall-groupdocs-mcp.ps1 -RemoveCompose              # also delete ./docker-compose.yml
  • -Products / -Clients accept all (the default) or comma-separated subsets.
  • Non-GroupDocs servers in the same config files are left untouched, and every modified file gets a timestamped .bak backup first.
  • CLI clients are cleared via claude mcp remove / codex mcp remove (skipped with a warning if the CLI is not on PATH).
  • -RemoveImages honours -Registry / -Version for the tag to delete.

./install-groupdocs-mcp.ps1 -Uninstall still works — it forwards to the same script, scoped to the clients listed in your config file.

Verify installed products

./install-groupdocs-mcp.ps1 -Verify              # install + prewarm + verify in one command
./verify-groupdocs-mcp.ps1                       # auto level (default) - zero config needed
./verify-groupdocs-mcp.ps1 -Level handshake      # minimum: server starts + lists tools
./verify-groupdocs-mcp.ps1 -Level toolcall       # strict: only explicit verify.cases
Level What it proves Needs setup?
auto (default) Handshake plus, when possible, a real document check: after tools/list the verifier picks the server's info tool (get_document_info, or get_view_info for Viewer) and calls it against the first document found in storagePath (or verify.sampleFile when set). No document / no info tool → degrades to handshake-only, still passing. No — drop any document into your storage folder for the deeper check
handshake Server starts (image pulls/runs or dnx resolves) and returns its tool list via initializetools/list. Universal across all products + both channels. No
toolcall Handshake plus exactly the tools/call defined per product in verify.cases against verify.sampleFile. Products without a case report no-case. Yes

Explicit verify.cases entries always win over the auto pick — use them to exercise a specific tool or argument shape:

"verify": {
  "level": "auto",                   // auto | handshake | toolcall
  "sampleFile": "sample.docx",       // optional - otherwise first document in storagePath
  "cases": {                         // optional per-product overrides
    "metadata":   { "tool": "get_document_info", "args": { "file": { "filePath": "sample.docx" } } },
    "conversion": { "tool": "get_document_info", "args": { "file": { "filePath": "sample.docx" } } }
  }
}

Exit code is 0 when all products pass, 1 otherwise — so it drops straight into CI. Tool args use Mcp.Core's FileInput shape: { "file": { "filePath": "<name>" } }.

docker-compose alternative

For a Docker-only shop, skip client registration and just:

./install-groupdocs-mcp.ps1 -EmitCompose -Clients @()   # writes docker-compose.yml
docker compose up

Delivery-channel notes (why this design)

  • NuGet (dnx) — zero pre-install, auto-pulls; needs .NET 10 SDK and native graphics libs on Linux/macOS. Total/Parser exceed NuGet's 250 MB cap.
  • Docker (GHCR / Docker Hub) — self-contained, native deps bundled; the "just works" cross-platform path and the primary channel here.
  • GitHub Copilot / VS Code / Cursor / Windsurf / Clineclients (registration targets), not runtimes; they still run dnx or docker underneath.
  • MCP Registry (io.github.groupdocs-*/…) — a discovery/verification index, not yet a bulk installer.

About

Configuration-driven script that installs and configures every GroupDocs MCP server locally in one run.

Resources

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages