Saltar al contenido

Servidor MCP

La integración MCP de Jotly conecta tus herramientas de IA directo a tu espacio a través de un servidor MCP remoto (HTTP transmitible, sin estado) con 82 herramientas: las mismas operaciones de la API REST, salvo subir archivos y borrar datos personales, que sólo van por REST.

Si tu editor o asistente acepta servidores MCP remotos, lo conectas a Jotly sin instalar ningún paquete local. Tus agentes atienden la bandeja, votan por tus clientes y escriben novedades.

Dirección del servidor

Jotly expone un solo endpoint MCP remoto:

https://jotly.si/api/v1/mcp

Es un servidor MCP remoto por HTTP, así que tu cliente necesita aceptar conexiones remotas y cabeceras propias.

Autenticación

Autentica las peticiones con una llave de API de Jotly:

Authorization: Bearer pk_live_TU_LLAVE

Crea la llave en Ajustes → API. Es la misma que usa la API REST. Listar herramientas no pide llave; llamarlas sí.

Cuándo usar MCP

Usa el servidor MCP cuando quieras que un asistente de IA trabaje con Jotly desde un cliente compatible como Claude Code, Cursor o Codex.

MCP te conviene cuando quieres:

  • traer el contexto de Jotly a un flujo con IA
  • que un asistente revise los datos de tu espacio sin construir una integración propia
  • conectar Jotly a una herramienta de código o de investigación que ya hable MCP

MCP o API REST

Usa MCP cuando lo que conectas es un cliente de IA que ya entiende el Model Context Protocol.

Usa la API REST cuando construyes tu propia integración, automatización o código de backend y quieres control total sobre peticiones y respuestas.

Claude Code

Desde la terminal, en la carpeta de tu proyecto:

claude mcp add --transport http jotly https://jotly.si/api/v1/mcp \  --header "Authorization: Bearer pk_live_TU_LLAVE"

O agrégalo a mano en .mcp.json:

.mcp.json
{  "mcpServers": {    "jotly": {      "type": "http",      "url": "https://jotly.si/api/v1/mcp",      "headers": { "Authorization": "Bearer pk_live_TU_LLAVE" }    }  }}

Cursor

En .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json para todos:

.cursor/mcp.json
{  "mcpServers": {    "jotly": {      "url": "https://jotly.si/api/v1/mcp",      "headers": { "Authorization": "Bearer pk_live_TU_LLAVE" }    }  }}

Codex

Codex lee su configuración de ~/.codex/config.toml. Exporta la llave como JOTLY_API_KEY en tu entorno y agrega:

~/.codex/config.toml
[mcp_servers.jotly]url = "https://jotly.si/api/v1/mcp"# La llave vive en una variable de entorno, no en el archivobearer_token_env_var = "JOTLY_API_KEY"

Probar la conexión

tools/list
curl -s -X POST "https://jotly.si/api/v1/mcp" \  -H "Content-Type: application/json" \  -H "Accept: application/json, text/event-stream" \  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Para un agente programado que atiende la bandeja, empieza por listConversations con inbox_state=needs_team y updated_since con la hora de su última corrida. Jotly todavía no envía eventos a tu agente: la frecuencia la define tu rutina.

Para no duplicar si la rutina se reintenta, createRequest, createChangelog, importAsset, createConversationReply y createConversationNote aceptan el argumento idempotency_key: con la misma llave y los mismos argumentos durante 24 horas devuelven el resultado original. El límite de peticiones por minuto de la llave es el mismo que en la API REST; al pasarlo, la herramienta responde con isError y el código rate_limited con los segundos de espera.

Manejo de la llave

Trata tu llave de API como cualquier otro secreto:

  • no la escribas en archivos de configuración que subes al repositorio
  • prefiere variables de entorno o tu gestor de secretos cuando tu cliente lo permita
  • crea una llave por agente o por entorno para poder revocarla sin afectar a las demás
  • revoca desde Ajustes → API las llaves que ya no uses
