Skip to main content
Glama

Songs To Your Eyes — production music catalogue

Find music for a scene or brief

stye_search_tracks
Read-onlyIdempotent

Searches the Songs To Your Eyes production-music catalogue for cues that fit a brief for a video, film, advert, trailer or podcast: music to license for a project, or anything about the Songs To Your Eyes catalogue.

The brief is matched by MEANING against an editorial description of how each cue behaves as well as against its tags, so a described scene, mood, instrumentation or arc ("tense investigative underscore that never resolves", "warm and hopeful for a charity film") matches far better than a single keyword.

LISTENING. Each result carries listen_url, a permanent public page where that cue plays. It is the only way a person can hear a cue: a cue listed without its listen_url cannot be auditioned. This holds for every list, an album listing included.

PRIVACY. When a brief has not been searched before, its text is sent to Google's Gemini API to interpret it; no identifier is sent.

FILTERS. Every filter is a hard constraint. Filters combine with AND, and a cue missing the tag a filter tests is excluded, so several filters together can empty a page. The brief carries soft qualities without excluding anything.

PAGES. One call returns one page of up to 25 cues (default 15); there is no pagination, and identical arguments return identical cues. A different brief, or the same need phrased from a different angle, returns different cues.

VOCALS. has_vocals=true selects songs with sung lead vocals and lyrics. Wordless vocal textures (background vocals, oohs and aahs, choir pads) are classed as instrumental, has_vocals=false; a request for "background vocals" is almost always a request for no lyrics. Texture words in the brief ("background vocals", "choir", "vocal hooks", "group singing") are detected server-side and applied as a hard requirement, so every result carries that texture and a short page reflects the catalogue's actual supply of it.

