Red Bee MCP Server
Um servidor MCP para a plataforma OTT da Red Bee Media, oferecendo ferramentas para autenticação, busca de conteúdo, gerenciamento de usuários, compras e operações do sistema.
Documentação
Red Bee MCP Server
Servidor de Model Context Protocol (MCP) para a Plataforma OTT da Red Bee Media
Conecte-se aos serviços de streaming da Red Bee Media a partir de clientes compatíveis com MCP, como o Claude Desktop, ou integre via HTTP/SSE para aplicações web. Este servidor fornece 65 ferramentas alinhadas com a Exposure API para autenticação, busca no catálogo, recomendações, gerenciamento de usuários, compras e operações de sistema.
🆕 Novo: Modo HTTP/SSE
Versão 1.5.0 alinha as ferramentas com a Exposure API atual e suporta múltiplos modos de operação:
- Modo Stdio (original): Para agentes de IA locais como o Claude Desktop
- Modo HTTP: API REST com JSON-RPC para integração web
- Modo SSE: Server-Sent Events para comunicação em tempo real
- Ambos os Modos: Execute stdio e HTTP simultaneamente
🚀 Início Rápido
Opção 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
Opção 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
📋 Configuração
Para Claude Desktop (Modo Stdio)
Adicione ao seu arquivo de configuração MCP do 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 Aplicações Web (Modo HTTP)
Inicie o servidor HTTP:
redbee-mcp --http --customer YOUR_CUSTOMER --business-unit YOUR_BU
O servidor estará disponível em http://localhost:8000 com estes endpoints:
| Método | URL | Descrição |
|---|---|---|
| GET | / | Informações da API |
| GET | /health | Verificação de saúde do servidor |
| POST | / | Requisições MCP JSON-RPC |
| GET | /sse | Fluxo de Server-Sent Events |
🌐 Uso da API HTTP/SSE
Exemplos de Requisições HTTP
Verificação de Saúde
curl http://localhost:8000/health
Listar Ferramentas Disponíveis
curl -X POST http://localhost:8000/ \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/list",
"id": "1"
}'
Buscar Conteúdo
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"
}'
Exemplo de Integração 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');
Server-Sent Events
Conecte-se ao fluxo de eventos em tempo 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);
}
};
🔧 Variáveis de Ambiente
| Variável | Obrigatória | Descrição | Exemplo |
|---|---|---|---|
REDBEE_CUSTOMER | ✅ Sim | Identificador de cliente Red Bee | CUSTOMER_NAME |
REDBEE_BUSINESS_UNIT | ✅ Sim | Unidade de negócio Red Bee | BUSINESS_UNIT_NAME |
REDBEE_EXPOSURE_BASE_URL | ❌ Não | URL base da API | https://exposure.api.redbee.live |
REDBEE_USERNAME | ❌ Não | Nome de usuário para autenticação | user@example.com |
REDBEE_PASSWORD | ❌ Não | Senha para autenticação | password123 |
REDBEE_SESSION_TOKEN | ❌ Não | Token de sessão existente | eyJhbGciOiJIUzI1... |
REDBEE_DEVICE_ID | ❌ Não | Identificador de dispositivo | web-browser-123 |
REDBEE_CONFIG_ID | ❌ Não | ID de configuração | sandwich |
REDBEE_TIMEOUT | ❌ Não | Tempo limite de requisição em segundos | 30 |
Ferramentas Disponíveis
Alinhadas com a Exposure API 1.0.0 (OAS 3.1).
Autenticação
login_user- Login viaPOST /v3/.../auth/logincreate_anonymous_session- Sessão anônima viaPOST /v2/.../auth/anonymousvalidate_session_token- Validar sessão viaGET /v2/.../auth/sessionlogout_user- Logout viaDELETE /v2/.../auth/loginrequest_password_reset- Enviar e-mail de redefinição viaGET /v2/.../user/password/reset/{username}
Conteúdo
get_public_asset_details- Ativo público por ID ou slugsearch_content_v2- Busca de texto livre incluindo descriçõesget_asset_details- Detalhes do ativo (sessão anônima se necessário)get_playback_info- Direito de reprodução viaGET /v2/.../entitlement/{assetId}/playentitle_asset- Conceder direito de acesso ao usuário para um ativosearch_assets_autocomplete- Autocompletar títuloget_epg_for_channel- EPG para um canal (slugs suportados)get_epg_all_channels- EPG para todos os canaisget_episodes_for_season- Temporada por ID ou slugget_season_episodes- Episódios da temporada N de uma sérieget_assets_by_tag- Tags únicas referenciadas por ativoslist_tags/get_tag- Catálogo de tagslist_assets- Listagem principal do catálogosearch_multi_v3- Busca por prefixo em ativos e tagsget_asset_collection_entries- Entradas de coleçãoget_asset_thumbnail- URL de miniatura (redirecionamento 307)get_seasons_for_series- Temporadas de uma série de TVget_next_episode/get_previous_episode- Episódios adjacentes
Descoberta
get_watch_next- Lista de assistir em seguida (funciona sem login)get_user_recommendations- Recomendações personalizadasget_continue_watching- Trilha de continuar assistindoget_last_viewed_offset- Marcadores de reproduçãoget_continue_tvshow- Episódio em andamento para uma série
Gerenciamento de Usuários
signup_user- Criar conta (emailAddresstorna-se nome de usuário)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 assistir
Compras
get_account_purchases/get_account_transactions/get_active_purchasesget_offerings- Ofertas para um país (detectado por IP se omitido)initialize_purchase- Tipos de pagamento e preço com desconto (experimental)purchase_product_offering/cancel_purchase_subscriptionget_stored_payment_methods/add_payment_method/delete_payment_methodget_account_products- Produtos com direito vs sem direito
Sistema
get_system_config-GET /v2/.../system/configget_system_time-GET /v2/timeget_user_location-GET /v2/locationget_active_channels/get_channel_onnow- Status de canal ao vivoget_user_devices/delete_user_deviceget_client_config- Páginas e componentes whitelabelget_document- Política de privacidade, termos, documentos de consentimento
🧪 Testes
Testar Servidor HTTP
# Start the server
redbee-mcp --http --customer DEMO --business-unit DEMO
# In another terminal, run the test script
python example_usage.py
Testar 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
Testar 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
🏗️ Arquitetura
Design Multi-Modo
O servidor é arquitetado com separação clara de responsabilidades:
- McpHandler: Lógica de negócio central compartilhada entre todos os modos
- Stdio Server: Interface MCP stdio tradicional para agentes de IA
- HTTP Server: Interface REST/SSE baseada em FastAPI para aplicações web
- CLI: Interface de linha de comando multi-modo
Estrutura de Arquivos
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
📖 Exemplos de Uso
Buscar Filmes Franceses (Modo Stdio)
Pergunte ao seu assistente de IA:
"Busque documentários franceses sobre natureza"
Buscar Conteúdo (Modo HTTP)
const mcp = new RedBeeMCPClient();
const results = await mcp.searchContent('french documentaries', {
types: 'MOVIE',
locale: ['fr'],
pageSize: 10
});
Obter Informações de 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"
}
Autenticação de Usuário
{
"username": "user@example.com",
"password": "password123",
"remember_me": true
}
🚀 Implantação em Produção
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"]
Configuração de Ambiente
export REDBEE_CUSTOMER="your-customer"
export REDBEE_BUSINESS_UNIT="your-business-unit"
export REDBEE_EXPOSURE_BASE_URL="https://exposure.api.redbee.live"
Serviço 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
🔒 Considerações de Segurança
Configuração CORS
Para implantações HTTP em produção, configure o CORS corretamente em 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"],
)
📝 Referência da API
O Red Bee MCP Server fornece acesso à Exposure API da Red Bee Media através de:
- Ferramentas MCP: Para agentes de IA e aplicações locais
- HTTP/JSON-RPC: Para aplicações web e integração remota
- Server-Sent Events: Para atualizações em tempo real
Cada ferramenta inclui:
- Validação de entrada com parâmetros obrigatórios e opcionais
- Tratamento abrangente de erros e mensagens
- Segurança de tipos para todas as entradas e saídas
- Documentação detalhada e exemplos
🛠️ Desenvolvimento
Requisitos
- Python 3.8+
- MCP SDK
- pydantic para validação de dados
- FastAPI e uvicorn para o modo HTTP
Desenvolvimento 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
📄 Licença
Licença MIT - consulte o arquivo LICENSE para detalhes.
🆘 Suporte
Para problemas e dúvidas:
- GitHub Issues: https://github.com/tamsibesson/redbee-mcp/issues
- Documentação da Red Bee Media: https://exposure.api.redbee.live/docs/index.html