MCP, Tiempo Real · · por Michael Wybraniec

Servidores MCP: Conectando IA a Datos en Tiempo Real

Aprende a crear un servidor Model Context Protocol (MCP) usando Python y la API de Open-Meteo para proporcionar datos meteorológicos a modelos de lenguaje como GPT-4 y Claude.

Los servidores MCP están revolucionando la forma en que los modelos de lenguaje interactúan con fuentes de datos externas. Piensa en ellos como plugins sofisticados que extienden las capacidades de la IA más allá de sus datos de entrenamiento. En este tutorial integral, construiremos un servidor MCP meteorológico que conecta Claude, GPT-4, o cualquier LLM a información meteorológica en tiempo real usando Python y la API de Open-Meteo.

Los servidores MCP extienden las capacidades de los modelos de lenguaje conectándolos a fuentes de datos y servicios. Son aplicaciones agnósticas que facilitan la integración con cualquier dato o servicio que puedas imaginar. Piensa en llamadas a funciones, pero las funciones son plugins que pueden hacer virtualmente cualquier cosa.

Los servidores MCP exponen tres primitivas principales:

  • Recursos (controlados por el cliente): Exposición pasiva de datos para contexto
  • Herramientas (controladas por el modelo): Funcionalidad ejecutable para acciones
  • Prompts (controlados por el usuario): Flujos de trabajo reutilizables y plantillas

Los datos meteorológicos proporcionan un excelente ejemplo para el desarrollo de servidores MCP porque demuestran la integración de APIs del mundo real con aplicaciones prácticas. Los modelos de lenguaje sobresalen transformando datos meteorológicos en bruto (temperatura, velocidad del viento, humedad) en descripciones en lenguaje natural y recomendaciones accionables.

Usaremos la API de Open-Meteo porque es:

  • Gratuita para uso no comercial
  • No requiere clave de API
  • Fácilmente configurable a través de parámetros de consulta
  • Perfecta para integración con LLM

Antes de sumergirnos en el código, asegúrate de tener las herramientas necesarias instaladas. Usaremos uv, un gestor de paquetes Python basado en Rust que hace que la gestión de dependencias sea perfecta.

# Crear directorio del proyecto
mkdir mcp-server-weather
cd mcp-server-weather

# Inicializar proyecto uv
uv init

# Crear y activar entorno virtual
uv venv
source .venv/bin/activate

# Instalar dependencias
uv add "mcp[cli]" httpx
  [{"type": "text", "text": "Pronóstico para 40.7128, -74.006:\n\nHoy:\nTemperatura: 66°F\nViento: 13 a 16 mph O\nPrincipalmente Soleado\n---\nEsta Noche:\nTemperatura: 55°F\nViento: 5 a 13 mph O\nParcialmente Nublado\n---\nLunes:\nTemperatura: 71°F\nViento: 8 mph O\nSoleado\n---\nLunes por la Noche:\nTemperatura: 59°F\nViento: 3 a 8 mph O\nPrincipalmente Despejado\n---\nMartes:\nTemperatura: 77°F\nViento: 3 a 7 mph SO\nSoleado\n---\nMartes por la Noche:\nTemperatura: 65°F\nViento: 5 a 8 mph S\nPrincipalmente Despejado\n---\nMiércoles:\nTemperatura: 82°F\nViento: 5 a 12 mph SO\nSoleado\n---\nMiércoles por la Noche:\nTemperatura: 69°F\nViento: 8 a 12 mph SO\nPrincipalmente Despejado\n---\nJueves:\nTemperatura: 85°F\nViento: 7 a 12 mph SO\nPrincipalmente Soleado\n---\nJueves por la Noche:\nTemperatura: 72°F\nViento: 7 a 12 mph SO\nParcialmente Nublado\n---\nViernes:\nTemperatura: 82°F\nViento: 7 a 12 mph SO\nPosibilidad de Chubascos\n---\nViernes por la Noche:\nTemperatura: 70°F\nViento: 7 a 12 mph SO\nPosibilidad de Chubascos\n---\nSábado:\nTemperatura: 76°F\nViento: 9 mph O\nPosibilidad de Chubascos\n---\nSábado por la Noche:\nTemperatura: 67°F\nViento: 6 a 9 mph NO\nPosibilidad de Chubascos\n---", "uuid": "fb196843-938b-4a75-b1a5-b660892f9817"}]

¡Aquí puedes ver una respuesta de la API get-weather de un servidor MCP!

Comienza creando la estructura del servidor. Esto establece la base para nuestro servidor MCP usando FastMCP, que simplifica la creación y gestión de servidores.

FastMCP proporciona una interfaz simplificada para definir herramientas, recursos y prompts. Al aprovechar sus características integradas, puedes enfocarte en implementar funcionalidad sin preocuparte por los detalles de servidor de bajo nivel.

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Inicializar servidor FastMCP
mcp = FastMCP("weather")

# Constantes
OPENMETEO_API_BASE = "https://api.open-meteo.com/v1"
USER_AGENT = "weather-app/1.0"

# Función auxiliar para peticiones API
async def make_openmeteo_request(url: str) -> dict[str, Any] | None:
    """Realizar una petición a la API de Open-Meteo con manejo de errores apropiado."""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/json"
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

if __name__ == "__main__":
    mcp.run(transport='stdio')

