MCP Web Scraper

Una plataforma de web scraping lista para producción con automatización impulsada por ML, automatización de navegador mediante Playwright y caché persistente.

Documentación

MCP Web Scraper

MCP TypeScript SDK Playwright MCP TypeScript Docker License: MIT

Una plataforma global de extracción de contenido lista para producción con automatización impulsada por ML, soporte para sitios internacionales y optimización inteligente. Incluye automatización completa del navegador con 29 herramientas, 21+ sitios compatibles en 4 regiones, 6 plataformas de contenido con optimización especializada y caché persistente SQLite con aprendizaje entre sesiones. Construido con TypeScript utilizando el SDK oficial de MCP TypeScript y Playwright.

🌍 Plataforma Global de Contenido - v1.0.1 + Fase 4C Completa

Estado de Desarrollo: ✅ COMPLETADO (6 de enero de 2025) - Todas las funciones planificadas implementadas y listas para producción.
Últimas Actualizaciones: Mejoras en TypeScript, limpieza de código heredado, suite de pruebas mejorada, validación del sistema (Fase 3.6)

🚀 Inicio Rápido

Docker (Recomendado)

# Pull and run the latest version
docker run -p 3001:3001 descoped/mcp-web-scraper

# Or with docker-compose
curl -O https://raw.githubusercontent.com/descoped/mcp-web-scraper/main/docker-compose.yml
docker-compose up

npm/Node.js

# Clone and build
git clone https://github.com/descoped/mcp-web-scraper.git
cd mcp-web-scraper
npm install
npm run build
npm start

Verificación de Salud

curl http://localhost:3001/health

🎯 Descripción General Completa de Funciones

🌍 Plataforma Global de Extracción de Contenido

  • 21+ Sitios Compatibles: Sitios de noticias noruegos (13) + internacionales (8) con optimización específica por región
  • 6 Plataformas de Contenido: Medium, Substack, LinkedIn, Dev.to, Hashnode, Ghost con lógica de optimización especializada
  • 4 Configuraciones Regionales: Escandinava, Europea, Americana, Internacional con estrategias adaptativas
  • 10+ Idiomas: Soporte multilingüe con codificación de caracteres y procesamiento de fechas adecuados
  • 92% de Confianza Internacional: Extracción de alta precisión en fuentes de noticias globales

🤖 Automatización e Inteligencia Impulsadas por ML

  • 88% de Confianza ML: Análisis de patrones DOM con 15+ características por elemento
  • 83% de Éxito en Generación de Reglas: Creación automática de reglas con validación estadística
  • Marco de Pruebas A/B: Pruebas estadísticas rigurosas con pruebas t de dos muestras y análisis de significancia
  • Aprendizaje Entre Sesiones: 89% de precisión en recomendación de métodos con inteligencia persistente
  • Optimización Generada por IA: Sugerencias automáticas de mejora de rendimiento con guía de implementación

💾 Sistema de Caché Persistente con Backend SQLite

  • 73% de Tasa de Aciertos de Caché: Caché de alta eficiencia con 82% de puntuación media de calidad en extracciones cacheadas
  • 15,847+ Extracciones en Caché: Caché integral que cubre contenido internacional y de plataformas
  • Inteligencia Entre Sesiones: Reconocimiento de patrones de dominio y aprendizaje de líneas base de rendimiento
  • 20% de Mejora de Rendimiento: Mediante optimización de caché y compresión de base de datos
  • Detección de Firmas HTML: Detección inteligente de cambios para invalidación de caché

📊 Analíticas en Tiempo Real y Monitoreo de Producción

  • Panel en Vivo: 30+ métricas en tiempo real con interfaz web en /dashboard
  • API de Producción: 6 endpoints de analíticas para monitoreo de reglas, caché y calidad
  • Registro Integral: Registro estructurado con seguimiento de correlación y verificaciones de salud
  • Líneas Base de Rendimiento: Calibración continua y recomendaciones de optimización
  • Análisis de Tendencias de Calidad: Seguimiento histórico de rendimiento entre dominios y métodos

