R2 Bucket MCP
Enables file operations (upload, download, list, delete) on Cloudflare R2 (S3-compatible) storage, with dedicated APK upload tool.
README
r2-bucket-mcp
Servidor MCP stdio para Cursor y otros clientes MCP. Sube archivos locales a Cloudflare R2 (S3-compatible) sin ejecutar scripts shell. Pensado para APKs de proyectos (vitalo, linkbox, nestle, …) y cualquier otro archivo.
Qué hace
Expone cinco tools MCP:
| Tool | Uso |
|---|---|
upload_apk |
APKs con key {project}/{version}/{filename} |
upload_file |
Cualquier archivo con key opcional |
get_file |
Descargar por key (URL o guardar local) |
list_files |
Listar objetos por prefijo |
delete_file |
Borrar objeto por key |
La respuesta incluye downloadUrl (URL pública CDN si R2_PUBLIC_BASE_URL está configurada, o presigned URL temporal).
Instalación
cd /Users/samuelgerardocastrolopez/Desktop/r2-bucket-mcp
npm install
Credenciales R2
Usa las mismas variables que opencode_whatsapp/.env (sin copiar secretos al repo):
- Abre
opencode_whatsapp/.enven tu máquina. - Copia los valores de
R2_ACCESS_KEY_ID,R2_SECRET_ACCESS_KEY,R2_BUCKET,R2_ENDPOINT(oR2_ACCOUNT_ID), y opcionalmenteR2_PUBLIC_BASE_URL. - Para pruebas locales, crea
.enven este repo desde.env.example(nunca lo commitees).
| Variable | Requerida | Descripción |
|---|---|---|
R2_ACCESS_KEY_ID |
sí | Access key R2 |
R2_SECRET_ACCESS_KEY |
sí | Secret key R2 |
R2_BUCKET |
sí | Bucket (default: apks) |
R2_ENDPOINT |
sí* | Endpoint S3-compatible |
R2_ACCOUNT_ID |
sí* | Alternativa a endpoint explícito |
R2_KEY_PREFIX |
no | Prefijo global opcional |
R2_PUBLIC_BASE_URL |
no | CDN pública; si falta, presigned URL |
R2_PRESIGNED_TTL_SECS |
no | Default: 604800 (7 días) |
R2_MAX_FILE_BYTES |
no | Límite validación MCP (default: 500 MB) |
* Al menos uno de R2_ENDPOINT o R2_ACCOUNT_ID.
Prueba manual
Arranque stdio (proceso queda esperando; Ctrl+C para salir):
node index.js
# stderr: [r2-bucket-mcp] ready (stdio)
Smoke test con credenciales en .env local (sube un .smoke-test.txt temporal):
npm run smoke
Registrar en Cursor
Settings → MCP o edita ~/.cursor/mcp.json.
Usa la ruta absoluta de node (which node). Ejemplo:
{
"mcpServers": {
"r2-bucket": {
"type": "stdio",
"command": "/Users/samuelgerardocastrolopez/.nvm/versions/node/v22.17.0/bin/node",
"args": [
"/Users/samuelgerardocastrolopez/Desktop/r2-bucket-mcp/index.js"
],
"env": {
"R2_ACCESS_KEY_ID": "PEGAR_ACCESS_KEY",
"R2_SECRET_ACCESS_KEY": "PEGAR_SECRET_KEY",
"R2_BUCKET": "apks",
"R2_ENDPOINT": "https://<account-id>.r2.cloudflarestorage.com",
"R2_PUBLIC_BASE_URL": "https://cdn.tudominio.com"
}
}
}
}
Reinicia Cursor o recarga servidores MCP tras cambiar mcp.json.
Uso desde agentes
- APKs: preferir
upload_apkconproject,versionyfilePathabsoluto. - Otros archivos:
upload_fileconfilePathy opcionalmentekey,prefix,contentType. - Listar:
list_filesconprefixopcional (ej.vitalo/). - Descargar:
get_fileconkey; opcionalfilePathabsoluto para guardar en disco. - Borrar:
delete_fileconkeycompleta (ej.vitalo/2.1.0/app-release.apk).
Ejemplo de key generada por upload_apk:
vitalo/2.1.0/app-release.apk
Respuesta JSON (campo principal para compartir el enlace):
{
"ok": true,
"bucket": "apks",
"key": "vitalo/2.1.0/app-release.apk",
"size": 12345678,
"contentType": "application/vnd.android.package-archive",
"downloadUrl": "https://cdn.tudominio.com/vitalo/2.1.0/app-release.apk",
"publicUrl": "https://cdn.tudominio.com/vitalo/2.1.0/app-release.apk",
"presignedUrl": null
}
Si no hay R2_PUBLIC_BASE_URL, downloadUrl será una presigned URL y publicUrl será null.
Integración SDK
Con un agente SDK local y settingSources: ['user'], el agente carga el mismo MCP definido en ~/.cursor/mcp.json. También puedes pasar mcpServers inline en la config del agente con las mismas credenciales en env.
Tools
upload_file
| Parámetro | Requerido | Descripción |
|---|---|---|
filePath |
sí | Ruta absoluta al archivo local |
key |
no | Clave en el bucket (default: basename) |
prefix |
no | Prefijo override (sin R2_KEY_PREFIX global) |
contentType |
no | MIME explícito |
upload_apk
| Parámetro | Requerido | Descripción |
|---|---|---|
filePath |
sí | Ruta absoluta al APK |
project |
sí | Alias (vitalo, linkbox, …) |
version |
sí | Versión (2.1.0) |
filename |
no | Default: app-release.apk |
get_file
| Parámetro | Requerido | Descripción |
|---|---|---|
key |
sí | Clave del objeto (ej. vitalo/2.1.0/app-release.apk) |
filePath |
no | Ruta absoluta local para guardar; sin ella solo devuelve URLs |
list_files
| Parámetro | Requerido | Descripción |
|---|---|---|
prefix |
no | Filtro de prefijo (ej. vitalo/, vitalo/2.1.0/) |
maxKeys |
no | Máximo por página (default: 100, max: 1000) |
continuationToken |
no | Token de paginación de una respuesta anterior |
delete_file
| Parámetro | Requerido | Descripción |
|---|---|---|
key |
sí | Clave del objeto (ej. vitalo/2.1.0/app-release.apk) |
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。