dms-mcp-server
A read-only MCP server that lets AI clients browse and read documents from DMS repositories through a local bridge.
Check bridge availability with
bridge_health.List configured DMS connections with
list_connections.Browse files and folders at a
connection:/pathlocation withlist_items.Search natively below a path with
search_items, with optional files-only filtering and result limits.Resolve Alfresco/eDoCat share URLs to exact DMS paths and inspect folder contents with
open_share_url.Get metadata for a specific file or folder with
get_item_info.Read size-limited documents with
read_document, decoding text or base64-encoding binary content.No upload, move, copy, mkdir, or delete tools; DMS credentials never enter the MCP server.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dms-mcp-server Show me the documents in connection:/Projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dms-mcp-server
Read-only Model Context Protocol server for DMS repositories exposed by
dms-provider-bridge. The MCP server never receives DMS usernames, passwords
or tokens. It forwards only the connection-owned credential_id reference and
leaves credential resolution to the bridge.
The server uses the official Python MCP SDK v2 with Streamable HTTP. The
server supports stateless HTTP so a long-running DMS operation does not block
independent MCP clients. Existing calls remain backward compatible;
search_items adds the optional search_mode parameter.
MVP tools
bridge_healthlist_connectionslist_itemssearch_itemssearch_metadataopen_share_urlget_item_inforead_document
All DMS paths use connection:/path. The server intentionally has no upload,
move, copy, mkdir or delete tools.
open_share_url accepts an Alfresco-compatible shared URL, resolves its exact
connection:/path, returns item metadata and lists the contents when the URL
targets a folder. eDoCat DIR-... links are resolved through their same-host
redirect to the underlying Alfresco document-library path.
Related MCP server: FileManager MCP Server
Architecture
MCP client --HTTP--> dms-mcp-server --HTTP--> dms-provider-bridge --> DMS
|
+--> credential resolutionFor a connection path, the MCP server reads the connection auth contract from
the bridge and passes only its credential_id reference back to the bridge
operation. The bridge owns resolution and use of DMS secrets. Secrets never
enter the MCP process, tool results or MCP configuration.
Configuration
Runtime data lives in config/mcp.json, separately from application code:
{
"bridge": {
"url": "http://127.0.0.1:8765",
"minimumVersion": "0.2.0"
},
"server": {
"host": "127.0.0.1",
"port": 8781,
"path": "/mcp",
"statelessHttp": true
},
"runtime": {
"timeoutSeconds": 30,
"maxDocumentBytes": 1048576
},
"debug": {
"enable": true,
"path": "%APPDATA%\\DMS MCP\\logs",
"loggerLevels": {
"httpx": "WARNING",
"httpcore": "WARNING"
}
}
}server.statelessHttp is enabled by default for the SDK v2 runtime. Logger
levels are data-driven; the defaults keep low-level HTTP transport chatter out
of Laděnka while preserving MCP tool and operation events.
The service always writes UTF-8 operational events to mcp.log. When
debug.enable is true, detailed events are also written to mcp-debug.log in
the configured directory. Tool logs never contain credentials or downloaded
document content.
The machine configuration provides the required base document. Optional user
overrides are loaded from %APPDATA%\\DMS MCP\\config\\mcp.local.json and
merged over that base. Set
DMS_MCP_MACHINE_CONFIG_DIR or DMS_MCP_USER_CONFIG_DIR to use other config
directories.
The distributed application keeps config/mcp.json beside the application,
not inside the Python package. A packaged executable therefore has this
layout:
dms-mcp-server/
|-- dms-mcp-server.exe
`-- config/
`-- mcp.jsonUser overrides in %APPDATA%\\DMS MCP\\config\\mcp.local.json are merged on
top of that default. Environment variables have the highest priority. A wheel
is only an installer input: a bare pip install is not a complete application
deployment unless the installer also places config/mcp.json beside the
application or sets DMS_MCP_MACHINE_CONFIG_DIR.
Environment variables remain available as final runtime overrides:
Variable | Default | Purpose |
|
| Local bridge URL |
|
| Local MCP bind address ( |
|
| MCP service port |
|
| Streamable HTTP endpoint path |
|
| Upstream HTTP timeout |
|
| Maximum document returned to MCP |
|
| Minimum compatible bridge version |
Credential IDs are owned by bridge connection configuration and are never selected by the AI or duplicated in MCP configuration.
The Bridge HTTP client ignores system proxy environment variables. This keeps
local Bridge traffic on its configured direct connection instead of routing it
through HTTP_PROXY or ALL_PROXY.
Development
python -m venv .venv
.\.venv\Scripts\pip.exe install -e ".[dev]"
.\.venv\Scripts\python.exe -m pytestRun the MCP HTTP service:
.\.venv\Scripts\dms-mcp-server.exeThe default endpoint is http://127.0.0.1:8781/mcp. Diagnostic scripts invoke
the same executable with the explicit --stdio compatibility switch.
The HTTP listener remains localhost-only. If a trusted loopback reverse proxy
such as Tailscale Serve preserves an external Host header, opt in to that
single exact host in the user-local mcp.local.json:
{
"server": {
"allowedHosts": ["vfs-node.example.ts.net:8443"]
}
}Localhost hosts remain allowed automatically. Wildcards are rejected so this setting cannot silently disable the MCP SDK's DNS-rebinding protection.
Run the read-only live smoke test while the bridge and its configured credential resolution service are running:
.\.venv\Scripts\python.exe scripts\run_live_smoke.py alfresco edocatThe smoke test exercises the original browsing and document tools. It prints document metadata, size and SHA-256 only; document content is never printed.
Display a bounded tree of DMS folders and files through the MCP server:
.\.venv\Scripts\python.exe scripts\debug_dms.py alfresco edocat --max-depth 2Optionally verify one document without printing its content:
.\.venv\Scripts\python.exe scripts\debug_dms.py alfresco `
--document "alfresco:/Shared/report.docx"The debug command prints names and available item metadata. Document
verification prints only MIME type, byte size and SHA-256. Traversal is bounded
by --max-depth, --max-directories and --max-items.
Run the local web inspector to see every MCP request and response side by side:
.\.venv\Scripts\python.exe scripts\web_debug.pyThen open the address configured by inspector.host and inspector.port in
config/mcp.json (default http://127.0.0.1:8780). Command-line --host and
--port values may temporarily override the JSON configuration. The inspector
exposes the original six browsing and document tools and binds only to localhost;
open_share_url remains available to MCP clients without adding another
diagnostic UI control. Its Search
control calls native provider search below the selected DMS path. For
read_document, it displays
MIME type, byte size and SHA-256 of the original bytes while omitting document
content. Switch between the raw MCP Response and a clickable UI View for
connections, folders, files and metadata; .. navigates to the parent folder.
Its API accepts only local
Host/Origin values and JSON requests.
Example HTTP MCP client configuration:
{
"mcpServers": {
"dms": { "url": "http://127.0.0.1:8781/mcp" }
}
}Available Tools
7 toolsbridge_healthA
Check whether the local DMS Provider Bridge is available.
Inputs: no named parameters.
get_item_infoA
Return metadata for one file or folder at connection:/path.
Inputs: path (required).
list_connectionsA
List DMS connections available through the bridge.
Inputs: no named parameters.
list_itemsB
List files and folders at a connection:/path location.
Inputs: path.
read_documentA
Read a size-limited document; text is decoded and binary data is base64 encoded.
Inputs: path (required).
search_itemsA
Search natively below connection:/path. Returned paths are exact and must be reused verbatim; never shorten or rewrite them. By default return unique files only.
Inputs: path (required), query (required), files_only, max_results.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: health check, connection listing, item listing, search, share URL resolution, metadata retrieval, and document reading. There is no overlapping functionality that would cause confusion.
Most tools follow a verb_noun pattern (list_connections, list_items, search_items, open_share_url, get_item_info, read_document), but bridge_health deviates by using a noun phrase. The inconsistency is minor and does not impede readability.
With 7 tools, the server is well-scoped for a DMS read-access bridge. Each tool serves a necessary function, and the count falls comfortably within the ideal range.
The server comprehensively covers browsing, searching, metadata retrieval, and document content access. However, it lacks any write operations (create, update, delete), which may limit functionality if full DMS management is expected. For read-only access, it is nearly complete.
Maintenance
Related MCP Connectors
Read-only MCP server exposing a user ORANO library to their own AI agent.
Read-only MCP server over the developer docs for the portfolio's JSON API, MCP, A2A and NLWeb.
Read-only MCP for AI usage profiles, leaderboards, stats, and docs; no writes or private data.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceZero-trust local MCP bridge that exposes read-only database tools and structured book navigation to AI agents, with two-tier PII redaction and MPS audit integration.16 npm2MIT- FlicenseNot gradedqualityDmaintenanceRead-only MCP server for AI clients to browse and search project files securely, with configurable permissions, virtual paths, and key-based access.-
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server exposing homelab data sources (files, mail, calls) to Cloudflare OS, enabling read-only access to documents, emails, and call records.-
- FlicenseAqualityCmaintenanceA read-only MCP server that enables AI clients to search a knowledge base and retrieve complete source documents via narrow search and fetch tools.2-