Skip to main content
Glama

Find songs a group can sing together

group_song_fit
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
profilesYesTwo or more singers, each with a rangeLow and rangeHigh.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
songsYes
sharedRangeYesThe overlap every supplied singer can reach. Null bounds mean no shared range exists.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedOutput schema / properties / songs / 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 / songs / 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": {
      +    "sharedRange": {
      +      "description": "The overlap every supplied singer can reach. Null bounds mean no shared range exists.",
      +      "properties": {
      +        "high": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "highName": {
      +          "type": "string"
      +        },
      +        "low": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "lowName": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "songs": {
      +      "items": {
      +        "properties": {
      +          "artist": {
      +            "type": "string"
      +          },
      +          "difficulty": {
      +            "description": "Label, e.g. \"Easy win\", \"Moderate\". Note this is a string here, unlike difficultyScore elsewhere.",
      +            "type": "string"
      +          },
      +          "fitLabel": {
      +            "description": "e.g. \"Group-ready\", \"Higher-risk\".",
      +            "type": "string"
      +          },
      +          "fitsMemberIds": {
      +            "description": "Which supplied singers can sing it, by their id. Shorter than the full group means a partial fit.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "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"
      +          },
      +          "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"
      +          },
      +          "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"
      +          },
      +          "reason": {
      +            "type": "string"
      +          },
      +          "slug": {
      +            "description": "Catalog slug; the identifier check_song_fit takes.",
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "description": "Canonical HumMatch page for the song.",
      +            "type": "string"
      +          },
      +          "year": {
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "slug",
      +          "title",
      +          "artist"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "sharedRange",
      +    "songs"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds context about the task but does not disclose behavioral details like handling of non-overlapping ranges or note format assumptions. It does not contradict annotations.

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 two sentences, front-loaded with the core function and then enriched with use-case examples. Every sentence adds value with no redundancy.

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

Completeness4/5

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

The description is sufficiently complete for a read-only analysis tool with an output schema. It explains the input, purpose, and when to use it. Minor missing details around edge cases (e.g., no overlap) are not critical given the output schema.

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 covers 100% of parameter descriptions, including the structure of profiles with rangeLow/rangeHigh. The description simply restates 'two or more singers' ranges' without adding new semantic details beyond the schema.

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 clearly states the tool's function: finding the shared vocal range and songs within it for two or more singers. It also distinguishes itself from siblings by focusing on group compatibility rather than individual song checks or recommendations.

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?

The description provides explicit usage contexts (karaoke, duets, choir, worship team) and suggests when to call it ('what can we all sing' question). It lacks explicit exclusions or alternative tool names, but the context is clear enough.

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