Install
openclaw skills install @beatra-ai/school-song-makerTurn your school, class, year, motto, and shared memories into original lyrics and a song the whole class can sing together. This school song maker writes a class song, graduation song, freshman welcome song, school anthem, teachers' day song, school anniversary song, or sports day song with a chorus that is easy to learn, shapes the words with you line by line, and produces the finished song with a student choir, children's choir, or solo voice for assemblies, opening and graduation ceremonies, class meetings, and school performances.
openclaw skills install @beatra-ai/school-song-makerTurn a school occasion into original lyrics and a finished song a class can sing together: a class song, a graduation song, a freshman welcome song, a new school or college anthem, a teachers' day song, a school anniversary song, or a sports day or military training song.
Use it when a teacher, class leader, student union, or school office
wants a song written for a school occasion from the school's own facts.
Route a finished lyric that only needs a song to suno-lyrics-to-song;
a new arrangement of an existing recorded school anthem to
ai-song-cover-studio; a personal gift song for one person to
personalized-song-maker; an exam knowledge-point song to
exam-mnemonic-song; and spoken lecture narration to
course-narration-studio. Route mixed or uncertain music requests to
beatra-ai-music-creator.
Hard inputs:
Ask only for a missing hard input. Reuse anything already given. Do not invent a motto, a school history fact, a memory, or a student name to finish a lyric. When the user lists student or teacher names, sing only the names they list, written exactly as they gave them.
Safe defaults:
model: "suno-6" with model_options.suno.custom_mode: true, so the
approved lyrics are sung as written. Show the model on the production
card; switch only when the user chooses another live model.instrumental: false with the approved lyrics present. Style lives
only in prompt; the sung words live only in lyrics. There is no
duration field; write the target length in the prompt.beatra.models.list for
text_to_music and confirm the live prompt, lyrics, and title limits,
the controls, and the current price.client_request_id per slot. Record each returned task_id
immediately.beatra.tasks.get until terminal. Deliver
every returned take with its link, actual duration, resolved model,
and billing.net_charged_credits. Review it (see Review, deliver, and
recover).Music generation is the only paid step. Before any billable call, show one current production card and wait for a clear yes:
beatra.music.generate call.text_to_music price just read from
beatra.models.list, per slot and in total. Never a remembered number.client_request_id per slot. Any changed
lyric, title, prompt, model, or control mints a new ID.One approval covers only the slots on that card. In the one-song-per-class mode, accepting the first song is not approval of the rest: show a fresh card for the remaining classes.
Invoke every remote Beatra operation only through the bundled
scripts/mcp_client.py: put the MCP tool name after call and send one
JSON object on standard input.
python3 scripts/mcp_client.py call beatra.models.list
{"capability": "text_to_music"}
Send the generate payload through a quoted heredoc (or a JSON file on
standard input), never inside a single-quoted shell string: lyrics and
school names often contain apostrophes, and a single-quoted string
silently drops them. The lyrics and title sent must match the approved
sheet character for character; inside the JSON, escape double quotes,
backslashes, and control characters such as line breaks (\n) and
tabs (\t).
python3 scripts/mcp_client.py call beatra.music.generate <<'JSON'
{"model":"suno-6","prompt":"Bright campus pop anthem, mixed student choir singing the chorus in unison, piano and strings with light drums, moderate tempo, easy to sing along, about two and a half minutes.","lyrics":"[Verse 1]\nWe're the class that never quits\n[Chorus]\nApproved hook","instrumental":false,"title":"Approved Title","model_options":{"suno":{"custom_mode":true}},"client_request_id":"opaque-school-song-01"}
JSON
Do not configure or call a host Beatra Connector, and do not use REST/OpenAPI as a fallback. Exact payloads for the instrumental slot and the per-class set are in the workflow reference.
Review each take against the lyric sheet: the school and class names sung in the form the user chose, every must-include line present, the chorus clear enough for a class to pick up, the voice matching the chosen choir or solo voice, the mood right for the occasion, and the audio clean. Report only what the host could actually hear; if it could not listen, say so and list what the user should check.
If the user wants changes after a delivered song, a changed lyric, title, prompt, or model is new paid work: revise the sheet for free, then show a new card with a new ID.
If a create response is lost, call beatra.tasks.list for text_to_music
and match candidates with beatra.tasks.get against the private ledger
before any replay; reuse an ID only with byte-identical arguments.
Queued and running are progress states. Call beatra.tasks.cancel only
when the user asks, then confirm the terminal state.
When the user asks how many credits remain or whether a live estimate
fits, call beatra.wallet.get. When they ask what was charged, call
beatra.wallet.ledger. Both are read-only. Do not invent an
account-balance or top-up tool, and do not make wallet.get a required
step before every paid submit.
The bundled client silently checks for a newer release at most once every 24 hours per installation. When a newer version is available, it installs automatically without separate confirmation. It downloads only from the fixed official Beatra discovery and immutable CDN paths for this package, channel, and locale, verifies discovery data, archive, manifest, and every packaged file, and replaces only package-owned files.
Update checks, downloads, verification, replacement, rollback, and recovery fail open: the current installation remains usable and the original command continues. An update failure never authorizes retrying a paid music request. The setting persists for this installation. See automatic updates and safety.
python3 scripts/mcp_client.py update --auto off
python3 scripts/mcp_client.py update --auto on
python3 scripts/mcp_client.py update --check