Skip to main content
Glama

Find songs that fit a voice

recommend_songs
Read-onlyIdempotent

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).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoHow many songs to return per bucket (default 12, max 50).
rangeLowYesLowest comfortable note, as a note name like "D3" or a raw MIDI number.
rangeHighYesHighest comfortable note, as a note name like "C5" or a raw MIDI number.
voiceTypeNoOptional voice type hint (soprano, mezzo, alto, tenor, baritone, bass). Inferred from the range when omitted.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
matchesYesRanked best matches overall.
vocalIdYes
easyWinsNoComfortable and easy to sing.
rangeLowNo
rangeHighNo
voiceTypeYes
bestSafePicksNoLowest-risk choices.
groupFriendlyNoWork well with other singers.
confidenceTierNo
riskyPicksToAvoidNoScored, but they exceed the comfortable range.
popularCrowdPleasersNoWell-known songs that still fit.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changed
    • changedOutput schema / properties / bestSafePicks / items / properties / rangeConfidence / description
      Previous value: -"How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data."New value: +"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."
    • addedOutput schema / properties / bestSafePicks / items / properties / rangeConfidence / enum
      Added value: +[
      +  "manual_research",
      +  "estimated",
      +  "high",
      +  "low",
      +  "unknown"
      +]
    • changedOutput schema / properties / easyWins / items / properties / rangeConfidence / description
      Previous value: -"How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data."New value: +"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."
    • addedOutput schema / properties / easyWins / items / properties / rangeConfidence / enum
      Added value: +[
      +  "manual_research",
      +  "estimated",
      +  "high",
      +  "low",
      +  "unknown"
      +]
    • changedOutput schema / properties / groupFriendly / items / properties / rangeConfidence / description
      Previous value: -"How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data."New value: +"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."
    • addedOutput schema / properties / groupFriendly / items / properties / rangeConfidence / enum
      Added value: +[
      +  "manual_research",
      +  "estimated",
      +  "high",
      +  "low",
      +  "unknown"
      +]
    • changedOutput schema / properties / matches / items / properties / rangeConfidence / description
      Previous value: -"How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data."New value: +"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."
    • addedOutput schema / properties / matches / items / properties / rangeConfidence / enum
      Added value: +[
      +  "manual_research",
      +  "estimated",
      +  "high",
      +  "low",
      +  "unknown"
      +]
    • changedOutput schema / properties / popularCrowdPleasers / items / properties / rangeConfidence / description
      Previous value: -"How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data."New value: +"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."
    • addedOutput schema / properties / popularCrowdPleasers / items / properties / rangeConfidence / enum
      Added value: +[
      +  "manual_research",
      +  "estimated",
      +  "high",
      +  "low",
      +  "unknown"
      +]
    • changedOutput schema / properties / riskyPicksToAvoid / items / properties / rangeConfidence / description
      Previous value: -"How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data."New value: +"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."
    • addedOutput schema / properties / riskyPicksToAvoid / items / properties / rangeConfidence / enum
      Added value: +[
      +  "manual_research",
      +  "estimated",
      +  "high",
      +  "low",
      +  "unknown"
      +]
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "bestSafePicks": {
      +      "description": "Lowest-risk choices.",
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficultyScore": {
      +            "description": "Karaoke difficulty, 0-100. Higher is harder.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "genre": {
      +            "type": "string"
      +          },
      +          "highNote": {
      +            "description": "Highest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "highNoteName": {
      +            "description": "Same as highNote, as a note name like \"C#5\".",
      +            "type": "string"
      +          },
      +          "likelyVoiceFit": {
      +            "type": "string"
      +          },
      +          "lowNote": {
      +            "description": "Lowest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "lowNoteName": {
      +            "description": "Same as lowNote, as a note name like \"G2\".",
      +            "type": "string"
      +          },
      +          "matchScore": {
      +            "description": "Overall suitability for this voice, 0-100.",
      +            "type": "integer"
      +          },
      +          "rangeConfidence": {
      +            "description": "How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data.",
      +            "type": "string"
      +          },
      +          "rangeSource": {
      +            "description": "Provenance tag for the range, e.g. \"estimated_curated_seed\".",
      +            "type": "string"
      +          },
      +          "riskWarning": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "suggestedKey": {
      +            "description": "Transposition advice, e.g. \"Try a lower key\".",
      +            "type": "string"
      +          },
      +          "tessituraScore": {
      +            "description": "How comfortable the song sits where the voice spends most time, 0-100.",
      +            "type": "integer"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "vocalFitScore": {
      +            "description": "How well the song range sits inside the singer range, 0-100.",
      +            "type": "integer"
      +          },
      +          "voiceTypeFitScore": {
      +            "description": "Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.",
      +            "type": "integer"
      +          },
      +          "whyItFits": {
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist",
      +          "rangeConfidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "confidenceTier": {
      +      "type": "string"
      +    },
      +    "easyWins": {
      +      "description": "Comfortable and easy to sing.",
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficultyScore": {
      +            "description": "Karaoke difficulty, 0-100. Higher is harder.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "genre": {
      +            "type": "string"
      +          },
      +          "highNote": {
      +            "description": "Highest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "highNoteName": {
      +            "description": "Same as highNote, as a note name like \"C#5\".",
      +            "type": "string"
      +          },
      +          "likelyVoiceFit": {
      +            "type": "string"
      +          },
      +          "lowNote": {
      +            "description": "Lowest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "lowNoteName": {
      +            "description": "Same as lowNote, as a note name like \"G2\".",
      +            "type": "string"
      +          },
      +          "matchScore": {
      +            "description": "Overall suitability for this voice, 0-100.",
      +            "type": "integer"
      +          },
      +          "rangeConfidence": {
      +            "description": "How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data.",
      +            "type": "string"
      +          },
      +          "rangeSource": {
      +            "description": "Provenance tag for the range, e.g. \"estimated_curated_seed\".",
      +            "type": "string"
      +          },
      +          "riskWarning": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "suggestedKey": {
      +            "description": "Transposition advice, e.g. \"Try a lower key\".",
      +            "type": "string"
      +          },
      +          "tessituraScore": {
      +            "description": "How comfortable the song sits where the voice spends most time, 0-100.",
      +            "type": "integer"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "vocalFitScore": {
      +            "description": "How well the song range sits inside the singer range, 0-100.",
      +            "type": "integer"
      +          },
      +          "voiceTypeFitScore": {
      +            "description": "Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.",
      +            "type": "integer"
      +          },
      +          "whyItFits": {
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist",
      +          "rangeConfidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "groupFriendly": {
      +      "description": "Work well with other singers.",
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficultyScore": {
      +            "description": "Karaoke difficulty, 0-100. Higher is harder.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "genre": {
      +            "type": "string"
      +          },
      +          "highNote": {
      +            "description": "Highest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "highNoteName": {
      +            "description": "Same as highNote, as a note name like \"C#5\".",
      +            "type": "string"
      +          },
      +          "likelyVoiceFit": {
      +            "type": "string"
      +          },
      +          "lowNote": {
      +            "description": "Lowest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "lowNoteName": {
      +            "description": "Same as lowNote, as a note name like \"G2\".",
      +            "type": "string"
      +          },
      +          "matchScore": {
      +            "description": "Overall suitability for this voice, 0-100.",
      +            "type": "integer"
      +          },
      +          "rangeConfidence": {
      +            "description": "How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data.",
      +            "type": "string"
      +          },
      +          "rangeSource": {
      +            "description": "Provenance tag for the range, e.g. \"estimated_curated_seed\".",
      +            "type": "string"
      +          },
      +          "riskWarning": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "suggestedKey": {
      +            "description": "Transposition advice, e.g. \"Try a lower key\".",
      +            "type": "string"
      +          },
      +          "tessituraScore": {
      +            "description": "How comfortable the song sits where the voice spends most time, 0-100.",
      +            "type": "integer"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "vocalFitScore": {
      +            "description": "How well the song range sits inside the singer range, 0-100.",
      +            "type": "integer"
      +          },
      +          "voiceTypeFitScore": {
      +            "description": "Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.",
      +            "type": "integer"
      +          },
      +          "whyItFits": {
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist",
      +          "rangeConfidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "matches": {
      +      "description": "Ranked best matches overall.",
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficultyScore": {
      +            "description": "Karaoke difficulty, 0-100. Higher is harder.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "genre": {
      +            "type": "string"
      +          },
      +          "highNote": {
      +            "description": "Highest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "highNoteName": {
      +            "description": "Same as highNote, as a note name like \"C#5\".",
      +            "type": "string"
      +          },
      +          "likelyVoiceFit": {
      +            "type": "string"
      +          },
      +          "lowNote": {
      +            "description": "Lowest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "lowNoteName": {
      +            "description": "Same as lowNote, as a note name like \"G2\".",
      +            "type": "string"
      +          },
      +          "matchScore": {
      +            "description": "Overall suitability for this voice, 0-100.",
      +            "type": "integer"
      +          },
      +          "rangeConfidence": {
      +            "description": "How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data.",
      +            "type": "string"
      +          },
      +          "rangeSource": {
      +            "description": "Provenance tag for the range, e.g. \"estimated_curated_seed\".",
      +            "type": "string"
      +          },
      +          "riskWarning": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "suggestedKey": {
      +            "description": "Transposition advice, e.g. \"Try a lower key\".",
      +            "type": "string"
      +          },
      +          "tessituraScore": {
      +            "description": "How comfortable the song sits where the voice spends most time, 0-100.",
      +            "type": "integer"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "vocalFitScore": {
      +            "description": "How well the song range sits inside the singer range, 0-100.",
      +            "type": "integer"
      +          },
      +          "voiceTypeFitScore": {
      +            "description": "Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.",
      +            "type": "integer"
      +          },
      +          "whyItFits": {
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist",
      +          "rangeConfidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "popularCrowdPleasers": {
      +      "description": "Well-known songs that still fit.",
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficultyScore": {
      +            "description": "Karaoke difficulty, 0-100. Higher is harder.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "genre": {
      +            "type": "string"
      +          },
      +          "highNote": {
      +            "description": "Highest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "highNoteName": {
      +            "description": "Same as highNote, as a note name like \"C#5\".",
      +            "type": "string"
      +          },
      +          "likelyVoiceFit": {
      +            "type": "string"
      +          },
      +          "lowNote": {
      +            "description": "Lowest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "lowNoteName": {
      +            "description": "Same as lowNote, as a note name like \"G2\".",
      +            "type": "string"
      +          },
      +          "matchScore": {
      +            "description": "Overall suitability for this voice, 0-100.",
      +            "type": "integer"
      +          },
      +          "rangeConfidence": {
      +            "description": "How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data.",
      +            "type": "string"
      +          },
      +          "rangeSource": {
      +            "description": "Provenance tag for the range, e.g. \"estimated_curated_seed\".",
      +            "type": "string"
      +          },
      +          "riskWarning": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "suggestedKey": {
      +            "description": "Transposition advice, e.g. \"Try a lower key\".",
      +            "type": "string"
      +          },
      +          "tessituraScore": {
      +            "description": "How comfortable the song sits where the voice spends most time, 0-100.",
      +            "type": "integer"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "vocalFitScore": {
      +            "description": "How well the song range sits inside the singer range, 0-100.",
      +            "type": "integer"
      +          },
      +          "voiceTypeFitScore": {
      +            "description": "Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.",
      +            "type": "integer"
      +          },
      +          "whyItFits": {
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist",
      +          "rangeConfidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "rangeHigh": {
      +      "type": "integer"
      +    },
      +    "rangeLow": {
      +      "type": "integer"
      +    },
      +    "riskyPicksToAvoid": {
      +      "description": "Scored, but they exceed the comfortable range.",
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficultyScore": {
      +            "description": "Karaoke difficulty, 0-100. Higher is harder.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "genre": {
      +            "type": "string"
      +          },
      +          "highNote": {
      +            "description": "Highest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "highNoteName": {
      +            "description": "Same as highNote, as a note name like \"C#5\".",
      +            "type": "string"
      +          },
      +          "likelyVoiceFit": {
      +            "type": "string"
      +          },
      +          "lowNote": {
      +            "description": "Lowest note of the song as a MIDI number.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "lowNoteName": {
      +            "description": "Same as lowNote, as a note name like \"G2\".",
      +            "type": "string"
      +          },
      +          "matchScore": {
      +            "description": "Overall suitability for this voice, 0-100.",
      +            "type": "integer"
      +          },
      +          "rangeConfidence": {
      +            "description": "How the range was established. \"verified\" was measured from the recording; \"estimated\" was derived from published sources and should be presented as guidance, not fact; \"unknown\" means no range data.",
      +            "type": "string"
      +          },
      +          "rangeSource": {
      +            "description": "Provenance tag for the range, e.g. \"estimated_curated_seed\".",
      +            "type": "string"
      +          },
      +          "riskWarning": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "suggestedKey": {
      +            "description": "Transposition advice, e.g. \"Try a lower key\".",
      +            "type": "string"
      +          },
      +          "tessituraScore": {
      +            "description": "How comfortable the song sits where the voice spends most time, 0-100.",
      +            "type": "integer"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "vocalFitScore": {
      +            "description": "How well the song range sits inside the singer range, 0-100.",
      +            "type": "integer"
      +          },
      +          "voiceTypeFitScore": {
      +            "description": "Fit against the voice type lane, 0-100. Can be high while matchScore is low when the range still exceeds the singer.",
      +            "type": "integer"
      +          },
      +          "whyItFits": {
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist",
      +          "rangeConfidence"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "vocalId": {
      +      "type": "string"
      +    },
      +    "voiceType": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "vocalId",
      +    "voiceType",
      +    "matches"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint as safe, so the bar is lower. The description adds behavioral context: 'scored for range fit, karaoke difficulty, and voice-type suitability' and the output structure with named buckets. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences: purpose, when-to-use, and return structure. Every sentence adds value, is front-loaded, and avoids redundancy with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, an output schema exists (so return values are covered), and the description explains the key behavior, use cases, and output buckets. It is complete for an agent to understand when and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description does not add significant syntax or domain meaning beyond the schema—'range' and 'voice-type' are mentioned but not expanded with new parameter-specific details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Rank') and resource ('the HumMatch catalog') and clearly states the outcome: 'return the songs they can actually sing, scored for range fit, karaoke difficulty, and voice-type suitability.' It also distinguishes from siblings by emphasizing 'one singer' versus group-oriented tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit call scenarios: 'when someone asks what they should sing, what suits their voice or range, or wants karaoke song suggestions.' It does not mention when-not-to-use or alternatives, but the context is clear and sufficient for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources