Cas d'usage MCP
Ces workflows montrent comment un agent IA enchaîne les outils Copera MCP pour accomplir un vrai travail. Comme le serveur est sans état, chaque outil board/table/ligne a besoin d'ObjectIds hex explicites — la plupart des flux commencent donc par la découverte (list_boards → list_tables → get_table_schema) avant de lire ou d'écrire.
Chaque exemple montre les appels d'outils dans l'ordre, avec les arguments clés. Les résultats d'outils sont en JSON ; l'agent lit les ids et valeurs d'un résultat pour alimenter l'appel suivant.
Trouver un board et lire ses lignes
Le motif le plus courant : localiser un board par nom, trouver une table, puis lire les lignes.
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 n'est pas paginé et peut être volumineux. Affinez avec query, un filter structuré ({ match, conditions: [{ column_id, operator, value }] }), et sort plutôt que de lire chaque ligne.
Mettre à jour le statut d'une ligne
Lire d'abord le schéma est requis pour utiliser le vrai columnId et un id d'option valide.
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" }],
})
Pour éditer la description de texte long d'une ligne ou une cellule de colonne RICH TEXT, utilisez set_row_markdown à la place — update_row ne touche pas au texte long. Les écritures markdown sont mises en file (HTTP 202), donc relisez avec get_row_markdown pour confirmer.
Rechercher des docs et résumer
Récupérez le document le plus pertinent pour un mot-clé, chargez son corps, et laissez le modèle le résumer.
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)
L'agent résume le markdown renvoyé dans sa propre réponse. Pour parcourir plutôt que rechercher, utilisez get_docs_tree pour marcher dans la hiérarchie.
Capturer un résumé dans un nouveau doc
Combinez lecture et écriture — recherchez dans le workspace, puis persistez le résultat.
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" })
Publier un message de channel
Notifiez un channel, ou envoyez un message direct à une personne précise. Fournissez exactement un de channelId ou 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?" })
Le name optionnel (remplacement du nom d'affichage) est channel uniquement — il est rejeté lors de l'envoi d'un message direct.
Trier les notifications
Lisez la boîte de réception, marquez les éléments traités, et nettoyez le bruit.
list_notifications()
// → { notifications: [...], unreadCount, count }
update_notification({ notificationId: "66ab…n05", status: "read" })
delete_notification({ notificationId: "66ab…n06" }) // no undo
La pagination utilise les ObjectIds de notification comme curseurs : passez l'id le plus ancien renvoyé comme after pour parcourir l'historique en arrière.
Commenter une ligne pour un client
Ajoutez un commentaire visible de l'extérieur à une ligne de board — utilisez external délibérément, uniquement lorsque des personnes hors du workspace doivent le voir.
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",
})
Exporter une vue et l'enregistrer dans le drive
Rendez une vue de table en fichier. Pour PDF/ZIP ou de gros exports, préférez saveToDrive: true pour que le fichier atterrisse dans le drive au lieu d'une charge utile 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)
Conseils pour des exécutions d'agents fiables
- Découvrez avant d'écrire. Appelez
get_table_schemapour obtenir de vraiscolumnIds et ids d'options avantcreate_row/update_row/set_row_markdown— les types de colonnes non pris en charge danscreate_rowsont silencieusement ignorés. - Relisez après les écritures async.
set_row_markdown,set_doc_contentet les messages directs sont éventuellement cohérents. - Gardez un volume de requêtes raisonnable. L'API applique des limites de débit ; les
429sont automatiquement réessayés avec backoff, mais les agents qui fan-out peuvent tout de même les atteindre. Affinez les recherches et listes avecquery/filter/limit. - Attention aux scopes. Un
403signifie presque toujours que le token n'a pas un scope pour cet outil — voir Authentification.
Voir aussi
- Référence des outils — chaque outil, ses arguments, et la capacité Public API à laquelle il correspond.
- Connecter un client MCP — branchez Claude, Cursor ou le MCP Inspector.
- Référence de l'API — schémas requête/réponse des endpoints sous-jacents.