Skip to main content
Glama

Red Bee MCP Server

Model Context Protocol (MCP) Server for Red Bee Media OTT Platform

Connect to Red Bee Media streaming services from MCP-compatible clients like Claude Desktop, or integrate via HTTP/SSE for web applications. This server provides 65 tools aligned with the Exposure API for authentication, catalog search, recommendations, user management, purchases, and system operations.

PyPI version Python 3.8+

๐Ÿ†• New: HTTP/SSE Mode

Version 1.5.0 aligns tools with the current Exposure API and supports multiple operating modes:

  • Stdio Mode (original): For local AI agents like Claude Desktop

  • HTTP Mode: REST API with JSON-RPC for web integration

  • SSE Mode: Server-Sent Events for real-time communication

  • Both Modes: Run stdio and HTTP simultaneously

Related MCP server: MCP JustWatch Server

๐Ÿš€ Quick Start

# 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

Option 2: Using pip

pip install redbee-mcp

# Same usage as uvx, but with redbee-mcp command
redbee-mcp --http --customer YOUR_CUSTOMER --business-unit YOUR_BU

๐Ÿ“‹ Configuration

For Claude Desktop (Stdio Mode)

Add to your Claude Desktop MCP configuration file:

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"
      }
    }
  }
}

For Web Applications (HTTP Mode)

Start the HTTP server:

redbee-mcp --http --customer YOUR_CUSTOMER --business-unit YOUR_BU

The server will be available at http://localhost:8000 with these endpoints:

Method

URL

Description

GET

/

API information

GET

/health

Server health check

POST

/

JSON-RPC MCP requests

GET

/sse

Server-Sent Events stream

๐ŸŒ HTTP/SSE API Usage

Example HTTP Requests

Health Check

curl http://localhost:8000/health

List Available Tools

curl -X POST http://localhost:8000/ \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "tools/list",
    "id": "1"
  }'

Search Content

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"
  }'

Web Integration Example

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

Connect to real-time event stream:

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);
  }
};

๐Ÿ”ง Environment Variables

Variable

Required

Description

Example

REDBEE_CUSTOMER

โœ… Yes

Red Bee customer identifier

CUSTOMER_NAME

REDBEE_BUSINESS_UNIT

โœ… Yes

Red Bee business unit

BUSINESS_UNIT_NAME

REDBEE_EXPOSURE_BASE_URL

โŒ No

API base URL

https://exposure.api.redbee.live

REDBEE_USERNAME

โŒ No

Username for authentication

user@example.com

REDBEE_PASSWORD

โŒ No

Password for authentication

password123

REDBEE_SESSION_TOKEN

โŒ No

Existing session token

eyJhbGciOiJIUzI1...

REDBEE_DEVICE_ID

โŒ No

Device identifier

web-browser-123

REDBEE_CONFIG_ID

โŒ No

Configuration ID

sandwich

REDBEE_TIMEOUT

โŒ No

Request timeout in seconds

30

Available Tools

Aligned with Exposure API 1.0.0 (OAS 3.1).

Authentication

  • login_user - Login via POST /v3/.../auth/login

  • create_anonymous_session - Anonymous session via POST /v2/.../auth/anonymous

  • validate_session_token - Validate session via GET /v2/.../auth/session

  • logout_user - Logout via DELETE /v2/.../auth/login

  • request_password_reset - Send a reset email via GET /v2/.../user/password/reset/{username}

Content

  • get_public_asset_details - Public asset by ID or slug

  • search_content_v2 - Free-text search including descriptions

  • get_asset_details - Asset details (anonymous session if needed)

  • get_playback_info - Play entitlement via GET /v2/.../entitlement/{assetId}/play

  • entitle_asset - Entitle the user to an asset

  • search_assets_autocomplete - Title autocomplete

  • get_epg_for_channel - EPG for one channel (slugs supported)

  • get_epg_all_channels - EPG for all channels

  • get_episodes_for_season - Season by ID or slug

  • get_season_episodes - Episodes of season N of a series

  • get_assets_by_tag - Unique tags referenced by assets

  • list_tags / get_tag - Tag catalog

  • list_assets - Main catalog listing

  • search_multi_v3 - Prefix search on assets and tags

  • get_asset_collection_entries - Collection entries

  • get_asset_thumbnail - Thumbnail URL (307 redirect)

  • get_seasons_for_series - Seasons of a TV series

  • get_next_episode / get_previous_episode - Adjacent episodes

