Rompe la caja de cristal de tu IA. Conéctala a la VIDA Vistas: 8

Recordarás que en el episodio anterior estuvimos analizando tres pilares que cambian por completo las reglas del juego cuando trabajamos con modelos de lenguaje locales: el RAG (esa memoria que le inyectamos a la IA), las habilidades y las herramientas. Fue un episodio bastante denso, y donde la verdad, bajé poco a la arena. Hoy no nos vamos a quedar en la superficie de la teoría abstracta, hoy quiero ver con detalle que es esto de los MCP y que opciones y posibilidaes ofrece. Nos vamos a arremangar para ver cómo funciona todo esto en el mundo real mediante un caso práctico y sumamente cotidiano: conseguir que nuestra IA local nos diga qué tiempo hace fuera, pero haciéndolo de forma inteligente, rápida y con un consumo mínimo de recursos. Y es que, el secreto no es solo tener un modelo de lenguaje potente corriendo en nuestro servidor, sino saber cómo comunicarlo con el exterior de forma eficiente.

0:00 / 0:00

El Gran Límite de los Modelos de Lenguaje: Cerebros en una Caja de Cristal

Para entender por qué necesitamos tecnologías como el Model Context Protocol (MCP), primero debemos comprender la naturaleza de los LLMs (Large Language Models). Cuando descargas un modelo como Qwen, Llama o DeepSeek y lo ejecutas en tu máquina local usando Ollama, lo que tienes es un cerebro increíblemente brillante, dotado de una base de conocimiento gigantesca capaz de razonar, programar y redactar textos maravillosos. Sin embargo, este cerebro está congelado en el tiempo. Sabe todo lo que ocurrió hasta el momento exacto en que finalizó su fase de entrenamiento, pero no tiene la más mínima idea de lo que está sucediendo ahora mismo.

Si a un modelo local «puro» le preguntas qué temperatura hace hoy en Valencia o en tu pueblo, se verá obligado a responderte que carece de acceso a datos en tiempo real, o peor aún, intentará inventarse una respuesta plausible basándose en datos históricos (lo que técnicamente conocemos como alucinación). El modelo está completamente desconectado del mundo exterior. Es un sabio encerrado en un búnker de hormigón sin ventanas.

Para solucionar esta desconexión extrema, tradicionalmente se ha recurrido a dos enfoques:

  1. La búsqueda web en tiempo real (Web Search / RAG Web): La interfaz o el sistema que envuelve al modelo busca en internet, extrae el contenido de varias páginas web, lo junta todo en un bloque inmenso de texto y se lo inyecta al modelo de lenguaje para que este lo resuma.
  2. Las APIs personalizadas: Desarrollar integraciones específicas en el backend de nuestra aplicación para que, cuando el usuario escriba una palabra clave (como «tiempo»), el sistema haga una consulta a un servicio meteorológico y le muestre los datos al usuario de forma paralela.

Aunque ambos enfoques funcionan, presentan graves inconvenientes. La búsqueda web genérica consume una cantidad ingente de tokens de contexto (como veremos más adelante), ralentiza la respuesta y suele traer consigo toneladas de código HTML y basura publicitaria innecesaria. Por otro lado, desarrollar integraciones de API personalizadas para cada nueva funcionalidad que queramos darle a nuestra IA es un trabajo titánico, rígido y muy difícil de mantener cuando cambiamos de modelo de lenguaje. Aquí es donde surge la necesidad de un protocolo estandarizado, un «enchufe universal» para la IA.

¿Qué es el Model Context Protocol (MCP)? El Enchufe Universal de la IA

Desarrollado originalmente para estandarizar la forma en que los asistentes de inteligencia artificial interactúan con las fuentes de datos y las herramientas locales, el Model Context Protocol (MCP) es un protocolo abierto que actúa como un puente de comunicación bidireccional entre tres elementos fundamentales:

  • El Cliente MCP: La interfaz de usuario o el entorno que interactúa con el usuario (por ejemplo, Open Web UI, Claude Desktop o tu propio agente personalizado desarrollado en Python o Rust).
  • El Modelo de Lenguaje (LLM): El motor de inferencia que procesa el lenguaje natural y toma decisiones sobre qué herramientas utilizar.
  • El Servidor MCP: Un pequeño servicio independiente que expone una serie de herramientas, recursos o sistemas de consulta estructurados.

