MindmupGoogleDriveMcp
Este servidor te permite buscar, recuperar y analizar archivos de MindMup almacenados en tu Google Drive directamente a través de la interfaz MCP.
Documentación
Servidor MCP de MindMup2 Google Drive
Un servidor de Model Context Protocol (MCP) que permite a los clientes de IA (Claude Code, Cursor) buscar, leer y profundizar en mapas mentales de MindMup 2 .mup almacenados en Google Drive — sin volcar un árbol JSON de 3MB en el modelo. Los mapas grandes se resumen automáticamente en un esquema de árbol; la IA luego profundiza en secciones específicas mediante node_path.
Compatibilidad: Claude Code, Cursor (transporte HTTP). No compatible: Claude Desktop (solo stdio).
💫 Resultado

✨ Características
- Buscar archivos MindMup en todo tu Google Drive (solo lectura)
- Navegación por árbol + profundización en secciones para mapas mentales grandes — los archivos pequeños devuelven el contenido completo, los archivos grandes devuelven un esquema en el que puedes profundizar
- Aislamiento de caché por cliente mediante el encabezado
X-Client-Id, para que diferentes usuarios/herramientas no compartan contenido en caché - Modo de desarrollo con recarga en caliente mediante
fastmcp run --reload+ fuente montada por bind - Servidor FastMCP con endpoints integrados
/healthy/ping - Docker Compose para desarrollo y producción
🗺️ Flujo de extremo a extremo
1. Set up Google Cloud service account → download JSON key
2. Share your Drive folder with the SA → Viewer access
3. Base64-encode the JSON key → for X-Google-Credential header
4. Run the server (Docker or Python) → http://127.0.0.1:9805
5. Configure your MCP client (Claude/Cursor) with the base64 credential
6. Verify → curl http://127.0.0.1:9805/health
🔧 Herramientas MCP disponibles
| Herramienta | Descripción |
|---|---|
list_files | Lista archivos MindMup de Google Drive (carpetas y no-.mup filtrados por defecto). Devuelve id, name, folder_url, size, modified_time. |
read_mindmap | Lee un archivo MindMup por file_id o file_name (se requiere uno; el nombre usa la primera coincidencia parcial). Los archivos pequeños (<100KB AI-dict) devuelven content_type: "full". Los archivos grandes devuelven content_type: "outline_only" con tree_outline, section_stats y suggested_start_paths. |
search_mindmap | Busca nodos por palabra clave. Parámetros: file_id, keyword, node_path opcional (alcance del subárbol), max_results=30, normalize_whitespace=True. Devuelve nodos con node_path, title_preview, breadcrumb, children_count. |
get_mindmap_section | Profundiza en una sección por node_path (enteros con puntos, la raíz es 1, p. ej. "1.2.3"). Opcionales max_depth, offset=0, limit=0. Devuelve content_type: "full" | "outline_only" | "paginated" | "truncated" — cambia automáticamente cuando la sección sigue siendo demasiado grande. |
Flujo de trabajo sugerido para agentes de IA: list_files → read_mindmap → si outline_only, ya sea search_mindmap (por palabra clave) o get_mindmap_section (por node_path de suggested_start_paths).
🚀 Primeros pasos
Requisitos previos
- Python 3.12+
- Docker y docker-compose (requeridos para
make run-dev-docker/make run-prod); Ref. makefile - Cuenta de Google Cloud Platform
- Un cliente MCP que admita transporte HTTP (Claude Code o Cursor)
Configuración de la API de Google Drive
| Paso | Descripción | Imagen |
|---|---|---|
| 1 | Ve a Google Cloud Console y crea un nuevo proyecto (el nivel gratuito es suficiente — no se requiere facturación para la API de Drive). | |
| 2 | Habilita la API de Google Drive. | |
| 3 | Crea credenciales de cuenta de servicio: - "IAM y Administración" → "Cuentas de servicio" → "Crear cuenta de servicio" - No se necesita rol a nivel de proyecto (el uso compartido de Drive maneja la autenticación) - Abre la SA → pestaña "Claves" → "Agregar clave" → JSON → descarga el archivo de clave. | ![]() |
| 4 | Codifica en base64 todo el archivo de clave JSON (consulta Referencia de encabezados). ⚠️ Agrega el archivo JSON a .gitignore — nunca lo subas al repositorio. | |
| 5 | Comparte tu carpeta de Google Drive con la SA: - Copia el valor de client_email del JSON- Haz clic derecho en la carpeta → Compartir → pega el correo - Otorga acceso de Lector, desmarca "Notificar a las personas" - El uso compartido se propaga a las subcarpetas. | ![]() |
Nota sobre los alcances: El servidor solicita
auth/drive+auth/drive.file. A pesar del alcance amplio, con el uso compartido a nivel de carpetaViewer, la SA solo puede leer lo que has compartido. Las cuentas administradas por Workspace pueden bloquear el uso compartido externo — si es así, pide a tu administrador que permita el uso compartido de cuentas de servicio para tu dominio.
Ejecutar el servidor
Docker (recomendado):
make run-dev-docker # dev: hot-reload, source bind-mounted
make run-prod # prod: no reload
Python directo (sin Docker):
pip install -r requirements.txt
python3 run.py
# Optionally: MCP_TRANSPORT=streamable-http python3 run.py
Verificar el servidor
curl http://127.0.0.1:9805/health
# => {"result":"success","time":"...","message":"MCP server is running. ..."}
Si no obtienes success, revisa docker logs <container> (modo Docker) o stdout (modo Python).
Ejecutar pruebas
pip install -r requirements.txt
pytest
Configuración del cliente MCP
Agrega a la configuración de tu cliente MCP (~/.claude/mcp.json para Claude Code, o la configuración MCP de Cursor):
{
"mcpServers": {
"mindmup-gdrive": {
"type": "http",
"url": "http://127.0.0.1:9805/mcp",
"headers": {
"X-Google-Credential": "ewogICJ0eXBlIjogInNlcnZpY2VfYWNjb3VuXXXXXXXXXXX",
"X-Client-Id": "shyin-claude-code"
}
}
}
}
Referencia de encabezados
| Encabezado | Requerido | Descripción |
|---|---|---|
X-Google-Credential | ✅ | Tu JSON de cuenta de servicio, codificado en base64. Usa base64encode.org y pega el resultado aquí. ⚠️ Base64 es codificación, no cifrado — la configuración del cliente MCP está en texto plano en el disco, así que no la sincronices a repositorios públicos / copias de seguridad en la nube sin cifrar. |
X-Client-Id | Opcional | Un identificador único por usuario + herramienta, p. ej. shyin-claude-code. Se usa como parte de la clave de caché (X-Client-Id, credential_hash, file_id) para aislar el contenido en caché entre clientes. Si se omite, se recurre a default (la caché puede compartirse con otros clientes sin configurar) y se registra una advertencia. Formato recomendado: <your-name>-<tool-name>. Usa un valor de alta entropía para evitar colisiones con otros usuarios. |
🩺 Solución de problemas
| Síntoma | Causa probable / solución |
|---|---|
health no devuelve nada / conexión rechazada | El servidor no está en ejecución. Revisa docker ps o stdout. ¿El puerto 9805 ya está en uso? Edita mcp_deployment/docker-compose-dev.yml para reasignarlo. |
Google Drive authentication failed | Base64 no válido. Verificación rápida: echo "$CRED" | base64 -d | jq .client_email — debería imprimir el correo de la SA. |
list_files devuelve vacío | (a) La carpeta se compartió con el correo incorrecto — debe coincidir con client_email en el JSON. (b) Los archivos no son .mup — llama con mindmup_only=False para confirmar la visibilidad. (c) La política de la organización de Workspace bloquea el uso compartido externo. |
| La compilación de Docker falla | Asegúrate de que el daemon de Docker esté en ejecución. Vuelve a ejecutar make run-dev-docker. |
| Los cambios no se reflejan en desarrollo | La recarga en caliente solo observa el código fuente de Python. Reinicia el contenedor después de cambios de dependencias o entorno. |
🏗️ Estructura del proyecto
Haz clic para expandir
├── mcp_deployment/
│ ├── docker-compose-dev.yml
│ ├── docker-compose-prod.yml
│ └── Dockerfile
├── src/
│ ├── core/
│ │ ├── gdrive_client.py # Google Drive API client
│ │ ├── gdrive_feature.py # Google Drive feature implementation
│ │ ├── mcp_server.py # Main MCP server with read tools
│ │ └── mindmup_parser.py # MindMup parsing + tree navigation
│ ├── model/
│ │ ├── common_model.py # Common data models
│ │ ├── gdrive_model.py # Google Drive data models
│ │ └── mindmup_model.py # Mind map data models (with to_ai_dict)
│ └── utility/
│ ├── enum.py # Enumerations and constants
│ └── logger.py # Logging utilities
├── tests/ # Unit tests
├── plans/ # Implementation plans
├── run.py # Main entry point
├── requirements.txt # Python dependencies
└── makefile # Build and deployment commands