🏆 Automatización Completa del Navegador (29 Herramientas)

  • 100% de Paridad con Microsoft Playwright MCP: Las 29 herramientas implementadas con paridad de funciones
  • Interacciones Principales: Navegación, clics, escritura, manejo de formularios, diálogos
  • Funciones Avanzadas: Generación de PDF, monitoreo de consola, pruebas de accesibilidad
  • Gestión de Sesiones: Gestión de pestañas, navegación de historial, monitoreo de red
  • Visión Impulsada por IA: Búsqueda de elementos, anotación de páginas, ejecución de JavaScript
  • Persistencia de Sesiones: Mantener el estado del navegador entre llamadas de herramientas

🍪 Manejo Avanzado de Consentimiento de Cookies

  • 30+ Idiomas: Noruego, inglés, alemán, francés, español, italiano y más
  • 25+ Marcos de Trabajo: OneTrust, Quantcast, Cookiebot, TrustArc y otros
  • Estrategias Regionales: Manejo de consentimiento Estricto/Estándar/Adaptativo según la ubicación
  • Rendimiento en Sub-segundos: <1000ms de tiempo medio de manejo de consentimiento con reconocimiento inteligente de patrones

🔌 Cumplimiento e Integración del Protocolo MCP

  • Puntuación Perfecta 10/10: Cumplimiento completo de la especificación MCP 2024-11-05
  • Progreso en Tiempo Real: Seguimiento de flujo de trabajo en 5 etapas con notificaciones SSE
  • Transmisión de Contenido: Entrega de contenido en vivo durante la extracción con múltiples formatos de salida
  • Seguimiento de Correlación: Los IDs de correlación proporcionados por el cliente fluyen a través de todos los eventos
  • Nativo en TypeScript: Seguridad de tipos completa y soporte de IntelliSense

🛠 Herramientas MCP (29 en Total)

🏆 100% de Compatibilidad con Microsoft Playwright MCP - Las 29 herramientas implementadas con paridad completa de funciones más nuestras ventajas únicas de consentimiento de cookies.

Herramientas Principales de Extracción (3 herramientas)

scrape_article_content

Extraer contenido de artículos con manejo inteligente de consentimiento de cookies.

{
  "url": "https://example.com/article",
  "outputFormats": [
    "text",
    "html",
    "markdown"
  ],
  "correlation_id": "task_085668b2-8f3d-418e",
  "extractSelectors": {
    "title": "h1",
    "content": "article",
    "author": ".author"
  }
}

Devuelve: Título, contenido, autor, fecha, resumen + texto completo + verificación de consentimiento

get_page_screenshot

Capturar capturas de pantalla de páginas después de manejar el consentimiento de cookies.

{
  "url": "https://example.com",
  "fullPage": true
}

Devuelve: Captura de pantalla PNG (base64) + estado de consentimiento + metadatos

handle_cookie_consent

Probar y validar el manejo de consentimiento de cookies para cualquier sitio web.

{
  "url": "https://example.com",
  "timeout": 5000
}

Devuelve: Verificación detallada de consentimiento + método utilizado + métricas de rendimiento

Interacciones Principales del Navegador (9 herramientas)

Capacidades completas de navegación e interacción de Playwright con operaciones basadas en sesión:

  • browser_navigate - Navegar a URLs con condiciones de espera
  • browser_click - Hacer clic en elementos con múltiples estrategias de selección
  • browser_type - Escribir texto con opciones de borrado/retraso
  • browser_hover - Interacciones de desplazamiento del ratón
  • browser_select_option - Manejo de menús desplegables y elementos de selección
  • browser_press_key - Simulación de entrada de teclado
  • browser_handle_dialog - Gestión de diálogos de alerta, confirmación y aviso
  • browser_file_upload - Funcionalidad de carga de archivos
  • browser_close - Gestión del ciclo de vida de la página

Funciones Avanzadas (6 herramientas)

Capacidades especializadas del navegador para pruebas y análisis:

  • browser_pdf_save - Generación de PDF con opciones de formato
  • browser_console_messages - Monitoreo y filtrado de registros de consola
  • browser_resize - Control de viewport para pruebas responsivas
  • browser_snapshot - Instantáneas del árbol de accesibilidad
  • browser_install - Gestión de instalación del navegador
  • browser_generate_playwright_test - Generación automatizada de scripts de prueba

