Octopus.do
Lee y edita los mapas visuales de octopus.do: páginas, bloques y notas de revisión, como el usuario con sesión iniciada.
Documentación
Una vez conectado, tu agente puede:
- Ver tu trabajo — listar tus proyectos y espacios de trabajo, y leer la estructura completa de un sitemap (páginas, bloques, colores, etiquetas, símbolos).
- Crear y editar sitemaps — crear y actualizar páginas, añadir bloques de contenido con wireframes, reestructurar el árbol de páginas, aplicar varios cambios a la vez como una única actualización atómica.
- Leer y dejar notas de revisión — leer los comentarios en páginas y bloques y los hilos anclados al lienzo, añadir notas y respuestas, y resolver o reabrir un hilo. Una nota dejada por un agente se atribuye a tu cuenta y se ve exactamente igual que una escrita por ti, y publicarla no notifica a nadie.
- Gestionar proyectos — crear, duplicar, archivar, mover proyectos; transferir la propiedad; actualizar la configuración del proyecto como el tema y el diseño. Los proyectos no se pueden eliminar a través de MCP — el archivado es lo máximo que puede hacer un agente, y los archivos son reversibles.
Cada acción se ejecuta como tú — el agente solo ve y cambia lo que tu cuenta de Octopus.do tiene acceso.
Conexión
Endpoint
https://mcp.octopus.do/mcp
El flujo general es el mismo en todos los clientes:
- Añade Octopus como servidor MCP remoto / conector usando el endpoint anterior.
- Elige OAuth como tipo de autorización — la mayoría de los clientes lo detectan automáticamente.
- Inicia sesión (o regístrate) con tu cuenta de Octopus.do cuando se abra el navegador.
- Pide a tu agente que haga algo — por ejemplo, "muestra mis proyectos de Octopus" o "añade una página de precios a mi sitemap."
No hay claves API que copiar o gestionar — la autorización ocurre a través de tu inicio de sesión normal de Octopus.do. Instrucciones específicas por cliente a continuación.
Claude (web y escritorio)
- Ve a Configuración → Conectores → Añadir conector personalizado.
- Introduce
https://mcp.octopus.do/mcpcomo URL y haz clic en Añadir. - Haz clic en Conectar e inicia sesión con tu cuenta de Octopus.do.
Claude Code
Ejecuta en tu terminal:
claude mcp add --transport http octopus https://mcp.octopus.do/mcp
Luego ejecuta /mcp dentro de Claude Code para completar el inicio de sesión.
Cursor
Añade Octopus.do a Cursor — abre Cursor con el servidor ya rellenado.
O añádelo manualmente a ~/.cursor/mcp.json (usa .cursor/mcp.json para limitarlo a un proyecto):
{
"mcpServers": {
"octopus": {
"url": "https://mcp.octopus.do/mcp"
}
}
}
Cursor te pedirá que te autentiques la primera vez que se use el servidor.
VS Code (GitHub Copilot)
Ejecuta MCP: Añadir servidor desde la Paleta de comandos y elige HTTP, o añádelo a .vscode/mcp.json:
{
"servers": {
"octopus": {
"type": "http",
"url": "https://mcp.octopus.do/mcp"
}
}
}
ChatGPT
Octopus.do está publicado en el directorio de aplicaciones de ChatGPT: busca Octopus.do en Configuración → Aplicaciones y conectores y pulsa Conectar. Requiere ChatGPT Plus o superior. Guía completa: Octopus.do para ChatGPT.
Para añadir el endpoint MCP manualmente — para un entorno de desarrollo, o un espacio de trabajo donde la aplicación no esté disponible — activa el modo desarrollador (Configuración → Aplicaciones y conectores → Configuración avanzada) y:
- Ve a Configuración → Aplicaciones y conectores → Crear (o Añadir conector).
- Establece la URL del servidor MCP en
https://mcp.octopus.do/mcpy la autenticación en OAuth. - Completa el inicio de sesión de Octopus.do cuando se te solicite.
Windsurf
Añade a ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"octopus": {
"serverUrl": "https://mcp.octopus.do/mcp"
}
}
}
Grok
- Abre grok.com → Conectores, haz clic en Nuevo conector, luego Personalizado.
- Introduce
https://mcp.octopus.do/mcpcomo URL del servidor MCP. - Completa el inicio de sesión de Octopus.do cuando se te solicite.
Los conectores personalizados son una función de plan de pago en Grok. En los planes Business y Enterprise, un administrador del equipo debe aprovisionar el conector en la consola en la nube de xAI antes de que los miembros puedan añadirlo.
Gemini
- Abre gemini.google.com → Configuración y ayuda → Aplicaciones conectadas.
- En Aplicaciones personalizadas para Spark, añade
https://mcp.octopus.do/mcpcomo URL del servidor MCP. - Completa el inicio de sesión de Octopus.do cuando se te solicite.
Las aplicaciones personalizadas requieren Gemini Spark en una cuenta personal de Google — las cuentas de Workspace no pueden añadirlas — y Google actualmente limita la función a usuarios en Estados Unidos, en inglés, desde la aplicación web de Gemini. Una vez conectado, también funciona en las aplicaciones móviles.
Otros clientes MCP
Cualquier cliente que admita servidores MCP remotos (Streamable HTTP) con OAuth funciona: apúntalo a https://mcp.octopus.do/mcp, elige OAuth e inicia sesión con tu cuenta de Octopus.do.
Autenticación
Octopus MCP usa OAuth 2.1, el estándar que los clientes MCP usan para la autorización segura por usuario. Tu agente solicita acceso en tu nombre, lo apruebas una vez durante el inicio de sesión, y el acceso se puede revocar desde tu cuenta de Octopus.do en cualquier momento. El propio servidor MCP nunca ve ni almacena tu contraseña.
Herramientas disponibles
Tu agente elige estas herramientas por sí mismo — no las llamas directamente. La referencia a continuación es útil cuando quieres saber exactamente qué puede (y no puede) hacer el agente, o para formular una solicitud con precisión.
La mayoría de las herramientas de escritura aceptan un idempotency_key opcional (cadena): una clave única que hace que los reintentos sean seguros — una solicitud repetida con la misma clave se aplica solo una vez. Se omite de las tablas a continuación.
Las acciones destructivas (como eliminar una página, un bloque o un comentario) se marcan para tu cliente de IA, que normalmente te pedirá confirmación antes de ejecutarlas.
Lectura
get_me
Devuelve el nombre de tu cuenta. Sin parámetros.
list_projects
Lista los proyectos a los que puedes acceder, en todos los espacios de trabajo (personales y de equipo), ordenados por más recientemente actualizados primero. Cada elemento incluye el espacio de trabajo al que pertenece. Una página a la vez: total es cuántos coincidieron y has_more si quedó alguno fuera. Para encontrar un proyecto por nombre usa q en lugar de paginar — busca en todos los proyectos de la cuenta, no solo en la página actual.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
q | No | cadena | Solo proyectos cuyo título contenga esto, sin distinguir mayúsculas |
workspace_uuid | No | cadena | Solo este espacio de trabajo. Usa el literal "my" para tu espacio de trabajo personal |
limit | No | número | Cuántos devolver, 1–200 (por defecto 50) |
offset | No | número | Cuántos omitir; para paginar |
list_workspaces
Lista tus espacios de trabajo (personal + equipos) con sus carpetas y los 10 proyectos más recientemente actualizados en cada uno — project_count da el total real, y list_projects busca y pagina por el resto. Sin parámetros.
get_workspace
Devuelve un espacio de trabajo: información, carpetas y proyectos.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
uuid | Sí | cadena | UUID del espacio de trabajo. Usa el literal "my" para tu espacio de trabajo personal. |
get_project
Devuelve el estado de un proyecto: las entidades (pestañas, secciones, nodos = páginas, bloques, colores, etiquetas, símbolos, flechas, …) y el árbol padre/hijo que las conecta. Un sitemap completo es una lectura grande, así que empieza con view: "outline" y reduce aún más con scope_id cuando solo necesites una rama. Los notes de una página vuelven en camelCase (seoTitle, pageIntent) aunque las escrituras los nombran en snake_case — ver Nombres de campos de notas.
En el plan Team, un espacio de trabajo puede mantener una biblioteca de símbolos compartida, y los proyectos referencian símbolos de ella en lugar de poseerlos. Esas referencias vuelven resueltas — el símbolo se lee como cualquier otro, con un libraryId extra que marca dónde viven su título, wireframes y contenido predeterminado. Tal símbolo no se puede editar a través de symbols.update (la llamada se rechaza): es compartido por cada proyecto del espacio de trabajo y se edita en la propia biblioteca, en el editor. Eliminarlo de un proyecto está permitido y deja la biblioteca intacta.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | cadena | UUID del proyecto. uuid se acepta como sinónimo, así que una llamada escrita de cualquier manera funciona |
view | No | enum | outline (por defecto) — el árbol de páginas con títulos, urls e ids, un orden de magnitud más barato; full — también el contenido de las páginas |
scope_id | No | cadena | Lee una rama en lugar del proyecto: un id de pestaña, sección o página. La respuesta lleva la cadena de ancestros, así que la rama mantiene su contexto |
exclude | No | array | Grupos de contenido a descartar — blocks, content, notes, styling, tags, estimates, overlays, meta |
include | No | array | Grupos de contenido a añadir de vuelta a la vista predeterminada outline, de la misma lista que exclude — include: ["estimates"] devuelve el árbol de páginas con la tarjeta de tasa de estimación (los ids lineItems necesarios para escribir valores) sin pagar por view: "full". Se ignora cuando view es full; exclude gana en un grupo nombrado en ambos |
format | No | enum | nested (por defecto) — el árbol; plain — colecciones planas más el grafo de relaciones |
list_comments
Lee las notas de revisión en un proyecto. Hay dos tipos y una sola llamada devuelve ambos: comentarios planos dejados en páginas y en bloques de contenido (las respuestas de hilos también son comentarios), y hilos de lienzo — los pines en el lienzo del sitemap, que llevan una posición y un estado abierto/resuelto. El resultado tiene un array comments y un array threads; el que no se pidió vuelve vacío. Los hilos por defecto son los abiertos, así que la respuesta predeterminada es lo que aún está pendiente en lugar de todo lo escrito alguna vez.
La falta de acceso se muestra de manera diferente según lo que se pidió. Una llamada predeterminada lee ambas mitades, y la mitad de hilos se rechaza por completo, así que toda la llamada falla y lo dice. Una llamada solo de comentarios (un kind de page, block o reply) obtiene una lista vacía en su lugar — el endpoint subyacente responde 200 con nada en lugar de un 403, y ningún llamador puede distinguir eso de un proyecto que simplemente no tiene notas.
Ambas mitades nombran a qué apuntan: el target de un comentario y el anchor de un hilo llevan un title junto al id, así que una nota se puede leer sin descargar todo el proyecto para buscar el id. Para una página o una pestaña es su título; para un bloque es el nombre del bloque. title es null en cuatro casos ordinarios, ninguno de ellos un error: el pin es huérfano (abajo); la nota es una respuesta, cuyo objetivo es un hilo y los hilos no tienen título propio; la página simplemente no tiene título; o el árbol del proyecto no se pudo leer, lo que cuesta los títulos y nada más — una llamada solo de comentarios en un proyecto que no puedes leer aún responde con una lista vacía en lugar de un error, exactamente como antes.
Un anchor.type de null en un hilo significa que la página o pestaña a la que estaba anclado se ha eliminado y el pin le sobrevivió — los pines huérfanos son normales. content es markdown, sea cual sea el formato en que el editor almacenó la nota, así que el asistente lee una nota de revisión como texto en lugar de como un documento de editor. author es { id, name, avatar } — el nombre y la foto del escritor junto a un id estable, y null cuando la nota fue dejada por un comentarista anónimo; la url del avatar es pública. En un comentario anónimo, guest_name es el nombre que el visitante escribió para sí mismo — no verificado, así que se le dice al asistente que diga "alguien que se llama X" en lugar de "X" — o null cuando no dio ninguno. Un hilo lo lleva en los mismos términos que un comentario — se le pide un nombre al visitante cuando suelta el pin — y es null en pines soltados antes de que el editor empezara a preguntar, lo que se lee igual que un visitante que no dio ninguno.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
kind | No | enum | page | block | reply | thread. Omítelo para comentarios de todo tipo e hilos juntos; thread devuelve solo hilos |
target_id | No | string | Solo notas sobre este id: un id de página, un id de bloque o un id de hilo, que devuelve las respuestas de ese hilo |
resolved | No | boolean | Solo hilos. Omítelo para los hilos abiertos, true para los resueltos |
include_replies | No | boolean | Incrusta las respuestas de cada hilo dentro del hilo (por defecto false) |
Edición
apply_changes
Aplica varias operaciones de edición a un proyecto como un cambio atómico — la forma preferida de construir o reestructurar un mapa del sitio. Las operaciones se ejecutan en orden y cada una ve el efecto de las anteriores. Asigna a una entidad creada un ref y refiérela en operaciones posteriores mediante parent_ref / node_ref en lugar de un id.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
operations | Sí | array | Al menos una operación (ver más abajo) |
dry_run | No | boolean | Solo validar y previsualizar: no se cambia nada |
idempotency_key | No | string | Repetir una llamada con la misma clave la aplica una sola vez |
Cada operación:
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
operation | Sí | string | Nombre de la operación, p. ej. "nodes.create" |
ref | No | string | Nombre local para la entidad creada, referenciado por operaciones posteriores mediante campos *_ref |
data | No | object | Carga útil de la operación: los mismos campos que la herramienta independiente correspondiente |
Hay dos límites en un lote, y solo uno es nuestro. La API limita una llamada a 100 operaciones. Por separado, el cliente de IA que aloja la conexión limita el tamaño de los argumentos de una sola llamada de herramienta, y a partir de aproximadamente 15–20 KB de JSON algunos clientes los truncan. Una llamada truncada no llega como un lote más pequeño: llega como JSON roto, y el error dice que los argumentos no se pudieron analizar como JSON. Eso no es un error de sintaxis en lo que enviaste, y reintentarlo sin cambios no ayudará: divide el trabajo en varios lotes más pequeños por tamaño, no solo por número de operaciones. No hay límite de bytes en el lado de Octopus, por lo que el límite exacto depende del cliente.
Una respuesta exitosa también puede incluir warnings: notas informativas, como una página cuya URL no está bajo la ruta de su padre. Nada fue bloqueado y no se necesita reintento; están ahí para leerse, no para actuar automáticamente sobre ellas.
Los nombres de las operaciones siguen group.action:
| Grupo | Acciones |
|---|---|
nodes | create, update, move, delete, clone, collapse, replace_url_prefix |
sections | create, update, delete, clone, collapse, move_up, move_down |
tabs | create, update, delete, clone |
blocks | create, update, replace_text, move, delete, clone |
tags | create, update, delete, assign_node, unassign_node |
colors | create, update, delete |
symbols | create, update, delete |
sticky_notes | create, update, delete, clone |
arrows | create, update, delete |
estimates | add_line_item, update_line_item, delete_line_item, set_value, update_settings |
settings | update |
Ambas mitades del nombre están en snake_case: tags.assign_node, sections.move_up, nodes.replace_url_prefix. El endpoint REST para la misma operación escribe su ruta con guiones (/tags/assign-node); las dos formas no son intercambiables, y una operación nombrada en forma de ruta es rechazada.
Dos de ellas editan muchas entidades desde una sola operación, lo cual vale la pena saber antes de escribir ochenta de algo. nodes.replace_url_prefix {from, to, scope_id?} reescribe el inicio de cada URL de página coincidente; blocks.replace_text {from, to, scope_id?} reemplaza una cadena literal dentro del contenido de un bloque sin reenviar el contenido: la forma de corregir una palabra en todo un sitio. Ambas coinciden literalmente y distinguen mayúsculas y minúsculas en lugar de usar patrones, ambas toman un scope_id (una pestaña, sección o página — y para blocks.replace_text, un solo bloque) que por defecto es todo el proyecto, y ambas fallan si nada coincide en lugar de responder éxito: una reescritura que no afectó nada es algo que debes saber, no algo de lo que pasar por alto. Responden con count y una lista de lo que cambiaron, limitada a 50 entradas y avisando cuando se trunca. blocks.replace_text omite las instancias de símbolos, cuyo contenido pertenece al símbolo, y dice cuántas omitió.
Las estimaciones son editables a través de MCP: estimates.add_line_item y estimates.update_line_item construyen la tarifa, estimates.set_value pone una cantidad de unidades en una página para una de sus filas (la primera llamada para un par página/fila crea el valor, las posteriores lo actualizan), estimates.delete_line_item elimina una fila con los valores por página, y estimates.update_settings establece moneda, unidades, impuestos y visibilidad. Las cinco necesitan que el propietario del proyecto tenga Pro o superior, y hidden — una estimación privada — necesita Team.
La API REST aún tiene algunas operaciones que el servidor MCP deliberadamente no ofrece: reordenamiento de pestañas, vinculación de símbolos y enlaces externos. Siguen disponibles a través de la API pública.
create_node
Crea una página (nodo) en el mapa del sitio.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
parent_id | Sí | string | Id del padre: una pestaña, sección u otro nodo (los ids provienen de get_project) |
title | No | string | Título de la página |
color_id | No | string | Id de color del proyecto; por defecto el color predeterminado del proyecto |
url | No | string | URL/slug de la página mostrado en el nodo |
variant | No | enum | default | frame | ghost | stack |
after_id | No | string | Colócalo directamente después de este hermano: nombra un vecino en lugar de contar posiciones |
before_id | No | string | Colócalo directamente antes de este hermano |
index | No | number | Posición absoluta entre los hijos del padre; omítelo para añadir al final |
update_node
Actualiza campos de la página.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
id | Sí | string | Id del nodo |
title | No | string | Nuevo título |
color_id | No | string | Id de color del proyecto; default lo restablece al color predeterminado del proyecto |
url | No | string | null | URL/slug de la página; null lo borra: una cadena vacía es rechazada |
variant | No | enum | default | frame | ghost | stack |
notes | No | object | Campos de SEO/notas para fusionar: note, keywords, page_intent, seo_title, seo_description, seo_h1, seo_slug, seo_url. Un campo omitido conserva su valor actual. Escrito en snake_case, leído de vuelta en camelCase: ver la tabla a continuación |
Los campos de notas se escriben en snake_case y se leen de vuelta en camelCase. Los nombres a la izquierda son los que update_node y la operación por lotes nodes.update aceptan; los nombres a la derecha son los que get_project devuelve dentro del notes de una página:
| Escrito | Leído de vuelta |
|---|---|
note | note |
keywords | keywords |
page_intent | pageIntent |
seo_title | seoTitle |
seo_description | seoDescription |
seo_h1 | seoH1 |
seo_slug | seoSlug |
seo_url | seoUrl |
Cada par es un solo campo con dos grafías, no dos campos. Una escritura exitosa seguida de una lectura que no muestra seo_title es este mapeo y no datos perdidos: busca seoTitle. Ambas grafías permanecen como están: normalizar cualquiera de los lados rompería los clientes que ya leen la otra.
move_node
Mueve una página con todo su subárbol a otro padre.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
id | Sí | string | Id del nodo a mover |
parent_id | Sí | string | Nuevo padre (pestaña, sección o nodo): no el nodo mismo ni su subárbol |
after_id | No | string | Colócalo directamente después de este hermano: nombra un vecino en lugar de contar posiciones |
before_id | No | string | Colócalo directamente antes de este hermano |
index | No | number | Posición entre los hijos del nuevo padre |
delete_node
Elimina una página con todo su subárbol y todos los bloques dentro.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
id | Sí | string | Id del nodo |
create_block
Crea un bloque de contenido dentro de una página.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
node_id | Sí | string | Id de la página (nodo) en la que se crea el bloque |
title | No | string | Título del bloque |
content | No | string | Contenido de texto del bloque |
wireframes | No | string[] | Nombres de wireframe a renderizar, p. ej. ["header"], ["text"], ["footer"] |
color_id | No | string | Id de color del proyecto |
index | No | number | Posición dentro de la página; omítelo para añadir al final |
update_block
Actualiza campos del bloque.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
id | Sí | string | Id del bloque |
title | No | string | Nuevo título |
content | No | string | Contenido de texto del bloque |
color_id | No | string | Id de color del proyecto; default lo restablece al color predeterminado del proyecto |
wireframes | No | string[] | Nombres de wireframe a renderizar |
collapsed | No | boolean | Contraer/expandir el bloque |
completed | No | boolean | Marcar el bloque como hecho/no hecho |
move_block
Mueve un bloque a otra página.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
id | Sí | string | Id del bloque a mover |
node_id | Sí | string | Id de la página (nodo) de destino |
index | No | number | Posición dentro de la página de destino |
delete_block
Elimina un bloque de su página.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
id | Sí | string | Id del bloque |
manage_comment
Añade, elimina, resuelve y reabre comentarios e hilos de lienzo. Una nota añadida de esta manera es creada por la cuenta con la que la conexión está iniciada sesión, sin ningún marcador de ningún tipo — en el editor es indistinguible de una que esa persona escribió — y no notifica a nadie, porque no se envían menciones.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
action | Sí | enum | add | delete | resolve | reopen |
target | Sí (add) | object | add: de qué cuelga la nota — { "type": "page" | "block" | "tab" | "thread", "id": "…" } |
content | Sí (add) | string | add: el cuerpo de la nota; no debe estar vacío. Envía texto plano — se envuelve en un documento de editor, un párrafo por línea, y se renderiza como esperaría una persona que lo escribe. No construyas ese documento tú mismo; uno que ya tengas se almacena sin cambios |
position | No | object | add: la posición del pin, { "x": 0, "y": 0 } — proporcionarlo solicita un pin en lugar de una nota simple. Consulta la tabla siguiente |
id | Sí (delete, resolve, reopen) | string | El id del comentario o del hilo sobre el que actuar |
Lo que add crea depende del tipo de destino y de si se proporciona un position:
| Tipo de destino | position | Lo que se crea |
|---|---|---|
page | omitido | Una nota en la página |
page | proporcionado | Un pin de lienzo en esa página — un hilo |
block | omitido | Una nota en el bloque de contenido |
block | proporcionado | Rechazado — un bloque nunca puede contener un pin de lienzo. Elimina position, o fija el pin a la página en su lugar |
tab | cualquiera | Un pin de lienzo en el lienzo vacío de esa pestaña — un hilo |
thread | omitido | Una respuesta en ese hilo |
thread | proporcionado | Rechazado — una respuesta no tiene posición propia |
Cada id se verifica contra el proyecto antes de escribir nada — en add, en delete, y en resolve y reopen por igual — por lo que un id que el proyecto no contiene falla en lugar de crear una nota sin anclar a nada o cerrar un hilo en otro lugar. Un id del tipo incorrecto, por ejemplo un id de bloque dado como página, se rechaza nombrando el tipo real del id. Ninguno merece un reintento: la solución es volver a leer los ids.
Solo los hilos de lienzo tienen un estado resuelto, por lo que resolve y reopen toman un id de hilo — un comentario de página o bloque no se puede resolver en absoluto. delete toma un id de comentario o un id de hilo y determina cuál es, por lo que el llamador no tiene que saberlo; eliminar un hilo quita el pin pero deja sus respuestas, ya que son comentarios por derecho propio.
El idempotency_key opcional hace seguro un reintento — la misma clave enviada dos veces añade una nota, no dos. No hace que add sea idempotente: dos llamadas a add con claves diferentes añaden dos notas. En delete la clave se acepta e ignora: no hay nada que proteger, porque eliminar el mismo id dos veces quita una nota y luego informa que ya no existe.
Gestión de proyectos
create_project
Crea un nuevo proyecto en el espacio de trabajo de destino. Puede fallar cuando se alcanza el límite de proyectos de tu plan.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
workspace_id | Sí | string | Espacio de trabajo de destino — un UUID de espacio de trabajo de equipo, o el literal "my" para tu espacio personal. Obligatorio; un valor vacío u omitido se rechaza con un error. |
folder_id | No | string | Id de carpeta dentro del espacio de trabajo de equipo |
manage_project
Acciones del ciclo de vida del proyecto: duplicar, archivar/desarchivar, mover, transferir.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
action | Sí | enum | duplicate | archive | unarchive | move | transfer |
workspace_id | Sí (move) | string | move: espacio de trabajo de destino — un UUID de espacio de trabajo de equipo, o el literal "my" para tu espacio personal. Obligatorio para move; un valor vacío se rechaza con un error. |
folder_id | No | string | move: id de carpeta de destino |
email | No | string | transfer: correo del destinatario — debe ser un usuario registrado y sin plan gratuito |
update_project_settings
Actualiza la configuración a nivel de proyecto.
| Campo | Obligatorio | Tipo | Descripción |
|---|---|---|---|
project_uuid | Sí | string | UUID del proyecto |
title | No | string | Título del proyecto |
theme | No | enum | blueprint | bold | dark | light |
tree | No | enum | Diseño de árbol: map | matrix |
frame | No | enum | Estilo de marco de nodo: mobile | neutral | web |
mobile | No | boolean | Modo móvil |
image_mode | No | boolean | Mostrar imágenes en los nodos |
legend_position | No | enum | bottom | none | top |
default_color_id | No | string | Color predeterminado para nuevas páginas |
Aprende más
- Octopus.do: https://octopus.do/
- Model Context Protocol: https://modelcontextprotocol.io/
- Octopus.do en Smithery: https://smithery.ai/servers/octopus-do/sitemaps