Repository navigation
Releases: groupdocs-search/GroupDocs.Search.Mcp
Release list
26.10.1
26.10.1 — explain an unwritable index folder, document --user for Docker on Linux
What changed
- An index folder the server cannot write now fails with the fix, not a raw exception. Before
creating, adding to, updating or removing from an index, the server checks that the index folder can
be written. If not, the response (isError: true) reads: "The index folder '…' is not writable by the
server process. In Docker on Linux the container runs as a non-root user, so a host folder you own is
read-only to it: add --user "$(id -u):$(id -g)" to docker run, or mount a writable folder at /index and
set GROUPDOCS_MCP_INDEX_PATH=/index. …" Previously the agent received
System.UnauthorizedAccessException: Access to the path '/data/.groupdocs-search-index' is denied. - README: new section Linux: run the container as your user, including the literal-number form
("--user", "1000:1000") for MCP client JSON configs, which do not run a shell. - Unit test for the unwritable-folder path (38 unit tests).
Why
The first CI run of the integration suite against the published 26.10.0 image failed 20 of 31 tests on
ubuntu-latest. The image runs as uid 1654; on a Linux host a bind mount keeps its host owner, so the
runner's temp folder — and any folder a Linux user owns — is read-only inside the container, and the
default index location /data/.groupdocs-search-index cannot be created. Docker Desktop on Windows and
macOS does not enforce bind-mount ownership, which is why local verification passed.
Search is hit harder than the other products because building an index is a write even when the user
only wants to search. The same cause affects every family image that writes into /data (Parser's
extract_images docker tests fail on it); that is tracked in docs/backlog-and-issues.md.
Migration impact
None for callers. Linux Docker users who saw the access-denied error add --user "$(id -u):$(id -g)"
(or the numeric form in JSON configs). Windows and macOS are unaffected.
Full Changelog: 26.10.0...26.10.1
26.10.0
GroupDocs.Search MCP server — first release
What changed
New MCP server GroupDocs.Search.Mcp over GroupDocs.Search for .NET 26.10.0, built on
GroupDocs.Mcp.Core / GroupDocs.Mcp.Local.Storage 26.9.0 and ModelContextProtocol 1.1.0,
targeting net10.0. It is the thirteenth server in the GroupDocs MCP family and the first stateful
one: indexes persist on disk between tool calls and restarts.
Tools:
| Tool | What it does |
|---|---|
add_to_index |
Indexes a file, a folder (recursive) or the whole storage folder; creates the index on demand |
search |
Ranked matching documents as JSON, with occurrence counts, terms and fields |
get_text_fragments |
Matching passages with surrounding words, as plain text |
update_index |
Re-reads changed files, adds new files under indexed folders, drops deleted ones |
remove_from_index |
Removes an indexed path; files on disk untouched |
create_index |
Creates or opens a named index; recreate empties it |
get_index_info |
Existence, counts, indexed paths, version, other indexes, optional supported formats |
get_license_status |
From Core: licensing mode, engine version, metered consumption |
Distribution — Docker-first (OCI):
- Image
ghcr.io/groupdocs-search/search-net-mcp:26.10.0(+:latest), multi-arch; Docker Hub
mirrorgroupdocs/search-net-mcponce the org has the Docker Hub secrets. - MCP Registry
io.github.groupdocs-search/groupdocs-search-mcp,registryType: oci. - No NuGet package: the packed tool measured 280.9 MiB (2026-10-14) against NuGet.org's
250 MB limit. The engine DLL alone is 199.6 MiB; the rest is ONNX Runtime and SkiaSharp natives
that remain afterStripMobileAndExoticRuntimes. Stripping further cannot close the gap.
Configuration — the family's five variables plus one:
GROUPDOCS_MCP_STORAGE_PATH,GROUPDOCS_MCP_OUTPUT_PATH,GROUPDOCS_LICENSE_PATH,
GROUPDOCS_METERED_PUBLIC_KEY,GROUPDOCS_METERED_PRIVATE_KEY(isSecret).GROUPDOCS_MCP_INDEX_PATH— where indexes live. Unset, they go to
<output or storage>/.groupdocs-search-index; the image leaves it unset on purpose so the index
persists inside the one/datamount every client config already has.
Design decisions:
- Relative paths only. Document paths are relative to the storage folder and indexes are
addressed by name; rooted paths and..escapes are rejected. The server never reads outside
the folders it was given. - The index folder is never indexed, even when it sits inside the storage folder — an engine
DocumentFilterexcludes it. - Failures carry
isError: true. Tools returnCallToolResult, so engine failures keep the
family's<Operation> failed for '<target>': …text and set the flag; other products return
stringand come back success-shaped on engine errors. - Evaluation limits are stated in every response (
evaluationfield in JSON, a trailing note in
text): 100 documents per index, 10 documents per search. - Old indexes are converted. GroupDocs.Search 26.10 cannot open indexes from 22.7–26.8 until
they are converted; the server converts on first open and keeps the original as
<name>.pre-26.10-backup. - Linux image installs
libgdiplus libfontconfig1for the engine's image paths; the
System.Drawing.EnableUnixSupportswitch is kept as the family's inert marker.
Engine behaviour documented in the tool descriptions because an agent would otherwise misread it
(verified on 26.10.0):
Index.Deleteaccepts only paths passed toAdd. A single file inside an indexed folder cannot
be removed on its own;remove_from_indexsays so and lists the indexed paths.- Unquoted multi-word queries match nothing; phrases need double quotes.
searchadds ahint
when that is the likely reason for zero results. *is a whole-word wildcard in this DSL;?is the character wildcard.
Why
Search answers the question the other servers cannot: which of my documents say X, and where?
Agents can read one file at a time; across hundreds of files they need an index. Running it locally
over MCP keeps confidential collections (contracts, HR, email archives) on the user's machine.
Verification
dotnet test src -c Release: 37/37 pass, including tool tests that drive the real engine in temp
folders (add, search, phrase, fragments, update after edit, remove, recreate, missing index,
index-folder exclusion).- Live stdio session against the published DLL, evaluation mode:
tools/listreports 8 tools;
every tool returns the expected shape; every failure path returnsisError: truewith the
prefixed text;get_license_statusreportsevaluationand engine26.10.
Migration impact
None — first release.
Full Changelog: https://github.com/groupdocs-search/GroupDocs.Search.Mcp/commits/26.10.0