Gestión de Sesiones (4 herramientas)

manage_tabs

Crear, cambiar, cerrar y listar pestañas del navegador.

{
  "action": "new",
  "url": "https://example.com"
}

Acciones: list, new, switch, close
Devuelve: Resultados de gestión de pestañas con metadatos

monitor_network

Rastrear solicitudes y respuestas HTTP con análisis detallado.

{
  "sessionId": "session_123",
  "action": "start",
  "filterUrl": "api.example.com"
}

Acciones: start, stop, get
Devuelve: Análisis de red con tiempos, códigos de estado, dominios

drag_drop

Realizar operaciones de arrastrar y soltar entre elementos.

{
  "sessionId": "session_123",
  "sourceSelector": ".drag-item",
  "targetSelector": ".drop-zone"
}

Devuelve: Resultados de operaciones de arrastre con validación de posición

navigate_history

Navegar por el historial del navegador (atrás/adelante) con control de pasos.

{
  "sessionId": "session_123",
  "direction": "back",
  "steps": 2
}

Devuelve: Resultados de navegación con cambios de URL e información de historial

Herramientas de Visión Impulsadas por IA (7 herramientas)

Automatización avanzada con descubrimiento y análisis inteligente de elementos:

  • browser_find_text - Búsqueda y localización avanzada de texto
  • browser_find_element - Descubrimiento de elementos por descripción
  • browser_describe_element - Análisis y descripción de elementos
  • browser_annotate_page - Sistema de anotación visual de páginas
  • browser_get_element_text - Extracción mejorada de texto con análisis
  • browser_wait_for_page_state - Monitoreo avanzado del estado de la página
  • browser_execute_javascript - Ejecución personalizada de JavaScript con seguridad

💻 Ejemplos de Uso

Cliente Node.js/TypeScript

import {MCPClient} from '@modelcontextprotocol/client';

const client = new MCPClient('http://localhost:3001');

// Article scraping
const result = await client.callTool('scrape_article_content', {
  url: 'https://www.cnn.com/news'
});

console.log('Article:', result.extracted.title);
console.log('Consent handled:', result.cookieConsent.success);

// Screenshot capture
const screenshot = await client.callTool('get_page_screenshot', {
  url: 'https://example.com',
  fullPage: true
});

// Advanced browser automation workflow
async function browserAutomationWorkflow() {
    // List existing tabs
    const tabList = await client.callTool('manage_tabs', {
        action: 'list'
    });
    console.log('Current tabs:', tabList.tabs.length);

    // Start network monitoring
    await client.callTool('monitor_network', {
        sessionId: 'automation_session',
        action: 'start'
    });

    // Create new tab with specific URL
    const newTab = await client.callTool('manage_tabs', {
        action: 'new',
        url: 'https://example.com/dashboard'
    });
    console.log('New tab index:', newTab.tabIndex);

    // Perform drag and drop interaction
    const dragResult = await client.callTool('drag_drop', {
        sessionId: 'automation_session',
        sourceSelector: '.widget-source',
        targetSelector: '.dashboard-area'
    });
    console.log('Drag success:', dragResult.dragDrop.success);

    // Get network activity analysis
    const networkData = await client.callTool('monitor_network', {
        sessionId: 'automation_session',
        action: 'get'
    });
    console.log('Network requests:', networkData.analysis.totalRequests);

    // Navigate back in history
    const historyNav = await client.callTool('navigate_history', {
        sessionId: 'automation_session',
        direction: 'back',
        steps: 1
    });
    console.log('URL changed:', historyNav.historyNavigation.urlChanged);
}

Seguimiento de Correlación

Rastrear solicitudes en todo su sistema usando IDs de correlación para procesamiento por lotes, sesiones de usuario o trazado distribuido:

// Track multiple articles in a batch analysis
const batchId = 'analysis_batch_2025_001';
const articles = [
  {url: 'https://example.com/article1', id: 'item_001'},
  {url: 'https://example.com/article2', id: 'item_002'}
];

