Doc Manager
The Doc Manager server is a zero-knowledge document vault with an MCP interface for managing plaintext and encrypted documents (e.g., via Claude). Encrypted documents are never decrypted server-side.
Document Operations:
List all documents — ID, title, encryption status, attachment info, and content size
Get a plaintext document by ID (refuses encrypted ones)
Search case-insensitively across titles and plaintext content, returning snippets
Create a new plaintext document (returns new UUID)
Update content and optionally title of a plaintext document
Delete a document and all its blobs irreversibly (works on encrypted too)
Attachment Operations:
Get attachment from a plaintext document — returns filename, size, base64, and UTF-8 text if applicable
Add/replace attachment (UTF-8 text or base64 binary) on a plaintext document
Delete attachment from any document, leaving the document intact
Access & Configuration:
OAuth 2.1 + PKCE (GitHub) authentication, restricting access to specified users
Read-only mode (
MCP_READ_ONLY) disables create/update toolsAccessible via Streamable-HTTP or stdio
Doc Manager
A zero-knowledge document vault backed by Azure Blob Storage, with a built-in MCP server so you can add, read and search your docs straight from a Claude conversation.
Zero-knowledge by design — documents and attachments are encrypted in the browser with AES-256-GCM (PBKDF2-SHA256, 600k iterations); the password never leaves the client.
Talk to your docs — Claude (web, desktop, Claude Code) can list, fetch, search, create and update plaintext documents through the MCP endpoint.
One Rust binary — Rocket backend + React 19 / Vite 8 frontend, deployable to Azure Container Apps, plain Docker, or
containerd+ Kaniko in a homelab.
Talking to your docs through Claude
The same Rust process exposes a Streamable-HTTP [Model Context Protocol]
(https://modelcontextprotocol.io) server at /mcp, gated by an OAuth 2.1
flow against an upstream identity provider (currently GitHub —
Auth0 reserved for a future round, the code is provider-shaped).
Encrypted documents stay private (their content is never returned to
Claude); plaintext documents become first-class citizens in the chat.
Tools
Tool | What it does | Available in |
| List every doc with | yes |
| Fetch one plaintext document by id; refuses encrypted ones | yes |
| Case-insensitive substring search over titles (always) and plaintext content | yes |
| Fetch the file attached to a doc (filename, bytes, base64, UTF-8 if applicable) | yes |
| Create a new plaintext document; returns the new id | no |
| Replace content (and optionally title) of a plaintext document | no |
| Attach a file (text or base64-encoded binary) to a doc; replaces any existing | no |
| Delete a document and all its blobs (main, title, attachment); irreversible | no |
| Delete only the attachment of a document, leaving the document itself intact | no |
Encrypted documents are surfaced to Claude with encrypted: true so it can
discover them by title, but their contents and writes are refused server-side.
That keeps the zero-knowledge guarantee intact: encrypted = "private to me",
plaintext = "shareable with Claude".
Add it to Claude
Claude.ai's custom-connector advanced settings accept an OAuth Client ID + Client Secret (only those two fields), so Claude.ai runs the full OAuth 2.1 + PKCE flow itself and our server only needs to (a) advertise the IdP via well-known metadata and (b) validate the resulting bearer.
Register a GitHub OAuth App. GitHub → Settings → Developer settings → OAuth Apps → New OAuth App. Set:
Authorization callback URL:
https://claude.ai/api/mcp/auth_callbackCopy the Client ID and generate a Client Secret.
Configure the server (env vars on the container app):
export OAUTH_PROVIDER=github export OAUTH_PUBLIC_BASE_URL=https://doc-manager.giuliohome.com export OAUTH_ALLOWED_USERS=giuliohome # comma-separated GitHub logins # optional — disables create/update tools: export MCP_READ_ONLY=trueOAUTH_ALLOWED_USERSis required — an empty allowlist refuses to start, so a misconfiguration cannot silently let any GitHub user in.Add the connector in Claude.ai — Settings → Connectors → Add custom connector, URL
https://doc-manager.giuliohome.com/mcp, then Advanced settings → paste the GitHub OAuth App's Client ID and Client Secret. The first request triggers the OAuth dance: Claude.ai sees the401+WWW-Authenticatefrom/mcp, fetches our well-known metadata, walks you throughgithub.com/login/oauth/authorize, and forwards the resulting bearer on every subsequent call. The server validates each request by callinghttps://api.github.com/user(5-min cache, SHA-256-hashed token key).
If OAUTH_PROVIDER is unset the endpoint replies 503 Service Unavailable,
so the MCP surface is fully opt-in.
Related MCP server: @bitatlas/mcp-server
Building the frontend
cd frontend
npm i
npm run build
cd ..Running with Docker
docker build -t giuliohome/doc-manager:latest .
export AZURE_STORAGE_ACCOUNT=youraccount
export AZURE_STORAGE_ACCESS_KEY=yourkey
export RUST_ROCKET_EXACT_ORIGIN=http://localhost:8080
# optional — enables the MCP endpoint:
export OAUTH_PROVIDER=github
export OAUTH_PUBLIC_BASE_URL=http://localhost:8080
export OAUTH_ALLOWED_USERS=your-github-login
docker run -p 8080:8080 \
-e AZURE_STORAGE_ACCOUNT \
-e AZURE_STORAGE_ACCESS_KEY \
-e RUST_ROCKET_EXACT_ORIGIN \
-e OAUTH_PROVIDER \
-e OAUTH_PUBLIC_BASE_URL \
-e OAUTH_ALLOWED_USERS \
giuliohome/doc-manager:latestTL;DR — containerd + Kaniko (homelab)
sudo mkdir /kcache
sudo ctr i pull gcr.io/kaniko-project/warmer:latest
sudo ctr run --net-host --rm --mount type=bind,src=$(pwd),dst=/workspace,options=rbind:rw --mount type=bind,src=/kcache,dst=/cache,options=rbind:rw gcr.io/kaniko-project/warmer:latest kaniko-warmer /kaniko/warmer --cache-dir=/cache --image=docker.io/rust:1-slim-bookworm --skip-tls-verify-registry index.docker.io --dockerfile=/workspace/Dockerfile
sudo ctr i pull gcr.io/kaniko-project/executor:latest
sudo ctr run --net-host --rm --mount type=bind,src=$(pwd),dst=/workspace,options=rbind:rw --mount type=bind,src=/kcache,dst=/cache,options=rbind:rw gcr.io/kaniko-project/executor:latest kaniko-executor /kaniko/executor -cache-dir=/cache --dockerfile=/workspace/Dockerfile --context=/workspace --no-push --skip-tls-verify --build-arg pkg=docs-app --tarPath=/workspace/doc-manager-latest.tar --destination=giuliohome/doc-manager:latest --cache=true --cache-repo=giuliohome/doc-manager:latest --no-push-cache
sudo ctr image import doc-manager-latest.tar
sudo ctr c create --net-host docker.io/giuliohome/doc-manager:latest doc-manager
sudo ctr t start doc-managerConfiguration reference
Env var | Required | Purpose |
| yes | Azure Storage account name (container |
| yes | Storage access key |
| yes | CORS origin for the React frontend |
| no (enables MCP) |
|
| with | Public base URL of this server, e.g. |
| with | Comma-separated GitHub logins; must list at least one user — empty refuses to start |
| no (default false) | When |
| no (auto) | Opens |
| no (default false) | When |
End-to-end tests
See the e2e repo.
Available Tools
9 toolsadd_attachmentA
Attach a file to an existing plaintext document. Replaces any pre-existing attachment for that document (one attachment per doc by design). Refuses if the document is encrypted client-side. Provide either 'content' (UTF-8 text, e.g. markdown) or 'content_base64' (binary, base64-encoded).
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | UTF-8 text content (mutually exclusive with content_base64). | |
| content_base64 | No | Base64-encoded binary content (mutually exclusive with content). | |
| filename | Yes | Filename for the attachment, e.g. 'plan.md'. Must not contain path separators or equal the reserved name 'dmencblob'. | |
| id | Yes | Target document id (UUID). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully bears the transparency burden. It discloses key behaviors: replacement of existing attachments, refusal for encrypted documents, and the one-attachment-per-doc constraint. This gives the agent a clear picture of the tool's side effects and limitations.
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 concise (three sentences) and front-loaded with the primary action. Every sentence adds necessary context without redundancy. It wastes no words.
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?
Given the tool's moderate complexity and the absence of an output schema, the description covers the essential behaviors (attachment, replacement, encryption restriction). It could optionally mention what the response looks like or failure modes, but overall it is sufficiently complete for an agent to use 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?
Schema coverage is 100%, so the schema already documents each parameter. The description adds value by explaining the mutual exclusivity of 'content' and 'content_base64' and the filename constraints, reinforcing the schema description. While helpful, it does not introduce entirely new information, so a slight premium over baseline 3 is warranted.
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 tool's purpose: 'Attach a file to an existing plaintext document.' It distinguishes itself from siblings by specifying the one-attachment-per-doc design and replacement behavior, making it easy to understand when to use this tool.
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 provides explicit usage context: it replaces pre-existing attachments, refuses encrypted documents, and clarifies the mutual exclusivity of content inputs. This helps the agent decide when to use this tool versus others like delete_attachment or update_document.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_documentA
Create a new plaintext document. Returns the new id. Cannot create encrypted documents.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| title | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full disclosure burden. It discloses that the tool creates a plaintext document, returns the new ID, and does not support encryption. It does not discuss side effects, authorization, or rate limits, but for a simple creation tool this is acceptable.
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 extremely concise with two sentences. Every phrase serves a purpose (action, return value, limitation). No superfluous text.
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?
Given the tool's simplicity (2 required params, no output schema, no nested objects), the description covers the essential purpose and a key limitation. It could be slightly improved by explicitly stating the plaintext nature of the content parameter, but it is 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?
The input schema has 2 parameters (content, title) with 0% description coverage. The description only mentions 'plaintext document' but does not explain what content or title should contain, nor any constraints. This adds little beyond the schema's type information.
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 'Create a new plaintext document', specifying the verb and resource. It distinguishes from siblings by noting it cannot create encrypted documents, which is a unique constraint among the sibling tools.
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 explains when to use (to create a new plaintext document) and explicitly states a limitation ('Cannot create encrypted documents'), which implicitly suggests an alternative may be needed for encrypted documents. However, it does not explicitly mention when not to use or provide alternative tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_attachmentA
Delete the file attached to a document, leaving the document itself intact. No-op (with status: 'no_attachment') if the document has no attachment. Works on encrypted attachments too.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id (UUID) whose attachment should be removed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the tool is a no-op if no attachment exists and works on encrypted attachments. However, it does not mention permissions or reversibility, but for a simple delete operation these are minor.
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 concise sentences with no waste. It front-loads the main purpose and covers key behaviors and edge cases.
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 tool with one parameter and no output schema, the description is complete. It covers the main operation, the no-op case, and a special case (encrypted attachments).
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 100% coverage with a clear description of the 'id' parameter. The tool description does not add additional parameter meaning beyond what the schema provides, but the schema itself is sufficiently descriptive.
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 action ('Delete the file attached'), the resource ('a document'), and what remains intact ('leaving the document itself intact'). It distinguishes itself from sibling 'delete_document' by specifying only the attachment is removed.
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 (to remove attachment without deleting the document) and when not to use (if you want to delete the document, use 'delete_document'). It does not explicitly list alternatives, but the sibling list provides context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentA
Delete a document and all of its associated blobs (main content, title, and any attachment). Works on encrypted documents too — deletion is destructive but does not disclose contents. Irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id (UUID) to delete. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses key behaviors: deletion of associated blobs, working on encrypted documents without content disclosure, and irreversibility. This goes beyond what the schema provides.
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 concise sentences that front-load the main action and scope, then add nuance. No unnecessary words.
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?
Given the simple tool (one parameter, no output schema, no annotations), the description fully covers purpose, behavior, and constraints. It is complete for agent use.
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 coverage is 100% with a clear description for the 'id' parameter. The tool description adds no additional parameter semantics beyond the schema, so baseline 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 clearly states the tool deletes a document and all its blobs, distinguishing it from sibling tools like delete_attachment. It is specific and unambiguous.
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 (when irreversible deletion is desired) and provides warnings about destructiveness, but does not explicitly mention alternatives or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentA
Fetch the file attached to a plaintext document. Returns filename, byte size, base64-encoded content, and a UTF-8 text rendition when the bytes are valid UTF-8 (e.g. .md, .txt, .json). Refuses if the attachment is encrypted client-side (named '_dmencblob').
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id (UUID) whose attachment you want. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses return contents and a specific refusal case. It does not cover error handling or rate limits, but the provided details are sufficient for a read-only fetch operation.
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 two sentences, front-loaded with the main action and immediate result details. Every sentence adds value with no 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?
Given the simple parameter and no output schema, the description covers key output fields and a refusal condition. Missing details about handling missing attachments or invalid IDs, but overall adequate.
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 describes the 'id' parameter as a UUID. The description adds 'plaintext document' context, but does not significantly enhance the parameter semantics beyond the schema, which has 100% coverage.
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 it fetches the file attached to a plaintext document and enumerates return fields (filename, byte size, base64 content, UTF-8 text rendition). It distinguishes from sibling tools like add_attachment and delete_attachment by focusing on retrieval.
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 this tool is used when the user needs an attachment from a plaintext document. It provides a refusal condition for encrypted attachments, offering a hint for when not to use it, but does not explicitly compare with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentA
Fetch a single plaintext document by id. Refuses encrypted documents (their content is unreadable server-side).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The document id (UUID, exactly as returned by list_documents). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully carries behavioral disclosure. It explicitly states that encrypted documents are refused because content is unreadable server-side, a key limitation. However, it does not mention other behaviors like error handling or auth requirements.
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, zero wasted words. Essential information is front-loaded with purpose first, then a critical behavioral note. Ideal conciseness for an AI agent.
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 single-document fetch with one parameter and no output schema, the description covers main functionality and a notable limitation. It could mention output format (plaintext) but that is implied by 'plaintext document'. Minor 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?
Input schema has 100% coverage for the 'id' parameter with description 'The document id (UUID, exactly as returned by list_documents).' The tool description does not add extra parameter info beyond what schema provides, so baseline score 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?
Description clearly states 'Fetch a single plaintext document by id.' Verb+resource is specific and unambiguous. It distinguishes from sibling tools like list_documents and search_documents by specifying single document retrieval.
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?
Description implies usage for fetching a specific document by ID but does not explicitly state when to use vs alternatives or any exclusions. No guidance on prerequisites like obtaining the ID from list_documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsA
List every document in the vault with its id, title, encryption status, attachment status, and content size.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It correctly describes the read-only nature by using 'list', but it does not explicitly state that the operation is non-destructive, nor does it mention performance implications or permissions. For a simple list, this is adequate but not exceptional.
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 sentence of 17 words, efficiently conveying the purpose and output. It is front-loaded with the action and immediately provides the list of fields, with no extraneous information.
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 tool with no parameters and no output schema, the description covers the essential behavior: it lists all documents and enumerates the returned fields. It does not mention pagination or behavior for empty vaults, but this is acceptable for a simple list operation.
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 is empty (zero parameters) and schema description coverage is 100%, so the baseline is 3. The description does not need to explain parameters, but it does list the output fields, which marginally adds value beyond the 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 clearly states the action 'list every document' and specifies the exact fields returned (id, title, encryption status, attachment status, content size). This verb+resource combination is unambiguous and distinguishes the tool from siblings like 'search_documents' which likely supports filtering.
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 provided on when to use this tool versus its siblings, particularly 'search_documents'. The description does not mention that this tool returns all documents without filtering, which could lead an agent to misuse it when a filtered query is intended.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsA
Case-insensitive substring search across titles (always) and plaintext content. Returns id, title, encrypted flag, what matched, and a short snippet.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search term. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavior. It states case-insensitive substring search and lists return fields. It does not mention potential limits, pagination, or performance, but for a simple search tool the disclosure is adequate.
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, no unnecessary words. Information is front-loaded: first sentence explains functionality, second sentence lists return fields. Every piece of information serves a purpose.
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?
Given one parameter, no output schema, and no annotations, the description covers the core functionality comprehensively. It explains what the tool does, what it returns, and its search scope. No missing critical details.
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 coverage is 100% with the 'query' parameter described as 'Search term.' The description adds that the search is across titles and content, providing context beyond the schema. This justifies a score slightly above baseline 3.
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 it performs case-insensitive substring search across titles and plaintext content, which is a distinct operation from sibling tools (CRUD, attachments). The verb 'search' and resource 'documents' are specific.
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?
It explains what is searched (titles, content) and what is returned (id, title, encrypted flag, matched field, snippet). No explicit when-not or alternative tool guidance, but sibling tools are obviously different (create, update, delete, etc.), so context provides clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_documentA
Replace the content (and optionally the title) of an existing plaintext document. Refuses if the document is encrypted.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | ||
| id | Yes | ||
| title | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It discloses the refusal for encrypted documents and the ability to optionally update the title. However, it does not mention permissions, side effects on other fields, or the exact nature of the replacement (e.g., whether it's a full overwrite).
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 sentence that front-loads the primary action and adds a key constraint. Every word is earned, and it is efficiently structured.
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?
Given no output schema and 3 parameters, the description covers the essential purpose and a behavioral constraint. However, it lacks details on return value, error handling beyond encryption, and does not elaborate on the 'id' parameter. It is somewhat complete but could be more helpful.
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 0%, so the description must compensate. It explains 'content' and 'title' (noting title is optional), but does not explain 'id' or provide constraints like format or length. The description adds some meaning but leaves gaps for two out of three parameters.
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 'Replace' and resource 'existing plaintext document', with a specific constraint 'Refuses if encrypted'. This distinguishes it from siblings like create_document or delete_document.
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 usage for updating existing documents but does not explicitly state when to use vs alternatives like create_document or delete_document. No exclusions or alternative suggestions are 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. Dates show when Glama detected each change.
9 tool updates
v1.0.0- First observed
add_attachment - First observed
create_document - First observed
delete_attachment - First observed
delete_document - First observed
get_attachment - First observed
get_document - First observed
list_documents - First observed
search_documents - First observed
update_document
TDQS
Each tool has a distinct purpose (create, read, update, delete for documents and attachments, plus search). No two tools overlap in functionality, and descriptions clarify edge cases (e.g., add_attachment replaces existing attachment).
All tools follow a consistent verb_noun pattern (e.g., create_document, delete_attachment, search_documents). No mixing of conventions like camelCase or inconsistent verb forms.
With 9 tools, the server covers all core operations for document and attachment management. The count is well-scoped—neither too few (would miss functionality) nor too many (would overwhelm).
The toolset provides full CRUD for plaintext documents and attachments. However, encrypted documents are only deletable; they cannot be read or updated via the server. This is a deliberate design but limits utility if encrypted documents are present.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
- JustOnceOAuthai.justonce
Persistent memory for AI assistants — one shared, OAuth-secured vault for every MCP client.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Sovereign E2E cloud storage for AI agents. Zero-knowledge, RGPD-compliant.
Shared long-term memory vault for AI agents with 20 MCP tools.
Related MCP Servers
- AlicenseAqualityDmaintenanceSecrets vault for Claude Code. Encrypt API keys, tokens and passwords with AES-256. Full audit logs, MCP access rules, and zero-knowledge mode. Secrets never appear in chat.17781MIT
- AlicenseAqualityAmaintenanceZero-Knowledge Cloud Drive for Humans and Agents. Client-side AES-256-GCM encryption with 7 MCP tools for secure file vault management — the server never sees plaintext data.72471MIT
- AlicenseNot gradedqualityBmaintenanceLocal-first markdown vault with a built-in MCP server (streamable HTTP). 16 tools and 2 resources for Claude Code / Desktop / Cursor: read/write/search plus context_for_query, find_orphans, weekly_digest, compare_notes, semantic_outline. Per-folder agent permissions, LanceDB vectors, local Xenova ONNX embedder swappable to Ollama. Single Bun binary. AGPL.33AGPL 3.0

Kova Mind MCP Serverofficial
AlicenseAqualityCmaintenanceEnables AI memory persistence and secure credential management via vault tools for MCP-compatible clients like Claude Desktop, Cursor, and VS Code.1227MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/giuliohome-org/doc-manager'
If you have feedback or need assistance with the MCP directory API, please join our Discord server