WebDAV MCP Server

Realiza operaciones CRUD en un servidor WebDAV con autenticación básica.

Documentación

WebDAV MCP Server

Un servidor de Model Context Protocol (MCP) que permite operaciones CRUD en un endpoint WebDAV con autenticación básica. Este servidor permite que Claude Desktop y otros clientes MCP interactúen con sistemas de archivos WebDAV mediante comandos en lenguaje natural.

Características

  • Conéctese a cualquier servidor WebDAV con autenticación opcional
  • Realice operaciones CRUD en archivos y directorios
  • Exponga operaciones de archivos como recursos y herramientas MCP
  • Ejecútese mediante transporte stdio (para integración con Claude Desktop) o transporte HTTP/SSE
  • Acceso seguro con autenticación básica opcional
  • Soporte para contraseñas cifradas con bcrypt para la autenticación del servidor MCP (las contraseñas WebDAV deben estar en texto plano debido a limitaciones del protocolo)
  • Agrupación de conexiones para un mejor rendimiento con servidores WebDAV
  • Validación de configuración mediante Zod
  • Registro estructurado para un mejor diagnóstico de problemas

Requisitos previos

  • Node.js 18 o posterior
  • npm o yarn
  • Servidor WebDAV (para operaciones reales de archivos)

Instalación

Opción 1: Instalar desde el paquete npm

# Global installation
npm install -g webdav-mcp-server

# Or with npx
npx webdav-mcp-server

Opción 2: Clonar y compilar desde el código fuente

# Clone repository
git clone https://github.com/yourusername/webdav-mcp-server.git
cd webdav-mcp-server

# Install dependencies
npm install

# Build the application
npm run build

Opción 3: Docker

# Build the Docker image
docker build -t webdav-mcp-server .

# Run the container without authentication
docker run -p 3000:3000 \
  -e WEBDAV_ROOT_URL=http://your-webdav-server \
  -e WEBDAV_ROOT_PATH=/webdav \
  webdav-mcp-server
  
# Run the container with authentication for both WebDAV and MCP server
docker run -p 3000:3000 \
  -e WEBDAV_ROOT_URL=http://your-webdav-server \
  -e WEBDAV_ROOT_PATH=/webdav \
  -e WEBDAV_AUTH_ENABLED=true \
  -e WEBDAV_USERNAME=admin \
  -e WEBDAV_PASSWORD=password \
  -e AUTH_ENABLED=true \
  -e AUTH_USERNAME=user \
  -e AUTH_PASSWORD=pass \
  webdav-mcp-server

Configuración

Cree un archivo .env en el directorio raíz con las siguientes variables:

# WebDAV configuration
WEBDAV_ROOT_URL=http://localhost:4080
WEBDAV_ROOT_PATH=/webdav

# WebDAV authentication (optional)
WEBDAV_AUTH_ENABLED=true
WEBDAV_USERNAME=admin

# WebDAV password must be plain text (required when auth enabled)
# The WebDAV protocol requires sending the actual password to the server
WEBDAV_PASSWORD=password

# Server configuration (for HTTP mode)
SERVER_PORT=3000

# Authentication configuration for MCP server (optional)
AUTH_ENABLED=true
AUTH_USERNAME=user
AUTH_PASSWORD=pass
AUTH_REALM=MCP WebDAV Server

# Auth password for MCP server can be a bcrypt hash (unlike WebDAV passwords)
# AUTH_PASSWORD={bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy

Contraseñas cifradas para la autenticación del servidor MCP

