← CanciónAlMedida

Servidor MCP

Nuestro servidor Model Context Protocol da a los asistentes de inteligencia artificial acceso directo a la producción musical. El agente reúne los detalles en la conversación, encarga la canción y entrega el resultado, sin que tengas que escribir una línea de código.

Actualizado: 2026-09-16

Solicitar acceso

Las claves se entregan a mano. Basta un correo breve con tu proyecto, el volumen previsto y los idiomas, y la activación suele tardar un día laborable.

Solicitar acceso

Introducción

El Model Context Protocol es el estándar abierto con el que los asistentes de inteligencia artificial hablan con sistemas externos. Nuestro servidor expone toda la producción musical como herramientas MCP: el agente puede crear una canción, consultar su estado, recuperar letra y audio y lanzar una regeneración.

La ventaja frente a la API REST es la conversación. Un agente sabe qué detalles faltan para que la canción sea personal y los pide por su cuenta. El usuario cuenta cosas de su padre, el agente hace de eso un briefing y encarga la canción.

El servidor corre en https://mcp.cancionalmedida.es y habla HTTP con Server-Sent Events, el transporte que todos los clientes actuales soportan. Usa las mismas claves que la API REST, así que quien ya integra no necesita credenciales nuevas.

También por MCP la facturación es por canción terminada, actualmente 29,99 €. La letra y la vista previa de 45 segundos siguen siendo gratuitas.

Acceso

Las claves se entregan a mano, igual que para la API REST. Escribe a songs@maxkuch.com indicando qué quieres construir, el volumen previsto y los idiomas. La activación suele tardar un día laborable.

Recibirás una clave de prueba con el prefijo sk_test_ y una en vivo con el prefijo sk_live_. Con la clave de prueba todas las herramientas funcionan igual, pero no arranca ninguna producción real y no cuesta nada.

Quien ya tenga una clave de API no necesita nada más: la misma clave abre el servidor MCP.

Conexión

La dirección del servidor es https://mcp.cancionalmedida.es/sse. La autenticación se hace con un token bearer en la cabecera Authorization, exactamente igual que en la API REST.

El servidor implementa la versión de protocolo 2026-03-26 y anuncia sus capacidades durante el saludo inicial: herramientas, recursos y prompts. Los clientes que solo conocen versiones antiguas siguen siendo compatibles, simplemente sin los prompts.

bashComprobar la conexión
curl https://mcp.cancionalmedida.es/health

Instalación en los clientes

Casi todos los clientes MCP se configuran con un pequeño archivo JSON. Aquí están las tres variantes más frecuentes, cada una con la clave en su sitio.

Claude Code

bashAñadir el servidor
claude mcp add --transport http songs \
  https://mcp.cancionalmedida.es/mcp \
  --header "Authorization: Bearer $SONG_API_KEY"

Claude Desktop

jsonclaude_desktop_config.json
{
  "mcpServers": {
    "songs": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.cancionalmedida.es/mcp",
               "--header", "Authorization: Bearer ${SONG_API_KEY}"],
      "env": { "SONG_API_KEY": "sk_live_..." }
    }
  }
}

Cursor

json.cursor/mcp.json
{
  "mcpServers": {
    "songs": {
      "url": "https://mcp.cancionalmedida.es/mcp",
      "headers": { "Authorization": "Bearer sk_live_..." }
    }
  }
}

Tras reiniciar el cliente, las herramientas aparecen en la lista. Si no lo hacen, la causa casi siempre es una clave que falta o un JSON con un error de sintaxis.

Herramientas

El servidor pone siete herramientas a disposición. Son pocas a propósito y tienen nombres claros, para que un agente elija bien.

HerramientaEscribePara qué sirve
create_songEncarga una canción nueva. Ocasión, nombre y detalles son obligatorios.
get_songDevuelve el estado actual, la letra y los enlaces disponibles.
list_songsLista las canciones recientes de la cuenta, filtrable por estado.
get_lyricsDevuelve la letra completa como texto plano.
regenerate_songLanza una regeneración gratuita, con indicación opcional.
get_checkout_linkGenera un enlace de pago para una canción y lo devuelve como URL, para que el agente pueda pasarlo en la conversación.
list_optionsDevuelve los valores válidos de ocasión, ambiente, estilo, voz e idioma.

Solo create_song y regenerate_song cambian algo. Los clientes que piden confirmación antes de operaciones de escritura la pedirán justo en esas dos.

create_song en detalle

Es la herramienta central. Su esquema es deliberadamente explícito, para que el agente sepa qué información debe reunir primero.

jsonEsquema
{
  "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": "es" },
      "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." }
    }
  }
}

El campo details es el decisivo. La descripción del esquema le dice claramente al agente que hacen falta detalles concretos, no adjetivos. Un buen agente no pregunta "cómo es tu padre" sino "qué dice siempre cuando algo le molesta".

jsonResultado
{
  "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.cancionalmedida.es/preview/sng_3n8Kd2ZpQv.mp3",
    "paid": false
  },
  "isError": false
}

La respuesta contiene texto para el agente y datos estructurados para el código. La llamada vuelve enseguida, la producción sigue en segundo plano.

Forma de las respuestas

Cada herramienta devuelve dos cosas: un bloque de texto legible que el agente puede transmitir tal cual, y structuredContent con los mismos datos en forma utilizable por la máquina. Un agente puede así responder al usuario sin perder los identificadores.