COMPOSERS. The composer filter matches the credited composer by partial name, with or without a brief (with none, it lists that composer's cues). Each result's composer field is the catalogue's own writer credit.

ANGLES. A page reflects one phrasing of a brief. Phrasings from different angles reach different parts of the whole catalogue: the literal angle (traditional instruments and idiom), the feel angle (texture, pulse and atmosphere with no instrument names, e.g. "hazy hypnotic modal groove, dusty and sun-baked") and the crossover angle (the setting's colour through another genre: desert funk, ethnic electronica, psychedelic world). The feel and crossover angles routinely surface the most distinctive picks, which a literal phrasing misses.

PLACES. The catalogue describes music by instrument, texture and mood, not geography: region and culture names ("Moroccan", "Gnawa", "Berber") appear in almost no tags, so a brief built on them loses its keyword match, while the sound of the place (oud, darbuka, qanun, hand percussion; desert, hypnotic, modal, dusty) matches.

ALBUMS. Albums are curated sets of about five cues built around one idea. A general search returns at most two cues per album (max_per_album) so that a page spans the catalogue, and albums_represented reports how many distinct albums the page drew on. The album filter returns a whole set and lifts that cap. A recommendation built from a single album shows one record's take on a brief rather than the catalogue's range.

EVENTS AND OCCASIONS. Tags naming a specific event (a festival, a holiday, an occasion) are on a handful of cues, not applied systematically: only 20 cues carry "Burning Man" while the catalogue holds ~1,900 electronic cues, and 39 carry "Festival". An event-tag match is therefore a narrow slice. The music an occasion implies reaches much further: house, techno, trance and rave for a festival; the emotional register, rather than the word, for a wedding.

CONTEXTS. The context parameter runs an owner-curated occasion search ('rave-club', 'christmas', 'halloween', 'summer' and others) against assignments precomputed from the catalogue owner's translation rules: "rave" reaches the whole beat-driven electronic palette, not just the cues that carry a festival tag. An unknown name returns the full list of valid contexts. Country names (Lebanon, Morocco, Turkey...) are accepted and generalise to their regional palette, where the catalogue's world coverage is deeper. Some contexts are ambiguous (summer, a country or territory): they return results grouped into 2-4 labelled directions, each with its own slug, plus a question that tells them apart; that slug passed as context returns the one direction.

AMBIGUOUS BRIEFS. Some briefs span genuinely different musical directions: "summer vibes" can mean tropical-house feelgood, chill-lounge, world/travel or sexy/fashion. A single search commits to one reading; the ambiguous contexts return the labelled spread.

REFERENCES. The catalogue's tags carry no artist, composer, film or brand names, so a reference searched verbatim ("a la Philip Glass", "like Stranger Things", "think Apple ads") finds little, while a description of its sound matches: Philip Glass is minimal pulsing arpeggios, piano and strings, hypnotic repetition; Trent Reznor meets M83 is dark industrial synths under huge emotive electronic swells; Stranger Things is a retro analog synth pulse, ominous but restrained.

NEGATIVES. Negation written into the brief does not subtract from a search. The exclude parameter hard-drops any cue carrying the listed tags, spelling variants included. It takes tag-shaped terms (instruments, moods, genres); soft qualities ("not too hard") match better as positive wording in the brief ("restrained", "understated").

STEMS, CUTDOWNS AND KEYS. The catalogue holds ~43,000 stem versions and ~2,800 drums-only stems, and ~1,100 cues have a labelled :30 cutdown; each result's versions counts what exists for that cue. The key filter matches briefs like "preferably in E" (E matches both E and Em); ~7,200 mains carry a key.

CLEAN LYRICS. explicit: true means the catalogue owner has flagged the cue's sung lyrics as not clean.

LYRICS. 328 cues have lyrics on file, and the lyrics are in the full-text index, so words that are actually sung match. Matching is by wording, not subject: "a song about winning" finds lyrics containing "winning", not every song about victory. The catalogue is overwhelmingly instrumental, so a lyric match is a narrow slice on top of the musical match.

RESULTS. Each result describes one cue. listen_url is a permanent public page where the cue plays, with cover art and a waveform: it is how a person actually hears the music. Every playable row carries its own listen_url. The versions of a cue share one title and differ only by ref, so a link built by hand from a title or a ref can point at the wrong audio.

Also returned: title, album, album_title, composer (the catalogue's own writer credit), description (what it sounds like and what it suits), duration_s, bpm, key, has_vocals, explicit, genres, moods, instruments, use_cases, keywords (extra catalogue tags beyond those lists, such as tempo bands like 'Mid Tempo' and placements like 'TV Score'), and three editorial judgements: energy (low | low-building | moderate | building | high), resolves (whether it lands, or stays unresolved and tense) and vo_friendly (whether it leaves space for a voiceover). versions counts the stems, alternate mixes and shorter cuts that exist for the cue, and cutdown_lengths_s lists the cut lengths in seconds. ref is the catalogue's ID for the cue. preview_url, when requested, is a temporary streaming link that expires after 15 minutes; listen_url never expires.

A field absent from a row means the catalogue holds no data for it: an absent bpm means untagged, not slow; an absent composer means no usable credit; an absent cutdown_lengths_s means no timed cutdowns exist.

The player streams nearly every cue clean. A file downloaded from it without a licence is a watermarked test file (a spoken "STYE Music" tag); a clean file comes with a licence. preview_url is watermarked too.

Input Schema

NameRequiredDescriptionDefault
keyNoMusical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em). ~7,200 mains carry key data, about 44% of the catalogue; the filter excludes the rest.
albumNoOnly tracks from this album, by name ('Desert Funk') or catalogue code ('STYE1204'); partial names match. With no brief it lists the album; with one it searches inside it. Setting it lifts the per-album cap, so the whole set comes back from one record.
briefNoWhat the music should sound like and what it is for: the mood, the scene, the instruments, vocal textures, how it should build. E.g. 'tense investigative underscore that never resolves'. Tempo and length have their own filters; vocal texture (wordless backing vocals, choir pads) is matched from the brief.
limitNoMaximum results, up to 25 (default 15). One page per call: there is no pagination, and identical arguments return identical cues.
moodsNoMatch ANY of these moods, e.g. ['Tension','Mysterious'].
energyNoOne of: low, low-building, moderate, building, high.
genresNoMatch ANY of these genres, e.g. ['Trailer','Orchestral'].
bpm_maxNoMaximum BPM.
bpm_minNoMinimum BPM. Around 54% of the catalogue has no tempo tag, and any BPM filter excludes all of those cues, good matches included; pace described in the brief has no such cost.
contextNoOwner-curated occasion/context search (CONTEXTS in the description): a context name ('rave-club', 'christmas', 'halloween', 'summer') or a country name, which generalises to its regional palette. An unknown name returns the full list of valid contexts. Ambiguous contexts return results grouped into labelled directions plus a question for the user.
excludeNoTags to hard-drop: any cue carrying any of them is removed (a brief's exclusions, such as 'no choir', 'avoid sweeping strings', 'not neo-classical'). Spelling variants and plurals are folded, so 'neo-classical' also drops 'Neoclassical'. Tag-shaped terms only; soft qualities are matched through the brief.
composerNoOnly tracks credited to this composer/artist. Partial names match ('Albeg' finds 'Yair Albeg Wein'), case-insensitive, with or without a brief. Every result carries its `composer` credit.
has_vocalsNotrue = songs with sung lead vocals and lyrics. false = everything else, including cues with wordless vocal textures (background vocals, oohs/aahs, choir pads), which count as instrumental here. 'Background vocals' in a request almost always means no lyrics. Omitted = both.
instrumentsNoMatch ANY of these instruments, e.g. ['Piano','Strings'].
vo_friendlyNotrue = only tracks that leave space for voiceover.
max_per_albumNoMaximum cues from any one album on the page, so results spread across the catalogue instead of returning a block from one record. Default 2 for a general search; ignored when filtering by album or composer.
duration_max_sNoMaximum runtime in seconds.
duration_min_sNoMinimum runtime in seconds.
include_previewsNoAttach a streaming preview link to each result (slower; links expire in 15 minutes).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / key / description
      Previous value: -"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em). ~7,100 mains carry key data, about 44% of the catalogue; the filter excludes the rest."New value: +"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em). ~7,200 mains carry key data, about 44% of the catalogue; the filter excludes the rest."
  2. Changed10 schema fields changed
    • changedInput schema / properties / album / description
      Previous value: -"Only tracks from this album — by name ('Desert Funk') or catalogue code ('STYE1204'); partial names match. Use it whenever someone names an album or asks what else is on the one a track came from. Works with no brief (lists the album) or with one (search inside it). Setting it disables the per-album cap, so the whole set comes back — which is why it is for a user who ASKED about an album, not a way to answer a brief. Answering a brief out of one album narrows the catalogue to one record; spread the picks instead."New value: +"Only tracks from this album, by name ('Desert Funk') or catalogue code ('STYE1204'); partial names match. With no brief it lists the album; with one it searches inside it. Setting it lifts the per-album cap, so the whole set comes back from one record."
    • changedInput schema / properties / bpm_min / description
      Previous value: -"Minimum BPM. Use sparingly: around 54% of the catalogue has no tempo tag, and any BPM filter excludes all of those cues — good matches included. Prefer describing the pace in the brief."New value: +"Minimum BPM. Around 54% of the catalogue has no tempo tag, and any BPM filter excludes all of those cues, good matches included; pace described in the brief has no such cost."
    • changedInput schema / properties / brief / description
      Previous value: -"What the music should sound like and what it is for — the mood, the scene, the instruments, vocal textures, how it should build. E.g. 'tense investigative underscore that never resolves'. Tempo and length belong in the filters below; vocal TEXTURE (wordless backing vocals, choir pads) belongs HERE, in the brief."New value: +"What the music should sound like and what it is for: the mood, the scene, the instruments, vocal textures, how it should build. E.g. 'tense investigative underscore that never resolves'. Tempo and length have their own filters; vocal texture (wordless backing vocals, choir pads) is matched from the brief."
    • changedInput schema / properties / composer / description
      Previous value: -"Only tracks credited to this composer/artist. Partial names match ('Albeg' finds 'Yair Albeg Wein'), case-insensitive. Works alone — 'music by <name>' needs no brief — or combined with a brief to search within one composer's catalogue. Every result carries its `composer` credit either way."New value: +"Only tracks credited to this composer/artist. Partial names match ('Albeg' finds 'Yair Albeg Wein'), case-insensitive, with or without a brief. Every result carries its `composer` credit."
    • changedInput schema / properties / context / description
      Previous value: -"Owner-curated occasion/context search — see CONTEXTS in the tool description. A context name ('rave-club', 'christmas', 'halloween', 'summer') or a country name (generalises to its regional palette). Unknown names return the full list of valid contexts. Ambiguous contexts return results grouped into labelled directions plus a question to relay to the user."New value: +"Owner-curated occasion/context search (CONTEXTS in the description): a context name ('rave-club', 'christmas', 'halloween', 'summer') or a country name, which generalises to its regional palette. An unknown name returns the full list of valid contexts. Ambiguous contexts return results grouped into labelled directions plus a question for the user."
    • changedInput schema / properties / exclude / description
      Previous value: -"Hard-drop any cue carrying ANY of these tags — for a brief's exclusions ('no choir', 'avoid sweeping strings', 'not neo-classical'). Spelling variants and plurals are folded, so 'neo-classical' also drops 'Neoclassical'. Tag-shaped terms only; soft qualities belong in the brief."New value: +"Tags to hard-drop: any cue carrying any of them is removed (a brief's exclusions, such as 'no choir', 'avoid sweeping strings', 'not neo-classical'). Spelling variants and plurals are folded, so 'neo-classical' also drops 'Neoclassical'. Tag-shaped terms only; soft qualities are matched through the brief."
    • changedInput schema / properties / has_vocals / description
      Previous value: -"true = SONGS with sung lead vocals and lyrics. false = everything else, INCLUDING cues with wordless vocal textures (background vocals, oohs/aahs, choir pads) — those count as instrumental here. 'Background vocals' in a request almost always means NO lyrics: use false and put the texture in the brief. Omit = both."New value: +"true = songs with sung lead vocals and lyrics. false = everything else, including cues with wordless vocal textures (background vocals, oohs/aahs, choir pads), which count as instrumental here. 'Background vocals' in a request almost always means no lyrics. Omitted = both."
    • changedInput schema / properties / key / description
      Previous value: -"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em) — briefs saying 'in E' usually accept both. ~7,100 mains carry key data, about 44% of the catalogue; the filter skips the rest, so use it only when the brief asks."New value: +"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em). ~7,100 mains carry key data, about 44% of the catalogue; the filter excludes the rest."
    • changedInput schema / properties / limit / description
      Previous value: -"Max results. One page per search — there is NO pagination, and repeating a search with the same arguments returns the SAME cues. Ask for as many as you need up front rather than searching twice; raise it toward 25 when exploring."New value: +"Maximum results, up to 25 (default 15). One page per call: there is no pagination, and identical arguments return identical cues."
    • changedInput schema / properties / max_per_album / description
      Previous value: -"Cap how many cues from any ONE album appear, so results spread across the catalogue instead of returning a block from one record. Defaults to 2 for a general search. Raise it, or set it high, when you deliberately want depth from one album — and it is ignored automatically when you filter by album or composer."New value: +"Maximum cues from any one album on the page, so results spread across the catalogue instead of returning a block from one record. Default 2 for a general search; ignored when filtering by album or composer."
  3. Changed1 schema field changed
    • changedInput schema / properties / key / description
      Previous value: -"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em) — briefs saying 'in E' usually accept both. ~7,000 mains carry key data, about 44% of the catalogue; the filter skips the rest, so use it only when the brief asks."New value: +"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em) — briefs saying 'in E' usually accept both. ~7,100 mains carry key data, about 44% of the catalogue; the filter skips the rest, so use it only when the brief asks."
  4. Changed2 schema fields changed
    • changedInput schema / properties / limit / default
      Previous value: -8New value: +15
    • changedInput schema / properties / limit / description
      Previous value: -"Max results."New value: +"Max results. One page per search — there is NO pagination, and repeating a search with the same arguments returns the SAME cues. Ask for as many as you need up front rather than searching twice; raise it toward 25 when exploring."
  5. Changed1 schema field changed
    • changedInput schema / properties / key / description
      Previous value: -"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em) — briefs saying 'in E' usually accept both. About 7,500 mains carry key data; the filter skips the rest, so use only when the brief asks."New value: +"Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em) — briefs saying 'in E' usually accept both. ~7,000 mains carry key data, about 44% of the catalogue; the filter skips the rest, so use it only when the brief asks."
  6. Changed1 schema field changed
    • changedInput schema / properties / album / description
      Previous value: -"Only tracks from this album — by name ('Desert Funk') or catalogue code ('STYE1204'); partial names match. Use it whenever someone names an album or asks what else is on the one a track came from. Works with no brief (lists the album) or with one (search inside it). Albums here are curated sets of ~5 cues around one idea, so pulling the whole album is often the best answer."New value: +"Only tracks from this album — by name ('Desert Funk') or catalogue code ('STYE1204'); partial names match. Use it whenever someone names an album or asks what else is on the one a track came from. Works with no brief (lists the album) or with one (search inside it). Setting it disables the per-album cap, so the whole set comes back — which is why it is for a user who ASKED about an album, not a way to answer a brief. Answering a brief out of one album narrows the catalogue to one record; spread the picks instead."
  7. Changed2 schema fields changed
    • addedInput schema / properties / exclude
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Hard-drop any cue carrying ANY of these tags — for a brief's exclusions ('no choir', 'avoid sweeping strings', 'not neo-classical'). Spelling variants and plurals are folded, so 'neo-classical' also drops 'Neoclassical'. Tag-shaped terms only; soft qualities belong in the brief.",
      +  "title": "Exclude"
      +}
    • addedInput schema / properties / key
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Musical key, e.g. 'E', 'Em', 'Bb', 'F# minor'. A bare major key also matches its minor ('E' matches E and Em) — briefs saying 'in E' usually accept both. About 7,500 mains carry key data; the filter skips the rest, so use only when the brief asks.",
      +  "title": "Key"
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / context
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Owner-curated occasion/context search — see CONTEXTS in the tool description. A context name ('rave-club', 'christmas', 'halloween', 'summer') or a country name (generalises to its regional palette). Unknown names return the full list of valid contexts. Ambiguous contexts return results grouped into labelled directions plus a question to relay to the user.",
      +  "title": "Context"
      +}
  9. Changed1 schema field changed
    • addedInput schema / properties / max_per_album
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 10,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Cap how many cues from any ONE album appear, so results spread across the catalogue instead of returning a block from one record. Defaults to 2 for a general search. Raise it, or set it high, when you deliberately want depth from one album — and it is ignored automatically when you filter by album or composer.",
      +  "title": "Max Per Album"
      +}
  10. Changed1 schema field changed
    • addedInput schema / properties / album
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Only tracks from this album — by name ('Desert Funk') or catalogue code ('STYE1204'); partial names match. Use it whenever someone names an album or asks what else is on the one a track came from. Works with no brief (lists the album) or with one (search inside it). Albums here are curated sets of ~5 cues around one idea, so pulling the whole album is often the best answer.",
      +  "title": "Album"
      +}
  11. Changed1 schema field changed
    • addedInput schema / properties / composer
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Only tracks credited to this composer/artist. Partial names match ('Albeg' finds 'Yair Albeg Wein'), case-insensitive. Works alone — 'music by <name>' needs no brief — or combined with a brief to search within one composer's catalogue. Every result carries its `composer` credit either way.",
      +  "title": "Composer"
      +}
  12. Changed2 schema fields changed
    • changedInput schema / properties / brief / description
      Previous value: -"What the music should sound like and what it is for — the mood, the scene, the instruments, how it should build. E.g. 'tense investigative underscore that never resolves'. Tempo, length and vocals belong in the filters below, not here."New value: +"What the music should sound like and what it is for — the mood, the scene, the instruments, vocal textures, how it should build. E.g. 'tense investigative underscore that never resolves'. Tempo and length belong in the filters below; vocal TEXTURE (wordless backing vocals, choir pads) belongs HERE, in the brief."
    • changedInput schema / properties / has_vocals / description
      Previous value: -"true = lead-vocal tracks only, false = instrumental only, omit = both."New value: +"true = SONGS with sung lead vocals and lyrics. false = everything else, INCLUDING cues with wordless vocal textures (background vocals, oohs/aahs, choir pads) — those count as instrumental here. 'Background vocals' in a request almost always means NO lyrics: use false and put the texture in the brief. Omit = both."
  13. Changed2 schema fields changed
    • changedInput schema / properties / bpm_min / description
      Previous value: -"Minimum BPM. NOTE: ~54% of the catalogue has no BPM tag; a BPM filter silently excludes those tracks."New value: +"Minimum BPM. Use sparingly: around 54% of the catalogue has no tempo tag, and any BPM filter excludes all of those cues — good matches included. Prefer describing the pace in the brief."
    • changedInput schema / properties / brief / description
      Previous value: -"What the music should SOUND like and what it is for — mood, scene, instrumentation, narrative arc. E.g. 'tense investigative underscore that never resolves'. Put tempo/duration/vocals in the filters, not here."New value: +"What the music should sound like and what it is for — the mood, the scene, the instruments, how it should build. E.g. 'tense investigative underscore that never resolves'. Tempo, length and vocals belong in the filters below, not here."
  14. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is met and then exceeded: the description discloses that filters are hard AND constraints that can empty a page, that there is no pagination and identical args return identical cues, that brief text is sent to Gemini with no identifier, that preview_url expires in 15 minutes while listen_url never expires, and that unlicensed downloads are watermarked. These are non-obvious operational facts an agent cannot infer from the schema.

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

