MCP server by unimelbmdap
encoding-music-mcp
MCP server for analyzing MEI (Music Encoding Initiative) files. Provides tools to extract metadata, analyze musical structure, and understand encoded scores.
Features
- 46 Built-in MEI Files: Bach Inventions, Bartók Mikrokosmos, Morley Canzonets - ready to analyze
- MEI Metadata Extraction: Extract title, composer, editors, analysts, publication dates, and copyright information
- Key Analysis: Detect musical keys with confidence scores using music21
- Interval Analysis: Extract notes, melodic intervals, harmonic intervals, and melodic n-grams using CRIM Intervals
- Simple & Efficient: Tools read directly from disk - no token waste
Documentation
📚 Read the full documentation for:
- Detailed tool reference
- Quick start guides
- MEI file collection details
- Development guides
- API reference
Installation
Prerequisites: This project requires uv to be installed.
Option 1: Quick Start (using uvx)
No cloning required! Add this to your MCP client configuration:
{
"mcpServers": {
"encoding-music-mcp": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/unimelbmdap/encoding-music-mcp.git",
"encoding-music-mcp"
]
}
}
}
Option 2: Local Development
Clone the repository and install dependencies:
git clone https://github.com/unimelbmdap/encoding-music-mcp.git
cd encoding-music-mcp
uv sync
Usage
With Claude Desktop
-
Find your Claude Desktop configuration file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%/Claude/claude_desktop_config.json
- macOS:
-
Add configuration (choose one method):
Method A: Using uvx (no clone needed)
{
"mcpServers": {
"encoding-music-mcp": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/unimelbmdap/encoding-music-mcp.git",
"encoding-music-mcp"
]
}
}
}
Method B: Using local clone
{
"mcpServers": {
"encoding-music-mcp": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/encoding-music-mcp",
"run",
"encoding-music-mcp"
]
}
}
}
-
Restart Claude Desktop
-
Try it out:
- "What MEI files are available?" → Lists all 46 built-in files
- "Tell me about Bach_BWV_0772.mei" → Extracts metadata
- "What key is Bach_BWV_0772.mei in?" → Analyzes key with confidence score
- "Get the melodic intervals for Bach_BWV_0772.mei" → Extracts melodic intervals
- "Find melodic 4-grams in Bach_BWV_0772.mei" → Extracts melodic n-grams
Standalone
Run the server directly:
uv run encoding-music-mcp
Available Tools
list_available_mei_files
Discover all built-in MEI files.
Returns: Dictionary with:
bach_inventions: List of Bach filesbartok_mikrokosmos: List of Bartók filesmorley_canzonets: List of Morley filesall_files: Complete list of all filenames
get_mei_metadata
Extract detailed metadata from a built-in MEI file.
Parameters:
filename(string, required): Name of the MEI file (e.g., "Bach_BWV_0772.mei")
Returns: Dictionary with metadata including:
- Title and work title
- Composer
- MEI editors
- XML editors
- Analysts
- Publication date
- Copyright/availability information
- Application used to create the file
Example output:
{
"title": "Invention No. 1 in C major",
"composer": "Bach, Johann Sebastian",
"mei_editors": ["Freedman, Richard"],
"xml_editors": ["Schölkopf, Tobias"],
"analysts": ["Student, This"],
"publication_date": "2024-11-19"
}
analyze_key
Analyze the musical key of a piece using music21's key detection algorithm.
Parameters:
filename(string, required): Name of the MEI file (e.g., "Bach_BWV_0772.mei")
Returns: Dictionary with:
Key Name: The detected key (e.g., "C major", "a minor")Confidence Factor: Correlation coefficient between 0.0 and 1.0
Example output:
{
"Key Name": "C major",
"Confidence Factor": 0.9451
}
get_notes
Extract all notes from an MEI file using CRIM Intervals.
Parameters:
filename(string, required): Name of the MEI file (e.g., "Bach_BWV_0772.mei")
Returns: Dictionary with:
filename: The input filenamenotes: String representation of the notes dataframe with pitch and octave information
Columns represent individual staves or voice parts. Rows represent measure and beat information as floats.
get_melodic_intervals
Extract melodic intervals from an MEI file using CRIM Intervals.
Parameters:
filename(string, required): Name of the MEI file (e.g., "Bach_BWV_0772.mei")
Returns: Dictionary with:
filename: The input filenamemelodic_intervals: String representation of the melodic intervals dataframe
Columns represent individual staves or voice parts. Rows represent measure and beat information as floats.
get_harmonic_intervals
Extract harmonic intervals from an MEI file using CRIM Intervals.
Parameters:
filename(string, required): Name of the MEI file (e.g., "Bach_BWV_0772.mei")
Returns: Dictionary with:
filename: The input filenameharmonic_intervals: String representation of the harmonic intervals dataframe
Columns represent pairs of voice parts. Rows represent measure and beat information as floats.
get_melodic_ngrams
Extract melodic n-grams from an MEI file using CRIM Intervals.
Parameters:
filename(string, required): Name of the MEI file (e.g., "Bach_BWV_0772.mei")n(integer, optional): Length of the n-grams (default: 4)
Returns: Dictionary with:
filename: The input filenamen: The n-gram length usedmelodic_ngrams: String representation of melodic n-grams dataframe
N-grams are tuples of intervals converted to strings with underscore separators (e.g., "2_-2_3_-1").
Built-in Files
The server includes 46 MEI files:
- 15 Bach Two-Part Inventions (BWV 772-786)
- 19 Bartók Mikrokosmos pieces
- 12 Morley Canzonets from 1595
Use list_available_mei_files() to discover all available files.
Development
The project uses uv for dependency management:
# Install dependencies
uv sync
# Run the server
uv run encoding-music-mcp
# Format code
uv run ruff format .
# Run tests
uv run pytest
# Run tests with verbose output
uv run pytest -v
# Serve documentation locally
uv run mkdocs serve
# Build documentation
uv run mkdocs build
Testing
The project includes comprehensive tests for all tools. See tests/README.md for detailed testing documentation.
Documentation
Documentation is built with MkDocs Material:
# Serve locally at http://localhost:8000
uv run mkdocs serve
# Build static site
uv run mkdocs build
Coming Soon
Additional tools planned:
- Time signature detection
- Pitch histograms and frequency analysis
- Lyrics extraction
- Pattern matching and similarity detection
License
MIT