La API te deja leer tus tableros y crear tarjetas desde scripts, automatizaciones o agentes, sin iniciar sesión. Creá un token en Ajustes → Tokens de API. El token se muestra una sola vez, así que guardalo en un lugar seguro.
Autenticación
Mandá el token en el header Authorization. Todos los endpoints de abajo lo piden.
curl https://decknote.app/api/v1/me \
-H "Authorization: Bearer ntrl_your_token_here"
Si el token falta o no es válido, la respuesta es 401. Cada token tiene los permisos de quien lo creó: podés leer cualquier tablero al que tengas acceso y escribir en cualquiera donde seas editor o dueño.
Errores
Los errores vuelven con el status HTTP que corresponde y un cuerpo JSON de la forma { "error": "message" }. Si te pasás de un límite de pedidos, la respuesta es 429 con un header Retry-After.
Un tablero es un proyecto cuando tiene ajustes (cliente, estado, presupuesto, tarifa por hora); las tareas son las tarjetas del tablero. El tiempo se registra con un cronómetro o a mano, y se suma en los informes. Las duraciones se escriben como las escribe una persona (1h30, 90m, 1:30); las fechas son YYYY-MM-DD; la plata que mandás va en la unidad principal de la moneda (85 or "85.50") y la que leés viene en centavos (la unidad más chica de la moneda: yenes enteros en JPY), junto a la moneda del cliente. Las lecturas admiten 120 pedidos por minuto y las escrituras 30.
GET /api/v1/time/timer — tu cronómetro en marcha, o null.POST /api/v1/time/timer — arranca un cronómetro en un proyecto o en una de sus tareas: { "cardId": "…", "note": "…" }. Si ya había uno en marcha, se detiene y vuelve como stopped.POST /api/v1/time/timer/stop — lo detiene y guarda el tiempo como un registro. Un cronómetro que se detiene antes de los 30 segundos se descarta como un clic de más (discarded: true).GET, POST /api/v1/boards/{boardId}/time — el registro de horas de un proyecto (filtros cardId userId from to limit), o sumar horas a mano: { "duration": "1h30", "cardId": "…", "day": "2026-10-19", "note": "…", "billable": true }.PATCH, DELETE /api/v1/time/entries/{entryId} — corregir o borrar un registro. Cada persona cambia los suyos; el dueño del proyecto, los de cualquiera. El tiempo ya facturado o todavía en marcha responde 409.GET, PATCH /api/v1/cards/{cardId}/time — el estimado de una tarea contra el tiempo registrado, y sus registros; PATCH fija el estimado ("estimate": "4h") y si su tiempo se factura ("billable": false).GET /api/v1/time/week?day=YYYY-MM-DD — tu propia hoja de horas de esa semana, de lunes a domingo.GET, PUT /api/v1/time-rules: las reglas que cierran las horas cargadas: las tuyas para los proyectos que sos dueño, o las que rigen un proyecto (?boardId=); PUT las define: { "lockedUntil": "2026-09-30", "editWindowDays": 7 }. lockedUntil es el último día cerrado (hasta hoy): nadie, ni el dueño, puede agregar, editar, mover ni borrar horas de ese día ni de los anteriores; editWindowDays es cuántos días atrás puede corregir cada persona sus propias horas (0 = solo hoy); null borra una regla. Definir reglas es Pro. Una escritura en un día cerrado responde 409 con { "code": "closed" }.GET, PUT /api/v1/timer-alert: a las cuántas horas te avisa un cronómetro que quedó corriendo (una notificación y un push, una sola vez por cronómetro; no lo para): { "hours": 8 }, 0 lo apaga, en cualquier plan. Por defecto 8 horas.GET, POST /api/v1/clients, PATCH /api/v1/clients/{clientId} — tus clientes (el plan gratis incluye 2 activos: más allá es 402, con upgradeUrl); PATCH edita uno o lo archiva con "archived": true.GET, PATCH /api/v1/boards/{boardId}/project — los ajustes de proyecto de un tablero, y cambiarlos (solo el dueño del tablero): { "clientId": "…", "status": "active", "budgetType": "hours", "budgetHours": 40, "hourlyRate": 85, "dueDate": "2026-12-31" }.GET /api/v1/boards/{boardId}/project/summary — horas registradas, monto facturable, cuánto del presupuesto se usó y las horas de cada persona.GET /api/v1/reports/time — las horas sumadas por proyecto, cliente, persona, tarea o día en un rango de fechas (from to by boardId clientId userId billable); format=csv devuelve el detalle como archivo CSV (Pro, si no 402).GET, POST /api/v1/projects — los proyectos que podés ver, con cliente, estado, horas y presupuesto (filtros status clientId q sort), o uno nuevo: { "title": "…", "clientId": "…" }. El tope de tableros del plan gratis responde 402.POST /api/v1/projects/from-template — un proyecto nuevo desde un modelo de los que vienen (website, marketing, retainer) o desde una plantilla guardada, con los vencimientos corridos hasta la fecha de inicio: { "templateKind": "saved", "templateId": "…", "title": "…", "startDate": "2026-11-02" }.GET, POST, DELETE /api/v1/projects/sample — tu proyecto de ejemplo (un cliente, un proyecto y dos semanas de horas marcados como ejemplo): verlo, crearlo o borrarlo con todo lo que tenga.
El dueño del proyecto lee las horas de todos y la plata (tarifas y montos). Cualquier otra persona del proyecto lee y registra solo sus horas y nunca ve tarifas ni montos. Un proyecto, tarea, registro o cliente que no es tuyo responde 404, igual que uno que no existe; para registrar tiempo hace falta el rol de editor. Las mismas operaciones son herramientas del MCP (abajo).
Factura solo el dueño de la cuenta: las facturas, los presupuestos, los pagos, los datos de facturación y los informes son suyos, y un documento que no es tuyo responde 404, igual que uno que no existe. Los montos que mandás van en la unidad principal de la moneda (85 or "85.50") y los que leés vienen en centavos (la unidad más chica de la moneda: yenes enteros en JPY) junto a la moneda. Nada de esto cobra ni mueve plata: un pago registra que el cliente ya pagó. Las lecturas permiten 120 pedidos por minuto y las escrituras 30; el tope del plan gratis de 2 documentos por mes responde 402 con upgradeUrl; los errores de negocio traen además un code junto a la frase (state, overpay, no_profile, nothing_to_invoice, no_mailer…).
GET, PATCH /api/v1/billing/profile — tus datos de facturación, que se copian en cada documento nuevo (null hasta que los armes), y cambiarlos: { "businessName": "…", "currency": "USD", "defaultTaxPercent": 21, "paymentTermsDays": 14 }. El nombre del negocio es obligatorio la primera vez.GET, POST /api/v1/boards/{boardId}/expenses — los gastos de un proyecto, o cargar uno (un costo, no se paga nada): { "description": "…", "amount": 30, "category": "software", "billable": true }. El dueño del proyecto lee los de todos, con el recargo; cualquier otra persona, solo los suyos.PATCH, DELETE /api/v1/expenses/{expenseId} — corregir o borrar un gasto que todavía no está en una factura.POST /api/v1/expenses/{expenseId}/receipts · DELETE /api/v1/expense-receipts/{receiptId}: adjuntar un comprobante a un gasto ({ filename, contentBase64 }: una foto o un PDF), o borrarlo.GET /api/v1/boards/{boardId}/unbilled, POST …/invoice-preview, POST …/invoices — el trabajo sin facturar del proyecto, una vista previa de la factura que haría y el borrador mismo (sus horas y gastos quedan atados a él hasta que se anule). Solo el dueño del proyecto; 409 si no hay nada para facturar.GET, POST /api/v1/invoices — tus facturas y presupuestos (filtros kind status clientId boardId from to q page pageSize; 25 por página), o un borrador nuevo: { "kind": "invoice", "clientId": "…", "lines": [{ "description": "…", "quantity": 1.5, "price": 100 }] }. No se envía ni se publica nada.GET /api/v1/invoices/aging, GET /api/v1/invoices/export — lo que te deben los clientes según cuánto se atrasó, y las facturas en un archivo CSV (Pro, 402 si no).GET, PATCH /api/v1/invoices/{invoiceId} — un documento completo, y cambiarlo. Un borrador acepta todos los campos; una vez enviado solo cambian las notas y el vencimiento.GET /api/v1/invoices/{invoiceId}/pdf — el documento en un archivo PDF (application/pdf): la hoja A4 que recibe su cliente por mail y desde el link, en ?lang=en|es o el idioma de la cuenta. Un borrador o un documento anulado dice lo que es.POST /api/v1/invoices/{invoiceId}/send, GET, POST …/email, POST …/void, POST …/duplicate — publicar el link de un borrador (no se manda ningún mail), leer el mail que le llegaría al cliente, mandárselo, anular el documento (sus horas y gastos vuelven al proyecto) o copiarlo en un borrador nuevo.DELETE /api/v1/invoices/{invoiceId}: borra un borrador para siempre. Nunca se envió, así que no tiene número y no deja hueco. Sus horas y gastos vuelven al proyecto. Un documento enviado se anula.GET, POST /api/v1/recurring-invoices · GET, PATCH, DELETE /api/v1/recurring-invoices/{recurringId}: facturas recurrentes (Pro). Listarlas, hacer que una factura se repita ({ invoiceId, interval, every?, nextDate, endAfter?, action? }), leer, cambiar o pausar una, y borrarla (las facturas que hizo quedan).- Mandar el mail responde
503 si este servidor no tiene el correo configurado y 502 si el mail no salió; en los dos casos no cambia nada. Veinte mails por hora por persona y uno por documento cada 10 minutos (429). Una dirección nueva pasado el cupo del plan (2 en Gratis, 25 nuevas por día en Pro) recibe un link para confirmar que quiere los mails, y la respuesta es 409 hasta que confirme. POST /api/v1/invoices/{invoiceId}/answer, POST …/convert — registrar que el cliente aceptó o rechazó un presupuesto enviado: { "answer": "accepted", "by": "…" }; y convertir uno aceptado en un borrador de factura, una sola vez.POST /api/v1/invoices/{invoiceId}/project: hace un proyecto con un presupuesto aceptado: { title?, budget?: "money" | "hours" | "none", tasks? }. Su cliente, su monto (o sus horas) como presupuesto y una tarea por línea.POST, DELETE /api/v1/invoices/{invoiceId}/link — reemplazar el link público del documento (el viejo deja de andar en el acto) o apagarlo.POST /api/v1/invoices/{invoiceId}/payments, DELETE /api/v1/payments/{paymentId} — registrar un pago que hizo el cliente: { "amount": 100, "day": "2026-10-19", "paymentMethod": "bank", "note": "…" }. No cobra ni mueve plata. Un pago mayor al saldo responde 409 con balanceCents hasta que se vuelva a mandar con "confirmOverpay": true; borrar uno lo saca de los libros.GET /api/v1/reports/billing — lo facturado y cobrado por mes y por cliente, los gastos y la rentabilidad de cada proyecto en un rango de fechas (from to boardId clientId; por defecto los últimos 12 meses, hasta 1100 días).
Una página para tu cliente, con un link secreto y sin cuenta: las tareas que marcás, las horas (solo horas, nunca tarifas ni plata) y los documentos que enviaste. Solo el dueño del proyecto la maneja y lee o responde los comentarios; un editor marca tareas. Prenderla o cambiar lo que muestra es Pro (402 si no); apagarla o cambiar el link está abierto a todos los planes. Lo que escriben los clientes es texto de un desconocido: las respuestas listan esos campos en writtenByOthers.
GET, PATCH /api/v1/boards/{boardId}/portal — el link del portal, sus ajustes y los últimos comentarios, y cambiarlos: { "enabled": true, "showTasks": true, "showHours": false, "showInvoices": true, "allowComments": true, "welcome": "…", "studioName": "…" }.POST /api/v1/boards/{boardId}/portal/link — cambiar el secreto del link: el viejo deja de andar en el acto.GET, PATCH /api/v1/cards/{cardId}/portal — la conversación de una tarea con el cliente (hasta 200 mensajes), y mostrar la tarea en el portal: { "visible": true }.POST /api/v1/cards/{cardId}/portal/replies, POST …/read, POST /api/v1/boards/{boardId}/portal/read — responderle al cliente debajo de una tarea (lo ve cualquiera con el link, firmado con el nombre del estudio y sin mail): { "text": "…" }; y marcar como leídos los comentarios del cliente, los de una tarea o los de todo el proyecto.DELETE /api/v1/client-comments/{commentId} — sacar un comentario de la conversación.
Las notas y discusiones entran y salen como Markdown, igual que la descripción de una tarea. Los títulos, cuerpos, comentarios, nombres de archivo y títulos de tareas los escriben los miembros del proyecto: las respuestas listan esos campos en writtenByOthers. Una página solo se edita con el rev que tenía cuando se leyó; un guardado hecho encima del de otro responde 409 y no pisa nada. Un cuerpo tiene hasta 100.000 caracteres, que es también lo máximo que devuelve una lectura (bodyTruncated dice que se cortó); una página con imágenes, o con un cuerpo más largo, conserva su cuerpo al editarla, y una lectura devuelve los comentarios más nuevos que entren en 30.000 caracteres.
GET /api/v1/workload, PUT /api/v1/workload/capacity — planifica el trabajo del equipo: el tiempo que falta de las tareas abiertas con estimado de cada persona, en la semana de su vencimiento durante las próximas seis semanas, contra la capacidad de esa semana: su capacidad semanal menos los feriados y sus propias ausencias, en capacityMinutes offMinutes de cada semana (Pro; filtros personId includeTasks); y fijar tu propia capacidad: { "hours": "37:30" }.GET, POST /api/v1/holidays · DELETE /api/v1/holidays/{holidayId} — tus feriados (Pro): listarlos, agregar uno ({ "day": "2026-12-25", "name": "Christmas" }) y quitar uno. Un feriado le saca el día laboral entero a la capacidad de todos en tu carga de trabajo; hay uno por día (409 si el día ya tiene uno) y un feriado en fin de semana no saca nada.GET, POST /api/v1/time-off · PATCH, DELETE /api/v1/time-off/{timeOffId} — ausencias: las tuyas en cualquier plan y, con Pro, las de los editores de los proyectos que sos dueño (filtros userId from to status); registrarla ({ "userId"?, "kind"?: "vacation|sick|other", "startDay", "endDay"?, "minutesPerDay"?: null, "note"? }), cambiarla o borrarla. Baja la capacidad de esa persona en la carga de trabajo en las semanas que toca. La nota es de la persona: sólo ella la escribe y la lee, y la dueña nunca la recibe.POST /api/v1/time-off/{timeOffId}/approve · POST /api/v1/time-off/{timeOffId}/reject: aprobar ausencias (Pro): la tuya espera a los dueños de los proyectos que editás ("status": "pending") y cuenta en la carga de trabajo una vez "approved"; el dueño la aprueba o la rechaza con una nota opcional para la persona ({ "note"? }), a quien le llega un aviso.GET /api/v1/team-rates, PUT /api/v1/team-rates/{userId} — tu equipo con la tarifa por hora por defecto de cada persona y lo que te cuesta una hora suya (en centavos; el costo es solo tuyo), y cómo definirlos: { "hourlyRate": "85.50", "hourlyCost": 40 }. Se aplican a las horas que se cargan desde ese momento (Pro).GET /api/v1/boards/{boardId}/member-rates, PUT /api/v1/boards/{boardId}/member-rates/{userId} — a cuánto se factura a cada persona de un proyecto tuyo y de dónde sale esa tarifa, y cómo definir la suya en ese proyecto: { "hourlyRate": 120 } (null vuelve a la del proyecto, la del cliente o la suya por defecto) (Pro).POST /api/v1/time/reprice — les da a las horas ya cargadas (no facturadas, sin cronómetro en marcha y fuera de los días cerrados) las tarifas y los costos que tendría una hora nueva hoy: { "from": "2026-10-01", "boardId": "…", "userId": "…", "overwrite": false, "apply": true }. Sin apply solo responde qué haría (Pro).GET /api/v1/reports/profitability, GET /api/v1/reports/utilization — lo que valieron las horas, lo que costaron y lo que queda, por proyecto, cliente, persona o tarea (from to by), y las horas facturables sobre lo que cada persona podía trabajar (Pro; hasta 400 días, por moneda, en centavos).GET /api/v1/reports/assignments: quién hace qué: todas las tareas abiertas de tus proyectos agrupadas por la persona asignada, y las que no tienen a nadie, con el estimado frente al tiempo cargado en cada una (filtros boardId clientId userId unassigned due label; format=csv para un archivo; Pro).GET, POST /api/v1/timesheets · GET, DELETE /api/v1/timesheets/{timesheetId} · POST /api/v1/timesheets/{timesheetId}/approve · POST /api/v1/timesheets/{timesheetId}/reject: semanas de horas en revisión: las que entregaste y las que te entregaron (status userId from to); entregar tu semana a los dueños de los proyectos en los que trabajaste ({ "week": "2026-10-19", "ownerId"? }); retirarla mientras espera; y, como dueño, aprobarla (Pro) o devolverla con una nota. Mientras una semana espera, o una vez aprobada, sus horas quedan cerradas para la persona: una escritura ahí responde 409 con { "code": "closed" }.GET, POST /api/v1/project-templates, PATCH, DELETE /api/v1/project-templates/{templateId} — las plantillas de las que puede arrancar un proyecto, las que vienen y las guardadas, y guardar la forma de un proyecto como plantilla: { "boardId": "…", "name": "…", "includeMoney": false }. El plan gratis guarda una sola (402 de ahí en más). La segunda ruta renombra o borra una guardada.GET, POST /api/v1/boards/{boardId}/pages — las notas o discusiones de un proyecto (kind=note|discussion, búsqueda q, archived), o empezar una: { "kind": "note", "title": "…", "content": "# Markdown" }.GET, PATCH, DELETE /api/v1/pages/{pageId} — leer una página con sus comentarios y su rev; editarla, fijarla o archivarla (lo último es del dueño del proyecto): { "rev": "…", "title": "…", "content": "…", "pinned": true, "archived": false }; o borrarla con sus comentarios (su autor y el dueño del proyecto).POST /api/v1/pages/{pageId}/comments, PATCH, DELETE /api/v1/page-comments/{commentId} — comentar una página: { "text": "…" }; editar tu propio comentario o borrar uno (su autor y el dueño del proyecto).GET /api/v1/boards/{boardId}/files — cada archivo y link adjunto a las tareas del proyecto, del más nuevo al más viejo, con cuántos hay de cada tipo (filtros q type).
Traé tus horas de Toggl, Harvest, Clockify o de cualquier CSV con una fecha y una duración (o hora de inicio y de fin). El archivo viaja como el texto csv (hasta 8 MB y 20.000 filas); las columnas se adivinan por los encabezados, como hace la página de importación, y cualquier parte se puede fijar: { "csv": "…", "fileName": "…", "source": "toggl", "mapping": { "duration": "Hours" }, "dateOrder": "dmy", "durationUnit": "minutes", "createClients": true }. Una columna se nombra por el texto de su encabezado o por su posición (0 es la primera). Las filas importadas antes se saltean, y una importación se puede deshacer.
POST /api/v1/imports/preview — qué haría importar el archivo, sin escribir nada: las filas, los clientes, proyectos y tareas que se crearían, las filas que no se pueden leer y los ajustes usados.GET, POST /api/v1/imports — tus importaciones, o hacer una (los topes del plan gratis responden 402).DELETE /api/v1/imports/{importId} — deshacer una importación: sus registros y lo que creó que nadie usó desde entonces; 409 si parte del tiempo ya se facturó.
Un webhook le manda a otra app lo que pasa en tus proyectos, en el momento. Hacé uno en Ajustes → Webhooks y Slack, o con las rutas de abajo. Escucha un tablero tuyo, o todos y tus facturas y presupuestos. El plan gratis tiene 1; Pro, 25.
"slack" publica una línea en un canal de Slack, con una de las incoming webhooks de Slack (https://hooks.slack.com/services/…)."json" manda cada evento por POST en JSON a cualquier dirección https (el Catch Hook de Zapier, Make, n8n, tu propio servidor): { "id": "evt_…", "type": "task.completed", "createdAt": "…", "actor": { "id", "name" }, "board": { … }, "task": { "id", "title", "url", "list", "dueDate", "completed" } }.- Eventos:
task.created, task.moved, task.completed, task.reopened, comment.created; y, para los webhooks de todos tus tableros, invoice.sent, estimate.sent, payment.recorded, invoice.paid, estimate.accepted, estimate.declined. - Cada envío JSON va firmado:
X-Decknote-Signature: sha256=… es el HMAC-SHA256 en hex de <X-Decknote-Timestamp>.<body> con el secreto del webhook (se muestra una vez, al crearlo o reemplazarlo). Verificalo, y que X-Decknote-Timestamp sea reciente, antes de confiar en un envío; X-Decknote-Delivery es el id del evento, para descartar uno repetido. - Un envío espera 8 segundos una respuesta 2xx, no sigue redirecciones y se reintenta una vez después de un error de red, un 429 o un 5xx. Después de 20 fallas seguidas el webhook se apaga solo y dice por qué; a cada uno le llegan como mucho 60 eventos por minuto.
GET, POST /api/v1/webhooks — tus webhooks (sin sus secretos), y agregar uno: { "kind": "json", "url": "https://…", "boardId": "…", "events": ["task.completed"] }. La respuesta trae el secreto, esa única vez.GET, PATCH, DELETE /api/v1/webhooks/{webhookId} — un webhook; cambiarle los eventos, prenderlo o apagarlo, o reemplazar su secreto ({ "events"?, "enabled"?, "rotateSecret"? }); borrarlo.POST /api/v1/webhooks/{webhookId}/test — mandar una prueba ahora (un evento de ejemplo marcado "test": true) y saber cómo salió.
La forma más simple de conseguir un token es Ajustes → Tokens de API: creá uno y pegalo en la configuración del MCP, más abajo. Para un CLI o un agente que puede manejar un navegador, Decknote también ofrece un flujo de autorización de dispositivo (con la misma forma que gh auth login), que anda por SSH y en contenedores donde no hay un navegador al que volver.
POST /api/v1/cli/auth arranca un flujo y devuelve un código de dispositivo (que se queda quien llama) y un código de usuario corto (el que ve la persona). La persona abre /cli, se fija que el código coincida y lo aprueba con la sesión iniciada. Quien llama consulta POST /api/v1/cli/auth/token cada tanto y recibe el token una sola vez — 202 mientras está pendiente, 200 con { token } cuando se aprueba, 410 cuando el código venció. Los códigos duran diez minutos, y el token que se emite cuenta para el límite de tu plan (el gratis incluye uno).
Hay un cliente de referencia para este flujo en cli/ (el paquete decknote).
Aprobá solo un código que generaste vos — si aprobás el de otra persona, le das un token de tu cuenta.
Decknote tiene un servidor de Model Context Protocol para que un agente de IA use un tablero como lista de tareas: agrega tareas, las completa y las vuelve a buscar — una memoria compartida entre tus agentes y tu equipo. Habla MCP sobre Streamable HTTP (protocolo 2025-06-18) y se autentica con el mismo token Authorization: Bearer que la API REST.
Endpoint
POST https://decknote.app/api/v1/mcp
Conectores con OAuth (ChatGPT, Claude)
Las apps que entran con OAuth usan https://decknote.app/mcp: el mismo servidor, pero todo pedido necesita un token, así que la app te pide que entres a Decknote y la permitas. Se registra sola (RFC 7591), usa PKCE y encuentra todo a partir de /.well-known/oauth-protected-resource. Las apps conectadas aparecen en Ajustes, donde las podés desconectar.
Conectate desde un cliente MCP
Apuntá cualquier cliente MCP al endpoint y pasale tu token como header Bearer. Por ejemplo, en la configuración MCP de Claude / Claude Code:
{
"mcpServers": {
"decknote": {
"type": "http",
"url": "https://decknote.app/api/v1/mcp",
"headers": { "Authorization": "Bearer ntrl_your_token_here" }
}
}
}
Una llamada directa a tools/list, para comprobar que anda:
curl -X POST https://decknote.app/api/v1/mcp \
-H "Authorization: Bearer ntrl_your_token_here" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Herramientas
Todo lo que una persona hace en la app tiene su herramienta. Empezá por overview: devuelve el plan y sus límites, los tableros recientes, lo que necesita atención y qué hacer después, con la herramienta para cada cosa.
list_boards — descubrir tableros y listas.create_board — crear un tablero, opcionalmente a partir de una plantilla (blank, kanban, content, personal).create_list — agregar una lista (columna) al final de un tablero.search_tasks — recordar: buscar tareas por texto, estado y vencimiento.get_task — leer una tarea completa, con los ids de sus checklists, comentarios, adjuntos y vínculos.create_task — agregar una tarea a una lista. La descripción acepta Markdown.update_task — editar título, descripción (Markdown), fechas, repetición o portada.complete_task / reopen_task — marcar como hecha o reabrir.move_task — mover una tarea a otra lista o a otro tablero.archive_task — archivar una tarea (borrado lógico); las tareas recurrentes con fecha programan su próxima repetición.add_comment — dejar una nota de avance que va a leer una persona (con notify: true, se avisa a los mencionados y a quienes siguen la tarjeta, como en la app — después de confirmar).add_reminder / list_reminders / remove_reminder — avisos para vos: un push y un mail en un momento, o unos días antes del vencimiento.search / fetch — leer: buscar en las tarjetas de todos los tableros y leer una entera (descripción, checklists, comentarios). La forma que espera ChatGPT.show_board / get_board_live_url — muestran un tablero como un kanban vivo e interactivo adentro de Claude, ChatGPT y otros clientes con MCP Apps: se arrastran tarjetas entre listas, se completan y se agregan, y se actualiza solo cuando alguien cambia el tablero (la segunda herramienta es sólo para la vista). Los demás clientes reciben el tablero en JSON.get_task / search_tasks / list_my_tasks / list_reminders / overview / list_notifications — estas seis lecturas además se dibujan como páginas adentro de Claude, ChatGPT y otros clientes con MCP Apps: una tarjeta entera (descripción, checklists, comentarios), las listas de tareas agrupadas por vencimiento, la agenda de avisos, el resumen de la cuenta y la bandeja de notificaciones. El texto de la respuesta es el mismo; la vista nunca cambia nada, sus botones sólo te dejan un mensaje armado para que lo mandes.get_board / list_activity — leer un tablero entero (listas, tarjetas, etiquetas, miembros, campos, reglas, plantillas, tarjetas archivadas, link público, invitaciones pendientes) y su historial de actividad.update_board / set_board_preferences / duplicate_board / archive_board / restore_board / delete_board / import_trello_board — el tablero en sí: título, ícono, color y fondo (Pro), favorito y silencio para vos, copiar, archivar, restaurar, borrar (con confirmación) e importar desde Trello.share_board / update_member / remove_member / leave_board / transfer_board / set_public_link / list_embeds / create_embed / revoke_embed — gente y compartir: invitar por mail (Pro en la web), cambiar roles, sacar a alguien, irse, transferir el tablero, el link público de sólo lectura y los tableros embebidos en tus apps.update_list / duplicate_list / sort_list / delete_list — listas: renombrar, reordenar, límite WIP (Pro), copiar, ordenar y borrar.create_label / update_label / delete_label / create_custom_field / update_custom_field / delete_custom_field — etiquetas y campos personalizados de un tablero.create_saved_view / delete_saved_view / create_automation / set_automation_enabled / delete_automation — tus vistas guardadas y las reglas del tablero (cuando una tarjeta se agrega, se mueve o se etiqueta, hacer algo).duplicate_task / restore_task / delete_task / set_task_labels / set_task_assignees / watch_task / set_task_field / link_tasks / unlink_tasks / bulk_tasks — dentro de una tarea: copiar, recuperar del archivo, borrar, etiquetas, asignados, seguirla, valores de campos, vínculos entre tareas, y mover/etiquetar/archivar en lote.create_task_from_template / save_task_as_template / delete_card_template — plantillas de tarjeta.edit_comment / delete_comment / react_to_comment / add_checklist / update_checklist / delete_checklist / add_checklist_items / update_checklist_item / delete_checklist_item / add_attachment / rename_attachment / delete_attachment — comentarios, checklists y adjuntos (links, o archivos en base64 dentro de los límites del plan).list_my_tasks / list_notifications / mark_notifications_read — tus tareas de todos los tableros y tus avisos.get_account / update_account / revoke_access / export_data — tu cuenta: ajustes, plan y límites, preferencias de avisos, revocar un token o una app conectada, y la exportación completa.list_webhooks / create_webhook / update_webhook / delete_webhook / test_webhook — los webhooks y canales de Slack de la cuenta: agregar, borrar, probar y volver a prender uno piden confirm: true, porque lo que mandan sale de Decknote.start_timer / stop_timer / get_running_timer / log_time / list_time_entries / update_time_entry / delete_time_entry — registro de horas: un cronómetro en un proyecto o tarea, horas cargadas a mano («1h30») y el registro de horas del proyecto con sus correcciones; borrar un registro pide confirmación.get_time_rules / set_time_rules / get_timer_alert / set_timer_alert — cierre de horas cargadas (Pro): el día hasta el que nadie puede agregar, editar, mover ni borrar horas y cuántos días atrás puede corregir cada persona las suyas, con una confirmación para definirlas; y el aviso de un cronómetro que quedó corriendo.list_timesheets / submit_timesheet / withdraw_timesheet / approve_timesheet / reject_timesheet — revisión de hojas de horas: una persona entrega una semana de horas a los dueños de los proyectos en los que trabajó y sus horas se cierran mientras espera; el dueño la aprueba (Pro) o la devuelve con una nota, y se vuelve a abrir. Entregar, aprobar y devolver piden confirmación.set_task_estimate / set_task_billable / get_task_time — el estimado de una tarea, si su tiempo se factura, y lo registrado contra el estimado.list_clients / create_client / update_client / archive_client / restore_client — clientes, las empresas o personas para las que se hacen los proyectos, con moneda y tarifa por hora por defecto (el plan gratis incluye 2 clientes activos); archivar pide confirmación.get_project_settings / update_project_settings / get_project_summary / get_week_timesheet / get_time_report / export_time_report — el cliente, estado, presupuesto, tarifa y fechas de un proyecto; su resumen (horas, monto facturable, presupuesto usado); tu hoja de horas semanal; informes por proyecto, cliente, persona, tarea o día; y la exportación a CSV (Pro). El dueño del proyecto lee las horas de todos y la plata; cualquier otro miembro, solo sus propias horas.get_billing_profile / update_billing_profile / list_expenses / create_expense / update_expense / delete_expense / add_expense_receipt / delete_expense_receipt — tus datos de facturación y los gastos cargados en un proyecto (un costo, no se paga nada); borrar un gasto pide confirmación.list_invoices / get_invoice / get_invoice_pdf / get_receivables_aging / export_invoices_csv / get_billing_report — tus facturas y presupuestos, uno completo o en PDF, lo que te deben los clientes según cuánto se atrasó, el CSV para tu contador (Pro) y los números de un rango de fechas: facturado, cobrado, gastos y ganancia por proyecto. Solo el dueño de la cuenta los lee.create_invoice / update_invoice / duplicate_invoice / convert_estimate_to_invoice / convert_estimate_to_project / list_unbilled_work / preview_invoice_from_work / create_invoice_from_work — borradores: empezar una factura o un presupuesto, editarlo, copiarlo, convertir un presupuesto aceptado en factura y armar un borrador con el trabajo sin facturar de un proyecto (primero la vista previa; el borrador pide confirm: true y el total repetido como amount). No se envía nada. El plan gratis incluye 2 documentos por mes.send_invoice / get_invoice_email_draft / email_invoice / regenerate_invoice_link / revoke_invoice_link / void_invoice / delete_invoice_draft / record_estimate_answer — lo que le llega al cliente o cierra un documento: publicar su link y mandarlo por mail (cada uno pide confirm: true y el total repetido como amount; el mail se muestra completo antes), cambiar o apagar el link, anular y registrar la respuesta de un presupuesto.list_recurring_invoices / create_recurring_invoice / update_recurring_invoice / delete_recurring_invoice — facturas recurrentes (Pro): una factura que se repite cada tantas semanas, meses o años, y cada nueva queda como borrador, enviada o mandada por mail. Crearla, cambiarla para que las nuevas salgan y borrarla piden confirmación.record_invoice_payment / remove_invoice_payment — anotar que el cliente pagó, y sacar un pago de los libros, después de una confirmación. Registran lo que ya pasó: no cobran ni mueven plata.get_client_portal / update_client_portal / regenerate_client_portal_link / set_task_visible_to_client / get_task_portal / reply_to_client / mark_client_comments_read / delete_client_comment — el portal del cliente, una página para tu cliente con un link secreto: sus ajustes y comentarios, prenderlo o cambiar lo que muestra (después de confirmar qué se hace público), cambiar el link, marcar tareas y responderle al cliente con el nombre del estudio.list_projects / create_project / get_workload / set_my_weekly_capacity — los proyectos que podés ver con su cliente, estado, horas y presupuesto, empezar uno, y la carga de trabajo del equipo por semana contra la capacidad de cada persona (Pro).list_team_rates / set_team_rate / get_member_rates / set_member_rate / reprice_time / get_profitability_report / get_utilization_report / get_assignments_report — las tarifas y los costos de tu equipo, la tarifa de una persona en un proyecto, aplicarlos a las horas ya cargadas (después de una confirmación) y los informes de rentabilidad (por proyecto, cliente, persona o tarea), de utilización y de asignaciones (Pro).list_project_templates / save_project_as_template / create_project_from_template / rename_project_template / delete_project_template — plantillas de proyecto: las que vienen y las tuyas guardadas, guardar la forma de un proyecto y arrancar un proyecto desde una (el plan gratis guarda una plantilla).list_pages / get_page / create_page / update_page / set_page_pinned / set_page_archived / delete_page / add_page_comment / edit_page_comment / delete_page_comment / list_project_files — las notas y discusiones de un proyecto, escritas en Markdown (una edición pide el rev con el que se leyó, así no se pisa el guardado de nadie), sus comentarios y la lista de todos los archivos adjuntos a sus tareas.list_holidays / add_holiday / remove_holiday / list_time_off / add_time_off / update_time_off / remove_time_off / approve_time_off / reject_time_off — feriados y ausencias, que bajan la capacidad de cada semana en la carga de trabajo una vez aprobadas: las tuyas en cualquier plan y, con Pro, tus feriados y las ausencias de los editores de tus proyectos, que aprobás o rechazás. Quitar, aprobar y rechazar piden confirmación; la nota es de la persona y nunca se le devuelve a nadie más.preview_time_import / import_time_csv / list_time_imports / undo_time_import / create_sample_project / delete_sample_project — importar horas desde un CSV pasado como texto (hasta 200.000 caracteres; los archivos más grandes van por la página de importación): la vista previa, la importación después de una confirmación, el historial y deshacer, y un proyecto de ejemplo marcado como tal.start_pro_checkout / open_billing_portal — el plan, solo como links: un link de Stripe Checkout para pasar a Pro (el agente tiene que repetir el precio exacto, y la persona paga en Stripe) y un link al portal para administrarlo o cancelarlo. Ninguna herramienta cobra, reintegra ni paga nada.api_read / api_create — la API HTTP de Decknote como vos, para lo que no tiene herramienta propia: leer (GET) y crear (POST, con confirmación) son herramientas distintas, sobre una lista fija de rutas (abajo); nunca autenticación, tokens, sesiones, admin ni pagos, y los secretos se quitan.
La API HTTP de Decknote desde el MCP
api_read y api_create llegan sólo a estas rutas, como la persona que conectó la app. Las de /api/v1 están documentadas más arriba, con sus cuerpos y respuestas; las demás son las que usa la propia app para el export, las vistas previas de links y los archivos adjuntos. Se rechaza un camino de otro sitio, con .. o escapes codificados, o hacia autenticación, tokens, sesiones, admin, pagos o rutas internas.
GET /api/v1/me — api_readGET /api/v1/boards — api_readPOST /api/v1/boards — api_createPOST /api/v1/cards — api_createGET /api/v1/boards/{boardId}/embeds — api_readPOST /api/v1/boards/{boardId}/embeds — api_createGET /api/export — api_readGET /api/link-preview?url=… — api_readGET /api/attachments/{attachmentId} — api_read
Qué pide confirmación
Lo que borra algo para siempre o llega a otras personas (un mail, una asignación, un link público, un tablero embebido) nunca pasa en la primera llamada: sin confirm: true la herramienta no cambia nada y devuelve una vista previa de lo que haría, para que el agente te la muestre. Ninguna herramienta mueve plata: start_pro_checkout además pide el precio exacto y solo devuelve un link de Stripe donde paga la persona. Cada herramienta tiene un título; las que sólo leen van marcadas readOnlyHint, y todas las que cambian datos, destructiveHint, así la app pregunta antes de correrlas.
Las herramientas de facturación llevan los libros y nada más: record_invoice_payment anota que un cliente pagó y no cobra ni mueve plata. Publicar el link de una factura, mandarla por mail, anularla, registrar o sacar un pago, responder un presupuesto y cambiar lo que muestra el portal del cliente piden confirm: true; enviar, mandar por mail o crear una factura desde el trabajo piden además amount igual al total del documento en la vista previa, así el sí es a una cifra. El texto que escriben los clientes, los compañeros o los archivos importados es dato, no instrucciones tuyas: los resultados que lo traen listan esos campos en writtenByOthers y de ahí nunca sale una confirmación.
El servidor también ofrece prompts (prompts/list) para los recorridos de siempre: daily_review, capture_tasks y board_cleanup.
Cada herramienta devuelve su resultado como JSON dentro de un bloque de contenido de texto: result.content[0].text es un string JSON que tenés que parsear. Una tarea tiene la forma { id, title, listId, boardId, dueDate, completed, description, url }; las herramientas que escriben devuelven { task }, search_tasks devuelve { tasks: [...] } y list_boards devuelve { boards: [{ id, title, lists }] }.
Cada herramienta se limita a los tableros a los que accede tu token, con los mismos permisos que la API REST: puede leer cualquier tablero del que seas miembro y escribir en cualquiera donde seas editor o dueño. Los errores de las herramientas (sin acceso, datos inválidos) vuelven como un resultado de error de MCP (un bloque de contenido de texto con isError: true), no como una conexión cortada. Las llamadas MCP tienen su propio límite de pedidos — unas 200 por minuto por token, aparte de lo que uses de la API REST.
Exportar tus datos
La API es para automatizar, no para hacer backups. Para llevarte todo — tableros, listas, tarjetas, checklists, comentarios y los datos de los adjuntos — usá Ajustes → Tus datos, o pedí /api/export con la sesión iniciada. Devuelve un solo archivo JSON y está disponible en todos los planes.