Conciseness3/5

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

Front-loaded and scannable thanks to ALL-CAPS section headers, but it is very long and contains real redundancy: listen_url and its permanence are explained in both LISTENING and RESULTS almost verbatim, and the RESULTS section re-enumerates fields (composer, versions, ref, bpm) already documented in the schema. Several sections (FILTERS vs NEGATIVES, CONTEXTS vs AMBIGUOUS BRIEFS vs ANGLES) overlap conceptually and could be consolidated.

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?

For a 19-parameter tool with no output schema, the description covers everything needed: what each result row contains, what a missing field means (absent bpm = untagged, not slow), the max-25 single-page limit, album cap behaviour, and how ambiguous contexts return grouped directions plus a follow-up question. Nothing material is left for the agent to guess.

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

Parameters5/5

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

Schema coverage is already 100%, so the baseline is 3; the description goes well beyond it by explaining the interplay the schema cannot encode — that filters are hard exclusions while the brief is soft, that several filters can empty a page, that max_per_album is lifted by album/composer filters, that a key like 'E' also matches Em, and that BPM filters silently drop the ~54% of untagged cues.

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?

States a specific verb and resource ('Searches the Songs To Your Eyes production-music catalogue for cues that fit a brief') plus the concrete deliverable (music to license) and the scope (film, advert, trailer, podcast). It is clearly distinguishable from siblings like stye_find_similar, stye_get_track and stye_list_versions, which operate on an already-identified cue.

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

Usage Guidelines5/5

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

Explicitly routes the agent: prefer described scenes/moods over single keywords, rewrite references and place names into sound descriptions, use `exclude` for negations rather than negated brief text, use `context` for occasions rather than event tags, and try feel/crossover angles when a literal phrasing underperforms. It also names when *not* to rely on event tags, geography and artist references, with the reason each time.

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