Red Bee MCP Server
Un servidor MCP para la plataforma OTT de Red Bee Media, que ofrece herramientas para autenticación, búsqueda de contenido, gestión de usuarios, compras y operaciones del sistema.
Documentación
Red Bee MCP Server
Servidor de Protocolo de Contexto de Modelo (MCP) para la plataforma OTT de Red Bee Media
Conéctate a los servicios de streaming de Red Bee Media desde clientes compatibles con MCP como Claude Desktop, o intégralo mediante HTTP/SSE para aplicaciones web. Este servidor proporciona 65 herramientas alineadas con la Exposure API para autenticación, búsqueda de catálogo, recomendaciones, gestión de usuarios, compras y operaciones del sistema.
🆕 Nuevo: Modo HTTP/SSE
La versión 1.5.0 alinea las herramientas con la Exposure API actual y admite múltiples modos de funcionamiento:
- Modo Stdio (original): Para agentes de IA locales como Claude Desktop
- Modo HTTP: API REST con JSON-RPC para integración web
- Modo SSE: Eventos enviados por el servidor (Server-Sent Events) para comunicación en tiempo real
- Ambos modos: Ejecutar stdio y HTTP simultáneamente
🚀 Inicio rápido
Opción 1: Usando uvx (recomendado)
# Test the server
uvx redbee-mcp --help
# Stdio mode (original)
uvx redbee-mcp --stdio --customer YOUR_CUSTOMER --business-unit YOUR_BU
# HTTP mode (new)
uvx redbee-mcp --http --customer YOUR_CUSTOMER --business-unit YOUR_BU
# Both modes simultaneously
uvx redbee-mcp --both --customer YOUR_CUSTOMER --business-unit YOUR_BU
Opción 2: Usando pip
pip install redbee-mcp
# Same usage as uvx, but with redbee-mcp command
redbee-mcp --http --customer YOUR_CUSTOMER --business-unit YOUR_BU
📋 Configuración
Para Claude Desktop (modo Stdio)
Añade a tu archivo de configuración MCP de Claude Desktop:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"redbee-mcp": {
"command": "uvx",
"args": ["redbee-mcp", "--stdio"],
"env": {
"REDBEE_CUSTOMER": "CUSTOMER_NAME",
"REDBEE_BUSINESS_UNIT": "BUSINESS_UNIT_NAME"
}
}
}
}
Para aplicaciones web (modo HTTP)
Inicia el servidor HTTP:
redbee-mcp --http --customer YOUR_CUSTOMER --business-unit YOUR_BU
El servidor estará disponible en http://localhost:8000 con estos endpoints:
| Método | URL | Descripción |
|---|---|---|
| GET | / | Información de la API |
| GET | /health | Comprobación de estado del servidor |
| POST | / | Solicitudes MCP JSON-RPC |
| GET | /sse | Flujo de eventos enviados por el servidor |
🌐 Uso de la API HTTP/SSE
Ejemplos de solicitudes HTTP
Comprobación de estado
curl http://localhost:8000/health
Listar herramientas disponibles
curl -X POST http://localhost:8000/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/list",
"id": "1"
}'
Buscar contenido
curl -X POST http://localhost:8000/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "search_content_v2",
"arguments": {
"query": "french films",
"types": "MOVIE",
"pageSize": 5
}
},
"id": "search-1"
}'
Ejemplo de integración web
class RedBeeMCPClient {
constructor(baseUrl = 'http://localhost:8000') {
this.baseUrl = baseUrl;
}
async callTool(toolName, arguments) {
const response = await fetch(this.baseUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method: 'tools/call',
params: { name: toolName, arguments },
id: Date.now().toString()
})
});
return response.json();
}
async searchContent(query, options = {}) {
return this.callTool('search_content_v2', {
query,
types: options.types || 'MOVIE,TV_SHOW',
pageSize: options.pageSize || 10,
...options
});
}
}
// Usage
const mcp = new RedBeeMCPClient();
const results = await mcp.searchContent('comedy movies');
Eventos enviados por el servidor
Conéctate al flujo de eventos en tiempo real:
const eventSource = new EventSource('http://localhost:8000/sse');
eventSource.onmessage = function(event) {
const data = JSON.parse(event.data);
console.log('Event received:', data.type);
if (data.type === 'welcome') {
console.log('Connected with client ID:', data.client_id);
} else if (data.type === 'tools') {
console.log('Available tools:', data.tools.length);
}
};
🔧 Variables de entorno
| Variable | Obligatoria | Descripción | Ejemplo |
|---|---|---|---|
REDBEE_CUSTOMER | ✅ Sí | Identificador de cliente de Red Bee | CUSTOMER_NAME |
REDBEE_BUSINESS_UNIT | ✅ Sí | Unidad de negocio de Red Bee | BUSINESS_UNIT_NAME |
REDBEE_EXPOSURE_BASE_URL | ❌ No | URL base de la API | https://exposure.api.redbee.live |
REDBEE_USERNAME | ❌ No | Nombre de usuario para autenticación | user@example.com |
REDBEE_PASSWORD | ❌ No | Contraseña para autenticación | password123 |
REDBEE_SESSION_TOKEN | ❌ No | Token de sesión existente | eyJhbGciOiJIUzI1... |
REDBEE_DEVICE_ID | ❌ No | Identificador de dispositivo | web-browser-123 |
REDBEE_CONFIG_ID | ❌ No | ID de configuración | sandwich |
REDBEE_TIMEOUT | ❌ No | Tiempo de espera de solicitud en segundos | 30 |
Herramientas disponibles
Alineadas con Exposure API 1.0.0 (OAS 3.1).
Autenticación
login_user- Iniciar sesión mediantePOST /v3/.../auth/logincreate_anonymous_session- Sesión anónima mediantePOST /v2/.../auth/anonymousvalidate_session_token- Validar sesión medianteGET /v2/.../auth/sessionlogout_user- Cerrar sesión medianteDELETE /v2/.../auth/loginrequest_password_reset- Enviar un correo de restablecimiento medianteGET /v2/.../user/password/reset/{username}
Contenido
get_public_asset_details- Recurso público por ID o slugsearch_content_v2- Búsqueda de texto libre incluyendo descripcionesget_asset_details- Detalles del recurso (sesión anónima si es necesario)get_playback_info- Derecho de reproducción medianteGET /v2/.../entitlement/{assetId}/playentitle_asset- Otorgar derecho al usuario sobre un recursosearch_assets_autocomplete- Autocompletado de títulosget_epg_for_channel- EPG para un canal (admite slugs)get_epg_all_channels- EPG para todos los canalesget_episodes_for_season- Temporada por ID o slugget_season_episodes- Episodios de la temporada N de una serieget_assets_by_tag- Etiquetas únicas referenciadas por los recursoslist_tags/get_tag- Catálogo de etiquetaslist_assets- Listado del catálogo principalsearch_multi_v3- Búsqueda por prefijo en recursos y etiquetasget_asset_collection_entries- Entradas de colecciónget_asset_thumbnail- URL de miniatura (redirección 307)get_seasons_for_series- Temporadas de una serie de TVget_next_episode/get_previous_episode- Episodios adyacentes
Descubrimiento
get_watch_next- Lista "ver a continuación" (funciona sin iniciar sesión)get_user_recommendations- Recomendaciones personalizadasget_continue_watching- Carril "continuar viendo"get_last_viewed_offset- Marcadores de reproducciónget_continue_tvshow- Episodio en curso de una serie
Gestión de usuarios
signup_user- Crear cuenta (emailAddressse convierte en nombre de usuario)change_user_password/change_user_emailget_user_details/update_user_detailsget_user_profiles/add_user_profile/select_user_profileupdate_user_profile/delete_user_profileget_user_preferences/set_user_preferencesget_preference_list/add_asset_to_list/remove_asset_from_list- favoritos / listas de seguimiento
Compras
get_account_purchases/get_account_transactions/get_active_purchasesget_offerings- Ofertas para un país (detectado por IP si se omite)initialize_purchase- Tipos de pago y precio con descuento (experimental)purchase_product_offering/cancel_purchase_subscriptionget_stored_payment_methods/add_payment_method/delete_payment_methodget_account_products- Productos con derecho vs. sin derecho
Sistema
get_system_config-GET /v2/.../system/configget_system_time-GET /v2/timeget_user_location-GET /v2/locationget_active_channels/get_channel_onnow- Estado de canales en vivoget_user_devices/delete_user_deviceget_client_config- Páginas y componentes de marca blancaget_document- Política de privacidad, términos, documentos de consentimiento
🧪 Pruebas
Probar el servidor HTTP
# Start the server
redbee-mcp --http --customer DEMO --business-unit DEMO
# In another terminal, run the test script
python example_usage.py
Probar el modo Stdio
# Using uvx
REDBEE_CUSTOMER=CUSTOMER_NAME REDBEE_BUSINESS_UNIT=BUSINESS_UNIT_NAME uvx redbee-mcp --stdio
# Using pip installation
REDBEE_CUSTOMER=CUSTOMER_NAME REDBEE_BUSINESS_UNIT=BUSINESS_UNIT_NAME redbee-mcp --stdio
Probar el protocolo MCP manualmente
# Initialize and list tools
echo '{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {"protocolVersion": "2024-11-05", "capabilities": {"roots": {"listChanged": true}}, "clientInfo": {"name": "test", "version": "1.0.0"}}}
{"jsonrpc": "2.0", "method": "notifications/initialized"}
{"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}' | uvx redbee-mcp --stdio
🏗️ Arquitectura
Diseño multimodo
El servidor está diseñado con una separación clara de responsabilidades:
- McpHandler: Lógica de negocio principal compartida entre todos los modos
- Servidor Stdio: Interfaz MCP stdio tradicional para agentes de IA
- Servidor HTTP: Interfaz REST/SSE basada en FastAPI para aplicaciones web
- CLI: Interfaz de línea de comandos multimodo
Estructura de archivos
src/redbee_mcp/
├── handler.py # Core business logic
├── server.py # Stdio MCP server
├── http_server.py # HTTP/SSE server
├── cli.py # Multi-mode CLI
├── models.py # Data models
└── tools/ # Tool modules
├── _common.py
├── auth.py
├── content.py
├── discovery.py
├── purchases.py
├── system.py
└── user_management.py
📖 Ejemplos de uso
Buscar películas francesas (modo Stdio)
Pregunta a tu asistente de IA:
"Busca documentales franceses sobre naturaleza"
Buscar contenido (modo HTTP)
const mcp = new RedBeeMCPClient();
const results = await mcp.searchContent('french documentaries', {
types: 'MOVIE',
locale: ['fr'],
pageSize: 10
});
Obtener información de un programa de TV
# First search for a TV show
{
"query": "Game of Thrones",
"types": "TV_SHOW"
}
# Then get its seasons
{
"assetId": "tv-show-asset-id"
}
Autenticación de usuario
{
"username": "user@example.com",
"password": "password123",
"remember_me": true
}
🚀 Despliegue en producción
Docker
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -e .
EXPOSE 8000
# HTTP mode
CMD ["redbee-mcp", "--http", "--host", "0.0.0.0", "--port", "8000"]
Configuración del entorno
export REDBEE_CUSTOMER="your-customer"
export REDBEE_BUSINESS_UNIT="your-business-unit"
export REDBEE_EXPOSURE_BASE_URL="https://exposure.api.redbee.live"
Servicio Systemd
# /etc/systemd/system/redbee-mcp-http.service
[Unit]
Description=Red Bee MCP HTTP Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/opt/redbee-mcp
Environment=REDBEE_CUSTOMER=your-customer
Environment=REDBEE_BUSINESS_UNIT=your-business-unit
ExecStart=/usr/local/bin/redbee-mcp --http --host 0.0.0.0 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
🔒 Consideraciones de seguridad
Configuración de CORS
Para despliegues HTTP en producción, configura CORS correctamente en http_server.py:
self.app.add_middleware(
CORSMiddleware,
allow_origins=["https://yourdomain.com"], # Specify allowed domains
allow_credentials=True,
allow_methods=["GET", "POST"],
allow_headers=["Content-Type"],
)
📝 Referencia de la API
El Red Bee MCP Server proporciona acceso a la Exposure API de Red Bee Media mediante:
- Herramientas MCP: Para agentes de IA y aplicaciones locales
- HTTP/JSON-RPC: Para aplicaciones web e integración remota
- Eventos enviados por el servidor: Para actualizaciones en tiempo real
Cada herramienta incluye:
- Validación de entrada con parámetros obligatorios y opcionales
- Manejo integral de errores y mensajes
- Seguridad de tipos para todas las entradas y salidas
- Documentación detallada y ejemplos
🛠️ Desarrollo
Requisitos
- Python 3.8+
- SDK de MCP
- pydantic para validación de datos
- FastAPI y uvicorn para el modo HTTP
Desarrollo local
# Clone and install
git clone https://github.com/tamsibesson/redbee-mcp
cd redbee-mcp
pip install -e .
# Run in development mode
PYTHONPATH=src python -m redbee_mcp --http --customer TEST --business-unit TEST
📄 Licencia
Licencia MIT: consulta el archivo LICENSE para más detalles.
🆘 Soporte
Para problemas y preguntas:
- Problemas en GitHub: https://github.com/tamsibesson/redbee-mcp/issues
- Documentación de Red Bee Media: https://exposure.api.redbee.live/docs/index.html