Skip to main content
Glama
README.md
# Find BGM MCP Server

An MCP server that helps YouTube content creators find perfect background music for their shorts by analyzing script content and recommending tracks from YouTube Music.

## Features

- **Script Analysis**: Analyzes mood, theme, pacing, and sentiment from video scripts
- **Smart Recommendations**: Uses YouTube Music API to find suitable background tracks
- **Duration Filtering**: Ensures recommendations fit your short video length
- **Confidence Scoring**: Ranks recommendations by relevance to your content

## Architecture

The server follows clean architecture principles with modular design:

```text
find_bgm/
├── server.py              # Main server entry point
├── config.py              # Configuration management
├── models.py              # Data models and types
├── script_analyzer.py     # Script analysis logic
├── music_service.py       # YouTube Music API integration
├── tools.py               # MCP tool definitions
└── test_server.py         # Test suite
```

## Installation

1. Install dependencies:

```bash
pip install -r requirements.txt
```

2. (Optional) Set up YouTube Music API access:
   - Follow the [ytmusicapi setup guide](https://ytmusicapi.readthedocs.io/en/stable/setup.html)
   - Create `oauth.json` file in the project directory
   - Without this, the server will use mock recommendations

## Usage

The server provides one main tool: `recommend_background_music`

### Parameters

- `script` (required): Your YouTube short script/content
- `duration` (required): Length of your short in seconds (15-60)
- `genre_preference` (optional): "pop", "electronic", "chill", "rock", "hip-hop", "classical", "ambient", "any"
- `mood_preference` (optional): "upbeat", "calm", "dramatic", "energetic", "relaxed", "motivational", "any"
- `content_type` (optional): "comedy", "educational", "lifestyle", "fitness", "cooking", "travel", "tech", "other"

### Example Response

```json
{
  "analysis": {
    "detected_mood": "motivational",
    "detected_theme": "fitness", 
    "pacing": "medium",
    "sentiment_score": 0.4,
    "keywords": ["workout", "energy", "strong"]
  },
  "recommendations": [
    {
      "title": "Uplifting Corporate Background",
      "artist": "Audio Library",
      "youtube_music_id": "abc123",
      "confidence_score": 0.85,
      "reason": "Strong match for motivational mood and fitness content",
      "duration": 45,
      "loop_suitable": true
    }
  ]
}
```

## Configuration

Customize behavior with environment variables:

```bash
# Logging level
export BGM_LOG_LEVEL=DEBUG

# OAuth file location
export BGM_OAUTH_FILE=my_oauth.json

# Search and recommendation limits
export BGM_MAX_DURATION=240
export BGM_SEARCH_LIMIT=15
```

## YouTube Music API Setup

### Method 1: Browser Authentication (Recommended)

1. Install ytmusicapi: `pip install ytmusicapi`
2. Run: `ytmusicapi browser`
3. Follow prompts to paste browser headers from YouTube Music
4. Save as `oauth.json`

### Method 2: OAuth Setup

1. Create Google Cloud project
2. Enable YouTube Data API v3
3. Create OAuth credentials
4. Run: `ytmusicapi oauth`
5. Complete authentication flow

Without the API, the server works with mock data for testing.

## Running the Server

```bash
python server.py
```

The server runs on stdio and can be integrated with any MCP-compatible client.

## Testing

```bash
# Test all components
python test_server.py

# Test with virtual environment
source venv/bin/activate
python test_server.py
```

## Claude Desktop Integration

Add to your `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "find-bgm": {
      "command": "/path/to/find_bgm/venv/bin/python",
      "args": ["/path/to/find_bgm/server.py"]
    }
  }
}
```

## Components

### ScriptAnalyzer

Analyzes script content to detect mood, theme, and pacing using natural language processing.

### YouTubeMusicService & MusicRecommendationService

Handles YouTube Music API integration and generates scored recommendations.

### BGMTools

MCP tool interface that orchestrates script analysis and music recommendations.

### Configuration Management

Environment-based configuration with sensible defaults and type safety.

## Example Usage

```python
from models import RecommendationRequest
from script_analyzer import ScriptAnalyzer
from music_service import MusicRecommendationService

# Analyze script
analyzer = ScriptAnalyzer()
analysis = analyzer.analyze_script("Your video script here")

# Get recommendations
service = MusicRecommendationService(music_service, config)
recommendations = await service.get_recommendations(
    analysis, "electronic", "upbeat", 30
)
```

The server provides intelligent music recommendations to help creators find the perfect soundtrack for their content! 🎵