// Process with correlation tracking
for (const article of articles) {
  const result = await client.callTool('scrape_article_content', {
    url: article.url,
    correlation_id: `${batchId}_${article.id}`,
    outputFormats: ['text', 'markdown']
  });
}

// Monitor progress via SSE with correlation
const eventSource = new EventSource('http://localhost:3001/mcp');
eventSource.onmessage = (event) => {
  const data = JSON.parse(event.data);
  if (data.params?.correlationId?.startsWith(batchId)) {
    console.log(`Progress for ${data.params.correlationId}: ${data.params.progress}%`);
  }
};

Ejemplos con curl

# List available tools
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

# Scrape an article with correlation tracking
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "scrape_article_content",
      "arguments": {
        "url": "https://www.reuters.com",
        "correlation_id": "task_085668b2-8f3d-418e",
        "outputFormats": ["text", "markdown"]
      }
    }
  }'

# Test cookie consent
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "handle_cookie_consent",
      "arguments": {"url": "https://www.vg.no"}
    }
  }'

# Create new browser tab
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "manage_tabs",
      "arguments": {"action": "new", "url": "https://example.com"}
    }
  }'

# Start network monitoring
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "monitor_network",
      "arguments": {"sessionId": "test_session", "action": "start"}
    }
  }'

# Perform drag and drop
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "drag_drop",
      "arguments": {
        "sessionId": "test_session",
        "sourceSelector": ".drag-item",
        "targetSelector": ".drop-zone"
      }
    }
  }'

⚙️ Configuración

Configuración de Claude Desktop

Agregar a ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):

{
  "mcpServers": {
    "mcp-web-scraper": {
      "command": "node",
      "args": [
        "/path/to/mcp-web-scraper/dist/server.js"
      ],
      "env": {
        "BROWSER_POOL_SIZE": "3",
        "DEBUG_LOGGING": "true"
      }
    }
  }
}

Variables de Entorno

# Server Configuration
MCP_SERVER_PORT=3001              # Server port (default: 3001)
BROWSER_POOL_SIZE=5               # Max concurrent browsers (default: 5)
REQUEST_TIMEOUT=30000             # Request timeout in ms (default: 30000)
CONSENT_TIMEOUT=3000              # Cookie consent timeout in ms (default: 3000)
DEBUG_LOGGING=false               # Enable debug logging (default: false)

# Docker Configuration
NODE_ENV=production               # Environment mode
MEMORY_LIMIT=3G                   # Container memory limit
CPU_LIMIT=1.5                     # Container CPU limit

Ejemplo de Docker Compose

version: '3.8'
services:
  mcp-web-scraper:
    image: descoped/mcp-web-scraper:latest
    ports:
      - "3001:3001"
    environment:
      - BROWSER_POOL_SIZE=5
      - REQUEST_TIMEOUT=30000
      - CONSENT_TIMEOUT=3000
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:3001/health" ]
      interval: 30s
      timeout: 10s
      retries: 3

🧪 Pruebas y Validación

Probar el Servidor Localmente

# 1. Build and start server
npm run build
npm start

# 2. Test health endpoint
curl http://localhost:3001/health

# 3. Test MCP protocol
curl -X POST http://localhost:3001/mcp-request \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

# 4. Run comprehensive test suite
npm test

# 5. Run system validation (Phase 3.6)
npx tsx tests/run-system-validation.ts --help

Probar con Claude Desktop

  1. Configurar Claude Desktop con el JSON anterior
  2. Reiniciar Claude Desktop por completo
  3. Probar en la conversación: "¿Puedes probar el consentimiento de cookies en https://www.bbc.com?"

Validación de Consentimiento de Cookies

# Test cookie consent on 6 representative sites
./test_cookie_consent.sh QUICK

# Test specific regions
./test_cookie_consent.sh SCANDINAVIAN
./test_cookie_consent.sh EUROPEAN

