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

  1. Clona este repositorio:
git clone https://github.com/smehmood/modal-mcp-server.git
cd modal-mcp-server
  1. 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 uv para la gestión de dependencias
    • Modal debe estar instalado en el entorno virtual del proyecto

Herramientas Soportadas

Operaciones con Volúmenes de Modal

  1. 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
  2. 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 Modal
      • path: Ruta dentro del volumen (por defecto: "/")
  3. Copiar Archivos (copy_modal_volume_files)

    • Copia archivos dentro de un volumen de Modal
    • Parámetros:
      • volume_name: Nombre del volumen de Modal
      • paths: Lista de rutas donde la última ruta es el destino
    • Ejemplo: ["source.txt", "dest.txt"] o ["file1.txt", "file2.txt", "dest_dir/"]
  4. Eliminar Archivos (remove_modal_volume_file)

    • Elimina un archivo o directorio de un volumen de Modal
    • Parámetros:
      • volume_name: Nombre del volumen de Modal
      • remote_path: Ruta del archivo/directorio a eliminar
      • recursive: Indicador booleano para eliminación recursiva (por defecto: false)
  5. Subir Archivos (put_modal_volume_file)

    • Sube un archivo o directorio a un volumen de Modal
    • Parámetros:
      • volume_name: Nombre del volumen de Modal
      • local_path: Ruta del archivo/directorio local a subir
      • remote_path: Ruta en el volumen donde subir (por defecto: "/")
      • force: Indicador booleano para sobrescribir archivos existentes (por defecto: false)
  6. Descargar Archivos (get_modal_volume_file)

    • Descarga archivos de un volumen de Modal
    • Parámetros:
      • volume_name: Nombre del volumen de Modal
      • remote_path: Ruta del archivo/directorio en el volumen a descargar
      • local_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_destination para escribir el contenido del archivo en stdout

Despliegue de Modal

  1. 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 uv para la gestión de dependencias
      • Tener la CLI de modal instalada en su entorno virtual

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.