Las herramientas son el corazón de los servidores MCP. Exponen funcionalidad ejecutable que los modelos de lenguaje pueden invocar. Nuestra herramienta meteorológica obtendrá las condiciones actuales y pronósticos basados en coordenadas geográficas.

@mcp.tool()
async def get_current_weather(latitude: float, longitude: float) -> str:
    """Obtener el clima actual para una ubicación.

    Args:
        latitude: Latitud de la ubicación
        longitude: Longitud de la ubicación
    """
    
    url = f"{OPENMETEO_API_BASE}/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m,is_day,showers,cloud_cover,wind_speed_10m,wind_direction_10m,pressure_msl,snowfall,precipitation,relative_humidity_2m,apparent_temperature,rain,weather_code,surface_pressure,wind_gusts_10m"
    
    data = await make_openmeteo_request(url)

    if not data:
        return "No se pueden obtener los datos del clima actual para esta ubicación."

    return data

@mcp.tool()
async def get_forecast(latitude: float, longitude: float, days: int = 7) -> str:
    """Obtener el pronóstico meteorológico para una ubicación.

    Args:
        latitude: Latitud de la ubicación
        longitude: Longitud de la ubicación  
        days: Número de días a pronosticar (1-16)
    """
    
    url = f"{OPENMETEO_API_BASE}/forecast?latitude={latitude}&longitude={longitude}&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,wind_speed_10m_max,weather_code&forecast_days={days}"
    
    data = await make_openmeteo_request(url)
    
    if not data:
        return "No se pueden obtener los datos del pronóstico para esta ubicación."
    
    return data

El MCP Inspector proporciona una interfaz basada en web para probar tu servidor antes de integrarlo con modelos de lenguaje. Esta herramienta es invaluable para depuración y validación.

# Iniciar servidor MCP en modo desarrollo
mcp dev server.py

# Abrir navegador en http://localhost:5173
# Conectar al servidor
# Navegar a la pestaña de Herramientas
# Probar get_current_weather con coordenadas
# Ejemplo: latitude=63.4463991, longitude=10.8127596

Al construir servidores MCP, resiste la tentación de formatear los datos devueltos dentro de tus herramientas. En su lugar, devuelve datos en bruto y deja que el modelo de lenguaje los procese y formatee apropiadamente. Este enfoque aprovecha las capacidades de lenguaje natural del LLM mientras mantiene la integridad de los datos.

Mejores Prácticas:

  • Devolver conjuntos de datos completos en lugar de resúmenes filtrados
  • Usar nombres de herramientas descriptivos y documentación
  • Implementar manejo de errores apropiado para fallos de API
  • Mantener las herramientas enfocadas en responsabilidades únicas
  • Aprovechar async/await para mejor rendimiento

Una vez que tengas un servidor meteorológico básico funcionando, considera agregar estas mejoras:

Servicios de Ubicación: Integrar la API de Geocodificación de Open-Meteo para convertir nombres de ciudades a coordenadas, reduciendo la dependencia del LLM para la generación de coordenadas.

Datos Históricos: Agregar herramientas para acceder a patrones meteorológicos históricos y datos climáticos.

Alertas y Advertencias: Implementar monitoreo de alertas meteorológicas para condiciones climáticas severas.

Múltiples Ubicaciones: Soportar peticiones por lotes para comparar el clima entre múltiples ubicaciones.

@mcp.tool()
async def get_location(city: str, country: str = "") -> str:
    """Obtener coordenadas para una ciudad usando geocodificación.
    
    Args:
        city: Nombre de la ciudad
        country: Nombre del país opcional para desambiguación
    """
    
    query = f"{city},{country}" if country else city
    url = f"https://geocoding-api.open-meteo.com/v1/search?name={query}&count=1&language=es&format=json"
    
    data = await make_openmeteo_request(url)
    
    if not data or not data.get('results'):
        return "Ubicación no encontrada."
    
    return data['results'][0]

Tu servidor MCP puede integrarse con varios modelos de lenguaje incluyendo Claude Desktop, GPT-4 a través de clientes compatibles, y otras aplicaciones compatibles con MCP. El servidor se comunica a través de entrada/salida estándar (stdio), haciéndolo universalmente compatible.

Para usar con Claude Desktop, agrega tu configuración de servidor al archivo de configuración MCP, típicamente ubicado en ~/Library/Application Support/Claude/claude_desktop_config.json en macOS.

{
  "mcpServers": {
    "weather": {
      "command": "uv",
      "args": ["run", "python", "server.py"],
      "cwd": "/ruta/a/tu/mcp-server-weather"
    }
  }
}

Construir servidores MCP abre nuevas posibilidades para la integración de IA con fuentes de datos del mundo real. Este servidor meteorológico demuestra conceptos fundamentales que se aplican a cualquier integración de API externa o servicio. El Model Context Protocol representa un paso significativo hacia sistemas de IA más capaces y conectados.

El código fuente completo para este tutorial está disponible en el repositorio de archivos de ejercicios. Experimenta con diferentes APIs, agrega nuevas herramientas, y explora las posibilidades infinitas del desarrollo de servidores MCP.

Michael Wybraniec

Michael Wybraniec

Freelance, Servidores MCP, Desarrollo Full-Stack, Arquitectura