Warning
Lab status: This project is under active development. It is intended for testing and evaluation, not production use. Features, APIs and behavior may change without notice.
An AI model knows a lot, but nothing about your organization: what you promised a customer or what the last project decided is in your files. This MCP server connects an MCP client to OpenCloud, so the model can look there, always as the signed-in user and with that user's permissions.
A few things to ask:
- "What did we promise Meridian on availability?"
- "Summarise the project folder before my meeting."
- "Find the signed offers from last quarter tagged open."
- "Put the offer into Sales 2026 and share it with Team Product, read only."
- "Bring back the version of the budget from Monday."
In detail, the server lets a client:
- read: list spaces and folders, read markdown, text, CSV and PDF, open one section of a document by its heading, see previews of images and documents
- search: OpenCloud's own search by words, folder, tags, type, date, size or KQL
- write: write text files, create folders, copy, move and delete
- undo: restore from the trash and earlier versions of a file
- share: with people and groups, by links; accept what others share
- organize: tags, favorites, activity, notifications, open a file in an office app
- manage spaces: as a space admin, create project spaces and manage their members
Every tool is listed in Tools. The documents are MCP resources too, with notice when one changes.
- Your permissions, nothing more. Every request goes to OpenCloud as the signed-in user. The agent sees what that user sees and can do what that user may do.
- Read only if you want.
--read-onlyoffers only the tools that change nothing, and--toolsetsonly the groups you name. A client cannot talk the server out of either. - Writing tools say so. Every tool carries MCP annotations (
readOnlyHint,destructiveHint), so the client can ask before anything is changed or deleted. - No copy of your data. The server keeps no index, no cache and no background copy.
- Only your OpenCloud and your provider. Calls with a user's token go to the configured OpenCloud only: a request or redirect to any other host is stopped before it leaves. With OpenID Connect the server also talks to your own provider, for the token exchange. It does not fetch files from URLs.
- Left out on purpose: admin and education routes, app tokens and passwords, locks, binary uploads. See Tools for why.
Want no data to leave the house? Run the model locally, for example with Ollama or vLLM. The server and the tools stay the same.
Tested with OpenCloud 9.0.0. Earlier versions are not supported; later ones should work but are not checked.
For Claude Desktop, download opencloud-mcp-<version>.mcpb from the
latest release and open it.
Claude Desktop asks for the OpenCloud address, your user name and an
app token, and keeps the token in the system's keychain.
For other clients, the release has the binary for Linux, macOS and Windows on amd64 and arm64.
From source, with mise providing Go and the linter:
mise install
mise run build # bin/opencloud-mcpOr as a container image:
mise run image # opencloud-mcp:dev
docker run -i --rm -e OPENCLOUD_URL -e OPENCLOUD_USER -e OPENCLOUD_APP_TOKEN opencloud-mcp:devCreate an app token for the user, then connect a client.
Claude Code:
claude mcp add opencloud \
-e OPENCLOUD_URL=https://cloud.example.com -e OPENCLOUD_USER=alice -e OPENCLOUD_APP_TOKEN='<app token>' \
-- /path/to/opencloud-mcpClaude Desktop, Cursor and other clients that take a JSON config:
{
"mcpServers": {
"opencloud": {
"command": "/path/to/opencloud-mcp",
"env": {
"OPENCLOUD_URL": "https://cloud.example.com",
"OPENCLOUD_USER": "alice",
"OPENCLOUD_APP_TOKEN": "<app token>"
}
}
}
}To start carefully, add "args": ["--read-only"].
Any MCP client works, over stdio or streamable HTTP: Claude, LibreChat and Open WebUI as well as clients for local models. Configuration has the HTTP setup.
| Mode | Who it acts as | Sign-in |
|---|---|---|
| stdio | one user | app token |
| HTTP, one user | one user, loopback only | app token |
| HTTP, sign-in per request | every user of the instance | app token, or MCP authorization with OpenID Connect |
With OpenID Connect the server exchanges the client's token for one issued for OpenCloud (RFC 8693) and keeps nothing between requests. Settings are in Configuration, the details of sign-in in Sign-in.
compose.yaml runs OpenCloud, an OpenID Connect provider (Rauthy), this server and LibreChat on
this machine. It needs an OpenAI-compatible model API:
cp .env.example .env # then set OPENAI_API_BASE_URL, OPENAI_API_KEY and DEFAULT_MODELS
mise run demoOpen http://localhost and sign in as alice@example.com / demo. The rest is in
Demo.
| Topic | Details |
|---|---|
| Protocol | MCP 2026-07-28 (stateless, server/discover, subscriptions/listen) and the older revisions as far as the go-sdk serves them |
| Modes | stdio, HTTP as one user, HTTP with sign-in per request; see Modes |
| Sign-in | app token (basic auth) or MCP authorization with OpenID Connect and token exchange (RFC 8693) |
| Tools | 57 in 10 toolsets, limited with --toolsets, read only with --read-only |
| APIs | LibreGraph, WebDAV, OCS and the app provider |
| Resources | documents as opencloud:///spaces/<space id>/<path>, with change notices |
| Left out | admin and education routes, credentials, locks, binary uploads; see why |
| Tested with | OpenCloud 9.0.0 |
| Runs as | one Go binary or a container |
| License | Apache 2.0 |
- Configuration: the settings, the three modes, app tokens, connecting a client
- Tools: every tool, the documents as resources, and search
- Sign-in: app tokens and OpenID Connect per HTTP request
- Demo: the compose demo and its users
- Development: the tests and the live test against the demo
- Evaluation: questions for a model, to see whether the tools guide it
Apache 2.0, see LICENSE.