Para una mayor seguridad del servidor MCP (no de las conexiones WebDAV), puede usar contraseñas cifradas con bcrypt en lugar de almacenarlas en texto plano:

  1. Genere un hash bcrypt:
    # Using the built-in utility
    npm run generate-hash -- yourpassword
    # Or with npx
    npx webdav-mcp-generate-hash yourpassword
    
  2. Agregue el hash a su archivo .env con el prefijo {bcrypt}:
    AUTH_PASSWORD={bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy
    

De esta manera, la contraseña de su servidor MCP se almacena de forma segura. Tenga en cuenta que las contraseñas WebDAV siempre deben estar en texto plano debido a los requisitos del protocolo.

Uso

Ejecución con transporte stdio

Este modo es ideal para la integración directa con Claude Desktop.

# If installed globally
webdav-mcp-server

# If using npx
npx webdav-mcp-server

# If built from source
node dist/index.js

Ejecución con transporte HTTP/SSE

Este modo permite que el servidor sea accesible a través de HTTP con Server-Sent Events para comunicación en tiempo real.

# If installed globally
webdav-mcp-server --http

# If using npx
npx webdav-mcp-server --http

# If built from source
node dist/index.js --http

Inicio rápido con Docker Compose

La forma más sencilla de comenzar con el servidor WebDAV y el servidor MCP es usar Docker Compose:

# Start both WebDAV and MCP servers
cd docker
docker-compose up -d

# This will start:
# - hacdias/webdav server on port 4080 (username: admin, password: admin)
# - MCP server on port 3000 (username: user, password: pass)

Esta configuración utiliza hacdias/webdav, un servidor WebDAV simple y autónomo escrito en Go. La configuración del servidor WebDAV se almacena en webdav_config.yml, que puede modificar para ajustar permisos, agregar usuarios o cambiar otras configuraciones.

El servidor WebDAV almacena todos los archivos en un volumen Docker llamado webdav_data, que persiste entre reinicios del contenedor.

Configuración del servidor WebDAV

El archivo webdav_config.yml configura el servidor hacdias/webdav utilizado en la configuración de Docker Compose. Esto es lo que puede personalizar:

# Server address and port
address: 0.0.0.0
port: 6060

# Root data directory
directory: /data

# Enable/disable CORS
cors:
  enabled: true
  # Additional CORS settings...

# Default permissions (C=Create, R=Read, U=Update, D=Delete)
permissions: CRUD

# User definitions
users:
  - username: admin
    password: admin      # Plain text password
    permissions: CRUD    # Full permissions
  
  - username: reader
    password: reader
    permissions: R       # Read-only permissions
    
  # You can also use bcrypt-encrypted passwords
  - username: secure
    password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"

Para opciones de configuración más avanzadas, consulte la documentación de hacdias/webdav.

Pruebas

Para ejecutar las pruebas:

npm test

Integración con Claude Desktop

  1. Asegúrese de que la función MCP esté habilitada en Claude Desktop Usando npx 2. Abra la configuración de Claude Desktop y haga clic en editar configuración (claude\_desktop\_config.json\) 3. Agregue \``json { "mcpServers": { "webdav": { "command": "npx", "args": \[ "-y", "webdav-mcp-server" \], "env": { "WEBDAV\_ROOT\_URL": "", "WEBDAV\_ROOT\_PATH": "", "WEBDAV\_USERNAME": "", "WEBDAV\_PASSWORD": "", "WEBDAV\_AUTH\_ENABLED": "true|false" } } } } \``\ Usando node y compilación local 2. Clone este repositorio y ejecute setup.sh\ en mac/linux o setup.bat\ en windows 3. Abra la configuración de Claude Desktop y haga clic en editar configuración (claude\_desktop\_config.json\) 4. Agregue \``json { "mcpServers": { "webdav": { "command": "node", "args": \[ "/dist/index.js" \], "env": { "WEBDAV\_ROOT\_URL": "", "WEBDAV\_ROOT\_PATH": "", "WEBDAV\_USERNAME": "", "WEBDAV\_PASSWORD": "", "WEBDAV\_AUTH\_ENABLED": "true|false" } } } } \``\

Recursos MCP disponibles

  • webdav://{path}/list - Listar archivos en un directorio
  • webdav://{path}/content - Obtener contenido de un archivo
  • webdav://{path}/info - Obtener información de un archivo o directorio

Herramientas MCP disponibles

  • webdav_create_remote_file - Crear un nuevo archivo en un servidor WebDAV remoto
  • webdav_get_remote_file - Recuperar contenido de un archivo almacenado en un servidor WebDAV remoto
  • webdav_update_remote_file - Actualizar un archivo existente en un servidor WebDAV remoto
  • webdav_delete_remote_item - Eliminar un archivo o directorio de un servidor WebDAV remoto
  • webdav_create_remote_directory - Crear un nuevo directorio en un servidor WebDAV remoto
  • webdav_move_remote_item - Mover o renombrar un archivo/directorio en un servidor WebDAV remoto
  • webdav_copy_remote_item - Copiar un archivo/directorio a una nueva ubicación en un servidor WebDAV remoto
  • webdav_list_remote_directory - Listar archivos y directorios en un servidor WebDAV remoto

Prompts MCP disponibles

  • webdav_create_remote_file - Prompt para crear un nuevo archivo en un servidor WebDAV remoto
  • webdav_get_remote_file - Prompt para recuperar contenido de un archivo WebDAV remoto
  • webdav_update_remote_file - Prompt para actualizar un archivo en un servidor WebDAV remoto
  • webdav_delete_remote_item - Prompt para eliminar un archivo/directorio de un servidor WebDAV remoto
  • webdav_list_remote_directory - Prompt para listar el contenido de un directorio en un servidor WebDAV remoto
  • webdav_create_remote_directory - Prompt para crear un directorio en un servidor WebDAV remoto
  • webdav_move_remote_item - Prompt para mover/renombrar un archivo/directorio en un servidor WebDAV remoto
  • webdav_copy_remote_item - Prompt para copiar un archivo/directorio en un servidor WebDAV remoto

Ejemplos de consultas en Claude

Aquí hay algunos ejemplos de consultas que puede usar en Claude Desktop una vez que el servidor WebDAV MCP esté conectado:

  • "Lista los archivos en mi servidor WebDAV remoto"
  • "Crea un nuevo archivo de texto llamado notes.txt en mi servidor WebDAV remoto con el siguiente contenido: Hello World"
  • "Obtén el contenido de document.txt de mi servidor WebDAV remoto"
  • "Actualiza config.json en mi servidor WebDAV remoto con esta nueva configuración"
  • "Crea un directorio llamado projects en mi servidor WebDAV remoto"
  • "Copia report.docx a una ubicación de respaldo en mi servidor WebDAV remoto"
  • "Mueve el archivo old_name.txt a new_name.txt en mi servidor WebDAV remoto"
  • "Elimina temp.txt de mi servidor WebDAV remoto"

Uso programático

También puede usar este paquete programáticamente en sus propios proyectos:

import { startWebDAVServer } from 'webdav-mcp-server';

// For stdio transport without authentication
await startWebDAVServer({
  webdavConfig: {
    rootUrl: 'http://your-webdav-server',
    rootPath: '/webdav',
    authEnabled: false
  },
  useHttp: false
});

// For stdio transport with WebDAV authentication (password must be plain text)
await startWebDAVServer({
  webdavConfig: {
    rootUrl: 'http://your-webdav-server',
    rootPath: '/webdav',
    authEnabled: true,
    username: 'admin',
    password: 'password'
  },
  useHttp: false
});

// With bcrypt hash for MCP server password (HTTP auth only)
await startWebDAVServer({
  webdavConfig: {
    rootUrl: 'http://your-webdav-server',
    rootPath: '/webdav',
    authEnabled: true,
    username: 'admin',
    password: 'password' // WebDAV password must be plain text
  },
  useHttp: true,
  httpConfig: {
    port: 3000,
    auth: {
      enabled: true,
      username: 'user',
      password: '{bcrypt}$2y$10$CyLKnUwn9fqqKQFEbxpZFuE9mzWR/x8t6TE7.CgAN0oT8I/5jKJBy'
    }
  }
});

// For HTTP transport with MCP authentication
await startWebDAVServer({
  webdavConfig: {
    rootUrl: 'http://your-webdav-server',
    rootPath: '/webdav',
    authEnabled: true,
    username: 'admin',
    password: 'password'
  },
  useHttp: true,
  httpConfig: {
    port: 3000,
    auth: {
      enabled: true,
      username: 'user',
      password: 'pass',
      realm: 'MCP WebDAV Server'
    }
  }
});

// For HTTP transport without authentication
await startWebDAVServer({
  webdavConfig: {
    rootUrl: 'http://your-webdav-server',
    rootPath: '/webdav',
    authEnabled: false
  },
  useHttp: true,
  httpConfig: {
    port: 3000,
    auth: {
      enabled: false
    }
  }
});