Skip to main content
Glama
henrikogaard

jottacloud-mcp

by henrikogaard

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 --> API

Auth

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 result

Use 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

/Archive/docs/note.md

https://jfs.jottacloud.com/jfs/{user}/Jotta/Archive/docs/note.md

jotta:///Archive/docs/note.md

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 build

Node 20+.

  1. Create a personal login token at https://www.jottacloud.com/web/secure.

  2. Either leave it in JOTTACLOUD_LOGIN_TOKEN for the first MCP start, call the login tool, or exchange it once:

JOTTACLOUD_LOGIN_TOKEN='…' node dist/index.js --login

Refresh 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

JOTTACLOUD_LOGIN_TOKEN

One-shot personal login token (bootstrap)

JOTTACLOUD_TOKEN_STORE

Override token file path

JOTTACLOUD_ROOTS

Allowed path prefixes (default /Archive)

JOTTACLOUD_READ_ONLY

1 (default) omits write tools; 0 enables them

JOTTACLOUD_DEVICE / JOTTACLOUD_MOUNT

Defaults Jotta / Archive

JOTTACLOUD_LIVE_TEST

1 enables live API tests (not used in CI)

Tools and resources

Read (always):

Tool

Role

login

Elicit / exchange a personal login token

list_roots

Configured roots + discovered mounts

list_directory

Folder listing with cursor pagination

get_file_info

Metadata only

search_files

?mode=liststream + local name filter; walk fallback

read_file

Capped text / base64; head / tail / max_bytes

list_trash

List /Trash without making it a general root

Write (if JOTTACLOUD_READ_ONLY=0):

Tool

Role

write_file

Create/overwrite (capped)

create_directory

mkDir, parents as needed

copy_file

cp / cpDir

move_file

mv / mvDir

restore_file

Move out of /Trash into an allowed root

delete_file

Soft-delete to trash; requires confirm=true

create_share_link / revoke_share_link

enableShare / disableShare

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 build

Live Jottacloud tests stay off unless you opt in (needs a real token / store; skipped in CI):

JOTTACLOUD_LIVE_TEST=1 npm test

Protocol smoke (initialize + tools/list) runs in CI as a stand-in for MCP Inspector. For the GUI:

npx @modelcontextprotocol/inspector node dist/index.js

Security

  • Default root is /Archive only; .. 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 0600 file, 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 tools
get_file_infoA
Read-only

Get metadata for a Jottacloud file or folder. Does not download content.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path, e.g. /Archive/docs/note.md

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_directoryC
Read-only

List files and folders at a Jottacloud path (e.g. /Archive or /Archive/docs).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesAbsolute path under a configured root, e.g. /Archive
limitNo
cursorNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_rootsA
Read-only

List configured Jottacloud path roots this server may access, plus discovered mounts when logged in. Trash is not a default search root.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_trashA
Read-only

List items in Jottacloud trash (~30 days). Trash is not included in default roots or search.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoTrash path; defaults to /Trash
limitNo
cursorNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_fileA
Read-only

Read a file from Jottacloud. Text is returned as UTF-8 (capped); binary as base64. Use head/tail/max_bytes to stay small.

ParametersJSON Schema
NameRequiredDescriptionDefault
headNo
pathYes
tailNo
max_bytesNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_filesB
Read-only

Search file and folder names under a path. Uses Jottacloud liststream when possible, then a capped folder walk.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoStart path; defaults to the first configured root
queryYesCase-insensitive substring to match against names

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 7 tool updatesv0.1.0
    • First observedget_file_info
    • First observedlist_directory
    • First observedlist_roots
    • First observedlist_trash
    • First observedlogin
    • First observedread_file
    • First observedsearch_files

TDQS

A3.8/5.0

Scored across 7 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers