Modal MCP Server
Interactúa con volúmenes de Modal y despliega aplicaciones de Modal desde Cursor.
Documentación
Modal MCP Server
Una implementación de servidor MCP para interactuar con volúmenes de Modal y desplegar aplicaciones de Modal desde Cursor.
Instalación
- Clona este repositorio:
git clone https://github.com/smehmood/modal-mcp-server.git
cd modal-mcp-server
- Instala las dependencias usando
uv:
uv sync
Configuración
Para usar este servidor MCP en Cursor, añade la siguiente configuración a tu ~/.cursor/mcp.json:
{
"mcpServers": {
"modal-mcp-server": {
"command": "uv",
"args": [
"--project", "/path/to/modal-mcp-server",
"run", "/path/to/modal-mcp-server/src/modal_mcp/server.py"
]
}
}
}
Reemplaza /path/to/modal-mcp-server con la ruta absoluta a tu repositorio clonado.
Requisitos
- Python 3.11 o superior
- Gestor de paquetes
uv - CLI de Modal configurado con credenciales válidas
- Para soporte de despliegue de Modal:
- El proyecto que se va a desplegar debe usar
uvpara la gestión de dependencias - Modal debe estar instalado en el entorno virtual del proyecto
- El proyecto que se va a desplegar debe usar
Herramientas Soportadas
Operaciones con Volúmenes de Modal
-
Listar Volúmenes de Modal (
list_modal_volumes)- Lista todos los volúmenes de Modal en tu entorno
- Devuelve información de volúmenes en formato JSON
- Parámetros: Ninguno
-
Listar Contenido del Volumen (
list_modal_volume_contents)- Lista archivos y directorios en un volumen de Modal
- Parámetros:
volume_name: Nombre del volumen de Modalpath: Ruta dentro del volumen (por defecto: "/")
-
Copiar Archivos (
copy_modal_volume_files)- Copia archivos dentro de un volumen de Modal
- Parámetros:
volume_name: Nombre del volumen de Modalpaths: Lista de rutas donde la última ruta es el destino
- Ejemplo:
["source.txt", "dest.txt"]o["file1.txt", "file2.txt", "dest_dir/"]
-
Eliminar Archivos (
remove_modal_volume_file)- Elimina un archivo o directorio de un volumen de Modal
- Parámetros:
volume_name: Nombre del volumen de Modalremote_path: Ruta del archivo/directorio a eliminarrecursive: Indicador booleano para eliminación recursiva (por defecto: false)
-
Subir Archivos (
put_modal_volume_file)- Sube un archivo o directorio a un volumen de Modal
- Parámetros:
volume_name: Nombre del volumen de Modallocal_path: Ruta del archivo/directorio local a subirremote_path: Ruta en el volumen donde subir (por defecto: "/")force: Indicador booleano para sobrescribir archivos existentes (por defecto: false)
-
Descargar Archivos (
get_modal_volume_file)- Descarga archivos de un volumen de Modal
- Parámetros:
volume_name: Nombre del volumen de Modalremote_path: Ruta del archivo/directorio en el volumen a descargarlocal_destination: Ruta local para guardar los archivos descargados (por defecto: directorio actual)force: Indicador booleano para sobrescribir archivos existentes (por defecto: false)
- Nota: Usa "-" como
local_destinationpara escribir el contenido del archivo en stdout
Despliegue de Modal
- Desplegar Aplicación Modal (
deploy_modal_app)- Despliega una aplicación de Modal
- Parámetros:
absolute_path_to_app: Ruta absoluta al archivo de la aplicación Modal
- Nota: El proyecto que contiene la aplicación Modal debe:
- Usar
uvpara la gestión de dependencias - Tener la CLI de
modalinstalada en su entorno virtual
- Usar
Formato de Respuesta
Todas las herramientas devuelven respuestas en un formato estandarizado, con ligeras variaciones según el tipo de operación:
# JSON operations (list volumes, list contents):
{
"success": True,
"data": {...} # JSON data from Modal CLI
}
# File operations (put, get, copy, remove):
{
"success": True,
"message": "Operation successful message",
"command": "executed command string",
"stdout": "command output", # if any
"stderr": "error output" # if any
}
# Error case (all operations):
{
"success": False,
"error": "Error message describing what went wrong",
"command": "executed command string", # for file operations
"stdout": "command output", # if available
"stderr": "error output" # if available
}
Contribuciones
¡Las contribuciones son bienvenidas! No dudes en enviar un Pull Request.
Licencia
Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.