Zfile
FreeNot checkedMCP Server for ZFile - Enable AI assistants to upload files and generate shareable links
About
MCP Server for ZFile - Enable AI assistants to upload files and generate shareable links
README
🗂️ ZFile MCP Server
A Model Context Protocol server that enables AI assistants to interact with ZFile
✨ Features
- 📁 List Files - Browse directories in ZFile
- 📤 Upload Files - Get upload URLs (no base64, saves context tokens)
- 📤 Batch Upload - Get multiple upload URLs at once
- 🧩 Chunked Upload - Large file upload with auto-merge (Cloudflare-friendly)
- 🔗 Direct Links - Generate permanent direct download links (single or batch)
- 🔗 Short Links - Generate temporary short links (31 days)
- 🔐 Secure - Auto-generated access token, credentials stored server-side
- 🌐 Dual Protocol - SSE (Kiro, Claude Desktop) + Streamable HTTP (Gemini CLI)
🏗️ Architecture
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────┐
│ MCP Client (Kiro/Claude)│ SSE/ │ MCP Server (Docker) │ API │ ZFile │
│ ┌───────────────────┐ │ HTTP │ ┌─────────────────┐ │ ──────► │ │
│ │ Only ACCESS_TOKEN │ │ ──────► │ │ ZFile credentials│ │ │ │
│ └───────────────────┘ │ Token │ │ stored here │ │ │ │
└─────────────────────────┘ │ └─────────────────┘ │ └─────────┘
└─────────────────────────┘
Security Model:
- Client only stores
ACCESS_TOKEN(for MCP authentication) - Server stores ZFile credentials via environment variables
- ZFile credentials are never exposed to clients
🚀 Quick Start
docker run -d --name zfile-mcp -p 8092:8092 \
-e ZFILE_URL=https://your-zfile.com \
-e ZFILE_USER=admin \
-e ZFILE_PASS=password \
-v ./data:/data \
neosun/zfile-mcp-server:latest
Get your ACCESS_TOKEN:
docker logs zfile-mcp 2>&1 | grep ACCESS_TOKEN
📦 Installation
Option 1: Docker Hub (Recommended)
docker run -d \
--name zfile-mcp \
-p 8092:8092 \
-e ZFILE_URL=https://your-zfile-server.com \
-e ZFILE_USER=your_username \
-e ZFILE_PASS=your_password \
-e ZFILE_STORAGE_KEY=1 \
-v ./data:/data \
neosun/zfile-mcp-server:latest
Option 2: Docker Compose
Create docker-compose.yml:
services:
zfile-mcp:
image: neosun/zfile-mcp-server:latest
container_name: zfile-mcp
restart: always
ports:
- '8092:8092'
environment:
- ZFILE_URL=https://your-zfile-server.com
- ZFILE_USER=your_username
- ZFILE_PASS=your_password
- ZFILE_STORAGE_KEY=1
# - ACCESS_TOKEN= # auto-generated if not set
# - CHUNK_SIZE_MB=10 # chunk size in MB for large file upload
# - MCP_SERVER_URL= # optional: external URL override for chunked upload callbacks
volumes:
- ./data:/data
extra_hosts:
- "host.docker.internal:host-gateway"
docker compose up -d
Option 3: Run from Source
Requirements:
- Python 3.11+
- pip
git clone https://github.com/neosun100/zfile-mcp-server.git
cd zfile-mcp-server
# Install dependencies
pip install -r requirements.txt
# Set environment variables
export ZFILE_URL=https://your-zfile.com
export ZFILE_USER=admin
export ZFILE_PASS=password
# Run
python server.py
⚙️ Configuration
Environment Variables
| Variable | Required | Description | Default |
|---|---|---|---|
ZFILE_URL |
✅ | ZFile server URL (e.g., https://zfile.example.com) |
- |
ZFILE_USER |
✅ | ZFile admin username | - |
ZFILE_PASS |
✅ | ZFile admin password | - |
ZFILE_STORAGE_KEY |
❌ | Storage source key | 1 |
ACCESS_TOKEN |
❌ | Custom access token (auto-generated if not set) | Auto |
CHUNK_SIZE_MB |
❌ | Chunk size in MB for large file upload | 10 |
MCP_SERVER_URL |
❌ | External URL override for chunked upload callbacks | Auto |
MCP Client Configuration
Kiro CLI
Add to ~/.kiro/settings/mcp.json:
{
"mcpServers": {
"zfile": {
"type": "sse",
"url": "https://your-server.com/mcp/sse?token=YOUR_ACCESS_TOKEN",
"headers": {},
"autoApprove": ["*"],
"disabled": false
}
}
}
Claude Desktop
Add to Claude Desktop config:
{
"mcpServers": {
"zfile": {
"type": "sse",
"url": "https://your-server.com/mcp/sse?token=YOUR_ACCESS_TOKEN"
}
}
}
Google Gemini CLI
Add to Gemini CLI config (Streamable HTTP mode):
{
"mcpServers": {
"zfile": {
"type": "streamableHttp",
"url": "https://your-server.com/mcp?token=YOUR_ACCESS_TOKEN"
}
}
}
🌐 Reverse Proxy Configuration
Option A: Cloudflare Tunnel (Recommended)
Cloudflare Tunnel provides secure access without exposing ports. Configure in Cloudflare Dashboard:
| Public hostname | Service |
|---|---|
zfile.example.com |
http://localhost:8090 (ZFile) |
zfile.example.com/mcp/* |
http://localhost:8092 (MCP Server) |
Path-based routing in Cloudflare Zero Trust:
- Go to Zero Trust → Networks → Tunnels
- Select your tunnel → Public Hostname
- Add two entries:
- Path:
/mcp/*→ Service:http://localhost:8092 - Path: (empty) → Service:
http://localhost:8090
- Path:
Option B: Nginx Reverse Proxy
server {
listen 443 ssl;
server_name zfile.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# MCP Server (SSE requires special handling)
location /mcp/ {
proxy_pass http://127.0.0.1:8092/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header Connection '';
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding off;
proxy_read_timeout 86400s;
}
# ZFile main application
location / {
proxy_pass http://127.0.0.1:8090/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 10G;
}
}
Option C: Caddy
zfile.example.com {
handle_path /mcp/* {
reverse_proxy localhost:8092
}
handle {
reverse_proxy localhost:8090
}
}
🛠️ Available Tools
| Tool | Description |
|---|---|
zfile_list |
List files in a directory |
zfile_upload |
Get upload URL for a file (returns URL + direct link) |
zfile_batch_upload |
Get upload URLs for multiple files |
zfile_chunked_upload |
Initialize chunked upload for large files (>10MB, Cloudflare-friendly) |
zfile_chunked_upload_status |
Check status of a chunked upload |
zfile_direct_link |
Generate permanent direct link for a file |
zfile_direct_links |
Generate direct links for multiple files |
zfile_short_link |
Generate 31-day short link |
Usage Examples
List files:
List all files in /documents
Upload a file:
I need to upload app.apk to /releases folder
Generate direct link:
Generate a direct link for /report.pdf
Batch operations:
Generate direct links for all PDF files in /documents
Why URL-based Upload?
Base64 upload consumes context tokens:
- 1MB file → ~350K tokens
- 5MB file → ~1.75M tokens (exceeds most context limits!)
URL-based upload: 0 tokens - client uploads directly to ZFile.
📁 Project Structure
zfile-mcp-server/
├── server.py # Main MCP server implementation
├── Dockerfile # Docker image definition
├── docker-compose.yml # Docker Compose configuration
├── requirements.txt # Python dependencies
├── .env.example # Environment variables template
├── README.md # English documentation
├── README_CN.md # 简体中文文档
├── README_TW.md # 繁體中文文檔
├── README_JP.md # 日本語ドキュメント
├── CHANGELOG.md # Version history
├── LICENSE # MIT License
└── .gitignore # Git ignore rules
🔧 Tech Stack
- Runtime: Python 3.11
- Framework: FastAPI + Uvicorn
- Protocol: MCP (Model Context Protocol) over SSE + Streamable HTTP
- HTTP Client: httpx
- Container: Docker
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📋 Changelog
See CHANGELOG.md for version history.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
⭐ Star History
📱 Follow

Installing Zfile
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/neosun100/zfile-mcp-serverFAQ
Is Zfile MCP free?
Yes, Zfile MCP is free — one-click install via Unyly at no cost.
Does Zfile need an API key?
No, Zfile runs without API keys or environment variables.
Is Zfile hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Zfile in Claude Desktop, Claude Code or Cursor?
Open Zfile on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectAmap Maps Mcp Server
MCP server for using the AMap Maps API
by duxiaohuiSupabase
Database, auth and storage
by SupabaseEverything
Reference / test server with prompts, resources, and tools.
Git
Tools to read, search, and manipulate Git repositories.
Sequential Thinking
Dynamic and reflective problem-solving through thought sequences.
Time
Time and timezone conversion capabilities.
Compare Zfile with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
