MCP server that exposes GroupDocs.Annotation as AI-callable tools for Claude, Cursor, GitHub Copilot, and other MCP agents.
Requires .NET 10 SDK.
Run directly with dnx (recommended — no install step):
dnx GroupDocs.Annotation.Mcp --yesPulls the latest stable release on every invocation. To pin to a specific
version (recommended for shared configs and CI), append @<version>:
dnx GroupDocs.Annotation.Mcp@26.5.0 --yesOr install as a global dotnet tool:
dotnet tool install -g GroupDocs.Annotation.Mcp
groupdocs-annotation-mcpOr run via Docker:
docker run --rm -i \
-v $(pwd)/documents:/data \
ghcr.io/groupdocs-annotation/annotation-net-mcp:latestThe underlying GroupDocs engine rasterises annotated pages and previews via
System.Drawing (GDI+). When you run the server natively (via dnx or
the global dotnet tool) on Linux or macOS, install the native libgdiplus
library and a fonts package first:
| Platform | Setup |
|---|---|
| Windows | Nothing — GDI+ is built into the OS. |
| Linux | sudo apt-get install -y libgdiplus libfontconfig1 ttf-mscorefonts-installer |
| macOS | brew install mono-libgdiplus |
| Docker | Nothing — the image already bundles libgdiplus, libfontconfig1, and ttf-mscorefonts-installer. |
Skipping this on Linux/macOS surfaces as DllNotFoundException: libgdiplus in
the tool response. The simplest zero-setup option on Linux/macOS is the
Docker image.
| Tool | Description |
|---|---|
AddAnnotation |
Add a textfield / area / point / arrow / highlight / underline / strikeout annotation; saves the annotated file as <name>_annotated.<ext> |
GetAnnotations |
List all annotations in a document as JSON (id, type, message, page, box, user, replies) |
UpdateAnnotation |
Modify an existing annotation's message and/or bounding box by id |
RemoveAnnotations |
Remove annotations by id list, or all if none specified |
AddReply |
Add a reply / comment thread to an existing annotation |
RemoveReplies |
Remove replies by reply-id list, by user name, or all |
ImportAnnotations |
Import annotations from an XML file or another annotated document into a target file |
ExportAnnotations |
Extract annotations from a document and save them as XML (re-importable via ImportAnnotations) |
GetDocumentInfo |
Return file type, page count, size, and per-page dimensions as JSON (no modification) |
GeneratePagesPreview |
Render up to 5 document pages as inline PNG images so AI clients display them directly |
- "Annotate contract.pdf — add a highlight on page 2 around the indemnity clause and an arrow with the comment 'Needs legal review'"
- "List every annotation in design-review.docx and group them by author"
- "Reply to annotation 7 in spec.pdf with 'Implemented in PR #42' under the user 'alice'"
- "Export the annotations from old.pdf to XML, then re-import them into new.pdf"
- "Preview page 1 and page 5 of report.pdf with annotations baked in"
| Variable | Description | Default |
|---|---|---|
GROUPDOCS_MCP_STORAGE_PATH |
Base folder for input and output files | current directory |
GROUPDOCS_MCP_OUTPUT_PATH |
(Optional) separate folder for output files | GROUPDOCS_MCP_STORAGE_PATH |
GROUPDOCS_LICENSE_PATH |
Path to GroupDocs license file | (evaluation mode) |
{
"mcpServers": {
"groupdocs-annotation": {
"type": "stdio",
"command": "dnx",
"args": ["GroupDocs.Annotation.Mcp", "--yes"],
"env": {
"GROUPDOCS_MCP_STORAGE_PATH": "/path/to/documents"
}
}
}
}To pin to a specific version, replace
"GroupDocs.Annotation.Mcp"with"GroupDocs.Annotation.Mcp@26.5.0"inargs. Pinning is recommended for shared / committed configs to avoid surprise upgrades.
NuGet.org generates a ready-to-use mcp.json snippet on the package page.
Copy it directly into your .vscode/mcp.json.
Alternatively, add manually to .vscode/mcp.json:
{
"inputs": [
{
"type": "promptString",
"id": "storage_path",
"description": "Base folder for input and output files.",
"password": false
}
],
"servers": {
"groupdocs-annotation": {
"type": "stdio",
"command": "dnx",
"args": ["GroupDocs.Annotation.Mcp", "--yes"],
"env": {
"GROUPDOCS_MCP_STORAGE_PATH": "${input:storage_path}"
}
}
}
}Same pinning rule as above — swap
"GroupDocs.Annotation.Mcp"for"GroupDocs.Annotation.Mcp@26.5.0"to lock to a specific release.
cd docker
docker compose upEdit docker/docker-compose.yml to point volumes at your local documents folder.
MIT — see LICENSE