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:

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

The step-by-step version with config and troubleshooting is in the documentation: How to run a document review cycle with an AI agent.

Dlaczego rundy przeglądu dryfują bez ustalonej kolejności?

Runda przeglądu rzadko polega jedynie na „dodaniu komentarza”. To jest: co nadal jest otwarte, kto to podniósł, jaka jest odpowiedź, jakie jest rozwiązanie i czysta kopia dla kolejnego odbiorcy. Gdy ludzie robią to ręcznie, kolejność się zmienia, odpowiedzi są niepodpisane, a kolejny projekt traci komentarze z poprzedniego.

Agent, który za każdym razem podąża tą samą sekwencją, eliminuje tę zmienność. Pozostawia także ślad wewnątrz dokumentu zamiast w transkrypcji czatu, czyli tam, gdzie audytor będzie szukał.

Przebieg pracy, krok po kroku

Każdy krok ma jedną podpowiedź i jedno narzędzie.

  1. Znajdź, co jest otwarte. Prompt: „List the annotations in output/contract_annotated.pdf. Which ones have no replies?” Agent wywołuje get_annotations, które zwraca każdą adnotację wraz z jej id, typem, wiadomością, stroną, ramką, użytkownikiem i odpowiedziami. Nieodpowiedziany komentarz to taki, którego tablica replies jest pusta, więc agent filtruje listę, którą już posiada.
  2. Odpowiedz w wątku. Prompt: „Reply to Maria’s comment that finance approved the terms on 12 March. Sign it as Alex.” Agent wywołuje add_reply z parametrami annotationId, comment i userName. Domyślnie nazwa to mcp-user, więc podaj prawdziwą.
  3. Rozwiąż to, co jest gotowe. Wybierz konwencję i podaj ją w promptcie: odpowiedz i pozostaw wątek jako zapis, usuń adnotację przy pomocy remove_annotations lub edytuj wiadomość przy pomocy update_annotation, zaczynając od [RESOLVED].
  4. Przenieś rundę do kolejnego projektu. Prompt: „Export the annotations from the reviewed copy, then import them into contract-v3.pdf.” Agent wywołuje export_annotations, które zapisuje plik XML, a następnie import_annotations.
  5. Zwróć czystą kopię. Prompt: „Remove all annotations and give me a clean copy for the counterparty.” remove_annotations bez podania ids usuwa wszystkie adnotacje i tworzy nowy plik.

Co decyduje agent, a co robi silnik?

Decyzja lub akcja Agent Silnik
Które komentarze wymagają odpowiedzi Czyta wynik get_annotations i filtruje go Zwraca każdą adnotację z id, autorami i odpowiedziami
Co ma zawierać odpowiedź Tworzy ją na podstawie Twojej instrukcji Zapisuje ją pod podanym userName
Która konwencja rozwiązania ma zastosowanie Stosuje regułę z Twojego promptu Wykonuje edycję lub usunięcie, o które poproszono
Czy runda jest zakończona Raportuje liczby; człowiek zatwierdza Zapisuje wynik każdej zmiany w pamięci

Silnik nigdy nie decyduje, co uznaje się za rozwiązane. Model adnotacji nie posiada flagi „resolved”; rozwiązanie to konwencja, którą wybierasz i podajesz w promptcie.

Gdzie człowiek pozostaje w pętli?

Dwa miejsca. Przed krokiem 5 poproś agenta, aby podał liczbę adnotacji, które zamierza usunąć, i poczekaj na Twoją odpowiedź. Usunięcie wszystkich adnotacji jest jedynym wywołaniem w przebiegu, którego nie da się cofnąć. Zanim cokolwiek opuści zespół, przeczytaj odpowiedzi, które agent przygotował. Tekst adnotacji pochodzi od innych osób, więc traktuj komentarz jako treść do podsumowania, a nie jako instrukcję dla agenta.

Przykładowa sesja (skrócona)

To ilustracja oparta na udokumentowanym zachowaniu narzędzi, a nie zrzut ekranu.

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.)

Jak uruchomić serwer dla Claude, Cursor lub Copilot?

Uruchom obraz Dockera z zamontowanym folderem dokumentów oraz folderem wyjściowym różnym od folderu przechowywania:

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

Ten sam polecenie oraz alternatywa dnx GroupDocs.Annotation.Mcp --yes są opisane w AI review that lands in the document, not in the chat log. Strona hub zawiera rejestrację dla Claude Desktop, Claude Code, VS Code z GitHub Copilot, Cursor, Windsurf i innych klientów.

Szczere ograniczenia

  • Tryb ewaluacji. Bez licencji na każdej stronie pojawia się znaczek próbny, co nie jest odpowiednie do wysyłki do kontrahenta. Sprawdź get_license_status przed formalnym przeglądem.
  • Każde narzędzie zapisuje wynik z powrotem w pamięci. Dlatego runda tworzy łańcuch plików. Powiedz agentowi, aby przekazywał nazwę pliku z poprzedniego wyniku dalej i ponownie odczytał ten plik przy pomocy get_annotations przed edycją, ponieważ id należą do dokumentu, który właśnie odczytał. Ustaw GROUPDOCS_MCP_OUTPUT_PATH na folder inny niż folder przechowywania, zanim połączysz edycje na wyprodukowanym pliku. Przy domyślnym ustawieniu (wyjścia trafiają do folderu przechowywania) drugi zapis kończy się błędem being used by another process; przy oddzielnym folderze add_reply, update_annotation i remove_annotations na wyprodukowanym pliku działają poprawnie.
  • Współrzędne przenoszą się bez zmian. W przetworzonym projekcie zaimportowana notatka może wylądować w pobliżu oryginalnego tekstu, a nie dokładnie na nim. Sprawdź pozycję po imporcie.
  • Podgląd na Linuksie. generate_pages_preview obecnie nie działa dla plików PDF na Linuksie, w tym w obrazie Dockera (TypeInitializationException dla Gdip: System.Drawing.Common nie jest wspierany na platformach nie‑Windows); dokumenty Word i inne pliki Office są renderowane, a na Windows z dnx każdy format się wyświetla. Pozostałe dziesięć narzędzi nie jest dotkniętych. Narzędzia przeglądowe opisane w tym poście nie korzystają z renderera podglądu.

FAQ

Czy AI może automatycznie odpowiadać na komentarze w pliku PDF? Tak. Agent odczytuje komentarze przy pomocy get_annotations i odpowiada przy pomocy add_reply, które przyjmuje identyfikator adnotacji, tekst odpowiedzi i nazwę autora.

Czy istnieje status „rozwiązane” dla komentarzy? Nie. Narzędzia nie mają flagi rozwiązania, więc wybierasz konwencję, np. pozostawienie wątku, usunięcie adnotacji lub poprzedzenie wiadomości [RESOLVED].

Czy mogę zachować komentarze przy kolejnej wersji dokumentu? Tak. Wyeksportuj adnotacje do XML z przeglądanego egzemplarza i zaimportuj je do nowego projektu. Ten sam zestaw narzędzi łączy dwie wersje recenzentów w jedną.

Idź głębiej