La magia de MCP radica en su capacidad de autodescripción. Cuando el cliente conecta con un servidor MCP, este último le envía un manifiesto con un listado detallado de todas las herramientas que tiene disponibles, junto con sus descripciones en formato JSON Schema. Por ejemplo, el servidor MCP Weather le dice al cliente: «Tengo una herramienta llamada get_current_weather que acepta un parámetro city de tipo texto y sirve para obtener la temperatura y humedad actuales».

Cuando el usuario escribe en el chat: «Lorenzo, dime si hace frío hoy en Madrid», el LLM analiza la frase, busca en el listado de herramientas disponibles y detecta que get_current_weather encaja perfectamente con la petición. El modelo genera de forma autónoma una llamada estructurada, el cliente la ejecuta contra el servidor MCP, y este último devuelve los datos exactos. El modelo interpreta esos datos y redacta una respuesta amigable para el usuario. Todo esto ocurre de forma transparente, rápida y sin que hayamos tenido que programar una lógica rígida de detección de palabras clave en nuestra aplicación de chat.

La Batalla del Contexto: Ahorro Extremo de Tokens

Uno de los aspectos más críticos al trabajar con inteligencia artificial, ya sea con APIs comerciales de pago o con modelos ejecutados de forma local en tu propio hardware, es la gestión del contexto y el consumo de tokens. Cada palabra, carácter o fragmento de código que le enviamos al modelo de lenguaje consume «tokens» de su ventana de contexto. Cuantos más tokens enviemos, más memoria VRAM consumirá nuestro sistema local, más lenta será la respuesta y, si usamos servicios en la nube (como DeepSeek-V4-Flash a través de OpenRouter, cuyo coste es de apenas $0.1 por millón de tokens), más dinero gastaremos.

Comparemos detalladamente qué ocurre bajo el capó en los dos escenarios de consulta meteorológica:

Escenario A: Búsqueda Web Tradicional (Scraping)

Cuando el sistema realiza una búsqueda web genérica para saber el tiempo, el flujo es el siguiente:

  1. El sistema busca en Google o DuckDuckGo «tiempo en Valencia hoy».
  2. Descarga el HTML completo de los primeros tres resultados.
  3. El HTML de una sola página de meteorología puede superar fácilmente las 150.000 líneas de código, repletas de scripts de seguimiento, publicidad, hojas de estilo CSS y menús de navegación.
  4. Aunque el sistema intente «limpiar» el texto para quedarse solo con el contenido legible, el volumen de datos que finalmente se envía al modelo de lenguaje como contexto puede superar fácilmente los 10.000 o 15.000 tokens.
  5. El modelo debe procesar toda esa inmensidad de texto para acabar abstrayendo un único dato: que en Valencia hace 24.9 grados. El coste computacional y de tiempo es absurdamente ineficiente.

Escenario B: Uso de un Servidor MCP Weather Optimizado

Cuando utilizamos nuestro servidor MCP dedicado, el flujo cambia por completo:

  1. El usuario pregunta por el tiempo de una ciudad.
  2. El LLM decide usar la herramienta del MCP Weather.
  3. El servidor MCP realiza una llamada HTTP súper rápida a un servicio de geolocalización para obtener las coordenadas y, posteriormente, realiza una consulta directa a una API meteorológica que devuelve un JSON limpio.
  4. El servidor MCP procesa ese JSON, elimina cualquier dato redundante o secundario y extrae estrictamente lo que el modelo necesita: temperatura, velocidad del viento, humedad y el estado general del cielo.
  5. El servidor MCP envía al modelo de lenguaje un payload JSON ultra-reducido. El consumo total de contexto para esta consulta es de apenas 50 tokens.

Pasar de 10.000 tokens a 50 tokens es una reducción del 99.5% en el consumo de recursos. Esto no solo significa que tu factura si usas APIs externas se reducirá a prácticamente cero, sino que en local la velocidad de inferencia será instantánea, evitando que tu tarjeta gráfica o tu procesador sufran innecesariamente procesando Gigabytes de paja textual.

¿Por qué Rust para el Desarrollo de MCPs? Rendimiento vs. Comodidad

