get_tracks_by_bpm_range
Filter and retrieve tracks from a rekordbox database based on a specified beats-per-minute range to match tempo requirements for DJ sets or music organization.
Instructions
Get tracks within a specific BPM range.
Args: bpm_min: Minimum BPM bpm_max: Maximum BPM
Returns: List of tracks within the BPM range
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| bpm_min | Yes | ||
| bpm_max | Yes |
Implementation Reference
- rekordbox_mcp/server.py:131-148 (handler)The primary handler for the 'get_tracks_by_bpm_range' tool. Decorated with @mcp.tool() for automatic registration in FastMCP. Implements the core logic by creating SearchOptions and delegating to the database search.@mcp.tool() async def get_tracks_by_bpm_range(bpm_min: float, bpm_max: float) -> List[Dict[str, Any]]: """ Get tracks within a specific BPM range. Args: bpm_min: Minimum BPM bpm_max: Maximum BPM Returns: List of tracks within the BPM range """ if not db: raise RuntimeError("Database not initialized.") search_options = SearchOptions(bpm_min=bpm_min, bpm_max=bpm_max, limit=1000) tracks = await db.search_tracks(search_options) return [track.model_dump() for track in tracks]
- rekordbox_mcp/models.py:151-185 (schema)Pydantic model defining SearchOptions used in the tool handler for input validation and filtering criteria, including bpm_min and bpm_max with range validation.class SearchOptions(BaseModel): """ Search criteria for track queries. """ query: str = Field("", description="General search query") artist: Optional[str] = Field(None, description="Filter by artist name") title: Optional[str] = Field(None, description="Filter by track title") album: Optional[str] = Field(None, description="Filter by album name") genre: Optional[str] = Field(None, description="Filter by genre") key: Optional[str] = Field(None, description="Filter by musical key") bpm_min: Optional[float] = Field(None, ge=0, description="Minimum BPM") bpm_max: Optional[float] = Field(None, ge=0, description="Maximum BPM") rating_min: Optional[int] = Field(None, ge=0, le=5, description="Minimum rating") rating_max: Optional[int] = Field(None, ge=0, le=5, description="Maximum rating") play_count_min: Optional[int] = Field(None, ge=0, description="Minimum play count") play_count_max: Optional[int] = Field(None, ge=0, description="Maximum play count") limit: int = Field(50, ge=1, le=1000, description="Maximum number of results") @field_validator('bpm_max') @classmethod def validate_bpm_range(cls, v, info): """Ensure bpm_max is greater than bpm_min.""" if v and info.data.get('bpm_min') and v < info.data['bpm_min']: raise ValueError('bpm_max must be greater than bpm_min') return v @field_validator('rating_max') @classmethod def validate_rating_range(cls, v, info): """Ensure rating_max is greater than rating_min.""" if v and info.data.get('rating_min') and v < info.data['rating_min']: raise ValueError('rating_max must be greater than rating_min') return v