Puntos de Referencia de Rendimiento

  • Extracción de Artículos: 1.8s de tiempo medio de extracción (superando el objetivo de <3s)
  • Sitios Internacionales: 92% de confianza media en 8 sitios de noticias globales
  • Generación de Reglas ML: 83% de tasa de éxito con 88% de confianza
  • Rendimiento de Caché: 73% de tasa de aciertos con 20% de mejora de rendimiento
  • Consentimiento de Cookies: <1s de media, soporte de 30+ idiomas
  • Fiabilidad del Sistema: 91% de fiabilidad de automatización con 99.2% de tiempo de actividad
  • Uso de Memoria: <3GB en total, <150MB por instancia de navegador

📚 Documentación

🔧 Arquitectura

Construido con tecnologías modernas para fiabilidad en producción:

  • TypeScript: Seguridad de tipos completa con mapeo de rutas (importaciones @/) y excelente experiencia de desarrollo
  • Playwright: Automatización de navegador estándar de la industria con 100% de paridad MCP
  • MCP SDK: Implementación oficial del Protocolo de Contexto de Modelo
  • Express.js: Servidor HTTP robusto con soporte de middleware
  • Docker: Contenedorización lista para producción
  • Zod: Validación de esquemas en tiempo de ejecución para todas las entradas
  • SQLite: Caché persistente e inteligencia entre sesiones

Mejoras Técnicas Recientes (enero de 2025)

  • 🔧 Mapeo de Rutas TypeScript: Eliminó importaciones relativas profundamente anidadas con rutas limpias @/
  • 🗑️ Limpieza de Código Heredado: Eliminó sistemas y artefactos obsoletos de la Fase 3.5/3.5.1
  • 🔒 Encapsulación Adecuada: Corrigió violaciones de acceso a propiedades privadas con métodos de API públicos
  • 🧪 Pruebas Mejoradas: Mejoró el rendimiento y la mantenibilidad de la suite de pruebas
  • 🎯 Validación del Sistema: Pipeline de validación unificado de la Fase 3.6 usando herramientas MCP de producción
  • 📁 Arquitectura Limpia: Separación clara entre código de producción (src/) y de pruebas (tests/)

🏢 Plataforma Global Lista para Producción

Funciones Empresariales y Fiabilidad

  • Detección de Múltiples Niveles: Sistema de respaldo Internacional → Noruego → Universal → Emergencia
  • Optimización Regional: Estrategias adaptativas para contenido escandinavo, europeo, americano e internacional
  • Garantía de Calidad: 15+ métricas con detección de portada y validación de contenido
  • Limitación de Tasa: Algoritmo de cubo de tokens con limitación por conexión
  • Monitoreo de Salud: Endpoints integrales de estado, métricas y analíticas
  • Apagado Elegante: Manejo de SIGTERM con limpieza de recursos y gestión de navegadores
  • Recuperación de Errores: Reinicio automático del navegador, resiliencia de conexión y respaldo de emergencia

Inteligencia y Automatización

  • Optimización impulsada por ML: Generación automática de reglas con una tasa de éxito del 83% y una confianza del 88%
  • Marco de pruebas A/B: Validación estadística con pruebas t de dos muestras y análisis de significancia
  • Aprendizaje entre sesiones: Precisión de recomendación del 89% con inteligencia persistente basada en SQLite
  • Líneas base de rendimiento: Calibración continua y recomendaciones de optimización
  • Inteligencia de caché: Tasa de aciertos del 73% con detección de firmas HTML y optimización automática

Monitoreo y observabilidad

  • Panel en tiempo real: Analíticas en vivo en /dashboard con más de 30 métricas y seguimiento de rendimiento
  • API de analíticas: 6 endpoints integrales para rendimiento de reglas, estadísticas de caché y tendencias de calidad
  • Seguimiento de correlación: Los IDs de correlación proporcionados por el cliente fluyen a través de todos los eventos y analíticas
    • Los eventos de progreso SSE incluyen correlation_id para el seguimiento de solicitudes
    • Admite escenarios de procesamiento por lotes y trazado distribuido
    • Perfecto para correlacionar actualizaciones de la interfaz de usuario con operaciones de backend
  • Registro estructurado: Registros JSON con IDs de correlación, metadatos de solicitudes y métricas de rendimiento
  • Comprobaciones de salud: Sondas de liveness/readiness compatibles con Kubernetes con estado detallado del sistema
  • Seguimiento de rendimiento: Tiempos de respuesta, tasas de error, uso de recursos y puntuaciones de calidad por correlation_id