Si buscas proyectos y ejemplos de servidores MCP en GitHub o en la documentación oficial de Anthropic, verás que la inmensa mayoría de las plantillas y librerías de inicio rápido están escritas en Python o en JavaScript/TypeScript (usando Node.js). Estos lenguajes son maravillosos para prototipar rápido y hacer pruebas de concepto en cuestión de minutos, pero cuando queremos integrar estos servicios en nuestro entorno de producción autohospedado en local, muestran sus debilidades.

El problema de Python en Microservicios Locales

Python es un lenguaje interpretado. Esto significa que cada vez que el sistema necesita arrancar un servidor MCP escrito en Python, debe levantar el intérprete de Python, cargar en memoria todas las dependencias virtuales (que a menudo ocupan cientos de Megabytes en la carpeta venv) y compilar el código al vuelo antes de procesar la primera petición. Esto se traduce en un fenómeno conocido como arranque en frío lento (slow cold start).
Además, el consumo base de memoria RAM de un script de Python sencillo, sin realizar ninguna tarea compleja, rara vez baja de los 50 o 80 Megabytes. Si planeas tener corriendo en tu servidor doméstico diez o quince servidores MCP diferentes para gestionar tus notas, tus tareas, tus calendarios, tus contenedores de Docker y tus búsquedas de YouTube, acabarás desperdiciando varios Gigabytes de memoria RAM únicamente en mantener levantados los entornos de ejecución de Python.

Las Ventajas de Rust: Eficiencia y Latencia Cero

Para evitar este desperdicio de recursos, he optado por desarrollar todos mis servidores MCP utilizando Rust. Rust es un lenguaje de programación compilado directamente a código máquina nativo. No requiere de ninguna máquina virtual ni de un intérprete pesado corriendo de fondo. Las ventajas de esta elección técnica son indiscutibles:

  • Consumo de Memoria Insignificante: Un servidor MCP escrito en Rust y ejecutándose dentro de un contenedor Docker consume apenas 2 o 3 Megabytes de memoria RAM en reposo. Puedes tener decenas de ellos corriendo de forma simultánea en una humilde Raspberry Pi o en un mini PC sin que el sistema lo note lo más mínimo.
  • Arranque Instantáneo: La velocidad de inicialización es de microsegundos. El binario está listo para responder de inmediato en cuanto llega la petición del cliente.
  • Seguridad de Memoria sin Recolector de Basura: Rust garantiza la seguridad de memoria en tiempo de compilación, eliminando por completo los errores de desbordamiento de memoria o referencias nulas que suelen provocar caídas inesperadas en producción.
  • Binarios Estáticos Pequeños: El resultado de la compilación es un único archivo ejecutable de unos pocos Megabytes que contiene absolutamente todo lo necesario para funcionar, lo que facilita enormemente su distribución y empaquetado en contenedores Docker ultra-ligeros.

Iteración Rápida con OpenCode

Podrías pensar que programar en Rust es un proceso lento y farragoso en comparación con la agilidad que ofrece Python. Sin embargo, en el panorama actual esto ya no es así. Utilizando un editor moderno como OpenCode (un entorno de desarrollo libre y local potenciado por IA), el flujo de trabajo es extremadamente ágil.

El secreto consiste en desarrollar un primer «esqueleto» funcional de un servidor MCP en Rust, puliendo todos los detalles del protocolo y asegurando una correcta gestión de errores. Una vez que tienes esa base sólida, puedes utilizar la IA de OpenCode para generar nuevos MCPs de forma casi automática. Solo tienes que decirle: «Toma como referencia el código de mi MCP Weather que tengo en esta carpeta y desarróllame un nuevo servidor MCP para interactuar con mi base de datos SQLite de tareas». La IA comprenderá perfectamente la estructura, las dependencias y la sintaxis de Rust, entregándote un código funcional en cuestión de segundos listo para compilar.

Anatomía de un MCP Weather en Rust: Un Vistazo al Código

Para aquellos que disfrutan entendiendo qué ocurre bajo el capó, analicemos la estructura y el flujo de llamadas de nuestro servidor MCP Weather programado en Rust. El proyecto utiliza un conjunto muy selecto de librerías (crates) del ecosistema de Rust:

  • Tokio: El motor de ejecución asíncrono estándar en Rust, indispensable para gestionar peticiones de red concurrentes de forma ultra-eficiente.
  • Serde (y Serde JSON): La librería reina para la serialización y deserialización de datos en Rust. Se encarga de transformar las estructuras de datos nativas de Rust en cadenas de texto JSON y viceversa.
  • Reqwest: Un cliente HTTP rápido y seguro que utilizaremos para realizar las consultas externas a los servicios de geolocalización y meteorología.

