Servidor MCP

HumMatch

me.hummatch/hummatch
Medios y contenido Público y accesible MCP 2026-07-28

Qué hace este MCP

Matches singers and groups with songs based on vocal range, voice type, transposition, and karaoke difficulty.

check_song_fit
Score one song for a voice
Score a specific catalog song against a singer's range and explain why it fits or does not, including a suggested key to transpose to. Call this when someone asks whether they can sing a particular song. Resolve the song with search_songs first to get its slug.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['slug', 'rangeLow', 'rangeHigh'], 'properties': {'slug': {'type': 'string', 'description': 'The catalog slug of the song, from search_songs.'}, 'rangeLow': {'type': 'string', 'description': 'Lowest comfortable note, as a note name like "D3" or a raw MIDI number.'}, 'rangeHigh': {'type': 'string', 'description': 'Highest comfortable note, as a note name like "C5" or a raw MIDI number.'}, 'voiceType': {'type': 'string', 'description': 'Optional voice type hint (soprano, mezzo, alto, tenor, baritone, bass). Inferred from the range when omitted.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['slug', 'title', 'artist', 'matchScore', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'reason': {'type': 'string', 'description': 'Plain-language verdict.'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'fitDetails': {'type': 'object', 'properties': {'riskLabel': {'type': 'string', 'description': 'e.g. "May be too high".'}, 'missingRange': {'type': 'boolean'}, 'priorityTier': {'type': 'integer'}, 'toneReliable': {'type': 'boolean'}, 'trustPhrases': {'type': 'array', 'items': {'type': 'string'}}, 'rangeFitLabel': {'type': 'string', 'description': 'e.g. "Comfortable", "Exploratory".'}, 'likelyVoiceFit': {'type': 'string'}, 'familiarityTier': {'type': 'string'}, 'voiceTypeFitLabel': {'type': 'string'}, 'catalogQualityLabel': {'type': 'string'}, 'reviewedSongProfile': {'type': 'boolean'}}, 'description': 'Labels behind the scores.'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}
get_vocal_profile
Build a vocal profile
Turn a singer's vocal range into a normalized HumMatch vocal profile: a persistent Vocal ID, voice type, and tone label. Call this first when you know someone's range and want a profile to reuse across the other HumMatch tools.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['rangeLow', 'rangeHigh'], 'properties': {'rangeLow': {'type': 'string', 'description': 'Lowest comfortable note, as a note name like "D3" or a raw MIDI number.'}, 'rangeHigh': {'type': 'string', 'description': 'Highest comfortable note, as a note name like "C5" or a raw MIDI number.'}, 'voiceType': {'type': 'string', 'description': 'Optional voice type hint (soprano, mezzo, alto, tenor, baritone, bass). Inferred from the range when omitted.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['vocalId', 'rangeLow', 'rangeHigh', 'voiceType'], 'properties': {'vocalId': {'type': 'string', 'description': 'Human-readable profile label, e.g. "Tenor - Balanced tone".'}, 'rangeLow': {'type': 'integer', 'description': 'Lowest comfortable note as MIDI.'}, 'rangeHigh': {'type': 'integer', 'description': 'Highest comfortable note as MIDI.'}, 'toneLabel': {'type': 'string'}, 'voiceType': {'type': 'string'}, 'humProfile': {'type': 'object', 'properties': {'low': {'type': 'integer'}, 'high': {'type': 'integer'}, 'center': {'type': 'integer'}, 'confidence': {'type': 'number', 'description': '0-1. Derived from range input alone is around 0.55.'}, 'timbreLabel': {'type': 'string'}, 'warmthScore': {'type': ['number', 'null']}, 'pitchStability': {'type': 'number'}, 'brightnessScore': {'type': ['number', 'null']}, 'timbreConfidence': {'type': 'number'}}, 'description': 'Underlying measurements. Timbre fields stay null until an actual hum recording has been analyzed.'}}}
group_song_fit
Find songs a group can sing together
Given two or more singers' ranges, find the vocal range they share and the songs that sit inside it. Call this for karaoke night with friends, a duet, a choir or worship team, or any "what can we all sing" question.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['profiles'], 'properties': {'profiles': {'type': 'array', 'items': {'type': 'object', 'required': ['rangeLow', 'rangeHigh'], 'properties': {'id': {'type': 'string', 'description': 'Optional label for this singer, e.g. their name.'}, 'rangeLow': {'type': 'string', 'description': 'Lowest note, as a note name or MIDI number.'}, 'rangeHigh': {'type': 'string', 'description': 'Highest note, as a note name or MIDI number.'}}}, 'minItems': 2, 'description': 'Two or more singers, each with a rangeLow and rangeHigh.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['sharedRange', 'songs'], 'properties': {'songs': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'reason': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'fitLabel': {'type': 'string', 'description': 'e.g. "Group-ready", "Higher-risk".'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'difficulty': {'type': 'string', 'description': 'Label, e.g. "Easy win", "Moderate". Note this is a string here, unlike difficultyScore elsewhere.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'fitsMemberIds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Which supplied singers can sing it, by their id. Shorter than the full group means a partial fit.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}}}}, 'sharedRange': {'type': 'object', 'properties': {'low': {'type': ['integer', 'null']}, 'high': {'type': ['integer', 'null']}, 'lowName': {'type': 'string'}, 'highName': {'type': 'string'}}, 'description': 'The overlap every supplied singer can reach. Null bounds mean no shared range exists.'}}}
recommend_songs
Find songs that fit a voice
Rank the HumMatch catalog for one singer and return the songs they can actually sing, scored for range fit, karaoke difficulty, and voice-type suitability. Call this when someone asks what they should sing, what suits their voice or range, or wants karaoke song suggestions. Returns a ranked list plus named buckets (safest picks, easy wins, crowd pleasers, songs to avoid).
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['rangeLow', 'rangeHigh'], 'properties': {'limit': {'type': 'integer', 'description': 'How many songs to return per bucket (default 12, max 50).'}, 'rangeLow': {'type': 'string', 'description': 'Lowest comfortable note, as a note name like "D3" or a raw MIDI number.'}, 'rangeHigh': {'type': 'string', 'description': 'Highest comfortable note, as a note name like "C5" or a raw MIDI number.'}, 'voiceType': {'type': 'string', 'description': 'Optional voice type hint (soprano, mezzo, alto, tenor, baritone, bass). Inferred from the range when omitted.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['vocalId', 'voiceType', 'matches'], 'properties': {'matches': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Ranked best matches overall.'}, 'vocalId': {'type': 'string'}, 'easyWins': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Comfortable and easy to sing.'}, 'rangeLow': {'type': 'integer'}, 'rangeHigh': {'type': 'integer'}, 'voiceType': {'type': 'string'}, 'bestSafePicks': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Lowest-risk choices.'}, 'groupFriendly': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Work well with other singers.'}, 'confidenceTier': {'type': 'string'}, 'riskyPicksToAvoid': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Scored, but they exceed the comfortable range.'}, 'popularCrowdPleasers': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Well-known songs that still fit.'}}}
search_songs
Search the song catalog
Search HumMatch by song title or artist. Use this to resolve a song someone named into the catalog slug that check_song_fit needs, or to look up a song's measured vocal range. Pass rangeLow/rangeHigh as well to score every result against that voice and get the hits ranked by fit.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['q'], 'properties': {'q': {'type': 'string', 'description': 'Search text: a song title, an artist, or both.'}, 'limit': {'type': 'integer', 'description': 'Maximum results (default 20, max 50).'}, 'rangeLow': {'type': 'string', 'description': 'Optional. Lowest note of the singer, to score and rank the results by fit.'}, 'rangeHigh': {'type': 'string', 'description': 'Optional. Highest note of the singer, to score and rank the results by fit.'}}, 'additionalProperties': False}
Esquema de salida
{'type': 'object', 'required': ['query', 'songs'], 'properties': {'count': {'type': 'integer'}, 'query': {'type': 'string'}, 'songs': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'title', 'artist', 'rangeConfidence'], 'properties': {'url': {'type': 'string', 'description': 'Canonical HumMatch page for the song.'}, 'slug': {'type': 'string', 'description': 'Catalog slug; the identifier check_song_fit takes.'}, 'year': {'type': ['integer', 'null']}, 'genre': {'type': 'string'}, 'title': {'type': 'string'}, 'artist': {'type': 'string'}, 'lowNote': {'type': ['integer', 'null'], 'description': 'Lowest note of the song as a MIDI number.'}, 'highNote': {'type': ['integer', 'null'], 'description': 'Highest note of the song as a MIDI number.'}, 'whyItFits': {'type': 'string'}, 'matchScore': {'type': 'integer', 'description': 'Overall suitability for this voice, 0-100.'}, 'lowNoteName': {'type': 'string', 'description': 'Same as lowNote, as a note name like "G2".'}, 'rangeSource': {'type': 'string', 'description': 'Provenance tag for the range, e.g. "estimated_curated_seed".'}, 'riskWarning': {'type': 'string'}, 'highNoteName': {'type': 'string', 'description': 'Same as highNote, as a note name like "C#5".'}, 'suggestedKey': {'type': 'string', 'description': 'Transposition advice, e.g. "Try a lower key".'}, 'vocalFitScore': {'type': 'integer', 'description': 'How well the song range sits inside the singer range, 0-100.'}, 'likelyVoiceFit': {'type': 'string'}, 'tessituraScore': {'type': 'integer', 'description': 'How comfortable the song sits where the voice spends most time, 0-100.'}, 'difficultyScore': {'type': ['integer', 'null'], 'description': 'Karaoke difficulty, 0-100. Higher is harder.'}, 'rangeConfidence': {'enum': ['manual_research', 'estimated', 'high', 'low', 'unknown'], 'type': 'string', 'description': 'How the range was established, strongest first. "manual_research" was researched against sheet music or a score and is the most trustworthy tier. "estimated" was derived from published sources rather than measured, so present those scores as guidance rather than fact. "high" and "low" are legacy confidence labels. "unknown" means no range data.'}, 'voiceTypeFitScore': {'type': 'integer', 'description': 'Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.'}}}, 'description': 'Results. Scored fields are present only when rangeLow and rangeHigh were supplied.'}}}
Añadido
group_song_fit
17 de September de 2026 a las 12:54
Añadido
check_song_fit
17 de September de 2026 a las 12:54
Añadido
search_songs
17 de September de 2026 a las 12:54
Añadido
recommend_songs
17 de September de 2026 a las 12:54
Añadido
get_vocal_profile
17 de September de 2026 a las 12:54