通过 MCP 服务器和 CLI 管理 Dropbox 文件。使用 SwiftyDropbox SDK 的 Swift 原生实现,支持 OAuth 2.0 PKCE 和安全密钥链令牌存储。
# 克隆并构建 Dropbook
git clone https://github.com/RyanLisse/Dropbook.git
cd Dropbook
make build
使用交互式 OAuth 流程和安全密钥链存储:
export DROPBOX_APP_KEY="你的_dropbox_应用密钥"
export DROPBOX_APP_SECRET="你的_dropbox_应用密钥"
make login
# 或者: swift run dropbook login
此操作将:
1. 生成 PKCE 代码验证器和质询(SHA256,RFC 7636)
2. 打开带有状态参数(CSRF 保护)的授权 URL
3. 提示您粘贴授权码
4. 将代码交换为访问令牌和刷新令牌
5. 将令牌保存到 macOS 密钥链(硬件加密支持)
6. 如果密钥链不可用,则回退到 ~/.dropbook/auth.json
7. 启用自动令牌刷新
安全特性(符合 RFC 9700):
- 使用 S256 质询方法的 PKCE
- 用于 CSRF 保护的状态参数
- 使用 kSecAttrAccessibleWhenUnlocked 的密钥链存储
- 使用 CryptoKit 进行加密操作
export DROPBOX_APP_KEY="你的_dropbox_应用密钥"
export DROPBOX_APP_SECRET="你的_dropbox_应用密钥"
export DROPBOX_ACCESS_TOKEN="你的_dropbox_访问令牌"
注意:手动令牌不支持自动刷新。生产环境请使用 OAuth 登录。
清除密钥链和文件存储中的令牌:
make logout
# 或者: swift run dropbook logout
启动 MCP 服务器:
make mcp
# 或者: ./.build/debug/dropbook mcp
| 工具 | 描述 |
|---|---|
list_directory |
列出 Dropbox 目录中的文件和文件夹 |
search |
按名称或内容搜索文件 |
upload |
上传文件到 Dropbox |
download |
从 Dropbox 下载文件 |
delete |
删除文件或文件夹(移至回收站) |
get_account_info |
获取账户名称和邮箱 |
read_file |
读取文本文件内容 |
列出 Dropbox 目录中的文件和文件夹。
参数:
- path (字符串,可选):目录路径。默认值:"/"
响应:
{
"files": [
{"type": "file", "name": "doc.pdf", "path": "/Docs/doc.pdf", "size": 1024},
{"type": "folder", "name": "Projects", "path": "/Projects"}
]
}
按名称或内容搜索文件。
参数:
- query (字符串,必需):搜索词
- path (字符串,可选):搜索路径。默认值:"/"
响应:
{
"count": 2,
"results": [
{"matchType": "filename", "metadata": {"name": "report.pdf", "path": "/Docs/report.pdf"}}
]
}
上传文件到 Dropbox。
参数:
- localPath (字符串,必需):本地文件的绝对路径
- remotePath (字符串,必需):Dropbox 中的目标路径
- overwrite (布尔值,可选):如果存在则替换。默认值:false
响应:
{
"uploaded": true,
"name": "file.txt",
"path": "/Uploads/file.txt",
"size": 5000
}
从 Dropbox 下载文件。
参数:
- remotePath (字符串,必需):Dropbox 中的文件路径
- localPath (字符串,必需):本地目标路径
响应:
{
"downloaded": true,
"to": "/tmp/report.pdf"
}
从 Dropbox 删除文件或文件夹(移至回收站)。
参数:
- path (字符串,必需):要删除的 Dropbox 路径
响应:
{
"deleted": true,
"path": "/Docs/old-file.pdf"
}
获取 Dropbox 账户信息。
参数: 无
响应:
{
"name": "Ryan Lisse",
"email": "user@example.com"
}
读取并返回 Dropbox 中文本文件的内容。
参数:
- path (字符串,必需):Dropbox 中的文件路径
响应:
以文本形式返回文件内容。仅适用于 UTF-8 编码的文本文件。
# 身份验证
make login # 使用密钥链存储进行 OAuth 登录
make logout # 清除存储的令牌
# 文件操作
make list # 列出根目录
swift run dropbook list /path
# 搜索文件
swift run dropbook search "query" [path]
# 上传文件
swift run dropbook upload /local/path /remote/path [--overwrite]
# 下载文件
swift run dropbook download /remote/path /local/path
# 启动 MCP 服务器
make mcp
项目包含一个配置 MCP 服务器的 .mcp.json 文件:
{
"mcpServers": {
"dropbox": {
"command": "/path/to/Dropbook/.build/debug/dropbook",
"args": ["mcp"],
"env": {
"DROPBOX_APP_KEY": "${DROPBOX_APP_KEY}",
"DROPBOX_APP_SECRET": "${DROPBOX_APP_SECRET}"
}
}
}
}
在 Claude Code 的 settings.json 中启用项目 MCP 服务器:
{
"enableAllProjectMcpServers": true
}
{
"mcpServers": {
"dropbox": {
"command": "/path/to/dropbook/.build/debug/dropbook",
"args": ["mcp"],
"env": {
"DROPBOX_APP_KEY": "${DROPBOX_APP_KEY}",
"DROPBOX_APP_SECRET": "${DROPBOX_APP_SECRET}"
}
}
}
}
| 错误 | 原因 | 解决方案 |
|---|---|---|
notConfigured |
缺少环境变量 | 设置 DROPBOX_APP_KEY, DROPBOX_APP_SECRET |
invalidArguments |
缺少必需参数 | 检查工具参数 |
notFound |
路径不存在 | 使用 list_directory 验证路径 |
itemNotFound |
密钥链中无令牌 | 运行 make login 进行身份验证 |
Dropbook/
├── Sources/
│ ├── DropbookCore/ # 业务逻辑(基于 actor)
│ │ ├── Auth/ # 密钥链和文件令牌存储
│ │ ├── Config/ # 配置管理
│ │ ├── Models/ # 领域模型
│ │ └── Services/ # DropboxService actor
│ ├── DropbookCLI/ # CLI 适配器
│ │ └── Commands/ # 登录、注销、文件命令
│ └── DropbookMCP/ # MCP 服务器
├── dropbox-skill/ # 技能文档
├── Makefile # 构建自动化
├── .mcp.json # MCP 服务器配置
└── Package.swift
对于备份、同步或批量传输等大规模操作,请使用 rclone——一个功能强大的云同步工具,原生支持 Dropbox。
brew install rclone
# 交互式设置(打开浏览器进行 OAuth)
rclone authorize dropbox
# 将令牌输出保存到配置
mkdir -p ~/.config/rclone
cat > ~/.config/rclone/rclone.conf << 'EOF'
[dropbox]
type = dropbox
token = {"access_token":"...在此处粘贴令牌..."}
EOF
# 完整备份并显示进度
rclone copy dropbox: /Volumes/TimeCapsule/Dropbox-Backup \
--progress \
--transfers 4 \
--checkers 8 \
--retries 10 \
--log-file /tmp/dropbox-backup.log
# 同步(镜像 - 删除源中不存在的文件)
rclone sync dropbox: /Volumes/Backup/Dropbox --progress
# 检查将要复制的内容(试运行)
rclone copy dropbox: /Volumes/Backup --dry-run
# 列出远程内容
rclone lsd dropbox: # 列出目录
rclone ls dropbox: # 列出所有文件
rclone size dropbox: # 计算总大小
# 复制操作
rclone copy dropbox:folder /local/path # 下载文件夹
rclone copy /local/path dropbox:folder # 上传文件夹
# 同步(双向)
rclone bisync dropbox: /local/path --resync
# 挂载为文件系统(macOS - 需要 macFUSE)
rclone mount dropbox: /mnt/dropbox --vfs-cache-mode full
| 标志 | 描述 |
|---|---|
--progress |
显示实时传输进度 |
--transfers 4 |
并行传输数量 |
--checkers 8 |
并行检查器数量 |
--retries 10 |
重试失败的操作 |
--low-level-retries 20 |
重试低级错误 |
--log-file path |
将日志写入文件 |
--dry-run |
显示将要执行的操作 |
--checksum |
使用校验和验证 |
Dropbox 有严格的 API 速率限制。如果遇到 too_many_requests 错误:
# 使用带宽限制
rclone copy dropbox: /backup --bwlimit 1M
# 或在操作之间添加延迟
rclone copy dropbox: /backup --tpslimit 2
rclone 会自动通过指数退避处理速率限制。
list_directorybrew install rclone)