El Flujo Bidireccional de Geolocalización y Clima

Una de las particularidades de consultar el tiempo a través de una API es que los usuarios escriben nombres de lugares (por ejemplo, «Valencia», «Madrid», o «Tokio»), pero las APIs meteorológicas de alta precisión no entienden de nombres geográficos, sino de coordenadas matemáticas de latitud y longitud.

Para resolver este problema sin complicarle la vida al modelo de lenguaje, nuestro MCP Weather integra un flujo interno compuesto por dos llamadas consecutivas a servicios web completamente libres y abiertos:

  1. Geolocalización con Nominatim (OpenStreetMap):
    Cuando el MCP recibe la orden de buscar el tiempo para la ciudad «Valencia», primero realiza una petición HTTP asíncrona a Nominatim, el motor de búsqueda geográfica de OpenStreetMap. El servidor MCP envía la cadena de texto de la ciudad y Nominatim responde con un JSON que contiene los datos de latitud y longitud correspondientes.
  2. Consulta Meteorológica con Open-Meteo:
    Una vez que el código de Rust ha extraído las coordenadas precisas, realiza de forma inmediata una segunda petición HTTP a la API de Open-Meteo. Open-Meteo es una maravilla para los desarrolladores porque ofrece predicciones meteorológicas globales de alta precisión de forma totalmente gratuita y sin necesidad de registrarse ni generar molestas claves de API (API Keys).

El Filtro de Datos: Entregando Oro en lugar de Carbón

Las respuestas JSON de las APIs meteorológicas suelen ser increíblemente densas y detalladas. Nos devuelven arrays inmensos con temperaturas horarias, presiones atmosféricas a nivel del mar, índices de radiación ultravioleta por minutos y un sinfín de datos técnicos que para una conversación normal no aportan ningún valor.

Si enviáramos ese JSON bruto al modelo de lenguaje, estaríamos desperdiciando miles de tokens de contexto inútilmente. Por ello, una de las funciones más importantes que realiza nuestro MCP en Rust es la limpieza de datos. El código analiza el JSON recibido de Open-Meteo, descarta el 95% de la información irrelevante y construye una estructura de datos minimalista con los parámetros clave:

  • Temperatura actual en grados Celsius.
  • Velocidad y dirección del viento.
  • Porcentaje de humedad relativa.
  • Previsión resumida para las próximas horas o días (si el usuario ha solicitado una previsión a corto plazo).

Esta estructura limpia se serializa de vuelta en un JSON de apenas unas líneas que se entrega al modelo de lenguaje. Gracias a este minucioso trabajo de filtrado, el modelo recibe la información masticada y lista para ser presentada de forma amigable al usuario final.

Resiliencia ante Fallos: La Gestión de Errores

¿Qué ocurre si la conexión a internet se cae, si la API de Open-Meteo está caída, o si el usuario escribe un nombre de ciudad inventado que Nominatim no es capaz de encontrar? En un sistema tradicional mal estructurado, esto provocaría una excepción en el código que colgaría la aplicación o dejaría a la IA respondiendo un mensaje genérico de error que arruinaría la experiencia de usuario.

En nuestro MCP en Rust, todos los posibles puntos de fallo están minuciosamente controlados. Si Nominatim no encuentra la ciudad, el servidor MCP captura el error de forma elegante y le devuelve al modelo de lenguaje un mensaje estructurado en formato JSON que dice: «Error: La ciudad especificada no pudo ser geolocalizada. Por favor, verifica el nombre». Al recibir esta respuesta estructurada, el modelo de lenguaje comprende la situación y le responde amablemente al usuario: «Vaya, parece que no he podido localizar la ciudad de ‘Falsolandia’. ¿Podrías comprobar si está bien escrita para que pueda buscar el tiempo de nuevo?». Esto dota a nuestros agentes de una resiliencia y una naturalidad conversacional asombrosas.

Despliegue Práctico con Docker o Podman

