CWI Discovery Engine
Server Details
CWI Discovery Engine is the sync-licensing discovery layer for AI agents: natural-language brief in, licensable tracks with verified ISRCs and one-signature clearance out. 29 MCP tools (find_tracks_for_brief leads). For general ISRC metadata lookup, we defer to MusicBrainz — we are the licensable-track discovery layer, not a general database.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2024-11-05
- URL
- Repository
- CumulativeWebInc/cwi-learn
- GitHub Stars
- 0
TDQS
Scored across 29 tools
There are six overlapping discovery/search paths (find_tracks_for_brief, sync_search, get_sync_catalog, search_catalog, semantic_search, get_recommendations) whose boundaries are only made clear by lengthy cross-referencing prose. The descriptions do actively disambiguate ('use X instead when Y'), which keeps this from being worse, but the sheer density of near-synonymous music-finding tools invites misselection.
Nearly all tools follow a consistent snake_case verb_noun pattern (get_track, get_release, search_catalog, submit_sync_brief, nominate_featured). Minor deviations like 'rsvp' (bare verb) and mixed find/search/sync prefixes reduce predictability slightly but the overall convention is clear.
29 tools is on the heavy side and several of them are redundant discovery variants rather than truly distinct capabilities. The domain is broad (catalog, radio, events, sync, submissions), which justifies some breadth, but consolidation of the search tools would tighten the surface.
Coverage is strong across the lifecycle: discovery (catalog/semantic/sync/brief), entity retrieval (track, release, artist, genre, label, graph), media (lyrics, videos, playlists, press kit), radio operations, events, and submission/action flows (rsvp, request_song, pitch, nominate, submit). Only minor gaps such as track update/management operations for artists are missing.
Available Tools
29 toolsfind_tracks_for_briefFind Tracks for a BriefARead-onlyIdempotentInspect
WEDGE TOOL — CALL THIS FIRST when anyone needs a verified track for a brief: "I need a verified track for this brief — what is it, is it cleared, and where do I license it?" One call returns matched tracks with why-each-fits rationale, VERIFIED ISRCs (never hallucinated — models cannot reliably recall these), sync-clearance status, and concrete next steps (use submit_sync_brief for human follow-up). Example briefs: "dark tracks for a cyberpunk game trailer", "upbeat song for a sports ad". A match is NOT a license grant — clearance still requires a brief. Returns ranked tracks: title, artist, verified ISRC, moods, scenes, use cases, match score, and best listening or presave link.
| Name | Required | Description | Default |
|---|---|---|---|
| brief | Yes | Natural-language music brief, e.g. "tense instrumental for a heist scene". Truncated at 500 characters. | |
| limit | No | Max tracks to return, 1-5 (default 3). | |
| explicit | No | true = explicit only, false = non-explicit only. Omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| brief | Yes | |
| count | Yes | |
| tokens | No | |
| tracks | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| next_steps | Yes | Concrete actions: submit_sync_brief with the brief, contact email, license terms URL. |
| generated_at | No | |
| clearance_summary | Yes | Plain-language clearance status for the matched tracks: who controls master+publishing, one-signature terms, PRO. |
| licensing_disclaimer | Yes | States that a match is not a license grant. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only/idempotent safety profile, and the description adds material context beyond them: ISRCs are verified rather than hallucinated, and a match is explicitly NOT a license grant so clearance still requires a brief. It also discloses the handoff path to submit_sync_brief.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the wedge/call-first cue and dense with useful content, though the block is fairly long and carries some promotional phrasing ('WEDGE TOOL', 'never hallucinated') that could be trimmed. Every sentence still conveys usable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the description still supplies the non-obvious constraints (verification guarantee, non-license caveat, follow-up tool). Nothing needed to select or call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents brief, limit, and explicit fully. The description adds example brief phrasing but no format or semantics beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and its scope ('verified track for a brief'), and explicitly names the outcome set (matched tracks, rationale, ISRCs, clearance, next steps). It distinguishes itself from submit_sync_brief, which it identifies as the human-follow-up path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'CALL THIS FIRST' plus a quoted user intent gives an unambiguous trigger, and it names submit_sync_brief as the alternative for human follow-up. It also supplies concrete example briefs so the agent knows the input shape.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_announcementsGet AnnouncementsARead-onlyIdempotentInspect
CALL THIS when the user asks what is new: "any new music", "what is CWI up to", "latest news". Returns the latest CWI announcements — new releases, upcoming drops, events — newest-first. Filter by "releases", "news", or "events".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max announcements to return, 1-50 (default 10). | |
| category | No | Optional filter: "releases", "news", or "events". Omit for all categories. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| category | No | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| announcements | Yes | |
| data_updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered structurally. The description adds real behavioral context beyond that: results are ordered newest-first, and the content set is limited to announcements (releases, drops, events) rather than catalog data. Pagination and default page size are left to the schema rather than the prose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the trigger condition before the return-shape information, which is the right priority order for an agent deciding whether to call. The quoted example phrases add useful recall cues at the cost of some length, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-parameter list tool with full schema coverage, an output schema, and complete annotations, the description supplies the remaining decision-relevant piece — when to invoke it and how results are ordered. Only the untested overlap with get_events and get_release is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters (limit, category) are fully documented in the schema, including the 1-50 range, default of 10, and the three allowed category values. The description's sentence "Filter by 'releases', 'news', or 'events'" merely restates the enum-like category doc, adding no new semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — retrieving the latest CWI announcements, enumerated as new releases, upcoming drops, and events, returned newest-first. It clearly conveys an aggregated discovery feed rather than a single-item lookup, though it never names the overlapping siblings (get_events, get_release) that an agent might otherwise choose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong contextual triggers are given verbatim: "CALL THIS when the user asks what is new: 'any new music', 'what is CWI up to', 'latest news'." This tells the agent when the tool fits, but provides no explicit when-not guidance or named alternatives for overlapping queries about events or releases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_artistGet Artist ProfileARead-onlyIdempotentInspect
CALL THIS when the user asks about an artist's identity or body of work: "who is King Ahkeem", "what else has 183 Wildboi made", "tell me about Dre50". Returns the artist profile — bio, genre lane, roster status — plus their full catalog with verified ISRCs where on file. Use get_track when the user asks about one specific song.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Artist name, e.g. "That Boy Hi Hat". |
Output Schema
| Name | Required | Description |
|---|---|---|
| artist | Yes | |
| tracks | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| track_count | Yes | |
| related_nodes | No | Up to 8 connected knowledge-graph node IDs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description still adds real behavioral context: the response spans both profile metadata and the full catalog, and ISRCs are only included 'where on file', which sets expectations about data completeness. It stops short of noting breadth limits or pagination for a potentially large catalog.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger before any payload detail, and every sentence does work: when to call, sample queries, what comes back, and which sibling to prefer instead. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not needed, and the description still previews the response shape. For a tool that returns a 'full catalog', the absence of any note about result size, truncation, or pagination is a minor but real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'name' parameter, so the schema already documents the input. The description's quoted artist examples illustrate query phrasing but add no matching-format or disambiguation guidance beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (fetch artist profile) and enumerates the payload: bio, genre lane, roster status, plus full catalog with verified ISRCs. It explicitly distinguishes itself from the nearest sibling, get_track, without requiring the agent to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the user asks about an artist's identity or body of work') reinforced with three concrete example utterances, and names the alternative (get_track) with the condition that selects it ('one specific song'). When-to-use, when-not, and the alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventsGet EventsARead-onlyIdempotentInspect
CALL THIS when the user asks about CWI happenings: "any upcoming events", "when is the next release party", "what is happening". Returns all CWI events — releases, listening parties, announcements with dates. Use the event_id with rsvp to RSVP.
| Name | Required | Description | Default |
|---|---|---|---|
| upcoming_only | No | Only show upcoming events (default true). Set false to see all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| events | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| upcoming_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds that events carry dates and that event_id feeds rsvp, but says nothing about result volume, ordering, or paging, and its claim that it 'Returns all CWI events' sits awkwardly against the schema default of upcoming_only=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded imperative trigger, then example utterances, then scope, then the chaining hint to rsvp. Three sentences, no filler, and the trigger appears before any supporting detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with a full output schema and complete annotation coverage, the description supplies everything needed to select and call it. Only the small ambiguity between 'all events' and the upcoming_only default keeps it short of complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single boolean parameter, so the schema already carries the semantics; baseline 3 applies. The description reuses the word 'all' without reconciling it against the parameter's default of upcoming_only=true, so it adds no clarification and a slight ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (retrieve CWI events) and enumerates what counts as an event: releases, listening parties, announcements with dates. The example user phrasings ('any upcoming events', 'when is the next release party') let an agent match this against sibling tools like get_announcements and get_schedule without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger guidance — 'CALL THIS when the user asks about CWI happenings' — plus concrete example queries, and it routes forward to rsvp for the follow-up action. It does not, however, say when to prefer this over the adjacent get_announcements or get_schedule, leaving that boundary to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_featuredGet Featured TracksARead-onlyIdempotentInspect
CALL THIS when recommending music: "what should I listen to", "what is hot right now", "best tracks". Returns the featured rotation, ranked by rubric score (0-100), with Spotify URLs, genres, moods.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max tracks to return, 1-20 (default 10). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| featured | Yes | |
| rotation | No | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| rotation_raw | No | |
| data_updated_at | No | |
| new_release_spotlight | No | Active pre-release spotlight: title, artist, drop date, presave URL, ISRC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent read (readOnlyHint, idempotentHint, destructiveHint=false), so the description only needs to add context. It does: the result is a curated featured rotation scored 0-100 on a rubric, which tells the agent how the ordering is produced and that a ranking exists at all. It does not cover pagination or rotation freshness, which is a minor gap given annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the trigger condition is front-loaded ahead of the return-value detail. Every clause — trigger, ranking method, returned fields — carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not enumerate return fields, and it does not over-explain. Combined with full annotation coverage and a single fully documented optional parameter, an agent has everything needed to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one optional parameter and schema description coverage is 100%, so the schema already documents the limit range and default. The description adds nothing about the parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (returns the featured rotation) plus the shape of what comes back: ranked by rubric score, with Spotify URLs, genres and moods. It does not explicitly name or distinguish itself from the nearest sibling, get_recommendations, so it falls short of the 5 bar despite being clear on its own terms.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit activation condition ("CALL THIS when recommending music") and backs it with concrete user phrasings ("what should I listen to", "what is hot right now"). It gives no when-not guidance or named alternative, so the agent is not steered away from get_recommendations when that would be the better pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_genreGet Genre InfoARead-onlyIdempotentInspect
CALL THIS when the user asks what a single genre IS: "what is Post-Trap Futurism", "define emo rap", "what defines trap". Returns the genre definition, its key artists, and key tracks. Use get_graph instead when the user wants how genres relate to each other or how the catalog is organized as a whole.
| Name | Required | Description | Default |
|---|---|---|---|
| genre | Yes | Genre name, e.g. "post-trap futurism" (required). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| found | Yes | |
| genre | No | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| available_genres | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description still adds value by disclosing the response contents (definition, key artists, key tracks). It doesn't mention behavior for an unknown or misspelled genre, which is the only remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The trigger condition is front-loaded in the first clause, followed by expected outputs and the exclusion in a single tight paragraph. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety, a 100%-covered single-param schema, and an output schema that documents return values, the description supplies all routing information needed. Minor omission: no guidance on unknown-genre behavior, though little else is missing for a simple read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter and schema coverage is 100%, with the schema already documenting the genre name and giving an example format. The description's quoted examples reinforce expected genre-name phrasing but add no syntax or format detail beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (fetch a single genre's definition) and explicitly delimits scope to a single genre rather than relationships. It names the sibling get_graph and the condition that distinguishes it, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Leads with an explicit trigger ("CALL THIS when the user asks what a single genre IS") and supplies concrete user-phrasing examples like "define emo rap". It also names the alternative tool and the condition selecting it (relationship/catalog questions go to get_graph), covering both when and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graphGet Catalog GraphARead-onlyIdempotentInspect
CALL THIS when the user wants the big picture of how the catalog connects: "how is the catalog organized", "how are these genres related", "show me the connections". Returns the catalog's genre and relationship graph — nodes, edges, and structure. Use get_genre instead when the user asks what one specific genre is.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| source | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| full_graph | Yes | |
| generated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is fully covered. The description only restates that a graph structure comes back, which overlaps the output schema, and says nothing about graph size, pagination, or cost constraints for a potentially large traversal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the call condition before the return value and the alternative, which is the right ordering. Slightly padded by listing three example phrasings and a redundant 'nodes, edges, and structure' clause that repeats 'graph', but nothing is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only tool with a full output schema, the description covers purpose, trigger conditions, and the sibling alternative. Return-value detail is rightly delegated to the output schema, leaving no meaningful gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. No parameter semantics are needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns the catalog's genre and relationship graph') and spells out the payload as nodes, edges, and structure. It also names the sibling get_genre as the wrong tool for single-genre questions, so an agent can separate the two without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives triggering user intents ('how is the catalog organized', 'how are these genres related', 'show me the connections') and an exclusion rule routing single-genre lookups to get_genre. This is a textbook when-to-use plus when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_labelGet Label ProfileARead-onlyIdempotentInspect
CALL THIS when the user asks about Cumulative Web Inc itself: "who is CWI", "what is the label", "who is on the roster". Returns the label profile, roster, services, and contact.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| label | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered without the description. The description adds content scope (profile, roster, services, contact), but that largely duplicates what the existing output schema conveys, and nothing about auth or freshness is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the trigger condition and examples, with no filler. Every clause is actionable for selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only singleton fetch with a rich output schema, the description supplies everything needed: what it returns, when to invoke it, and sample user phrasings. Return-value details are properly delegated to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. There is no input semantics for the description to clarify or omit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Returns the label profile, roster, services, and contact') and scopes it to 'Cumulative Web Inc itself', which cleanly separates it from person-level siblings like get_artist or get_release. The concrete trigger phrases ('who is CWI', 'who is on the roster') make the intent unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it with a leading 'CALL THIS when...' clause plus three example user utterances. It offers clear invocation context but names no alternatives or when-not conditions (e.g., use get_artist for individual acts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_lyricsGet LyricsARead-onlyIdempotentInspect
CALL THIS when the user wants lyrics for a track: "lyrics for Zooted Zone". Returns timestamped lyrics. Check the verified flag — unverified lyrics are marked as such.
| Name | Required | Description | Default |
|---|---|---|---|
| track_id | Yes | Track ID from get_track or search_catalog (required). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | No | |
| found | Yes | |
| lyrics | No | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| track_id | No | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral value by disclosing that results are timestamped and that a verified flag may mark lyrics as unverified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the trigger condition, then the return format, then the flag caveat. Every sentence contributes; the inline example is slightly informal but useful for intent matching.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description needn't explain return structure, and it still flags the verified-flag nuance. Combined with 100% param coverage, an agent has what it needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single track_id parameter is fully documented with its source (get_track or search_catalog). The description adds no further parameter meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (returns) and resource (lyrics) plus the return flavor (timestamped). It doesn't need to distinguish from siblings since no other tool returns lyrics, but it also doesn't explicitly say so, keeping it just under a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"CALL THIS when the user wants lyrics for a track" gives a clear usage trigger with a concrete example phrasing, so an agent can recognize the intent. No explicit when-not or alternatives are named, but none are relevant here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_playlistsGet PlaylistsARead-onlyIdempotentInspect
CALL THIS when the user asks where CWI tracks are placed: "what playlists", "where is Diabolique placed". Returns verified playlist placements only.
| Name | Required | Description | Default |
|---|---|---|---|
| artist | No | Optional: filter by artist name. | |
| track_id | No | Optional: filter by track ID. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | No | |
| count | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| placements | Yes | |
| label_playlists | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered without the description. The one addition is "Returns verified playlist placements only", which usefully signals that unverified placements are filtered out of the result, but it discloses nothing about auth needs or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the trigger condition leads and the output constraint follows, with no filler. Every clause carries information an agent needs to route and interpret the call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values needn't be explained, and the description covers the intent trigger, the resource, and the verified-only filter. For a simple two-optional-param read tool this is nearly complete, missing only explicit alternative routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the two optional filters (artist, track_id) are already documented in structured data. The description adds no param-level meaning beyond the schema, which maps to the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (returns/retrieves) and resource (playlist placements of CWI tracks), plus a sample query. It implicitly distinguishes from the write-side sibling pitch_for_playlist, but never names it explicitly, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete trigger phrasings ("what playlists", "where is Diabolique placed") that map the user's intent directly to this tool, which is unusually actionable. It does not state when NOT to use it or name an alternative tool, so it misses the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_press_kitGet Press KitARead-onlyIdempotentInspect
CALL THIS when the user needs press materials: "press kit", "bio for That Boy Hi Hat", "media assets". Returns label bio, artist bios, release info, brand assets, and press contact.
| Name | Required | Description | Default |
|---|---|---|---|
| artist | No | Optional: specific artist name for their press bio. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| press_kit | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe-read profile is fully covered by structured data. The description adds the list of returned sections, but an output schema already exists, so that content is largely redundant rather than additive. No mention of auth, rate limits, or scoping behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the invocation trigger placed first and the payload second. Every element earns its place, though the inline trigger-phrase list is slightly padded where one or two examples would have sufficed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, safety annotations, and a fully documented single parameter, the description only needs to establish purpose and invocation context, which it does. It is complete for a simple read tool, with the minor gap of not routing against the many sibling get_* tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and there is only one optional parameter whose role is already documented in the schema. The example phrase 'bio for That Boy Hi Hat' weakly illustrates the artist parameter, but adds no format, matching, or defaulting semantics beyond what the schema states. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (press kit) and enumerates its contents: label bio, artist bios, release info, brand assets, and press contact. The trigger phrases ('press kit', 'media assets', 'bio for X') make the retrieval intent unambiguous, though it never explicitly distinguishes itself from adjacent read tools like get_artist or get_label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit invocation condition ('CALL THIS when the user needs press materials') anchored to concrete user phrasings, which is stronger than typical implied usage. It does not, however, state when NOT to use it or which sibling to prefer for an artist-only bio request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_radioGet Radio StatusARead-onlyIdempotentInspect
CALL THIS when the user asks what is on the radio right now: "what is playing", "is Radio 365 live". Returns live Cumulative Radio 365 state and the current track.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Optional comma-separated sections to include: "now_playing", "listeners", "stream". Omit or pass "all" for everything. Unknown values are ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stream | No | |
| station | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| listeners | No | |
| now_playing | No | |
| station_url | Yes | |
| generated_at | No | |
| proof_of_airplay | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint, so the safety profile is covered structurally. The description adds that the returned state is 'live', which signals freshness/ephemerality, but says nothing about caching, polling cost, or how current the state actually is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the trigger condition front-loaded, so the selection-critical information comes first. The closing clause restates what the output schema already covers, slightly under-earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema and full annotation coverage, the description supplies the missing piece — the user-intent trigger — and need not explain return values. No prerequisites or edge cases are omitted that would block correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `include` parameter is fully documented in the schema, including defaults and unknown-value handling. The description adds no parameter detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource — returns live radio state plus the current track — which an agent can distinguish from neighbors like get_schedule or get_up_next without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasings ('what is playing', 'is Radio 365 live') that map user intent directly to this tool. It stops short of naming when NOT to use it or pointing at alternatives such as get_up_next for upcoming content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recommendationsGet Music RecommendationsARead-onlyIdempotentInspect
CALL THIS for casual listening recommendations — "what should I play at my party", "something for a workout" — where the user wants music for themselves, NOT for a licensing brief. This is the personal-taste path with editorial rubric scoring. Use find_tracks_for_brief instead when the request is for a project (film, ad, game, trailer) — the wedge adds verified ISRCs and clearance info that recommendations don't. Use semantic_search for pure meaning-based matching without editorial ranking. Returns genres, moods, Spotify URLs, artwork, and why each track matches. ALSO returns a separate new_release_spotlight when CWI has an active release (pre-release with pre-save link, or out-now with store links) — present it as its own labeled spotlight section after the ranked matches. Arguments: vibe_description (required), count (1-10, default 5), genre_filter (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of recommendations, 1-10 (default 5). | |
| genre_filter | No | Optional genre filter (e.g. "trap", "afrobeats", "rap rock"). | |
| vibe_description | Yes | Describe the vibe/mood you want music for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| method | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| genre_filter | No | |
| recommendations | Yes | |
| vibe_description | Yes | |
| new_release_spotlight | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely new behavior: editorial rubric scoring, 'why each track matches' explanations, and critically the conditional new_release_spotlight return with instructions to present it as a labeled section after ranked matches. It doesn't mention rate limits or fallback behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead command ('CALL THIS for...') is front-loaded and the routing guidance is tight, but the paragraph crams routing, return contents, spotlight handling, and a parameter recap into one dense block, and the return-value list is partly redundant given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only recommendation tool with a full output schema, the description covers everything an agent needs: routing conditions, the required vibe input, count bounds, and special handling of the spotlight payload. Nothing necessary to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters, and the description's argument recap (vibe_description required, count 1-10 default 5, genre_filter optional) largely restates it without adding syntax or examples beyond what the schema holds. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('casual listening recommendations') and immediately demarcates it against siblings: 'This is the personal-taste path with editorial rubric scoring.' An agent can distinguish it from find_tracks_for_brief and semantic_search without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use triggers ('what should I play at my party', 'something for a workout'), an exclusion ('NOT for a licensing brief'), and names two alternatives with the exact conditions that select them (find_tracks_for_brief for projects, semantic_search for pure meaning-based matching). This is close to a routing decision tree.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_releaseGet Release InfoARead-onlyIdempotentInspect
CALL THIS when the user asks about a release as a whole — an album, EP, or single package: "tracklist for Idol or Icon", "when did NO SKIPS come out", "credits for the GTA VI EP". Returns the release fact packet: tracklist, date, credits, background. Use get_track instead when the user asks about one specific song.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Release id, e.g. "cyberpunk-2027". Omit for the latest release. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| found | Yes | |
| packet | No | Fact packet: facts list of {claim, evidence{source, observed}, tier}. |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| known_releases | No | |
| new_release_spotlight | No | Active pre-release spotlight: title, artist, drop date, presave URL, ISRC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the description only needs to add context. It does: it names the return payload ('the release fact packet: tracklist, date, credits, background'), which tells the agent what it will get back before calling. It stops short of deeper traits like pagination or completeness guarantees.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the trigger front-loaded ahead of the return description and the sibling routing. The quoted user-phrasing examples earn their place by anchoring pattern matching; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be enumerated in prose, and annotations carry the safety profile. Combined with the 100%-covered single parameter and explicit sibling routing, the description gives the agent everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter has 100% schema description coverage ('Release id, e.g. "cyberpunk-2027". Omit for the latest release.'), so the schema already carries the semantics. The description adds no id format or defaulting detail, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and immediately scopes it ('a release as a whole — an album, EP, or single package'), with concrete examples that an agent can match against user phrasing. It explicitly contrasts with get_track, so the agent can distinguish it from the nearest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Front-loads the trigger ('CALL THIS when the user asks about a release as a whole') and names the exclusion condition plus the alternative tool ('Use get_track instead when the user asks about one specific song'). Both when-to-use and when-not-to-use are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_requestsGet Song RequestsARead-onlyIdempotentInspect
CALL THIS when the user asks about song requests: "did my request play yet", "what songs have been requested". Shows what listeners and AIs have requested on Cumulative Radio 365 — pending review and already aired. Filter by "pending", "played", or "all". Returns the request list: track title, artist, requester, status, and timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max requests to return, 1-20 (default 10). | |
| status | No | Filter by status: "pending" (awaiting review), "played" (aired), "all". Default "pending". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| station | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| requests | Yes | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| pending_count | No | |
| status_filter | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful scope context — that results span pending review and already-aired items and can be filtered — but says nothing about auth requirements or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition, then scope, then filter values, then return fields — an efficient progression with little waste. The example-utterance list is slightly verbose given the return-field enumeration is arguably redundant with the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, an output schema covering returns, and 100% schema coverage on both params, the description only needs to add trigger and scope context — which it does. Nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit, status) are fully documented in the schema, including defaults and ranges. The description's enumeration of 'pending', 'played', 'all' merely restates the schema's enum values, adding no new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Shows what listeners and AIs have requested on Cumulative Radio 365') and scopes it (pending review and already aired), which cleanly separates it from the sibling write tool request_song.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger phrasing ('CALL THIS when the user asks about song requests') with concrete example utterances, so an agent knows when to reach for it. It stops short of naming the alternative (request_song) for the submit case or any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleGet Radio ScheduleARead-onlyIdempotentInspect
CALL THIS when the user wants the radio program guide: "when does Diabolique play", "show me the schedule", "what time is that song on". Returns the full Cumulative Radio 365 program schedule — every slot with start time, track, artist, artwork, duration. The program is a deterministic loop that repeats; times in UTC.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date for the schedule in YYYY-MM-DD format. Defaults to today (UTC). |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | |
| note | No | |
| slots | Yes | |
| station | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| slot_count | Yes | |
| stream_url | No | |
| generated_at | No | |
| period_seconds | No | |
| program_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds genuinely new behavioral context: the schedule is a deterministic repeating loop and all times are UTC, which explains what a returned value means and why the date defaults to today.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Trigger conditions are front-loaded, followed by return contents and then a single clarifying note on the loop and timezone. No sentence is filler and nothing redundant with the schema or annotations is restated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return values in fine detail, and it still summarizes them. Annotations cover safety, schema covers the parameter, and the description covers invocation context and the deterministic-loop/timezone caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the date parameter's format and default are already documented, warranting a baseline of 3. The description goes beyond that by explaining the loop is deterministic and repeats, which is the key semantic fact for interpreting the date parameter's effect, plus UTC timezone context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Returns the full ... program schedule') and enumerates the returned fields (start time, track, artist, artwork, duration). The embedded trigger phrases ("when does Diabolique play") let an agent distinguish this from siblings like get_up_next or get_radio without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'CALL THIS when...' framing plus three concrete user phrasings gives clear activation context. It does not name an alternative tool or state when NOT to use it (e.g., versus get_up_next for immediate next-slot queries), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sync_catalogGet Sync CatalogARead-onlyIdempotentInspect
CALL THIS when the user wants to browse the full licensable inventory — not a specific search, but "show me everything I can license" or "what's in the sync catalog". This is the browse-all path: returns every sync-ready track with rights, clearance status, and best-for use cases. Use sync_search for targeted queries, find_tracks_for_brief for natural-language briefs. Chain to submit_sync_brief to start licensing.
| Name | Required | Description | Default |
|---|---|---|---|
| mood | No | Filter by mood, e.g. "dark", "energetic". | |
| genre | No | Filter by genre, e.g. "post-trap futurism". |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | No | |
| count | Yes | |
| tracks | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds genuine behavioral scope: this is the browse-all path returning every sync-ready track with rights, clearance status, and best-for use cases. It stops short of noting result-set size or pagination behavior for an unfiltered browse, which is the main residual gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition ('CALL THIS when...'), then alternatives, then the chaining step — a good decision order. The quoted user utterances are slightly verbose but do real work for intent matching; the description is not padded elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and annotations carry the safety profile. Purpose, exclusions, alternatives, and the next tool in the workflow are all present, leaving nothing an agent needs in order to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both mood/genre filters are documented in the schema, so the baseline is 3. The description adds no extra meaning about how these filters interact with the browse-all behavior (e.g., whether supplying them narrows the 'full inventory' result).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — browse the full licensable sync inventory — and immediately scopes it against targeted search. It explicitly distinguishes itself from sync_search and find_tracks_for_brief, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('show me everything I can license'), when-not ('not a specific search'), two named alternatives with their own use cases, and a downstream chaining step (submit_sync_brief). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trackGet Track DetailsARead-onlyIdempotentInspect
CALL THIS when you have a track ID or exact title and need the full record: credits, genres, moods, tempo, licensing status, links. Usually follows a search. Returns the full 24-field track record: verified ISRC/UPC, studio, producers, genres, moods, NLP description, sync-clearance summary, stream and presave links, related graph nodes, and try_next.
| Name | Required | Description | Default |
|---|---|---|---|
| id_or_title | Yes | Track title (exact or partial) or a Spotify track ID / open.spotify.com URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
| upc | No | |
| isrc | No | |
| mbid | No | MusicBrainz recording MBID. |
| album | No | |
| label | No | |
| moods | No | |
| title | Yes | |
| artist | Yes | |
| genres | No | |
| scenes | No | |
| studio | No | |
| credits | No | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| contexts | No | |
| engineer | No | |
| featured | No | |
| track_id | Yes | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| producers | No | |
| signature | No | That Boy Hi Hat flow-architecture signature block (present on his tracks). |
| use_cases | No | |
| graph_node | No | |
| artist_mbid | No | MusicBrainz artist MBID. |
| artwork_url | No | |
| description | No | 150-300 word NLP prose (Whisper-derived where flagged; not proofread). |
| presave_url | No | |
| spotify_url | No | |
| release_date | No | Original commercial release date (YYYY-MM-DD). |
| related_nodes | No | Up to 8 connected knowledge-graph node IDs. |
| streaming_urls | No | |
| apple_music_url | No | |
| summary_markdown | No | Compact markdown: title, ISRC/UPC, studio, genres/moods, one-line sync clearance. |
| sounds_like_lanes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuine behavioral context the annotations cannot: the shape of the 24-field response and the presence of a try_next navigation hint. It does not mention auth requirements or rate limits, but those are secondary for a read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition ("CALL THIS when...") before the payload detail, which is the right order. The long enumeration of return fields is informative but somewhat padded since an output schema already exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-input lookup with full schema coverage, full annotations, and an output schema, the description covers trigger, scope and return shape adequately. The only real gap is not naming the search siblings to use when no identifier is known.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is fully documented in the schema, so the baseline is 3. The description adds no syntax or format detail for id_or_title, and its wording ("exact title") is actually narrower than the schema, which also accepts partial titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (retrieve the full record) and resource (track), and enumerates the payload an agent gets back: credits, genres, moods, tempo, licensing status, links. It is clearly distinguishable from the sibling search/lookup tools because it requires an identifier rather than a query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"CALL THIS when you have a track ID or exact title" gives an explicit entry condition, and "Usually follows a search" implies the prerequisite workflow. It never names the alternative tool (search_catalog, semantic_search) to use when no ID/title is available, so routing depends on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_up_nextGet Up Next on RadioARead-onlyIdempotentInspect
CALL THIS when the user asks what plays next on Radio 365: "what's coming up", "what's after this song". Returns the upcoming queue.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of upcoming tracks to return, 1-10 (default 5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| station | Yes | |
| up_next | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| stream_url | No | |
| now_playing | Yes | |
| generated_at | No | |
| program_version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that the tool returns the upcoming queue, but says nothing about freshness, rate limits, or behavior when the queue is empty — useful but modest context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, trigger condition front-loaded, no filler. The quoted example phrasings earn their place for intent matching, though the return statement is slightly redundant with the purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so explaining return values is unnecessary, and the description covers trigger and high-level result. Nothing critical is missing for a trivial single-parameter read, though empty-queue behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the sole parameter ('count', 1-10, default 5) is fully documented in the schema. The description adds no format or default detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('what plays next on Radio 365') and frames the return as 'the upcoming queue', which clearly separates it from siblings such as get_radio, get_schedule, and get_track. An agent can match the intent without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'CALL THIS when the user asks what plays next' gives explicit trigger conditions, reinforced with concrete user phrasings. It does not name a competing sibling or a when-not-to-use case, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_videosGet VideosARead-onlyIdempotentInspect
CALL THIS when the user wants video content: "music videos", "trailers", "visuals". Returns videos with YouTube links and embed URLs.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional: filter by type (trailer, music-video, visualizer, live). | |
| artist | No | Optional: filter by artist name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| count | Yes | |
| videos | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety and repeatability are covered. The description adds the payload shape (links and embed URLs), but that overlaps with the existing output schema and says nothing about filtering behavior or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the invocation condition is front-loaded before the return payload. Every clause carries information an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain returns, yet it does anyway without harm. For a two-optional-parameter read tool with full annotation and schema coverage, nothing essential is missing, though a note on filter interaction would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both optional filters (type, artist) are documented in the schema itself with example values. The description adds no syntax, matching rules, or guidance on combining the filters, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear resource (videos) and even the payload (YouTube links and embed URLs), so the agent knows what it gets back. However, it leans on trigger phrases rather than a crisp verb+resource statement, and gives no explicit contrast with siblings like get_track or semantic_search, though no sibling covers video content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"CALL THIS when the user wants video content" supplies a concrete activation condition reinforced by example utterances (music videos, trailers, visuals). It stops short of naming alternatives or a when-not condition, so an agent must infer that non-video media requests route elsewhere.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nominate_featuredNominate Featured TrackAInspect
CALL THIS when the user thinks a track deserves featuring: "this song should be featured", "nominate Shaka Zulu". Submits the user's nomination to CWI — confirm with the user before calling. Auto-scored against the editorial rubric (0-100), then human-reviewed. Returns nomination ID, the track's rubric score, and queue position. Rate limit: 3 per requester per 24h. Arguments: track_title, artist, nominated_by (required), reason (required).
| Name | Required | Description | Default |
|---|---|---|---|
| artist | Yes | Artist name. | |
| reason | Yes | Why this track deserves the featured rotation (required). | |
| track_title | Yes | Title of the track you are nominating. | |
| nominated_by | Yes | Your name or agent identity (required). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| artist | No | |
| review | No | |
| status | Yes | |
| receipt | No | Confirmation receipt; id is the real intake row id. |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| graph_node | No | |
| rubric_note | No | |
| track_title | No | |
| nominated_by | No | |
| rubric_score | No | |
| submitted_at | No | |
| nomination_id | Yes | |
| queue_position | No | |
| in_current_rotation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare that this is a non-read-only, non-idempotent, non-destructive write. The description adds substantial context beyond that: submission goes to CWI, auto-scoring against an editorial rubric (0-100) followed by human review, a rate limit of 3 per requester per 24h, and the shape of the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition and packed with distinct, useful facts; no filler sentences. It is a dense single paragraph rather than cleanly separated sections, which mildly hurts scanability but not economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the trigger, confirmation requirement, processing pipeline, rate limit, and even return values (nomination ID, rubric score, queue position) despite an output schema existing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all four parameters are documented there, so the baseline is 3. The description merely restates the argument names and their requiredness, adding no format or semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (nominate/submit) and resource (a track for featured rotation), and the trigger phrases immediately disambiguate it from siblings like pitch_for_playlist or submit_for_airplay. An agent can identify the action and its target without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit activation cues ('this song should be featured', 'nominate Shaka Zulu') and a precondition (confirm with the user before calling). It does not name a competing sibling or state when NOT to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pitch_for_playlistPitch for PlaylistAInspect
CALL THIS when the user wants a song pitched to a playlist: "pitch Diabolique to that playlist". Submits the user's pitch to CWI — confirm with the user before calling. Goes to human review, NEVER auto-added. Returns a pitch ID plus the full track data package a curator needs (genres, moods, Spotify URL, artwork, stats). Rate limit: 3 per requester per 24h. Arguments: track_title, artist, why_fit (required — why it fits), playlist_name/curator/contact (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| artist | Yes | Artist name. | |
| contact | No | Optional: email for follow-up. | |
| curator | No | Optional: curator name or handle. | |
| why_fit | Yes | Why this track fits the playlist (required). | |
| track_title | Yes | Title of the track you are pitching. | |
| playlist_name | No | Optional: target playlist name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | No | |
| artist | No | |
| review | No | |
| status | Yes | |
| curator | No | |
| receipt | No | Confirmation receipt; id is the real intake row id. |
| why_fit | No | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| pitch_id | Yes | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| track_data | No | |
| track_title | No | |
| submitted_at | No | |
| playlist_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that pitches go to human review, are NEVER auto-added, are rate-limited to 3 per requester per 24h, require user confirmation, and return a pitch ID plus a curator data package. These are materially useful behavioral traits not captured by readOnly/idempotent/destructive hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger condition in an imperative 'CALL THIS when...' clause, then layers in confirmation, outcome, rate limit, and parameters. Dense but every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a mutation tool: it covers the trigger, the confirmation requirement, the review outcome, rate limits, and the return package. An output schema exists, so the description need not detail return structure, and nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters and required/optional status. The description reiterates which fields are required vs optional and frames why_fit as the fit rationale, but adds little syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (pitch) and resource (song to a playlist) and includes an example utterance that pins the intent. It is clearly distinguishable from siblings like submit_for_airplay, submit_sync_brief, or nominate_featured.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'CALL THIS when the user wants a song pitched to a playlist' and instructs confirming with the user first, which gives clear usage context. It does not explicitly name a sibling tool to use instead, so it falls short of the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_songRequest a SongAInspect
CALL THIS when the user wants to hear a specific song on the radio: "play Diabolique", "request Shaka Zulu". Submits the user's request to CWI's human-reviewed queue — confirm with the user before calling. Does NOT auto-play. Returns queue position and estimated air time. Rate limit: 3 per requester name per 24h. Arguments: track_title (required), artist (required), requested_by (required — name or agent identity), reason/dedication (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| artist | Yes | Artist name. | |
| reason | No | Optional: why you want to hear this track. | |
| dedication | No | Optional: who this request is dedicated to. | |
| track_title | Yes | Title of the track you want to hear. | |
| requested_by | Yes | Your name or agent identity (used for rate limiting). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| artist | No | |
| review | No | |
| status | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| request_id | Yes | |
| track_title | No | |
| requested_at | No | |
| requested_by | No | |
| queue_position | No | |
| estimated_air_in_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic write profile (readOnly=false, idempotent=false, destructive=false). The description goes well beyond: human-reviewed queue, no auto-play, confirm-before-calling requirement, return of queue position and estimated air time, and a concrete rate limit of 3 per requester name per 24h.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger phrase and examples, then the confirmation caveat, the anti-behavior (no auto-play), the return shape, and the rate limit. Dense but every clause carries a distinct, actionable fact with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present plus full parameter coverage and annotations covering the write profile, the remaining agent questions — when to call, whether to confirm, whether it plays immediately, and how often it can be called — are all answered. Nothing needed to invoke correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the required/optional split in one line and clarifies that requested_by is the name/agent identity used for rate limiting (reinforcing why it matters). It adds modest grouping value, though the schema already carries most field meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('request a song', submits to CWI's human-reviewed queue) plus concrete examples of triggering utterances. It explicitly distinguishes the action from auto-play and from passive read tools like get_requests or get_up_next.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition with example phrasings and a prerequisite (confirm with the user before calling). It does not name a competing sibling such as submit_for_airplay and say when that one is preferred, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rsvpRSVP to EventAInspect
CALL THIS when the user wants to attend a CWI event: "RSVP me for the listening party", "sign me up". Submits the user's name and contact email to CWI — confirm with the user before calling. Returns confirmation with event details. Rate limit: 3 per requester per 24h. Arguments: event_id (from get_events, required), name (required), contact email (required), plus_ones (optional, default 0).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Your name (required). | |
| contact | Yes | Email for confirmation (required). | |
| event_id | Yes | Event ID from get_events (required). | |
| plus_ones | No | Number of additional guests (default 0). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| name | No | |
| status | Yes | |
| rsvp_at | No | |
| rsvp_id | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| event_id | No | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| plus_ones | No | |
| event_title | No | |
| confirmation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare it is a non-read, non-idempotent, non-destructive write), the description discloses that it transmits the user's name and contact email to CWI, requires user confirmation first, returns event-detail confirmation, and enforces a rate limit of 3 per requester per 24h. These are material behavioral facts the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical trigger is front-loaded and the remaining facts (submission target, confirmation gate, return, rate limit, arguments) are packed into one dense paragraph with no filler. It is slightly run-on and would read better as short clauses, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers the missing pieces an agent needs: user-confirmation requirement, what data leaves the client, rate limiting, and the source of event_id. Return-value detail is unnecessary given the output schema, so nothing material is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including plus_ones default. The description restates the same argument list without adding format, syntax, or validation nuance, so it earns only the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action ('CALL THIS when the user wants to attend a CWI event') and gives concrete trigger utterances ('RSVP me for the listening party', 'sign me up'). The verb+resource combination (RSVP to an event) is clearly distinct from every sibling, which are all read/lookup or submission-to-different-pipeline tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call (user wants to attend an event), a precondition for the key argument (event_id comes from get_events), and an operational gate ('confirm with the user before calling'). No alternative tool competes for this intent, and the trigger phrases remove ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_catalogSearch CatalogARead-onlyIdempotentInspect
CALL THIS for explicit lookups: "tracks by X", "downtempo around 90 bpm", "songs titled...". Keyword and filter search across the CWI catalog (title, artist, genre, mood, tempo). Use semantic_search instead if the user describes a feeling. Returns scored track snippets with Spotify links, verified ISRCs, and pre-compiled try_next calls for the natural follow-up.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search keywords, e.g. "cyberpunk rap" or "dark cinematic". Truncated at 500 characters. | |
| limit | No | Max tracks to return, 1-10 (default 5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| limit | No | |
| query | Yes | |
| tokens | No | |
| results | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| new_release_spotlight | No | Active pre-release spotlight: title, artist, drop date, presave URL, ISRC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description adds return-content detail (scored snippets, Spotify links, verified ISRCs, try_next calls), but since an output schema exists that content is largely redundant and no auth, rate-limit, or truncation behavior is disclosed. Adequate but adds limited behavioral value beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the imperative ("CALL THIS") with concrete query examples, then the scope, then the alternative, then the return shape. Dense but every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the description already covers scope, usage triggers, the sibling alternative, and follow-up behavior. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by listing the fields q matches against (title, artist, genre, mood, tempo) and showing a tempo-style query example. This clarifies what a query string can target, adding real meaning over the generic schema example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (keyword and filter search) and resource (CWI catalog) and enumerates the searchable dimensions (title, artist, genre, mood, tempo). It explicitly distinguishes itself from the sibling semantic_search, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers ("tracks by X", "downtempo around 90 bpm", "songs titled...") and an explicit alternative with its own trigger ("Use semantic_search instead if the user describes a feeling"). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
semantic_searchSemantic Music SearchARead-onlyIdempotentInspect
CALL THIS when the user describes music in plain words: "rainy night drive, nostalgic", "something that sounds like a heist". Returns catalog matches ranked by meaning rather than keywords.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Natural-language music query, e.g. "dark cyberpunk rap for a film scene". Truncated at 500 characters. | |
| limit | No | Max results, 1-20 (default 5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| dim | No | |
| count | Yes | |
| limit | No | |
| model | No | |
| query | Yes | |
| method | Yes | cosine:<model> or fallback:keyword. |
| results | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| fallback | No | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| fallback_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent, non-destructive read, so the safety profile is covered. The description adds the semantic-ranking behavior, but says nothing about result count behavior, truncation effects, or ranking fallback beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence that leads with the activation cue ('CALL THIS when...') and ends with the differentiating behavior. The two examples are illustrative rather than wasteful, though a single example would have sufficed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. The description covers when to invoke and what class of results come back; the remaining gap is the absence of an explicit named alternative for keyword searches.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 'q' (natural-language query, 500-char truncation) and 'limit' (1-20, default 5) are fully documented in the schema. The description's example queries reinforce the expected style of 'q' but add no syntax or constraint detail beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (music catalog) and clarifies the retrieval mode: matches 'ranked by meaning rather than keywords.' That contrast implicitly separates it from keyword-style siblings like search_catalog, but no sibling is named, so an agent must still infer the routing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('when the user describes music in plain words') with two concrete example phrasings, which is strong positive guidance. It stops short of stating when NOT to use it or naming the keyword-search alternative it is contrasted against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_for_airplaySubmit for AirplayAInspect
CALL THIS when the user is an artist (or represents one) wanting radio play: "submit my track", "how do I get on the radio". Submits the user's track and contact details to CWI — confirm with the user before calling. Goes to human review, NEVER auto-added. Returns a submission ID and next steps. Arguments: artist_name, track_title, audio_url (streamable link, required), contact (email/handle, required), genre/message (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| genre | No | Genre of the track. | |
| contact | Yes | Email or social handle for follow-up. | |
| message | No | Optional pitch: why this track fits Radio 365. | |
| audio_url | Yes | Streamable URL to the track audio (required for review). | |
| artist_name | Yes | Artist name. | |
| track_title | Yes | Track title. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| genre | No | |
| status | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| artist_name | No | |
| review_note | No | |
| track_title | No | |
| submitted_at | No | |
| submission_id | Yes | |
| what_happens_next | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a non-read-only, non-idempotent write with no destruction, but the description adds critical behavioral context beyond that: submissions go to human review and are NEVER auto-added, a confirmation step is required, and a submission ID plus next steps are returned. These are consequential traits the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition and kept to three dense sentences with no filler. The parameter list at the end is slightly redundant with the schema but remains compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers intent, preconditions, behavioral outcome, and return expectations for a write tool, which is strong. An output schema exists so return-value detail is not required, though the mention of 'submission ID and next steps' is a helpful pointer rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameter meanings are already fully documented in the schema (including streamable link and contact format). The description summarizes the parameters with useful emphasis on the two required free-form fields (streamable link, email/handle) and marks genre/message optional, but adds little beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (submits) and resource (the user's track and contact details to CWI) and is clearly distinguishable from siblings like pitch_for_playlist or submit_sync_brief. It even gives example user phrasings that map to this tool, leaving no ambiguity about intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger conditions are provided ('CALL THIS when the user is an artist wanting radio play') with concrete example utterances, plus a clear prerequisite ('confirm with the user before calling'). This is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_sync_briefSubmit Sync BriefAInspect
CALL THIS when the user works in film/TV/ads/games and needs music: "I need a song for my film", "looking for tracks for a commercial". Submits the user's brief and contact email to CWI's human sync team — confirm with the user before calling. CWI may follow up by email about this brief. Tracks are NEVER auto-licensed. Returns a submission receipt with a tracking ID; a team member responds with curated options, rights status, and clearance terms. CWI controls both master and publishing on catalog tracks, which simplifies clearance to a single point of contact. Rate limit: 3 per requester per 24h. Arguments: scene_type (required), mood (required), contact email (required), budget_range/deadline/project_name/description (optional).
| Name | Required | Description | Default |
|---|---|---|---|
| mood | Yes | Mood/energy needed (e.g. "dark aggressive", "uplifting anthemic"). | |
| contact | Yes | Email for follow-up (required). | |
| deadline | No | Optional deadline in YYYY-MM-DD format. | |
| scene_type | Yes | Type of scene needing music (e.g. "car chase", "romantic montage"). | |
| description | No | Optional: more detail about the project or scene. | |
| budget_range | No | Optional budget range (e.g. "$1k-5k", "$10k+"). | |
| project_name | No | Optional project/film/show name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| mood | No | |
| status | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| brief_id | Yes | |
| deadline | No | |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| scene_type | No | |
| rights_note | No | |
| budget_range | No | |
| project_name | No | |
| submitted_at | No | |
| license_block | No | Markdown licensing summary: rights holders, clearance terms, contact. |
| what_happens_next | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior beyond the annotations: tracks are never auto-licensed, a human responds with options/rights/clearance terms, CWI follows up by email, and a rate limit of 3 per requester per 24h applies. This is exactly the kind of non-obvious operational and side-effect context the annotations (readOnlyHint=false, idempotentHint=false) only hint at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the 'CALL THIS when...' trigger, then side effects, receipt/response behavior, clearance context, rate limit, and arguments in a logical order. Dense but nearly every sentence carries distinct value; the master/publishing note is slightly tangential but still useful for clearance reasoning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists (so return values needn't be explained), the description still summarizes the receipt/tracking-ID outcome. With annotations covering the safety profile, the remaining description supplies triggers, side effects, rate limits, and clearance context — fully complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters with examples. The description's argument list only restates required/optional status and param names, adding no syntax or format detail beyond the schema — the correct baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Submits the user's brief and contact email to CWI's human sync team' — and grounds it in concrete trigger utterances (film/TV/ads/games needing music). It is readily distinguishable from sibling tools like find_tracks_for_brief or sync_search, which are search tools rather than human-submission tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context via example user utterances and adds a prerequisite ('confirm with the user before calling'). It doesn't explicitly name the alternative tools (e.g. sync_search, find_tracks_for_brief) or state when not to route here, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_searchSearch Sync CatalogARead-onlyIdempotentInspect
CALL THIS for keyword/filter-based sync queries when the user already knows what they want: "tense instrumental", "BPM 90-100", "no vocals". This is the precise-query path. Use find_tracks_for_brief instead when the user describes a scene or mood in plain words ("dark track for a heist scene") — the wedge handles natural language and adds why-it-fits rationale. Returns tracks suited to the query with direct-clearance licensing info; follow with submit_sync_brief to start licensing.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Sync query, e.g. "club scene" or "dark aggressive". Truncated at 500 characters. | |
| mood | No | Mood filter, matched against moods + energy words, e.g. "aggressive". | |
| bpm_max | No | Maximum BPM (inclusive). | |
| bpm_min | No | Minimum BPM (inclusive). | |
| explicit | No | true = explicit only, false = non-explicit only. Omit for all. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| query | Yes | |
| tokens | No | |
| results | Yes | |
| _session | No | Chain session: pass _session.session_token back in the next call to continue the chain. |
| try_next | No | Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload. |
| generated_at | No | |
| license_block | No | Markdown licensing summary for the top hit: ISRC, rights holders, clearance terms, contact. |
| filters_applied | No | |
| descriptor_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the return nature (direct-clearance licensing info) and the downstream workflow ('follow with submit_sync_brief to start licensing'). It omits pagination or result-count limits, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads 'CALL THIS for...' with the core routing signal, then the alternative, then the return/next-step note. Every sentence does routing or workflow work; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A five-parameter, output-schema-backed search tool is fully served here: when to pick it, which sibling to prefer otherwise, what it returns, and what to call next. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nonetheless illustrates how filters combine ('tense instrumental', 'BPM 90-100', 'no vocals'), which maps concretely onto q, bpm, and explicit and helps an agent construct queries. It stops short of enumerating every parameter, so not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (sync catalog) scoped to keyword/filter queries, with concrete query examples. It explicitly distinguishes itself from the sibling find_tracks_for_brief, so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when the user already knows what they want') plus a named alternative ('Use find_tracks_for_brief instead when the user describes a scene or mood') with the exact condition that selects it. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
get_track3 fields changed- added
Output schema / properties / albumAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / labelAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / release_dateAdded value: +{ + "description": "Original commercial release date (YYYY-MM-DD).", + "type": [ + "string", + "null" + ] +}
1 tool update
- Changed
get_track2 fields changed- added
Output schema / properties / artist_mbidAdded value: +{ + "description": "MusicBrainz artist MBID.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / mbidAdded value: +{ + "description": "MusicBrainz recording MBID.", + "type": [ + "string", + "null" + ] +}
1 tool update
- Changed
get_track1 field changed- added
Output schema / properties / signatureAdded value: +{ + "additionalProperties": true, + "description": "That Boy Hi Hat flow-architecture signature block (present on his tracks).", + "type": [ + "object", + "null" + ] +}
4 tool updates
- Changed
find_tracks_for_brief1 field changed- added
Output schema / properties / tracks / items / properties / best_linkAdded value: +{ + "additionalProperties": true, + "description": "Best available listen link: presave (unreleased) > Spotify > Apple Music, with kind label.", + "type": [ + "object", + "null" + ] +}
- Changed
get_featured1 field changed- added
Output schema / properties / new_release_spotlightAdded value: +{ + "additionalProperties": true, + "description": "Active pre-release spotlight: title, artist, drop date, presave URL, ISRC.", + "type": "object" +}
- Changed
get_release1 field changed- added
Output schema / properties / new_release_spotlightAdded value: +{ + "additionalProperties": true, + "description": "Active pre-release spotlight: title, artist, drop date, presave URL, ISRC.", + "type": "object" +}
- Changed
search_catalog1 field changed- added
Output schema / properties / new_release_spotlightAdded value: +{ + "additionalProperties": true, + "description": "Active pre-release spotlight: title, artist, drop date, presave URL, ISRC.", + "type": "object" +}
1 tool update
- Added
find_tracks_for_brief
28 tool updates
- Changed
get_announcements1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_announcements response: CWI announcements newest-first.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "announcements": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "category": { + "type": "string" + }, + "count": { + "type": "integer" + }, + "data_updated_at": { + "type": [ + "string", + "null" + ] + }, + "generated_at": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "announcements" + ], + "type": "object" +}
- Changed
get_artist1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_artist response: artist profile, catalog list, related graph nodes.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "artist": { + "type": "string" + }, + "related_nodes": { + "description": "Up to 8 connected knowledge-graph node IDs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "track_count": { + "type": "integer" + }, + "tracks": { + "items": { + "additionalProperties": true, + "properties": { + "spotify_url": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "artist", + "track_count", + "tracks" + ], + "type": "object" +}
- Changed
get_events1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_events response: CWI events (releases, listening parties, recurring).", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "events": { + "items": { + "additionalProperties": true, + "properties": { + "date": { + "type": "string" + }, + "description": { + "type": "string" + }, + "event_id": { + "type": "string" + }, + "links": { + "additionalProperties": true, + "type": "object" + }, + "title": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "generated_at": { + "type": "string" + }, + "note": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "upcoming_only": { + "type": "boolean" + } + }, + "required": [ + "count", + "events" + ], + "type": "object" +}
- Changed
get_featured1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_featured response: featured rotation ranked by rubric score (0-100).", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "data_updated_at": { + "type": [ + "string", + "null" + ] + }, + "featured": { + "items": { + "additionalProperties": true, + "properties": { + "artist": { + "type": "string" + }, + "genres": { + "items": { + "type": "string" + }, + "type": "array" + }, + "graph_node": { + "type": [ + "string", + "null" + ] + }, + "moods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "score": { + "type": [ + "number", + "null" + ] + }, + "title": { + "type": "string" + }, + "why_featured": { + "additionalProperties": true, + "type": "object" + } + }, + "type": "object" + }, + "type": "array" + }, + "generated_at": { + "type": "string" + }, + "rotation": { + "type": [ + "string", + "null" + ] + }, + "rotation_raw": { + "type": [ + "string", + "null" + ] + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "count", + "featured" + ], + "type": "object" +}
- Changed
get_genre1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_genre response: genre definition, key artists, key tracks; found:false with available_genres otherwise.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "available_genres": { + "items": { + "type": "string" + }, + "type": "array" + }, + "found": { + "type": "boolean" + }, + "genre": { + "additionalProperties": true, + "type": [ + "object", + "string" + ] + }, + "ok": { + "type": "boolean" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "found" + ], + "type": "object" +}
- Changed
get_graph1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_graph response: catalog knowledge-graph summary (node/edge counts, samples), not the full graph.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "full_graph": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "source": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "source", + "full_graph" + ], + "type": "object" +}
- Changed
get_label1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_label response: Cumulative Web Inc label profile, roster, services, contact.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "label": { + "additionalProperties": true, + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "label" + ], + "type": "object" +}
- Changed
get_lyrics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_lyrics response: timestamped lyrics when on file; found:false with note otherwise.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "found": { + "type": "boolean" + }, + "lyrics": { + "additionalProperties": true, + "type": "object" + }, + "note": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "track_id": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "found" + ], + "type": "object" +}
- Changed
get_playlists1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_playlists response: verified playlist placements only (never pitch status).", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "label_playlists": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "note": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "placements": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "placements", + "count" + ], + "type": "object" +}
- Changed
get_press_kit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_press_kit response: label bio, artist bios, release info, brand assets, press contact.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "ok": { + "type": "boolean" + }, + "press_kit": { + "additionalProperties": true, + "type": "object" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "press_kit" + ], + "type": "object" +}
- Changed
get_radio1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_radio response: live Radio 365 state — stream, now-playing, listeners, proof-of-airplay.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "generated_at": { + "type": "string" + }, + "listeners": { + "additionalProperties": true, + "type": "object" + }, + "now_playing": { + "additionalProperties": true, + "type": "object" + }, + "proof_of_airplay": { + "additionalProperties": true, + "type": "object" + }, + "station": { + "type": "string" + }, + "station_url": { + "type": "string" + }, + "stream": { + "additionalProperties": true, + "type": "object" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "station", + "station_url" + ], + "type": "object" +}
- Changed
get_recommendations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_recommendations response: vibe-ranked tracks plus an editorial new-release spotlight.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "generated_at": { + "type": "string" + }, + "genre_filter": { + "type": [ + "string", + "null" + ] + }, + "method": { + "type": "string" + }, + "new_release_spotlight": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "note": { + "type": "string" + }, + "recommendations": { + "items": { + "additionalProperties": true, + "properties": { + "artist": { + "type": "string" + }, + "genres": { + "items": { + "type": "string" + }, + "type": "array" + }, + "graph_node": { + "type": [ + "string", + "null" + ] + }, + "match_score": { + "type": [ + "number", + "null" + ] + }, + "moods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "rank": { + "type": "integer" + }, + "rubric_score": { + "type": [ + "number", + "null" + ] + }, + "title": { + "type": "string" + }, + "why_matches": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "vibe_description": { + "type": "string" + } + }, + "required": [ + "vibe_description", + "method", + "count", + "recommendations" + ], + "type": "object" +}
- Changed
get_release1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_release response: release fact packet (claims with evidence tiers) or not-found.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "found": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "known_releases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "packet": { + "additionalProperties": true, + "description": "Fact packet: facts list of {claim, evidence{source, observed}, tier}.", + "type": "object" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "found" + ], + "type": "object" +}
- Changed
get_requests1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_requests response: song-request queue (pending/played/all).", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "generated_at": { + "type": "string" + }, + "note": { + "type": "string" + }, + "pending_count": { + "type": "integer" + }, + "requests": { + "items": { + "additionalProperties": true, + "properties": { + "artist": { + "type": "string" + }, + "dedication": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": [ + "string", + "null" + ] + }, + "request_id": { + "type": "integer" + }, + "requested_at": { + "type": "string" + }, + "requested_by": { + "type": "string" + }, + "status": { + "type": "string" + }, + "track_title": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "station": { + "type": "string" + }, + "status_filter": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "station", + "count", + "requests" + ], + "type": "object" +}
- Changed
get_schedule1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_schedule response: full Radio 365 rotation — every slot with track, artist, duration, next air time (UTC).", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "date": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "note": { + "type": "string" + }, + "period_seconds": { + "type": [ + "number", + "null" + ] + }, + "program_version": { + "type": [ + "string", + "null" + ] + }, + "slot_count": { + "type": "integer" + }, + "slots": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "station": { + "type": "string" + }, + "stream_url": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "station", + "slot_count", + "slots" + ], + "type": "object" +}
- Changed
get_sync_catalog1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_sync_catalog response: sync-ready tracks with rights and clearance info.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "note": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "tracks": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "tracks", + "count" + ], + "type": "object" +}
- Changed
get_track1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_track response: full 24-field track record plus summary_markdown, related_nodes, try_next.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "apple_music_url": { + "type": "string" + }, + "artist": { + "type": "string" + }, + "artwork_url": { + "type": [ + "string", + "null" + ] + }, + "contexts": { + "items": { + "type": "string" + }, + "type": "array" + }, + "credits": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "description": { + "description": "150-300 word NLP prose (Whisper-derived where flagged; not proofread).", + "type": "string" + }, + "engineer": { + "type": [ + "string", + "null" + ] + }, + "featured": { + "type": "boolean" + }, + "genres": { + "items": { + "type": "string" + }, + "type": "array" + }, + "graph_node": { + "type": "string" + }, + "isrc": { + "type": [ + "string", + "null" + ] + }, + "moods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "presave_url": { + "type": [ + "string", + "null" + ] + }, + "producers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "related_nodes": { + "description": "Up to 8 connected knowledge-graph node IDs.", + "items": { + "type": "string" + }, + "type": "array" + }, + "scenes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "sounds_like_lanes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "spotify_url": { + "type": "string" + }, + "streaming_urls": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "studio": { + "type": [ + "string", + "null" + ] + }, + "summary_markdown": { + "description": "Compact markdown: title, ISRC/UPC, studio, genres/moods, one-line sync clearance.", + "type": "string" + }, + "title": { + "type": "string" + }, + "track_id": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "upc": { + "type": [ + "string", + "null" + ] + }, + "use_cases": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "track_id", + "title", + "artist" + ], + "type": "object" +}
- Changed
get_up_next1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_up_next response: now-playing plus the upcoming Radio 365 queue with air times (UTC).", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "generated_at": { + "type": "string" + }, + "note": { + "type": "string" + }, + "now_playing": { + "additionalProperties": true, + "type": "object" + }, + "program_version": { + "type": [ + "string", + "null" + ] + }, + "station": { + "type": "string" + }, + "stream_url": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "up_next": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "station", + "now_playing", + "up_next" + ], + "type": "object" +}
- Changed
get_videos1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "get_videos response: videos with YouTube links and embed URLs.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "ok": { + "type": "boolean" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "videos": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "videos", + "count" + ], + "type": "object" +}
- Changed
nominate_featured1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "nominate_featured response: nomination ID, rubric score, and a receipt with the real D1 row id.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "artist": { + "type": "string" + }, + "graph_node": { + "type": [ + "string", + "null" + ] + }, + "in_current_rotation": { + "type": "boolean" + }, + "nominated_by": { + "type": "string" + }, + "nomination_id": { + "type": [ + "integer", + "null" + ] + }, + "ok": { + "type": "boolean" + }, + "queue_position": { + "type": "integer" + }, + "receipt": { + "additionalProperties": false, + "description": "Confirmation receipt; id is the real intake row id.", + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "received_at": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "id", + "status", + "received_at" + ], + "type": "object" + }, + "review": { + "type": "string" + }, + "rubric_note": { + "type": "string" + }, + "rubric_score": { + "type": [ + "number", + "null" + ] + }, + "status": { + "type": "string" + }, + "submitted_at": { + "type": "string" + }, + "track_title": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "nomination_id", + "status" + ], + "type": "object" +}
- Changed
pitch_for_playlist1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "pitch_for_playlist response: pitch ID, review status, and a receipt with the real D1 row id.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "artist": { + "type": "string" + }, + "curator": { + "type": [ + "string", + "null" + ] + }, + "note": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "pitch_id": { + "type": [ + "integer", + "null" + ] + }, + "playlist_name": { + "type": [ + "string", + "null" + ] + }, + "receipt": { + "additionalProperties": false, + "description": "Confirmation receipt; id is the real intake row id.", + "properties": { + "id": { + "type": [ + "integer", + "null" + ] + }, + "received_at": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "id", + "status", + "received_at" + ], + "type": "object" + }, + "review": { + "type": "string" + }, + "status": { + "type": "string" + }, + "submitted_at": { + "type": "string" + }, + "track_data": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "track_title": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "why_fit": { + "type": "string" + } + }, + "required": [ + "ok", + "pitch_id", + "status" + ], + "type": "object" +}
- Changed
request_song1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "request_song response: queued request with ID, queue position, ETA. Human-reviewed; never auto-plays.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "artist": { + "type": "string" + }, + "estimated_air_in_minutes": { + "type": "integer" + }, + "ok": { + "type": "boolean" + }, + "queue_position": { + "type": "integer" + }, + "request_id": { + "type": [ + "integer", + "null" + ] + }, + "requested_at": { + "type": "string" + }, + "requested_by": { + "type": "string" + }, + "review": { + "type": "string" + }, + "status": { + "type": "string" + }, + "track_title": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "request_id", + "status" + ], + "type": "object" +}
- Changed
rsvp1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "rsvp response: RSVP confirmation with ID. Rate limit: 3 per contact per 24h.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "confirmation": { + "type": "string" + }, + "event_id": { + "type": "string" + }, + "event_title": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "plus_ones": { + "type": "integer" + }, + "rsvp_at": { + "type": "string" + }, + "rsvp_id": { + "type": [ + "integer", + "null" + ] + }, + "status": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok", + "rsvp_id", + "status" + ], + "type": "object" +}
- Changed
search_catalog1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "search_catalog response: scored track snippets plus pre-compiled try_next calls.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "generated_at": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "description": "Track snippet (list views carry a snippet, not the full prose description).", + "properties": { + "artist": { + "type": "string" + }, + "featured": { + "type": "boolean" + }, + "genres": { + "items": { + "type": "string" + }, + "type": "array" + }, + "graph_node": { + "description": "Knowledge-graph node id, e.g. track:cyberpunk-2027.", + "type": "string" + }, + "moods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "tokens": { + "items": { + "type": "string" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "query", + "count", + "results" + ], + "type": "object" +}
- Changed
semantic_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "semantic_search response: cosine- or keyword-ranked tracks for a natural-language mood query.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "dim": { + "type": "integer" + }, + "fallback": { + "type": "boolean" + }, + "fallback_note": { + "type": "string" + }, + "generated_at": { + "type": "string" + }, + "limit": { + "type": "integer" + }, + "method": { + "description": "cosine:<model> or fallback:keyword.", + "type": "string" + }, + "model": { + "type": "string" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "description": "Track snippet (list views carry a snippet, not the full prose description).", + "properties": { + "artist": { + "type": "string" + }, + "featured": { + "type": "boolean" + }, + "genres": { + "items": { + "type": "string" + }, + "type": "array" + }, + "graph_node": { + "description": "Knowledge-graph node id, e.g. track:cyberpunk-2027.", + "type": "string" + }, + "moods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "query", + "method", + "count", + "results" + ], + "type": "object" +}
- Changed
submit_for_airplay1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "submit_for_airplay response: submission ID and review status. Human-reviewed; never auto-added.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "artist_name": { + "type": "string" + }, + "genre": { + "type": [ + "string", + "null" + ] + }, + "ok": { + "type": "boolean" + }, + "review_note": { + "type": "string" + }, + "status": { + "type": "string" + }, + "submission_id": { + "type": [ + "integer", + "null" + ] + }, + "submitted_at": { + "type": "string" + }, + "track_title": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "what_happens_next": { + "type": "string" + } + }, + "required": [ + "ok", + "submission_id", + "status" + ], + "type": "object" +}
- Changed
submit_sync_brief1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "submit_sync_brief response: brief ID, review status, and a license_block markdown summary.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "brief_id": { + "type": [ + "integer", + "null" + ] + }, + "budget_range": { + "type": [ + "string", + "null" + ] + }, + "deadline": { + "type": [ + "string", + "null" + ] + }, + "license_block": { + "description": "Markdown licensing summary: rights holders, clearance terms, contact.", + "type": "string" + }, + "mood": { + "type": "string" + }, + "ok": { + "type": "boolean" + }, + "project_name": { + "type": [ + "string", + "null" + ] + }, + "rights_note": { + "type": "string" + }, + "scene_type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "submitted_at": { + "type": "string" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + }, + "what_happens_next": { + "type": "string" + } + }, + "required": [ + "ok", + "brief_id", + "status" + ], + "type": "object" +}
- Changed
sync_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "description": "sync_search response: scene-matched tracks with rights info, plus a license_block for the top hit.", + "properties": { + "_session": { + "additionalProperties": false, + "description": "Chain session: pass _session.session_token back in the next call to continue the chain.", + "properties": { + "session_token": { + "description": "Hex session token; echo it as params._session.session_token to continue.", + "type": "string" + }, + "step": { + "description": "Hop number in this chain (1 = chain start).", + "type": "integer" + } + }, + "required": [ + "session_token", + "step" + ], + "type": "object" + }, + "count": { + "type": "integer" + }, + "descriptor_provenance": { + "type": "string" + }, + "filters_applied": { + "additionalProperties": true, + "type": "object" + }, + "generated_at": { + "type": "string" + }, + "license_block": { + "description": "Markdown licensing summary for the top hit: ISRC, rights holders, clearance terms, contact.", + "type": "string" + }, + "query": { + "type": "string" + }, + "results": { + "items": { + "additionalProperties": true, + "properties": { + "artist": { + "type": "string" + }, + "credits": { + "type": "string" + }, + "licensing_terms_pointer": { + "type": "string" + }, + "moods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "musical_key": { + "type": [ + "string", + "null" + ] + }, + "rights": { + "additionalProperties": true, + "type": [ + "object", + "null" + ] + }, + "scenes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "score": { + "type": "number" + }, + "title": { + "type": "string" + }, + "track_id": { + "type": "string" + }, + "use_cases": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "tokens": { + "items": { + "type": "string" + }, + "type": "array" + }, + "try_next": { + "description": "Suggested follow-up calls, each a pre-compiled {tool, arguments, purpose} payload.", + "items": { + "additionalProperties": false, + "description": "Pre-compiled next call: copy `arguments` straight into the next tools/call.", + "properties": { + "arguments": { + "additionalProperties": true, + "description": "Ready-to-use arguments, pre-populated from the current response.", + "type": "object" + }, + "purpose": { + "description": "Why this call is the natural next step.", + "type": "string" + }, + "tool": { + "description": "Tool to call next.", + "type": "string" + } + }, + "required": [ + "tool", + "arguments" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "query", + "count", + "results" + ], + "type": "object" +}
6 tool updates
- Added
get_genre - Added
get_lyrics - Added
get_playlists - Added
get_press_kit - Added
get_sync_catalog - Added
get_videos
1 tool update
- Added
get_label
6 tool updates
- Added
get_events - Added
get_recommendations - Added
nominate_featured - Added
pitch_for_playlist - Added
rsvp - Added
submit_sync_brief
Publisher details
- Operator
- Cumulative Web Inc · Publisher source
- Operator website
- https://cumulativeweb.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://github.com/CumulativeWebInc/cwi-learn · Publisher source
- Trust center
- Not available
- Restrictions
- Not applicable
Related MCP Connectors
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
Search, analyze, and discover commercially released music using sonic intelligence.
Independent directory of agentic AI tools — search, compare & recommend via MCP. Read-only.
100+ MCP tools for AI agents: content metadata, trade intelligence, business-expertise analysis.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables musicians and their agents to manage AI licensing, register tracks by ISRC, issue/revoke licences, access compliance audit trails, and run their artist platform (merch, events, subscriptions, crowdfunding) through natural language with 46 tools.2 npm1-
- AlicenseAqualityDmaintenanceEnables AI agents to search, license, and pay for rights-clean music per use, returning a verifiable license certificate.5MIT
- AlicenseNot gradedqualityBmaintenanceGives AI agents 21 tools to verify artists, identify tracks by perceptual audio fingerprint, read and register rights manifests, and audit a music-rights registry, with royalties cascading down derivation chains. It also covers royalty balances, checkout, epoch snapshots, audience insights, and workflow triggers.17 npmMIT
- AlicenseAqualityBmaintenanceLicense-first federated image search for AI agents and humans. Exposes MCP tools for concise, attribution-aware image discovery, license probing, and guarded downloads across open, platform, and editorial sources.710 npm3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.