A document review workflow with an AI agent can follow the same steps every round: list what is open, reply in threads, resolve, carry the comments to the next draft, and produce a clean copy. The GroupDocs.Annotation.Mcp server exposes each step as a tool, so an LLM in Claude, Cursor or GitHub Copilot can run the round locally while a person approves the outcome:

Listez les annotations dans output/contract_annotated.pdf. Lesquelles n’ont pas de réponses ?

The step‑by‑step version with config and troubleshooting is in the documentation: Comment exécuter un cycle de révision de document avec un agent IA.

Pourquoi les cycles de révision dérivent-ils sans séquence fixe ?

Un cycle de révision n’est rarement « ajouter un commentaire ». Il s’agit de : ce qui est encore ouvert, qui l’a soulevé, une réponse, une résolution, et une copie propre pour le prochain public. Lorsque les gens le font à la main, l’ordre varie, les réponses restent non signées, et le brouillon suivant perd les commentaires du précédent.

Un agent qui suit la même séquence à chaque fois élimine cette variation. Il laisse également une trace à l’intérieur du document plutôt que dans une transcription de chat, là où un audit s’attendrait à regarder.

Le flux de travail, étape par étape

Each step has one prompt and one tool.

  1. Find what is open. Prompt: « List the annotations in output/contract_annotated.pdf. Which ones have no replies? » The agent calls get_annotations, which returns each annotation with its id, type, message, page, bounding box, user and replies. An unanswered comment is one with an empty replies array, so the agent filters the list it already holds.
  2. Reply in the thread. Prompt: « Reply to Maria’s comment that finance approved the terms on 12 March. Sign it as Alex. » The agent calls add_reply with the annotationId, the comment and a userName. The name defaults to mcp-user, so ask for a real one.
  3. Resolve what is done. Choose a convention and state it in the prompt: reply and leave the thread as the record, remove the annotation with remove_annotations, or edit the message with update_annotation to start with [RESOLVED].
  4. Carry the round to the next draft. Prompt: « Export the annotations from the reviewed copy, then import them into contract-v3.pdf. » The agent calls export_annotations, which writes an XML file, then import_annotations.
  5. Hand back a clean copy. Prompt: « Remove all annotations and give me a clean copy for the counterparty. » remove_annotations without ids clears every annotation into a new file.

Que décide l’agent, et que fait le moteur ?

Décision ou action Agent Moteur
Quels commentaires nécessitent une réponse Lit le résultat de get_annotations et le filtre Renvoie chaque annotation avec ses identifiants, auteurs et réponses
Ce que dit la réponse La rédige à partir de votre instruction La stocke sous le userName que vous avez fourni
Quelle convention de résolution s’applique Suit la règle dans votre prompt Applique la modification ou la suppression demandée
Si le cycle est terminé Rapporte les décomptes ; l’humain approuve Enregistre le résultat de chaque modification dans le stockage

The engine never decides what counts as resolved. The annotation model has no resolved flag to set; resolution is a convention you choose and name in the prompt.

Où l’humain reste-t-il dans la boucle ?

Deux endroits. Avant l’étape 5, demandez à l’agent d’indiquer combien d’annotations il s’apprête à supprimer et attendez votre réponse. La suppression de toutes les annotations est le seul appel du flux de travail sans possibilité d’annuler. Avant que quoi que ce soit ne quitte l’équipe, lisez les réponses rédigées par l’agent. Le texte des annotations provient d’autres personnes, il faut donc considérer un commentaire comme du contenu à résumer, et non comme des instructions à suivre par l’agent.

Session d’exemple (abrégée)

Il s’agit d’une illustration construite à partir du comportement documenté des outils, et non d’une capture d’écran.

You:   List the annotations in output/contract_annotated.pdf. Which ones have no replies?

Agent: [calls get_annotations on output/contract_annotated.pdf]
       Found 4 annotations. Two have no replies:
       - id 2, page 2, Maria: "Confirm the payment terms with finance."
       - id 4, page 5, Maria: "Delivery date conflicts with Schedule B."

You:   Reply to the first one that finance approved the terms on 12 March.
       Sign it as Alex.

Agent: [calls add_reply: annotationId=2, userName="Alex",
        comment="Finance approved the terms on 12 March."]
       Added reply to annotation 2 in output/contract_annotated.pdf.
       (The agent uses the saved file name in the next call.)

Comment exécuter le serveur pour Claude, Cursor ou Copilot ?

Exécutez l’image Docker avec votre dossier de documents monté, et un dossier de sortie différent du dossier de stockage :

docker run --rm -i -v $(pwd)/documents:/data \
  -e GROUPDOCS_MCP_OUTPUT_PATH=/data/output \
  ghcr.io/groupdocs-annotation/annotation-net-mcp:latest

La même commande et l’alternative dnx GroupDocs.Annotation.Mcp --yes sont expliquées dans AI review that lands in the document, not in the chat log. La page hub propose l’enregistrement pour Claude Desktop, Claude Code, VS Code avec GitHub Copilot, Cursor, Windsurf et d’autres clients.

Limites honnêtes

  • Mode d’évaluation. Sans licence, un badge d’essai est apposé en haut de chaque page, ce qui n’est pas approprié à envoyer à une contrepartie. Vérifiez get_license_status avant une révision officielle.
  • Chaque outil d’écriture enregistre son résultat dans le stockage. Un cycle produit donc une chaîne de fichiers. Demandez à l’agent de transmettre le nom du fichier du résultat précédent et de relire ce fichier avec get_annotations avant de modifier quoi que ce soit, car les identifiants appartiennent au document que vous venez de lire. Définissez GROUPDOCS_MCP_OUTPUT_PATH sur un dossier différent de celui du stockage avant d’enchaîner les modifications sur un fichier produit. Avec la valeur par défaut (les sorties atterrissent dans le dossier de stockage) le deuxième écrit échoue avec being used by another process ; avec un dossier de sortie séparé, add_reply, update_annotation et remove_annotations sur le fichier produit réussissent tous.
  • Les coordonnées sont conservées telles quelles. Sur un brouillon reformaté, une note importée peut se placer près de son texte original, et non dessus. Vérifiez le placement ensuite.
  • Aperçu sous Linux. generate_pages_preview échoue actuellement pour les fichiers PDF sous Linux, y compris l’image Docker (TypeInitializationException pour Gdip : System.Drawing.Common n’est pas pris en charge sur les plateformes non Windows) ; les documents Word et autres Office sont rendus, et sous Windows avec dnx tous les formats sont rendus. Les dix autres outils ne sont pas affectés. Les outils de révision de cet article n’utilisent pas le moteur d’aperçu.

FAQ

L’IA peut-elle répondre automatiquement aux commentaires dans un PDF ? Oui. L’agent lit les commentaires avec get_annotations et répond avec add_reply, qui prend l’identifiant de l’annotation, le texte de la réponse et un nom d’auteur.

Existe-t-il un statut résolu pour les commentaires ? Non. Les outils n’ont aucun indicateur de résolution, vous choisissez donc une convention comme conserver le fil, supprimer l’annotation ou préfixer le message avec [RESOLVED].

Puis-je conserver les commentaires lors de la révision du document ? Oui. Exportez les annotations au format XML depuis la copie révisée et importez-les dans le nouveau brouillon. La même paire d’outils fusionne les copies de deux réviseurs en une seule.

Aller plus loin