Los identificadores de canción son los mismos que en la API REST. Una canción creada por MCP se recupera después por REST y al revés, lo que viene bien cuando el agente reúne el briefing y tu backend se ocupa de la entrega.

Recursos

Además de las herramientas, el servidor ofrece recursos, es decir, contenidos de solo lectura que un cliente puede cargar en su contexto sin llamar a una herramienta.

textRecursos disponibles
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 contiene todos los valores válidos, song://guide/details una guía breve sobre qué hace personal a una canción, song://songs/{id} una canción concreta con letra y estado. La guía está pensada sobre todo para agentes: hace bastante más probable que pregunten lo correcto.

Prompts

El servidor trae prompts listos que un cliente puede ofrecer como comandos. Le ahorran al usuario la explicación de qué tiene que contar.

jsonPrompts disponibles
{
  "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 lleva al agente por un diálogo breve que acaba en un briefing utilizable. write_song_brief convierte un texto existente, por ejemplo el correo de un cliente, en un briefing estructurado. suggest_occasion ayuda cuando la ocasión no encaja en las categorías habituales.

Una conversación típica

Así se ve en la práctica, con un usuario que aún no sabe bien qué quiere.

textTranscripción abreviada
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.

Lo importante está en el medio. El agente no se queda con la primera descripción general sino que pregunta dos veces más, y son justo esas dos preguntas las que convierten una canción sobre cualquiera en una canción sobre esta persona.

Pago

Un agente no puede iniciar un pago. Solo puede generar un enlace de pago y pasarlo, el cobro ocurre en el navegador. Está construido así a propósito: un modelo no debe tomar una decisión de compra que una persona no ha visto.

get_checkout_link devuelve una URL válida durante 24 horas. Tras el pago la canción pasa al estado complete y en la siguiente llamada a get_song la grabación completa está lista. El agente no tiene que suscribirse a nada, basta con una llamada posterior.

Quien gestiona el pago en su propio sistema y solo nos factura puede pedir que le abramos la vía directa de la API REST. Entonces el enlace de pago desaparece y la canción se libera de inmediato.

Derechos y ámbitos

Cada clave lleva permisos. Lo estándar es lectura y escritura sin acceso a la facturación, lo que encaja con la mayoría de los agentes.

ÁmbitoValorPermite
songs:readConsultar canciones, listarlas, leer las letras. Sin este permiso el servidor anuncia una lista de herramientas vacía.
songs:writeCrear canciones y regenerarlas. Genera costes de producción.
billingCrear enlaces de pago y leer el estado del pago. Solo hace falta si el agente debe pasar enlaces.

Las herramientas cuyo permiso falta ni siquiera aparecen en la lista de herramientas. Resulta más agradable que un mensaje de error en mitad de la conversación, porque así el modelo no ofrece nada que de todos modos no podría hacer.

Errores

Los errores llegan como resultado de herramienta con isError: true y un texto comprensible, no como error de protocolo. Así el agente puede reaccionar y explicarle al usuario qué falta, en vez de interrumpirse.

jsonError de validación
{
  "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.cancionalmedida.es/c/cs_live_8Hd2Kq..." }
  ],
  "isError": true
}

Los códigos de error corresponden a los de la API REST: validation_error, rate_limit, not_found, permission_error, api_error. El texto está redactado para que un agente pueda transmitirlo palabra por palabra.

Límites

Rigen los mismos límites que en la API REST: 60 llamadas a herramientas por minuto y clave y diez producciones simultáneas. Las llamadas adicionales quedan en cola en vez de fallar.

Una sesión MCP queda abierta mientras el cliente la mantenga. Tras 30 minutos de inactividad cerramos la conexión; cualquier cliente actual se reconecta solo.

Si el volumen crece, escríbenos y subimos los límites.

Datos

Lo que el agente nos transmite lo usamos para producir esa canción y para nada más. Sin entrenar modelos propios con los contenidos de tus usuarios.

Los datos introducidos y las canciones terminadas se quedan 90 días; después se borran. Para borrar antes está DELETE /v1/songs/{id} en la API REST.

Recuerda a los usuarios que están contando cosas privadas sobre personas reales. Un agente debería pedir detalles concretos sin empujar hacia información sensible de salud o finanzas.

Operación

El servidor MCP corre sobre la misma infraestructura que la API REST. No hay un componente aparte que instalar o actualizar: añadimos herramientas nuevas de forma aditiva, las existentes se mantienen estables.

Un cliente debería leer la lista de herramientas al arrancar en lugar de escribirla en el código. Es la forma habitual y te trae las novedades sin cambios.

Para los mantenimientos planificados avisamos por correo a las cuentas activas con al menos 48 horas de antelación. Hasta ahora no ha habido ventanas de parada planificadas.

Soporte

Preguntas sobre instalación, ámbitos, límites más altos o casos especiales: songs@maxkuch.com. Para problemas técnicos indica el nombre de la herramienta y la hora aproximada de la llamada.

Quien prefiera integrar directamente en lugar de pasar por un agente encuentra la API REST en /api/. Ambos caminos usan las mismas claves y los mismos identificadores.

Solicitar acceso

Las claves se entregan a mano. Basta un correo breve con tu proyecto, el volumen previsto y los idiomas, y la activación suele tardar un día laborable.

Solicitar acceso