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/mcpEs 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_LLAVECrea 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:
{ "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:
{ "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:
[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
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 → APIlas 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
| Herramienta | Qué hace |
|---|---|
listBoards | Lista los tableros de feedback del espacio, en su orden. |
createBoard | Crea un tablero de feedback. 409 board_name_conflict si ya existe uno con ese nombre. |
getBoard | Obtiene un tablero. |
updateBoard | Edita nombre, color, descripción o visibilidad (public o private) de un tablero. |
deleteBoard | Borra un tablero vacío. 409 board_not_empty si todavía tiene solicitudes. |
listRequestTags | Lista las etiquetas de solicitudes del espacio. |
createRequestTag | Crea una etiqueta de solicitudes. 409 tag_name_conflict si ya existe. |
deleteRequestTag | Borra una etiqueta de solicitudes y la quita de todas las solicitudes. |
listRequests | Lista solicitudes con filtros y orden. sort: newest, oldest, top, trending o status_updated. |
createRequest | Crea una solicitud a nombre de un miembro (author { id } o { external_id }). Acepta Idempotency-Key. |
getRequest | Obtiene una solicitud por id o por número. |
updateRequest | Edita título o cuerpo de una solicitud (Jotly también acepta hidden). |
deleteRequest | Borra una solicitud con sus votos y comentarios. |
listSimilarRequests | Solicitudes parecidas a otra (o a un texto en query), para detectar duplicados. similarity va de 0 a 1. |
updateRequestStatus | Cambia el estado y avisa por correo a autor, votantes y seguidores. actor opcional: quién lo cambia (alguien del equipo). |
moveRequestBoard | Mueve una solicitud a otro tablero. |
mergeRequest | Fusiona una solicitud duplicada en la canónica (into_request_id). Votos y comentarios pasan a la canónica. |
listRequestVotes | Lista quién votó una solicitud, del voto más nuevo al más viejo. |
addRequestVote | Vota una solicitud en nombre de un miembro (por ejemplo, tras una llamada de ventas). |
deleteRequestVote | Quita el voto de un miembro (voter_id o voter_external_id). |
listRequestSubscriptions | Lista quién sigue una solicitud (recibe sus avisos). |
addRequestSubscription | Suscribe a un miembro a los avisos de una solicitud. |
deleteRequestSubscription | Quita la suscripción de un miembro (subscriber_id o subscriber_external_id). |
listRequestTagAssignments | Lista las etiquetas de una solicitud. |
addRequestTags | Agrega etiquetas a una solicitud sin quitar las que ya tiene. |
deleteRequestTagAssignment | Quita una etiqueta de una solicitud. |
setRequestTags | Reemplaza todas las etiquetas de una solicitud (Jotly). |
listRequestComments | Lista los comentarios de una solicitud en hilos de un nivel (replies), con los fijados primero. Incluye notas internas. |
createRequestComment | Comenta 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. |
getComment | Obtiene un comentario. |
updateComment | Edita el texto de un comentario. |
deleteComment | Borra un comentario y sus respuestas. |
listCommentVotes | Lista quién votó un comentario. |
addCommentVote | Vota un comentario en nombre de un miembro. |
deleteCommentVote | Quita el voto de un miembro en un comentario (voter_id o voter_external_id). |
pinComment | Fija un comentario arriba del hilo. |
unpinComment | Desfija un comentario. |
listChangelogTags | Lista las etiquetas del changelog (Nueva función, Mejora, Corrección...). |
createChangelogTag | Crea una etiqueta del changelog. 409 tag_name_conflict si ya existe. |
deleteChangelogTag | Borra una etiqueta del changelog y la quita de todas las entradas. |
listChangelogs | Lista entradas del changelog. status: draft, scheduled o published. |
createChangelog | Crea 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. |
getChangelog | Obtiene una entrada del changelog con etiquetas, autores y solicitudes vinculadas. |
updateChangelog | Edita una entrada; status publica, programa (con publish_at) o regresa a borrador. |
deleteChangelog | Borra una entrada del changelog. |
listChangelogTagAssignments | Lista las etiquetas de una entrada del changelog. |
addChangelogTags | Agrega etiquetas a una entrada sin quitar las que ya tiene. |
deleteChangelogTagAssignment | Quita una etiqueta de una entrada. |
listChangelogAuthors | Lista los autores de una entrada. |
addChangelogAuthors | Agrega autores a una entrada. Tienen que ser del equipo (invalid_changelog_author si no). |
deleteChangelogAuthor | Quita a un autor de una entrada. |
listChangelogRequests | Lista las solicitudes que cierra una entrada. |
addChangelogRequests | Vincula solicitudes (por id o número) a una entrada; sus votantes ven que se cumplió. |
deleteChangelogRequest | Desvincula una solicitud de una entrada. |
listMembers | Lista miembros (quienes votan, publican o chatean). type: user, admin u owner. company_external_id filtra por empresa. |
lookupMember | Busca un miembro por external_id o por correo. |
syncMember | Crea 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. |
getMember | Obtiene un miembro. 410 member_erased si sus datos se borraron. |
updateMember | Edita un miembro: external_id, correo, nombre, avatar o traits (se fusionan; un trait en null se borra). |
syncCompany | Crea o actualiza una empresa por external_id. name es obligatorio al crearla; los traits se fusionan. |
listCompanies | Lista empresas. Filtra por search (nombre o dominio), external_id o domain. |
lookupCompany | Busca una empresa por external_id. |
getCompany | Obtiene una empresa. |
updateCompany | Edita una empresa. 409 company_identity_conflict si el external_id nuevo ya es de otra. |
listCompanyMembers | Lista los miembros de una empresa. |
addCompanyMember | Liga un miembro ({ id } o { external_id }) a una empresa. |
deleteCompanyMember | Desliga a un miembro de una empresa. |
listConversations | Lista 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. |
getConversation | Obtiene una conversación. Sus mensajes están en listConversationTimeline. |
listConversationTimeline | Lí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. |
createConversationReply | Responde 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. |
createConversationNote | Agrega una nota interna (el cliente no la ve). Acepta Idempotency-Key. |
updateConversationStatus | Resuelve o reabre una conversación. 409 conversation_status_conflict si está archivada o en spam. |
updateConversationAssignee | Asigna la conversación a alguien del equipo (assignee { id } o { external_id }, o assignee_email) o la desasigna con null. |
importAsset | Importa 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. |
getAsset | Obtiene un asset del espacio. |
listRequestAttachments | Lista las imágenes adjuntas de una solicitud (URLs firmadas que caducan en una hora). |
addRequestAttachments | Adjunta imágenes a una solicitud a partir de URLs (máximo 4 por solicitud). |
deleteRequestAttachment | Quita un adjunto de una solicitud. |
listCommentAttachments | Lista las imágenes adjuntas de un comentario. |
addCommentAttachments | Adjunta imágenes a un comentario a partir de URLs (máximo 4 por comentario). |
deleteCommentAttachment | Quita un adjunto de un comentario. |
Ver también Servidor MCP