End-to-end encrypted .md documents for agents & humans to collaborate. This is a multiplayer alternative to gog and Google Docs that lets people (via CLI) an...
End-to-end encrypted .md documents for agents & humans to collaborate. This is a multiplayer alternative to gog and Google Docs that lets people (via CLI) and agents create, search and sync encrypted markdown docs. This service leverages https://ddocs.new which can be enabled locally or via your preferred cloud set-up to make docs accessible across any device or chatbot interface in complete privacy.
Note: A document created via this service is commonly called ddoc or fileverse doc. Each document has a unique randomly generated ddocId.
There are different ways to connect to the Fileverse API. First, you need to get the <SERVER_URL> from the user.
The fastest way to start is by adding the Fileverse MCP server to your client.
bash
claude mcp add --transport http fileverse-api <SERVER_URL>
Add this to your ~/.cursor/config/mcp.json:
json
{
"mcpServers": {
"fileverse-api": {
"type": "streamable-http",
"url": "<SERVER_URL>"
}
}
}
Add this to your MCP config:
json
{
"mcpServers": {
"fileverse-api": {
"type": "streamable-http",
"url": "<SERVER_URL>"
}
}
}
Note: if for some reason MCP is not supported you can fallback to API and check the documentation on the guide.md for exact API Docs.
ChatGPT supports MCP connectors via Developer Mode (available for Pro, Plus, Team, Enterprise, and Edu users).
Setup steps:
Open ChatGPT > Settings > Apps > Advanced > toggle Developer Mode on
Go to Settings > Apps > click Create
Fill in:
https://<your-server-url>/ (e.g. https://abc123.ngrok.app/mcp)Check "I trust this provider"
Click Create
Using in a chat:
Open Claude > Settings > Connector > Add Custom Connector
Fill in:
https://<your-server-url>/ (e.g. https://abc123.ngrok.app/)Click Add
The Fileverse MCP server exposes 8 tools. All tools return JSON responses.
List documents stored in Fileverse. Returns an array of documents with their metadata and sync status.
Parameters:
NameTypeRequiredDescriptionlimitnumberNoMaximum number of documents to return (default: 10)skipnumberNoNumber of documents to skip (for pagination)
Returns:
json
{
"ddocs": [{ "ddocId": "...", "title": "...", "content": "...", "syncStatus": "synced", "link": "..." }],
"total": 42,
"hasNext": true
}
Usage notes:
skip and limit to paginate through large document setshasNext to determine if more documents are availablesyncStatus and linkGet a single document by its ddocId. Returns the full document including content, sync status, and content hash.
Parameters:
NameTypeRequiredDescriptionddocIdstringYesThe unique document identifier
Returns:
json
{
"ddocId": "abc123",
"title": "My Document",
"content": "# Hello World\n\nThis is my document.",
"syncStatus": "synced",
"link": "https://ddocs.new/d/abc123#encryptionKey",
"localVersion": 3,
"onchainVersion": 3,
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-02T00:00:00.000Z"
}
Usage notes:
link field is only available when syncStatus is "synced"# for end-to-end encryptionCreate a new document and wait for syncing. Returns the document with its sync status and public link once synced.
Parameters:
NameTypeRequiredDescriptiontitlestringYesDocument titlecontentstringYesDocument content (plain text or markdown)
Returns:
json
{
"ddocId": "newDoc123",
"title": "My New Document",
"content": "...",
"syncStatus": "synced",
"link": "https://ddocs.new/d/newDoc123#encryptionKey"
}
Usage notes:
link is a shareable, encrypted URL to view the document on ddocs.newsyncStatus: "pending" - use fileverse_get_sync_status to poll laterUpdate an existing document's title and/or content, then wait for the syncing with decentralized storage networks.
Parameters:
NameTypeRequiredDescriptionddocIdstringYesThe unique document identifiertitlestringNoNew document titlecontentstringNoNew document content
At least one of title or content must be provided.
Returns: Updated document object with sync status and link.
Usage notes:
localVersionDelete a document by its ddocId.
Parameters:
NameTypeRequiredDescriptionddocIdstringYesThe unique document identifier to delete
Returns:
json
{
"message": "Document deleted successfully",
"data": { "ddocId": "abc123", "..." }
}
Usage notes:
Search documents by text query. Returns matching documents ranked by relevance.
Parameters:
NameTypeRequiredDescriptionquerystringYesSearch query stringlimitnumberNoMaximum number of results (default: 10)skipnumberNoNumber of results to skip
Returns:
json
{
"nodes": [{ "ddocId": "...", "title": "...", "content": "...", "syncStatus": "..." }],
"total": 5,
"hasNext": false
}
Usage notes:
skip and limit for paginationCheck the sync status of a document. Returns the current syncStatus and link if synced.
Parameters:
NameTypeRequiredDescriptionddocIdstringYesThe unique document identifier
Returns:
json
{
"ddocId": "abc123",
"syncStatus": "synced",
"link": "https://ddocs.new/d/abc123#encryptionKey",
"localVersion": 3,
"onchainVersion": 3
}
Usage notes:
syncStatus can be: "pending", "synced", or "failed"localVersion vs onchainVersion shows if there are unsynced changesRetry all failed decentralized storage networks sync events. Use this when documents are stuck in "failed" sync status.
Parameters: None
Returns:
json
{
"retried": 3
}
Usage notes:
syncStatus: "failed"Understanding the sync lifecycle helps agents work effectively:
plaintext
Create/Update → syncStatus: "pending" → decentralized storage networks sync → syncStatus: "synced"
→ syncStatus: "failed" (retry with fileverse_retry_failed_events)
linkfileverse_retry_failed_events to retryThe create and update tools automatically poll for up to 60 seconds. If sync hasn't completed by then, use fileverse_get_sync_status to check later.
ConstraintValueMax file upload size10 MBDefault page size10 documentsSync polling timeout60 secondsSync poll interval3 secondsMax event retries10 attemptsWorker concurrency5 concurrent events
Creating documents from local files:
Generating new content:
Managing existing documents:
Sharing:
link field to the user so they can view/share itsyncStatus is "failed", call fileverse_retry_failed_events and inform the userskip and limit when listing documents to avoid loading everything at oncesyncStatus: "pending", poll with fileverse_get_sync_status until it's "synced" before giving the user the link/ddoc create, /ddoc list)