Casos de uso de MCP
Estos flujos de trabajo muestran cómo un agente de IA encadena las herramientas MCP de Copera para hacer trabajo real. Como el servidor es sin estado, cada herramienta de board/tabla/fila necesita ObjectIds hexadecimales explícitos — así que la mayoría de los flujos empiezan con descubrimiento (list_boards → list_tables → get_table_schema) antes de leer o escribir.
Cada ejemplo muestra las llamadas a herramientas en orden, con los argumentos clave. Los resultados de las herramientas son JSON; el agente lee ids y valores de un resultado para alimentar la siguiente llamada.
Encontrar un board y leer sus filas
El patrón más común: localizar un board por nombre, encontrar una tabla y luego leer las filas.
list_boards({ query: "Roadmap" })
// → [{ id: "66ab…b01", name: "Q3 Roadmap", … }]
list_tables({ boardId: "66ab…b01", query: "Features" })
// → [{ id: "66ab…t02", name: "Features", columns: [...] }]
get_table_schema({ boardId: "66ab…b01", tableId: "66ab…t02" })
// → column ids + STATUS/DROPDOWN option ids
list_rows({ boardId: "66ab…b01", tableId: "66ab…t02", sort: "66ab…date:desc" })
// → rows with cell values keyed by columnId
list_rows no está paginado y puede ser grande. Acótalo con query, un filter estructurado ({ match, conditions: [{ column_id, operator, value }] }) y sort en lugar de leer cada fila.
Actualizar el estado de una fila
Leer el esquema primero es obligatorio para usar el columnId real y un id de opción válido.
get_table_schema({ boardId, tableId })
// find the STATUS column id and the "Done" option id
update_row({
boardId,
tableId,
rowId: "66ab…r07",
columns: [{ columnId: "66ab…status", value: "66ab…doneOption" }],
})
Para editar la descripción de texto largo de una fila o una celda de columna RICH TEXT, usa set_row_markdown en su lugar — update_row no toca el texto largo. Las escrituras a markdown se encolan (HTTP 202), así que vuelve a leer con get_row_markdown para confirmar.
Buscar documentos y resumir
Extrae el documento más relevante para una palabra clave, obtén su cuerpo y deja que el modelo lo resuma.
search_docs({ query: "onboarding checklist", limit: 5 })
// → ranked hits with highlights showing what matched
get_doc_content({ docId: "66ab…d11" })
// → full markdown body (can be large — only fetch when you need it)
El agente resume el markdown devuelto en su propia respuesta. Para navegar en lugar de buscar, usa get_docs_tree para recorrer la jerarquía.
Capturar un resumen en un nuevo documento
Combina la lectura con la escritura — investiga en todo el workspace y luego persiste el resultado.
search({ query: "Q3 launch", types: ["document", "channelMessage"], limit: 20 })
// gather context across docs and chat
create_doc({ title: "Q3 Launch Summary", content: "# Summary\n\n…" })
// → { id: "66ab…d99" }
// append more later (async — re-read to confirm)
set_doc_content({ docId: "66ab…d99", content: "\n\n## Risks\n…", operation: "append" })
Publicar un mensaje en un canal
Notifica a un canal, o envía un mensaje directo a una persona específica. Proporciona exactamente uno de channelId o userId.
list_channels({ query: "engineering", type: "text" })
// → [{ id: "66ab…c01", name: "engineering" }]
// or resolve a DM target:
list_workspace_members({ query: "alex@" })
// → [{ id: "66ab…u22", name: "Alex", email: "alex@…" }]
// post to a channel (synchronous)
send_message({ channelId: "66ab…c01", message: "Deploy is green ✅" })
// or direct-message a user (queued, may not appear immediately)
send_message({ userId: "66ab…u22", message: "Can you review the PR?" })
El name opcional (override del nombre para mostrar) es solo para canales — se rechaza al enviar un mensaje directo.
Triar notificaciones
Lee la bandeja de entrada, marca los elementos atendidos y despeja el ruido.
list_notifications()
// → { notifications: [...], unreadCount, count }
update_notification({ notificationId: "66ab…n05", status: "read" })
delete_notification({ notificationId: "66ab…n06" }) // no undo
La paginación usa los ObjectIds de notificación como cursores: pasa el id más antiguo devuelto como after para retroceder en el historial.
Comentar en una fila para un cliente
Agrega un comentario visible externamente a una fila de board — usa external de forma deliberada, solo cuando personas fuera del workspace deban verlo.
list_row_comments({ boardId, tableId, rowId, visibility: "all" })
// review the thread (cursor-paginated via pageInfo.endCursor)
add_row_comment({
boardId,
tableId,
rowId,
content: "We shipped the fix in today's release.",
visibility: "external",
})
Exportar una vista y guardarla en el drive
Renderiza una vista de tabla a un archivo. Para PDF/ZIP o exportaciones grandes, prefiere saveToDrive: true para que el archivo quede en el drive en lugar de un payload inline.
// viewId comes from list_tables / get_table_schema
export_table({
boardId,
tableId,
viewId: "66ab…v01",
format: "PDF",
saveToDrive: true,
})
// → async job snapshot + a drive reference
// later, fetch the file
get_drive_download_url({ fileId: "66ab…f44" })
// → presigned CloudFront url (fetch directly, no auth)
Consejos para ejecuciones de agente confiables
- Descubre antes de escribir. Llama a
get_table_schemapara obtenercolumnIds reales e ids de opción antes decreate_row/update_row/set_row_markdown— los tipos de columna no admitidos encreate_rowse ignoran silenciosamente. - Vuelve a leer tras las escrituras asíncronas.
set_row_markdown,set_doc_contenty los mensajes directos son consistentes en el tiempo. - Mantén un volumen de peticiones razonable. La API limita la tasa; los
429se reintentan automáticamente con backoff, pero los agentes que se expanden pueden aún alcanzar los límites. Acota las búsquedas y listas conquery/filter/limit. - Cuida los scopes. Un
403casi siempre significa que al token le falta un scope para esa herramienta — consulta Autenticación.
Ver también
- Referencia de herramientas — cada herramienta, sus argumentos y la capacidad de la Public API que mapea.
- Conectar un cliente MCP — conecta Claude, Cursor o el MCP Inspector.
- Referencia de la API — esquemas de petición/respuesta para los endpoints subyacentes.