Discovery

  • get_watch_next - Watch-next list (works without login)

  • get_user_recommendations - Personalized recommendations

  • get_continue_watching - Continue-watching rail

  • get_last_viewed_offset - Playback bookmarks

  • get_continue_tvshow - Episode in progress for a series

User Management

  • signup_user - Create account (emailAddress becomes username)

  • change_user_password / change_user_email

  • get_user_details / update_user_details

  • get_user_profiles / add_user_profile / select_user_profile

  • update_user_profile / delete_user_profile

  • get_user_preferences / set_user_preferences

  • get_preference_list / add_asset_to_list / remove_asset_from_list - favorites / watchlists

Purchases

  • get_account_purchases / get_account_transactions / get_active_purchases

  • get_offerings - Offerings for a country (IP-detected if omitted)

  • initialize_purchase - Payment types and discounted price (experimental)

  • purchase_product_offering / cancel_purchase_subscription

  • get_stored_payment_methods / add_payment_method / delete_payment_method

  • get_account_products - Entitled vs not-entitled products

System

  • get_system_config - GET /v2/.../system/config

  • get_system_time - GET /v2/time

  • get_user_location - GET /v2/location

  • get_active_channels / get_channel_onnow - Live channel status

  • get_user_devices / delete_user_device

  • get_client_config - Whitelabel pages and components

  • get_document - Privacy policy, terms, consent documents

๐Ÿงช Testing

Test HTTP Server

# Start the server
redbee-mcp --http --customer DEMO --business-unit DEMO

# In another terminal, run the test script
python example_usage.py

Test Stdio Mode

# 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

Test MCP Protocol Manually

# 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

๐Ÿ—๏ธ Architecture

Multi-Mode Design

The server is architected with clean separation of concerns:

  • McpHandler: Core business logic shared between all modes

  • Stdio Server: Traditional MCP stdio interface for AI agents

  • HTTP Server: FastAPI-based REST/SSE interface for web apps

  • CLI: Multi-mode command line interface

File Structure

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

๐Ÿ“– Usage Examples

Search for French Movies (Stdio Mode)

Ask your AI assistant:

"Search for French documentaries about nature"

Search for Content (HTTP Mode)

const mcp = new RedBeeMCPClient();
const results = await mcp.searchContent('french documentaries', {
  types: 'MOVIE',
  locale: ['fr'],
  pageSize: 10
});

Get TV Show Information

# First search for a TV show
{
  "query": "Game of Thrones",
  "types": "TV_SHOW"
}

# Then get its seasons
{
  "assetId": "tv-show-asset-id"
}

User Authentication

{
  "username": "user@example.com",
  "password": "password123",
  "remember_me": true
}

๐Ÿš€ Production Deployment

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"]

Environment Setup

export REDBEE_CUSTOMER="your-customer"
export REDBEE_BUSINESS_UNIT="your-business-unit"
export REDBEE_EXPOSURE_BASE_URL="https://exposure.api.redbee.live"

Systemd Service

# /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

๐Ÿ”’ Security Considerations

CORS Configuration

For production HTTP deployments, configure CORS properly in 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"],
)

๐Ÿ“ API Reference

The Red Bee MCP Server provides access to Red Bee Media Exposure API through:

  • MCP Tools: For AI agents and local applications

  • HTTP/JSON-RPC: For web applications and remote integration

  • Server-Sent Events: For real-time updates

Each tool includes:

  • Input validation with required and optional parameters

  • Comprehensive error handling and messages

  • Type safety for all inputs and outputs

  • Detailed documentation and examples

๐Ÿ› ๏ธ Development

Requirements

  • Python 3.8+

  • MCP SDK

  • pydantic for data validation

  • FastAPI and uvicorn for HTTP mode

Local Development

# 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

๐Ÿ“„ License

MIT License - see LICENSE file for details.

๐Ÿ†˜ Support

For issues and questions:

Related MCP Connectors

Related MCP Servers