Fieles a la filosofía de autohospedaje y de mantener el servidor limpio y ordenado, el despliegue del servidor MCP Weather se realiza de forma totalmente aislada utilizando contenedores. Esto nos garantiza que no ensuciaremos nuestro sistema operativo anfitrión con dependencias de compilación ni librerías extrañas.

El Dockerfile Multi-Stage: Optimizando el Peso de la Imagen

Para compilar la aplicación en Rust y meterla dentro de una imagen de Docker de forma óptima, utilizamos una técnica conocida como multi-stage build (construcción en varias etapas). El Dockerfile se estructura de la siguiente manera:

  1. Etapa de Compilación (Builder): Utilizamos una imagen oficial de Rust basada en Debian o Alpine. En esta etapa copiamos nuestro código fuente, descargamos las dependencias de red y compilamos la aplicación en modo de optimización máxima (cargo build --release). Esta etapa genera un binario ejecutable optimizado.
  2. Etapa Final de Ejecución (Runtime): En lugar de conservar la pesada imagen de compilación de Rust (que puede superar fácilmente el Gigabyte de tamaño), creamos una nueva etapa partiendo de una imagen base de Linux ultra-ligera y segura como gcr.io/distroless/cc o una imagen limpia de Alpine. Copiamos únicamente el binario compilado en la etapa anterior.

Gracias a esta estrategia multi-stage, la imagen final de nuestro contenedor ocupa apenas unos 15 o 20 Megabytes, está libre de vulnerabilidades de seguridad y no consume recursos del sistema de forma innecesaria.

Integración en systemd con Quadlets de Podman

Para aquellos que hemos dado el salto de Docker a Podman para disfrutar de contenedores sin privilegios de superusuario (rootless), la gestión de servicios mediante Quadlets es una auténtica bendición. Un Quadlet nos permite definir la configuración de nuestro contenedor en un archivo de texto plano muy similar a una unidad de systemd tradicional.

Al colocar nuestro archivo .container en la carpeta correspondiente, el propio systemd se encarga de autogenerar la unidad de servicio, permitiéndonos gestionar el ciclo de vida de nuestro contenedor MCP con los comandos clásicos:

systemctl --user start mcp-weather.service
systemctl --user enable mcp-weather.service

Con esto conseguimos que nuestro servidor MCP se levante de forma automática en cada reinicio del servidor físico, esté perfectamente integrado en los logs del sistema a través de journalctl y corra con la máxima seguridad sin necesidad de privilegios de administrador.

Conexión Paso a Paso en Open Web UI

Una vez que tenemos nuestro contenedor del MCP Weather corriendo en el puerto 3001 de nuestro servidor local, el último paso es conectarlo a nuestra interfaz de usuario. En este caso usaremos Open Web UI, la herramienta reina para gestionar modelos de lenguaje en local.

