jottacloud-mcp
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., "@jottacloud-mcplist my files in /Archive"
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.
jottacloud-mcp
v0.1.0 — @henrikogard/jottacloud-mcp on npm.
Stdio MCP server so Cursor, Grok Bot, Claude, and Codex can read (and optionally write) Jottacloud files.
It is a local process: Cursor/Claude/Codex spawn it on your machine; Grok Bot runs the same npx command on its cloud VM. There is no public HTTP endpoint.
Jottacloud has no third-party OAuth app. Login is the same personal login token as jotta-cli / rclone.
Author: Henrik Øgård · License: MIT
Architecture
The server is a thin MCP adapter in front of Jottacloud’s unofficial JFS (XML) and files/v1 (JSON) APIs. Hosts never talk to Jottacloud directly.
flowchart LR
subgraph hosts [MCP hosts]
Cursor
GrokBot["Grok Bot VM"]
Claude
Codex
end
subgraph mcp [jottacloud-mcp stdio]
Tools["Tools"]
Resources["jotta:/// resources"]
Client["JottaClient"]
Store["tokens.json 0600"]
end
subgraph jotta [Jottacloud]
OIDC["id.jottacloud.com OIDC"]
JFS["jfs.jottacloud.com XML"]
API["api.jottacloud.com JSON"]
end
Cursor -->|stdin / stdout| Tools
GrokBot --> Tools
Claude --> Tools
Codex --> Tools
Tools --> Client
Resources --> Client
Client --> Store
Client --> OIDC
Client --> JFS
Client --> APIAuth
The personal login token from jottacloud.com/web/secure is a one-shot base64url JSON blob (username, auth_token, well_known_link). The server exchanges it for access + refresh tokens and stores only those.
sequenceDiagram
participant User
participant Host as MCP host
participant MCP as jottacloud-mcp
participant OIDC as Jottacloud OIDC
participant JFS as JFS / files v1
User->>User: Create token at /web/secure
Note over User,Host: Prefer elicitation or env — not chat
User->>Host: login tool / JOTTACLOUD_LOGIN_TOKEN
Host->>MCP: stdio tools/call login
MCP->>OIDC: password grant client_id=jottacli
OIDC-->>MCP: access_token + refresh_token
MCP->>MCP: write ~/.config/jottacloud-mcp/tokens.json
MCP->>JFS: Bearer access_token
JFS-->>MCP: XML / JSON
MCP-->>Host: tool / resource resultUse the login tool (host elicitation) or JOTTACLOUD_LOGIN_TOKEN. Do not paste the token into chat transcripts.
Path sandbox
Agent paths are mount-relative. They never include your Jottacloud username.
flowchart TD
In["/Archive/docs/note.md"] --> Norm["Normalize: reject .. and relatives"]
Norm --> Roots["Must sit under JOTTACLOUD_ROOTS<br/>default /Archive"]
Roots --> Map["JFS: /{user}/Jotta/Archive/docs/note.md<br/>allocate: /jfs/Jotta/Archive/docs/note.md"]
Map --> Caps["Size caps + read-only default"]Agent path | JFS URL |
|
|
| Same file, via MCP resources |
/Trash is not a default root. list_trash / restore_file use it explicitly so search and listing do not dump trash into ordinary results. Add Sync with JOTTACLOUD_ROOTS=/Archive,/Sync.
Related MCP server: Obsidian MCP Server
Setup
npm install
npm run buildNode 20+.
Create a personal login token at https://www.jottacloud.com/web/secure.
Either leave it in
JOTTACLOUD_LOGIN_TOKENfor the first MCP start, call thelogintool, or exchange it once:
JOTTACLOUD_LOGIN_TOKEN='…' node dist/index.js --loginRefresh tokens are stored at ~/.config/jottacloud-mcp/tokens.json (0600). Do not share that file. One MCP process per store — refresh-token rotation will kill the session if two processes race.
The personal login token is one-shot. After a successful exchange, the store is enough.
Default is read-only. Set JOTTACLOUD_READ_ONLY=0 to enable write/mkdir/copy/move/delete/share.
Cursor
Desktop Cursor: ~/.cursor/mcp.json (or project .cursor/mcp.json):
{
"mcpServers": {
"jottacloud": {
"command": "npx",
"args": ["-y", "@henrikogard/jottacloud-mcp"],
"env": {
"JOTTACLOUD_LOGIN_TOKEN": "paste-from-web-secure",
"JOTTACLOUD_ROOTS": "/Archive",
"JOTTACLOUD_READ_ONLY": "1"
}
}
}
}After --login you can omit JOTTACLOUD_LOGIN_TOKEN.
Cursor Cloud Agents do not read ~/.cursor/mcp.json. Add the server in the MCP dropdown at cursor.com/agents.
Grok Bot
Grok Bot cannot use your laptop’s mcp.json. Ask the bot in chat (say custom server):
Add a custom MCP server called jottacloud that runs: npx -y @henrikogard/jottacloud-mcp Set env JOTTACLOUD_LOGIN_TOKEN to my personal login token, JOTTACLOUD_READ_ONLY=1, and JOTTACLOUD_ROOTS=/Archive.
Until publish, use a built path the bot can run, or npx from npm once published. Put the token on the server env, not in later chat.
On Grok’s cloud computer the token store is that VM’s home dir. For the durable workspace:
JOTTACLOUD_TOKEN_STORE=/workspace/jottacloud-mcp-tokens.json
Attach with @jottacloud in chat.
This is not grok.com → Connectors (that path needs a public HTTPS MCP).
Claude and Codex
Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json (same mcpServers JSON as Cursor). Fully quit Claude after edits.
Claude Code: .mcp.json or ~/.claude.json.
Codex (~/.codex/config.toml):
[mcp_servers.jottacloud]
command = "npx"
args = ["-y", "@henrikogard/jottacloud-mcp"]
[mcp_servers.jottacloud.env]
JOTTACLOUD_LOGIN_TOKEN = "paste-from-web-secure"
JOTTACLOUD_ROOTS = "/Archive"
JOTTACLOUD_READ_ONLY = "1"Environment
Variable | Role |
| One-shot personal login token (bootstrap) |
| Override token file path |
| Allowed path prefixes (default |
|
|
| Defaults |
|
|
Tools and resources
Read (always):
Tool | Role |
| Elicit / exchange a personal login token |
| Configured roots + discovered mounts |
| Folder listing with cursor pagination |
| Metadata only |
|
|
| Capped text / base64; |
| List |
Write (if JOTTACLOUD_READ_ONLY=0):
Tool | Role |
| Create/overwrite (capped) |
|
|
|
|
|
|
| Move out of |
| Soft-delete to trash; requires |
|
|
Resources: jotta:///{+path} (for example jotta:///Archive/docs/note.md). Same size caps as read_file. The template is advertised; the whole account is not enumerated in resources/list.
Paths look like /Archive/docs/note.md.
Development
npm test
npm run typecheck
npm run buildLive Jottacloud tests stay off unless you opt in (needs a real token / store; skipped in CI):
JOTTACLOUD_LIVE_TEST=1 npm testProtocol smoke (initialize + tools/list) runs in CI as a stand-in for MCP Inspector. For the GUI:
npx @modelcontextprotocol/inspector node dist/index.jsSecurity
Default root is
/Archiveonly;..and paths outside the allow-list are rejected.Read-only by default; delete is trash-only and needs
confirm=true.Tokens live in env or a
0600file, never in tool arguments by design. Elicitation is the in-app login path.One process per token store (refresh rotation).
Treat cloud file names and contents as untrusted (prompt injection).
License
MIT © 2026 Henrik Øgård
Available Tools
7 toolsget_file_infoARead-only
Get metadata for a Jottacloud file or folder. Does not download content.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path, e.g. /Archive/docs/note.md |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds the useful behavioral detail that content is not downloaded, but it does not disclose what metadata fields are returned or how errors are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The main operation is front-loaded, the scope is stated, and the key distinction from content-retrieval tools is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with full schema coverage and read-only annotations, the description is mostly complete. It would be slightly stronger if it summarized the kind of metadata returned, but that is a minor gap given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single path parameter with an example. The description adds meaning by clarifying that the path can refer to either a file or a folder and that only metadata, not content, is retrieved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get metadata for a Jottacloud file or folder.' It also explicitly notes that it does not download content, which separates it from the sibling read_file tool. This is clear and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: use this tool when you need metadata for a Jottacloud file or folder. The 'Does not download content' statement gives an implicit when-not-to-use signal relative to content-reading tools, though it does not name an explicit alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directoryCRead-only
List files and folders at a Jottacloud path (e.g. /Archive or /Archive/docs).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path under a configured root, e.g. /Archive | |
| limit | No | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. However, the description adds no behavioral context beyond the basic listing action, such as pagination behavior, non-recursion, or how limit/cursor affect results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with a clear front-loaded verb, resource, and useful path examples. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is minimally viable for a simple path-based listing operation, and the annotations cover read-only safety. But meaningful gaps remain around pagination parameters and when to choose this over sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, with limit and cursor lacking any schema description. The description repeats path semantics already present in the schema ('/Archive') but offers nothing about pagination semantics, leaving two undocumented parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('files and folders at a Jottacloud path'), with concrete path examples that clarify scope. It does not explicitly distinguish itself from sibling tools like list_roots or search_files, so the differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus siblings such as list_roots, get_file_info, search_files, or list_trash. The description states what it does but not when it should be preferred, and it offers no alternative conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rootsARead-only
List configured Jottacloud path roots this server may access, plus discovered mounts when logged in. Trash is not a default search root.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description carries a lower burden. It adds useful behavioral context: results depend on login state ('when logged in') and are limited to configured roots, plus the explicit trash exclusion. It does not overstate or contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the first front-loads the core action and scope, the second clarifies a key exclusion. Every word adds value; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, annotation-covered read-only tool, the description is complete. It explains what is listed, the auth-dependent extension, and an important exclusion, leaving no missing information an agent would need to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100% by default. Per the baseline for 0-parameter tools, the description is not required to explain parameters; it instead clarifies the scope of the resource being listed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'List' with a specific resource ('Jottacloud path roots') and adds scope details ('configured... may access', 'discovered mounts when logged in'). It also distinguishes itself from trash listing, separating it from the sibling list_trash without needing to open the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use the tool: to discover accessible roots and mounts, with the caveat that trash is not included. However, it does not explicitly name sibling alternatives (e.g., list_trash) or give a direct when-not-to-use instruction, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_trashARead-only
List items in Jottacloud trash (~30 days). Trash is not included in default roots or search.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Trash path; defaults to /Trash | |
| limit | No | ||
| cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the readOnlyHint and openWorldHint annotations, specifically the ~30-day retention window and the fact that trash is omitted from default roots and search. These are meaningful operational details not visible in the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry significant information with no filler. The core action is front-loaded, and the exclusion detail is directly relevant to correct tool selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple read-only listing tool, but there is no output schema and the return format is not described. Additionally, cursor and limit are undocumented in both schema and description, leaving pagination behavior unclear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%; path has a description, but limit and cursor have none. The description does not compensate by explaining any parameters, so an agent is left guessing about pagination semantics and the meaning of limit and cursor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('List') and the specific resource ('items in Jottacloud trash'), and adds a useful retention detail (~30 days). It also distinguishes the tool from siblings by noting trash is not included in default roots or search, so an agent can tell it apart from list_directory and search_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool is needed: trash items are not surfaced by default roots or search, so this is the dedicated way to access them. It does not explicitly name sibling tools as alternatives, but the exclusions make the intended use obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
loginA
Sign in with a Jottacloud personal login token. The host should prompt privately (elicitation). Do not paste the token into chat.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral traits beyond the openWorldHint annotation: it requires private elicitation and forbids token exposure in chat. It does not detail side effects or post-login behavior, but for a zero-parameter auth tool this is meaningful added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no redundant content. The purpose is front-loaded, and the sensitive handling instructions earn their place because they are critical for safe invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple login tool with no parameters and no output schema, the description provides the essential invocation context: what credential to use and how to collect it safely. It could mention success/failure signaling, but the low complexity makes the description largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no schema parameters and schema coverage is 100%, so the baseline is 4. The description clarifies that the actual credential is a personal login token and must not be shared in chat, which adds meaning beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (Sign in) and a specific resource (Jottacloud personal login token). It clearly distinguishes login from the sibling file-access tools, so an agent can tell this is the authentication step rather than a data operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear interaction guidance (prompt privately, do not paste token into chat), but it never explicitly states when to use this tool versus alternatives or that it should precede file operations. Usage context is implied by the login purpose, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileARead-only
Read a file from Jottacloud. Text is returned as UTF-8 (capped); binary as base64. Use head/tail/max_bytes to stay small.
| Name | Required | Description | Default |
|---|---|---|---|
| head | No | ||
| path | Yes | ||
| tail | No | ||
| max_bytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the readOnlyHint annotation: text is returned as UTF-8 and capped, binary is returned as base64, and size-limiting parameters are encouraged. This informs the agent about output encoding and safety around large files. It does not contradict the readOnlyHint, and the openWorldHint is not contradicted either.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no fluff. The core purpose is front-loaded, return format is explained, and a practical usage tip follows. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read operation with readOnlyHint and openWorldHint annotations, the description covers the main things an agent needs: what the tool does, how text vs binary is returned, and how to limit size. It lacks some specifics such as the exact cap threshold or error behavior, so it is not perfect, but it is reasonably complete for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must carry the parameter-meaning burden. It adds useful context by linking head, tail, and max_bytes to keeping reads small, but it does not explain each parameter's exact semantics, units, or interaction. This is better than the schema alone but still leaves some parameter behavior to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'Read a file from Jottacloud', making it clear that this tool returns file contents. It is distinct from siblings like list_directory, search_files, and get_file_info in that it focuses on reading content. However, it does not explicitly differentiate itself from get_file_info, so it does not fully earn the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when you need a file's content rather than metadata or listing information. It also gives practical guidance to use head/tail/max_bytes to keep reads small. But it never explicitly states when not to use it or names alternative tools, leaving the selection context mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filesBRead-only
Search file and folder names under a path. Uses Jottacloud liststream when possible, then a capped folder walk.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Start path; defaults to the first configured root | |
| query | Yes | Case-insensitive substring to match against names |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnly and openWorld, so the safety profile is already covered. The description adds implementation context ('Uses Jottacloud liststream when possible, then a capped folder walk'), which hints at performance and possible result limits, but the cap is unspecified and return/error behavior is not disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tight sentence that front-loads the core purpose. The implementation detail is compressed but adds value without bloat; however the sentence is slightly dense with jargon ('liststream', 'capped folder walk') and could be clearer with a little structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should explain what results look like and any cap behavior; it only mentions a 'capped folder walk' with no limit, return format, or error conditions. For a search tool whose completeness may be limited, this is a meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; both `query` and `path` are already described in the input schema. The description adds no extra parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search') and resource ('file and folder names') with a scope ('under a path'), making the tool's function clear. It does not explicitly contrast with sibling tools like list_directory, but the search-by-name behavior is evident from the first clause and name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrasing implies the tool is for finding files/folders by name under a path, but it never states when to prefer it over siblings like list_directory or list_roots, nor gives exclusion criteria. No alternatives or when-not-to-use guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.0- First observed
get_file_info - First observed
list_directory - First observed
list_roots - First observed
list_trash - First observed
login - First observed
read_file - First observed
search_files
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose: authentication, listing roots, listing directory contents, metadata retrieval, searching, reading file content, and trash listing. No overlap or ambiguity between tools.
All tool names follow a consistent verb_noun pattern in snake_case (list_roots, get_file_info, search_files, etc.). Naming is predictable and uniform across the set.
Seven tools is well-scoped for a cloud storage MCP. Each tool serves a distinct function without redundancy or missing essentials, fitting comfortably in the ideal range.
The read-focused surface covers listing, searching, metadata, and file reading, plus trash handling. Write operations (upload, delete, move) are absent, but if the server is intended for read-only access, only minor gaps remain (e.g., no way to download complete files without streaming limits).
Maintenance
Related MCP Connectors
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Browse and manage files in your Moxt AI workspace from any MCP client.
Persistent file storage for AI agents via MCP and curl. Upload, download, and version files.
Connect AI agents to Filepad workspaces through OAuth MCP.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to search, read, and manage documents in a Laserfiche repository via the MCP protocol, with optional write operations and safety controls.382MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search, read, and append content to notes in an Obsidian vault via the MCP protocol.7,553 npmBSD Zero Clause
- AlicenseAqualityFmaintenanceEnables AI assistants to read, write, and manage files on the local system with security features like path restrictions and optional read-only mode.92MIT
- AlicenseNot gradedqualityDmaintenanceExposes file system operations to AI clients via MCP, enabling secure read, write, and management of files and folders.4 npmMIT