Vår Model Context Protocol-server ger AI-assistenter direkt tillgång till låtproduktionen. Agenten samlar detaljerna i samtalet, beställer låten och levererar resultatet, utan att du skriver en rad kod.
Uppdaterad: 2026-09-16
Nycklar delas ut för hand. Ett kort mejl med ditt upplägg, förväntad volym och språk räcker, och frisläppningen tar normalt en arbetsdag.
Model Context Protocol är den öppna standard som AI-assistenter talar med externa system genom. Vår server exponerar hela låtproduktionen som MCP-verktyg: agenten kan skapa en låt, följa status, hämta text och ljud och starta en omgenerering.
Fördelen mot REST-API:et är samtalet. En agent vet vilka detaljer som saknas för att låten ska bli personlig och frågar efter dem själv. Användaren berättar om sin pappa, agenten gör en brief av det och beställer låten.
Servern ligger på https://mcp.dinlat.se och talar HTTP med Server-Sent Events, den transport alla aktuella klienter stöder. Den använder samma nycklar som REST-API:et, så den som redan integrerar behöver inga nya uppgifter.
Även via MCP sker debiteringen per färdig låt, för närvarande 299 SEK. Text och förhandslyssningen på 45 sekunder förblir gratis.
Nycklar delas ut för hand, som för REST-API:et. Skriv till songs@maxkuch.com och nämn vad du vill bygga, förväntad volym och språk. Frisläppningen tar normalt en arbetsdag.
Du får en testnyckel med prefixet sk_test_ och en livenyckel med prefixet sk_live_. Med testnyckeln fungerar alla verktyg likadant, men ingen riktig produktion startar och ingenting kostar.
Den som redan har en API-nyckel behöver inget mer: samma nyckel öppnar MCP-servern.
Serveradressen är https://mcp.dinlat.se/sse. Autentiseringen sker med en bearer-token i Authorization-huvudet, precis som i REST-API:et.
Servern följer protokollversion 2026-03-26 och meddelar sina förmågor under handskakningen: verktyg, resurser och prompter. Klienter som bara känner äldre versioner är fortsatt kompatibla, bara utan prompterna.
curl https://mcp.dinlat.se/health
Nästan alla MCP-klienter ställs in med en liten JSON-fil. Här är de tre vanligaste varianterna, var och en med nyckeln på rätt plats.
claude mcp add --transport http songs \
https://mcp.dinlat.se/mcp \
--header "Authorization: Bearer $SONG_API_KEY"
{
"mcpServers": {
"songs": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.dinlat.se/mcp",
"--header", "Authorization: Bearer ${SONG_API_KEY}"],
"env": { "SONG_API_KEY": "sk_live_..." }
}
}
}
{
"mcpServers": {
"songs": {
"url": "https://mcp.dinlat.se/mcp",
"headers": { "Authorization": "Bearer sk_live_..." }
}
}
}
Efter omstart av klienten dyker verktygen upp i listan. Om de inte gör det beror det nästan alltid på en saknad nyckel eller en JSON med syntaxfel.
Servern ställer sju verktyg till förfogande. De är medvetet få och tydligt namngivna, så att en agent väljer rätt.
| Verktyg | Skriver | Syfte |
|---|---|---|
| create_song | Beställer en ny låt. Tillfälle, namn och detaljer är obligatoriska. | |
| get_song | Lämnar aktuell status, texten och tillgängliga länkar. | |
| list_songs | Listar kontots senaste låtar, filtrerbart på status. | |
| get_lyrics | Lämnar hela texten som ren text. | |
| regenerate_song | Startar en kostnadsfri omgenerering, med valfri anvisning. | |
| get_checkout_link | Skapar en betallänk för en låt och returnerar den som URL, så att agenten kan skicka den vidare i samtalet. | |
| list_options | Lämnar giltiga värden för tillfälle, stämning, stil, röst och språk. |
Bara create_song och regenerate_song ändrar något. Klienter som frågar innan skrivande åtgärder frågar alltså precis vid dessa två.
Det är det centrala verktyget. Dess schema är medvetet utförligt, så att agenten vet vilka uppgifter den behöver skaffa först.
{
"name": "create_song",
"description": "Write and produce a personalised song. Returns immediately with a song id; the recording is ready a few minutes later.",
"inputSchema": {
"type": "object",
"required": ["occasion", "recipient_name", "details"],
"properties": {
"occasion": { "type": "string", "enum": ["birthday", "wedding", "anniversary", "farewell", "funeral", "christening", "graduation", "christmas", "declaration", "other"] },
"recipient_name": { "type": "string", "maxLength": 80 },
"relationship": { "type": "string", "maxLength": 80 },
"language": { "type": "string", "default": "sv" },
"mood": { "type": "string", "enum": ["happy", "warm", "funny", "romantic", "gentle", "epic", "surprise_me"] },
"style": { "type": "string" },
"voice": { "type": "string", "enum": ["female", "male", "duet", "choir", "childrens", "surprise_me"] },
"details": { "type": "string", "minLength": 40, "maxLength": 4000 },
"wait": { "type": "boolean", "default": false, "description": "Block until the preview is ready, at most 10 minutes." }
}
}
}
Fältet details är det avgörande. Schemabeskrivningen säger tydligt till agenten att det behövs konkreta detaljer, inte adjektiv. En bra agent frågar inte "hur är din pappa" utan "vad säger han alltid när något stör honom".
{
"content": [
{ "type": "text", "text": "Song sng_3n8Kd2ZpQv for Anna is written. Lyrics below, the 45 second preview is ready." },
{ "type": "resource", "resource": { "uri": "song://sng_3n8Kd2ZpQv/lyrics", "mimeType": "text/plain" } },
{ "type": "resource", "resource": { "uri": "song://sng_3n8Kd2ZpQv/preview", "mimeType": "audio/mpeg" } }
],
"structuredContent": {
"id": "sng_3n8Kd2ZpQv",
"status": "preview_ready",
"preview_url": "https://cdn.dinlat.se/preview/sng_3n8Kd2ZpQv.mp3",
"paid": false
},
"isError": false
}
Svaret innehåller text för agenten och strukturerade data för koden. Anropet återvänder direkt, produktionen fortsätter i bakgrunden.
Varje verktyg lämnar två saker: ett läsbart textblock som agenten kan återge direkt, och structuredContent med samma uppgifter i maskinläsbar form. En agent kan alltså svara användaren utan att tappa identifierarna.
Låtidentifierarna är desamma som i REST-API:et. En låt som skapats via MCP kan senare hämtas via REST och tvärtom, vilket är praktiskt när agenten samlar briefen och din backend sköter leveransen.
Utöver verktygen erbjuder servern resurser, alltså läsbart innehåll som en klient kan lägga i sitt sammanhang utan att anropa ett verktyg.
song://sng_3n8Kd2ZpQv the song object as JSON
song://sng_3n8Kd2ZpQv/lyrics the full lyrics as plain text
song://sng_3n8Kd2ZpQv/preview the first 45 seconds as audio/mpeg
song://sng_3n8Kd2ZpQv/audio the full recording, only after payment
song://options innehåller alla giltiga värden, song://guide/details en kort guide om vad som gör en låt personlig, song://songs/{id} en enskild låt med text och status. Guiden är framför allt till för agenter: den gör det betydligt mer sannolikt att de frågar om rätt saker.
Servern har färdiga prompter med sig som en klient kan erbjuda som kommandon. De besparar användaren förklaringen av vad hen ska berätta.
{
"name": "birthday_song",
"description": "Collects the five things a birthday song needs and then creates it.",
"arguments": [
{ "name": "recipient_name", "required": true },
{ "name": "age", "required": false },
{ "name": "details", "required": false }
]
}
gather_song_details leder agenten genom ett kort samtal som slutar i en användbar brief. write_song_brief gör om en befintlig text, till exempel ett kundmejl, till en strukturerad brief. suggest_occasion hjälper när tillfället inte passar i de vanliga kategorierna.
Så här ser det ut i praktiken, med en användare som ännu inte riktigt vet vad hen vill.
User: My sister Anna turns 34 on Friday. She climbs, she is always late,
and she calls everyone chef. Make her a song.
Claude: [calls create_song with occasion=birthday, recipient_name=Anna,
relationship=sister, mood=funny, details="climbs every weekend,
always ten minutes late, calls everyone chef"]
Done. Here are the lyrics, and the first 45 seconds are playable
right away. Should the chorus lean more on the climbing or more
on the chef thing?
User: More chef.
Claude: [calls regenerate_song with keep_lyrics=false,
note="put the chef running gag in the chorus"]
New version is running, about five minutes.
Poängen ligger i mitten. Agenten nöjer sig inte med den första allmänna beskrivningen utan frågar två gånger till, och det är just de två frågorna som gör en låt om vem som helst till en låt om den här personen.
En agent kan inte utlösa en betalning. Den kan bara skapa en betallänk och skicka den vidare, betalningen sker i webbläsaren. Det är byggt så med flit: en modell ska inte fatta ett köpbeslut som en människa inte har sett.
get_checkout_link lämnar en URL som gäller i 24 timmar. Efter betalningen går låten över i status complete, och vid nästa get_song ligger hela inspelningen klar. Agenten behöver inte prenumerera på något, ett senare anrop räcker.
Den som sköter betalningen i sitt eget system och bara fakturerar oss kan på begäran få den direkta vägen i REST-API:et öppnad. Då bortfaller betallänken och låten friges direkt.
Varje nyckel bär behörigheter. Standard är läsa och skriva utan åtkomst till fakturering, vilket passar de flesta agenter.
| Scope | Värde | Tillåter |
|---|---|---|
| songs:read | Hämta låtar, lista dem, läsa sångtexter. Utan den här behörigheten anmäler servern en tom verktygslista. | |
| songs:write | Skapa låtar och generera om dem. Utlöser produktionskostnader. | |
| billing | Skapa betallänkar och läsa betalstatus. Behövs bara om agenten ska skicka vidare länkar. |
Verktyg vars behörighet saknas dyker inte ens upp i verktygslistan. Det är behagligare än ett felmeddelande mitt i samtalet, eftersom modellen då inte erbjuder något den ändå inte kan göra.
Fel kommer som verktygsresultat med isError: true och en begriplig text, inte som protokollfel. Så kan agenten reagera och förklara för användaren vad som saknas, i stället för att avbryta.
{
"content": [
{ "type": "text", "text": "The song is not paid for yet, so the full recording cannot be handed over. The checkout link is https://pay.dinlat.se/c/cs_live_8Hd2Kq..." }
],
"isError": true
}
Felkoderna motsvarar REST-API:ets: validation_error, rate_limit, not_found, permission_error, api_error. Texten är formulerad så att en agent kan återge den ordagrant.
Samma gränser gäller som för REST-API:et: 60 verktygsanrop per minut och nyckel samt tio samtidiga produktioner. Ytterligare anrop hamnar i kö i stället för att misslyckas.
En MCP-session står öppen så länge klienten håller den. Efter 30 minuters overksamhet stänger vi anslutningen; varje aktuell klient återansluter av sig själv.
Växer volymen, skriv till oss så höjer vi gränserna.
Det agenten skickar till oss använder vi för att producera just den låten och till ingenting annat. Ingen träning av egna modeller på dina användares innehåll.
Indata och färdiga låtar ligger kvar i 90 dagar, sedan raderas de. För tidigare radering finns DELETE /v1/songs/{id} i REST-API:et.
Påminn användarna om att de berättar privata saker om verkliga personer. En agent bör fråga efter konkreta detaljer utan att styra mot känsliga hälso- eller ekonomiuppgifter.
MCP-servern körs på samma infrastruktur som REST-API:et. Det finns ingen separat komponent att installera eller uppdatera: vi lägger till nya verktyg additivt, befintliga förblir stabila.
En klient bör läsa verktygslistan vid start i stället för att skriva in den i koden. Det är det vanliga sättet och ger dig nyheter utan ändringar.
Vid planerat underhåll varnar vi aktiva konton per mejl minst 48 timmar i förväg. Hittills har det inte funnits några planerade avbrott.
Frågor om installation, scopes, högre gränser eller särskilda fall: songs@maxkuch.com. Vid tekniska problem, ange verktygets namn och ungefärlig tid för anropet.
Den som hellre integrerar direkt än via en agent hittar REST-API:et på /api/. Båda vägarna använder samma nycklar och samma identifierare.
Nycklar delas ut för hand. Ett kort mejl med ditt upplägg, förväntad volym och språk räcker, och frisläppningen tar normalt en arbetsdag.