El procedimiento es sumamente intuitivo y no requiere tocar archivos de configuración complejos:

  1. Inicia sesión en tu instancia de Open Web UI con tu cuenta de administrador.
  2. Haz clic en tu perfil en la esquina inferior izquierda y entra en el panel de Administración.
  3. En el menú de opciones, haz clic en Ajustes y luego desplázate hasta la pestaña de Integraciones.
  4. En el apartado dedicado a MCP, verás un botón para añadir un nuevo servidor.
  5. Rellena los campos con los siguientes datos:
  • Nombre: Weather MCP (o el nombre que prefieras para identificarlo).
  • Tipo: Selecciona el método de conexión HTTP/SSE.
  • URL de Conexión: Introduce la dirección de red donde está corriendo tu contenedor. Si Open Web UI y el MCP están en la misma máquina o red de Docker, puedes usar el nombre del contenedor; de lo contrario, usa la IP local acompañada del puerto y el endpoint de comunicación (por ejemplo, http://localhost:3001/mcp).
  1. Haz clic en Guardar.

¡Y ya está! No hay que hacer nada más. La próxima vez que inicies un chat con cualquier modelo de lenguaje que tengas conectado a tu Open Web UI (ya sea un modelo local a través de Ollama o un modelo externo a través de OpenRouter), verás que al lado de la caja de texto aparece un pequeño icono que indica que el chat tiene acceso a herramientas externas. Si le preguntas al modelo: «¿Necesito coger paraguas hoy si voy a salir en Valencia?», verás cómo el chat muestra una pequeña animación indicando que está llamando a la herramienta get_forecast de tu MCP Weather, recibirá los datos limpios en milisegundos y te dará una respuesta perfectamente razonada y contextualizada con la climatología real de tu ubicación.

El Futuro Inmediato: Persistencia con MCP To Do y RAG Local

Este servidor MCP del tiempo es solo la punta del iceberg de un ecosistema que no para de crecer y que ofrece un abanico de posibilidades sencillamente brutal. Uno de los mayores desafíos a los que nos enfrentamos cuando trabajamos con agentes autónomos de Inteligencia Artificial es el problema de la amnesia de sesión.

Cuando chateas con una IA, en el momento en que cierras la pestaña o inicias una nueva conversación, todo el contexto anterior se borra por completo de la memoria de trabajo del modelo. Si en una conversación le pides que recuerde que mañana tienes que ir al Linux Center o que debes comprar leche, en la siguiente sesión el modelo no tendrá ni la más remota idea de lo que le habías encomendado.

Para solucionar esto de raíz, en el próximo episodio te voy a hablar de un desarrollo que me tiene completamente fascinado: el MCP To Do.

La Magia de MCP To Do con SQLite

Se trata de un servidor MCP escrito igualmente en Rust que tiene como motor de almacenamiento de fondo una base de datos local ligera en SQLite. Mediante este servidor, dotamos a nuestra IA de herramientas para crear, listar, modificar y eliminar tareas pendientes.

La verdadera potencia de este sistema se desata cuando integramos este MCP con un agente conversacional multicanal como Hermes. Hermes nos permite interactuar con nuestra IA no solo desde una interfaz web, sino a través de plataformas de mensajería instantánea cotidianas como Telegram o Matrix. Gracias a la persistencia que nos brinda el MCP To Do, puedes ir caminando por la calle, abrir tu aplicación de Telegram, enviarle un mensaje de voz o de texto a tu agente diciéndole: «Oye, apúntame que mañana tengo que revisar los Quadlets del servidor». El agente procesará tu petición en local, llamará al MCP To Do y guardará la tarea de forma permanente en la base de datos SQLite. Cuando por la noche llegues a casa y le preguntes desde tu cliente de Matrix en el ordenador «¿Qué tareas tengo pendientes para mañana?», el agente consultará la misma base de datos y te mostrará la lista actualizada. Esto es comodidad, privacidad absoluta y control de tus datos llevado al extremo.

Y el camino no termina ahí. En futuros artículos nos adentraremos también en el fascinante mundo del RAG Local, aprendiendo a crear un sistema de indexación inteligente que analice todas nuestras notas personales en formato markdown y las sincronice en tiempo real cada vez que modifiquemos un archivo, permitiéndonos realizar consultas complejas en lenguaje natural sobre toda nuestra base de conocimiento personal, todo ello corriendo de forma 100% local en nuestro propio hardware, sin depender de servicios de terceros como Obsidian Sync o Notion.

Conclusión

Como has podido comprobar a lo largo de este episodio, el Model Context Protocol (MCP) no es solo una especificación técnica de moda; es la pieza del rompecabezas que nos faltaba para conectar la potencia de razonamiento de las inteligencias artificiales con la utilidad práctica de nuestros servicios locales autohospedados. Y hacerlo utilizando Rust nos garantiza que nuestro servidor doméstico seguirá funcionando de forma ligera, eficiente y segura, sin que el consumo de recursos se dispare.

El verdadero peligro de todo esto, te lo digo por experiencia propia, es que una vez que empiezas a cacharrear con MCPs y ves lo ridículamente fácil y útil que es conectar tu IA con el mundo real, se te empiezan a ocurrir ideas nuevas a cada momento. En estas últimas semanas, impulsado por los bajísimos costes de cómputo que ofrece DeepSeek y la comodidad de desarrollo de OpenCode, he estado construyendo un arsenal completo de servidores MCP locales:

  • Uno para gestionar menús de comidas diarios.
  • Otro para consultar recetas de cocina guardadas en local.
  • Un conector para realizar búsquedas web privadas utilizando la instancia local de SearXNG.
  • Un buscador de vídeos de YouTube optimizado que extrae información de forma limpia mediante instancias de Invidious.
  • Y un gestor de calendarios y eventos basado en formatos estándar que permite programar avisos de forma persistente.

Deja una respuesta