🔗 Proyectos relacionados y referencias

Recursos oficiales de MCP

Microsoft Playwright MCP

  • Microsoft Playwright MCP - Servidor MCP oficial de Playwright de Microsoft
  • Comparación de características: Nuestra implementación proporciona una paridad del 100% con las 29 herramientas de Microsoft, además de un manejo superior del consentimiento de cookies
  • Ventajas clave: Soporte de consentimiento de cookies en más de 30 idiomas, monitoreo de producción, seguimiento de progreso en tiempo real

Automatización de navegadores

🌟 ¿Por qué elegir MCP Web Scraper?

Para desarrolladores

  • Cobertura global: Más de 21 sitios en 4 regiones con sistemas de respaldo inteligentes
  • Impulsado por ML: Éxito del 83% en la generación automática de reglas con validación estadística
  • Seguridad de tipos: Soporte completo de TypeScript con esquemas integrales y validación en tiempo de ejecución
  • Nativo de MCP: Construido específicamente para el Model Context Protocol con cumplimiento del 100%
  • Probado en batalla: Comprobado en sitios de noticias internacionales y plataformas de contenido
  • 🏆 Automatización completa: Las 29 herramientas de Microsoft Playwright MCP + características especializadas

Para empresas

  • Listo para empresas: Automatización de ML, caché persistente y monitoreo integral
  • Escala global: Soporte multirregional con estrategias adaptativas y garantía de calidad
  • Rendimiento optimizado: Extracción promedio de 1.8s con una tasa de aciertos de caché del 73%
  • Inteligente: Aprendizaje entre sesiones con una precisión de recomendación del 89%
  • Cumplimiento: Maneja automáticamente el consentimiento de cookies GDPR en más de 30 idiomas
  • Confiable: Confiabilidad de automatización del 91% con un tiempo de actividad del sistema del 99.2%

Para aplicaciones de IA

  • Extracción inteligente: Detección de contenido impulsada por ML con puntuación de calidad
  • Analíticas en tiempo real: Panel en vivo con más de 30 métricas y seguimiento de rendimiento
  • Automatización avanzada: Pruebas A/B, optimización automática y recuperación de emergencia
  • Inteligencia estructurada: JSON limpio y validado con metadatos integrales
  • Transmisión de contenido: Procesa el contenido a medida que se extrae con notificaciones de progreso
  • 🏆 Plataforma de producción: Extracción completa de contenido global con confiabilidad empresarial

Ventajas clave sobre alternativas

  • ✅ Inteligencia de ML: Generación y optimización automática de reglas (característica única)
  • ✅ Cobertura global: Sitios internacionales + plataformas de contenido con optimización regional
  • ✅ Aprendizaje persistente: Inteligencia entre sesiones con backend SQLite
  • ✅ Analíticas en tiempo real: Panel en vivo y monitoreo integral
  • ✅ Garantía de calidad: Más de 15 métricas con detección y validación de portada
  • ✅ Automatización completa: Cero intervención manual con validación estadística
  • ✅ Código limpio: Mapeo de rutas de TypeScript, encapsulación adecuada, arquitectura sin código heredado
  • ✅ Pruebas de producción: Validación unificada de la fase 3.6 utilizando herramientas reales de producción de MCP

¿Listo para extraer contenido de cualquier sitio web? ¡Comienza con la guía de inicio rápido anterior!

🤝 Contribuciones

  1. Haz un fork del repositorio
  2. Crea una rama de características: git checkout -b feature/amazing-feature
  3. Realiza los cambios: git commit -am 'Add amazing feature'
  4. Sube a la rama: git push origin feature/amazing-feature
  5. Abre una solicitud de extracción (Pull Request)

Para preguntas, problemas o contribuciones, visita nuestro repositorio de GitHub.

📝 Licencia

Este proyecto está licenciado bajo la Licencia MIT: consulta el archivo LICENSE para más detalles.