{
  "markdown": "# Tunova SDK\n\nTiny, **zero-dependency** clients + MCP manifest for the [Tunova](https://tunova.ai) music API —\ngenerate music with Suno (v5.5) over a simple REST or MCP interface.\nGeneration is async and **billed only on success**: a failed render refunds itself.\n\n- **Python** → [`python/tunova.py`](python/tunova.py) — stdlib only, Python 3.8+.\n- **Node / TypeScript** → [`node/tunova.ts`](node/tunova.ts) — Node 18+ (`fetch` built in).\n- **MCP** → [`server.json`](server.json) — hosted Streamable-HTTP server at `https://api.tunova.ai/mcp`.\n\nGet a key (50 free tokens, no card) at **<https://tunova.ai>**. Full reference:\n<https://api.tunova.ai/docs> · live status: <https://tunova.ai/status>.\n\n> Tunova is an independent service, not affiliated with or endorsed by Suno. Tracks come from paid\n> Suno plans; review Suno's terms for your use case.\n\n## Python\n\n```bash\npip install tunova\n```\n\n```python\nfrom tunova import Tunova\n\nt = Tunova(\"sk_live_…\")\njob = t.generate(\"warm lo-fi piano to study to\", model=\"v5.5\")\nprint(job[\"clips\"][0][\"audio_url\"] if job[\"status\"] == \"complete\" else job[\"error\"])\n```\n\nPrefer no install? `python/tunova.py` is stdlib-only — vendor the single file and `import` it.\n\n## Node / TypeScript\n\n```bash\nnpm i tunova\n```\n\n```ts\nimport { Tunova } from \"tunova\";\n\nconst t = new Tunova(process.env.TUNOVA_API_KEY!);\nconst job = await t.generate(\"warm lo-fi piano to study to\", { model: \"v5.5\" });\nconsole.log(job.status === \"complete\" ? job.clips[0]?.audio_url : job.error);\n```\n\nBoth `generate()` calls submit a job and poll until the track is delivered. Prefer fire-and-forget?\nUse `submit()` with a `callback_url` and take an HMAC-signed webhook instead.\n\n## MCP — give an AI agent the power to make music\n\n```bash\nclaude mcp add --transport http tunova https://api.tunova.ai/mcp \\\n  --header \"X-API-Key: sk_live_…\"\n```\n\nTools: `generate_song` · `wait_for_song` · `check_song`. Same API key, same billed-on-success rule.\n\n## Verifying webhooks\n\nIf you pass `callback_url`, Tunova POSTs the terminal job with\n`X-Webhook-Signature: sha256=<hmac>` over `<X-Webhook-Timestamp>.<rawBody>`, keyed with your\n`whsec_…` secret (view/rotate it on the dashboard's API-keys page). Verify against the **raw** body\nbefore parsing — both SDKs ship a verifier (`Tunova.verify_webhook` / `verifyWebhook`).\n\n## License\n\nMIT — see [LICENSE](LICENSE). The SDK code is yours to use freely; your use of the Tunova API is\ngoverned by the [terms](https://tunova.ai/terms).\n",
  "bytes": 2479,
  "sha": "a13be3b7552fba28518ad2ef8bc47647b588c2399f6d17d5386ca5a5996ad80e",
  "repo_slug": "erliona/tunova-sdk",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_erliona_tunova_2f09eed6/readme"
}