Una llave puede hacer todo dentro de su espacio, incluso borrar. Crea una por agente y guárdala en tu gestor de secretos, no en el repositorio.

Herramientas

HerramientaQué hace
listBoardsLista los tableros de feedback del espacio, en su orden.
createBoardCrea un tablero de feedback. 409 board_name_conflict si ya existe uno con ese nombre.
getBoardObtiene un tablero.
updateBoardEdita nombre, color, descripción o visibilidad (public o private) de un tablero.
deleteBoardBorra un tablero vacío. 409 board_not_empty si todavía tiene solicitudes.
listRequestTagsLista las etiquetas de solicitudes del espacio.
createRequestTagCrea una etiqueta de solicitudes. 409 tag_name_conflict si ya existe.
deleteRequestTagBorra una etiqueta de solicitudes y la quita de todas las solicitudes.
listRequestsLista solicitudes con filtros y orden. sort: newest, oldest, top, trending o status_updated.
createRequestCrea una solicitud a nombre de un miembro (author { id } o { external_id }). Acepta Idempotency-Key.
getRequestObtiene una solicitud por id o por número.
updateRequestEdita título o cuerpo de una solicitud (Jotly también acepta hidden).
deleteRequestBorra una solicitud con sus votos y comentarios.
listSimilarRequestsSolicitudes parecidas a otra (o a un texto en query), para detectar duplicados. similarity va de 0 a 1.
updateRequestStatusCambia el estado y avisa por correo a autor, votantes y seguidores. actor opcional: quién lo cambia (alguien del equipo).
moveRequestBoardMueve una solicitud a otro tablero.
mergeRequestFusiona una solicitud duplicada en la canónica (into_request_id). Votos y comentarios pasan a la canónica.
listRequestVotesLista quién votó una solicitud, del voto más nuevo al más viejo.
addRequestVoteVota una solicitud en nombre de un miembro (por ejemplo, tras una llamada de ventas).
deleteRequestVoteQuita el voto de un miembro (voter_id o voter_external_id).
listRequestSubscriptionsLista quién sigue una solicitud (recibe sus avisos).
addRequestSubscriptionSuscribe a un miembro a los avisos de una solicitud.
deleteRequestSubscriptionQuita la suscripción de un miembro (subscriber_id o subscriber_external_id).
listRequestTagAssignmentsLista las etiquetas de una solicitud.
addRequestTagsAgrega etiquetas a una solicitud sin quitar las que ya tiene.
deleteRequestTagAssignmentQuita una etiqueta de una solicitud.
setRequestTagsReemplaza todas las etiquetas de una solicitud (Jotly).
listRequestCommentsLista los comentarios de una solicitud en hilos de un nivel (replies), con los fijados primero. Incluye notas internas.
createRequestCommentComenta una solicitud a nombre de un miembro (author). Sin author comenta el equipo. visibility internal = nota que el cliente no ve. Una respuesta a otra respuesta queda en el mismo hilo.
getCommentObtiene un comentario.
updateCommentEdita el texto de un comentario.
deleteCommentBorra un comentario y sus respuestas.
listCommentVotesLista quién votó un comentario.
addCommentVoteVota un comentario en nombre de un miembro.
deleteCommentVoteQuita el voto de un miembro en un comentario (voter_id o voter_external_id).
pinCommentFija un comentario arriba del hilo.
unpinCommentDesfija un comentario.
listChangelogTagsLista las etiquetas del changelog (Nueva función, Mejora, Corrección...).
createChangelogTagCrea una etiqueta del changelog. 409 tag_name_conflict si ya existe.
deleteChangelogTagBorra una etiqueta del changelog y la quita de todas las entradas.
listChangelogsLista entradas del changelog. status: draft, scheduled o published.
createChangelogCrea una entrada del changelog. Queda en borrador salvo status=published (o publish_at futuro para programarla). Sin authors firma quien creó la llave. Acepta Idempotency-Key.
getChangelogObtiene una entrada del changelog con etiquetas, autores y solicitudes vinculadas.
updateChangelogEdita una entrada; status publica, programa (con publish_at) o regresa a borrador.
deleteChangelogBorra una entrada del changelog.
listChangelogTagAssignmentsLista las etiquetas de una entrada del changelog.
addChangelogTagsAgrega etiquetas a una entrada sin quitar las que ya tiene.
deleteChangelogTagAssignmentQuita una etiqueta de una entrada.
listChangelogAuthorsLista los autores de una entrada.
addChangelogAuthorsAgrega autores a una entrada. Tienen que ser del equipo (invalid_changelog_author si no).
deleteChangelogAuthorQuita a un autor de una entrada.
listChangelogRequestsLista las solicitudes que cierra una entrada.
addChangelogRequestsVincula solicitudes (por id o número) a una entrada; sus votantes ven que se cumplió.
deleteChangelogRequestDesvincula una solicitud de una entrada.
listMembersLista miembros (quienes votan, publican o chatean). type: user, admin u owner. company_external_id filtra por empresa.
lookupMemberBusca un miembro por external_id o por correo.
syncMemberCrea o actualiza un miembro por external_id (tu id de usuario). Los traits se fusionan. companies[] crea o actualiza sus empresas y lo liga a ellas.
getMemberObtiene un miembro. 410 member_erased si sus datos se borraron.
updateMemberEdita un miembro: external_id, correo, nombre, avatar o traits (se fusionan; un trait en null se borra).
syncCompanyCrea o actualiza una empresa por external_id. name es obligatorio al crearla; los traits se fusionan.
listCompaniesLista empresas. Filtra por search (nombre o dominio), external_id o domain.
lookupCompanyBusca una empresa por external_id.
getCompanyObtiene una empresa.
updateCompanyEdita una empresa. 409 company_identity_conflict si el external_id nuevo ya es de otra.
listCompanyMembersLista los miembros de una empresa.
addCompanyMemberLiga un miembro ({ id } o { external_id }) a una empresa.
deleteCompanyMemberDesliga a un miembro de una empresa.
listConversationsLista conversaciones. inbox_state: needs_team (esperan al equipo), ai_handling (las atiende la IA) o waiting_on_customer. Para agentes programados: updated_since + inbox_state=needs_team.
getConversationObtiene una conversación. Sus mensajes están en listConversationTimeline.
listConversationTimelineLínea de tiempo de una conversación, de lo más viejo a lo más nuevo. types: message, note, ai_handoff, resolved, reopened, assigned, unassigned.
createConversationReplyResponde al cliente como alguien del equipo (actor; sin actor, quien creó la llave). La IA se retira de la conversación; reabre si estaba resuelta. Acepta Idempotency-Key.
createConversationNoteAgrega una nota interna (el cliente no la ve). Acepta Idempotency-Key.
updateConversationStatusResuelve o reabre una conversación. 409 conversation_status_conflict si está archivada o en spam.
updateConversationAssigneeAsigna la conversación a alguien del equipo (assignee { id } o { external_id }, o assignee_email) o la desasigna con null.
importAssetImporta una imagen desde una URL HTTPS pública (hasta 3 redirecciones, 10 MiB, PNG, JPEG, GIF o WebP). Devuelve el asset con su URL permanente.
getAssetObtiene un asset del espacio.
listRequestAttachmentsLista las imágenes adjuntas de una solicitud (URLs firmadas que caducan en una hora).
addRequestAttachmentsAdjunta imágenes a una solicitud a partir de URLs (máximo 4 por solicitud).
deleteRequestAttachmentQuita un adjunto de una solicitud.
listCommentAttachmentsLista las imágenes adjuntas de un comentario.
addCommentAttachmentsAdjunta imágenes a un comentario a partir de URLs (máximo 4 por comentario).
deleteCommentAttachmentQuita un adjunto de un comentario.

Ver también Servidor MCP