PrecisionPDF-MCP
A local MCP server for reviewing and editing PDF highlights in a workspace, with proposal/apply separation and fingerprint checks.
List PDFs in the configured workspace (up to 200).
Read selectable text from a 1-based page and get its SHA-256 fingerprint.
Propose exact-word highlights without modifying any PDF, with explicit ambiguity rejection.
Apply proposed highlights to new or existing
*-annotated.pdfcopies after reviewing the returned fingerprint.List existing annotations, including page, xref, color, opacity, and stored content.
Render a PDF page (including annotations) to PNG for visual review.
Propose and apply changes to one existing highlight’s color or opacity.
Propose and apply removal of one existing highlight.
Enforce safety: confine I/O to the workspace, refuse original-file overwrite, limit edits to
*-annotated.pdf, use atomic replacement, validate fingerprints, and make no network calls.
Provides Copilot-assisted PDF tutoring and guided reading, using available GitHub Copilot models through VS Code's Language Model API to explain selected passages, answer document-wide questions, and generate evidence-backed explanations with user approval before sending PDF text.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@PrecisionPDF-MCPhighlight the definition of entropy on page 12 in yellow"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
PrecisionPDF-MCP
A local PDF toolkit combining a PrecisionPDF MCP server for reviewable PDF annotations with an optional VS Code Learning Mode for interactive reading, exact document search, and Copilot-assisted explanations.
Current components: the MCP annotation server and the experimental PrecisionPDF Learning Mode v0.6.2 VS Code extension. Learning Mode has been tested on real course PDFs through the VS Code Extension Development Host. It is not a published VS Code Marketplace extension.
Features
Ten MCP tools:
list_pdfs,read_pdf_page,propose_highlight,apply_highlight,list_annotations,render_pdf_page,propose_annotation_update,apply_annotation_update,propose_annotation_removal, andapply_annotation_removal.Match normalized full word sequences with explicit ambiguity rejection.
Group word positions by PDF text line to create clean colored highlights.
Yellow, blue, green, pink and orange with configurable opacity.
1-based page numbering; source SHA-256 fingerprint between proposal and application.
Confine all PDF and image I/O to a single workspace directory (including symlink resolution).
Refuse accidental original-file overwrite. Only explicitly update
*-annotated.pdfcopies.Atomic replacement when saving an annotated working copy, so Okular can reload after each save.
Optional read-only VS Code PDF reader with word-level selection, page-aware tutoring, whole-PDF guided explanations, evidence navigation, and local exact-phrase search.
Related MCP server: PDF Memo MCP Server
Fedora install
Ensure
uvandokularare available (sudo dnf install uv okular).Clone this repo, then from inside it:
uv sync --extra dev
uv run pytestIn the PDF workspace
.vscode/mcp.json, configure:
{
"servers": {
"precisionpdf": {
"type": "stdio",
"command": "uv",
"args": ["--directory", "/home/YOU/Development/PrecisionPDF-MCP", "run", "precisionpdf-mcp"],
"env": {"PRECISIONPDF_ROOT": "${workspaceFolder}"}
}
}
}Replace the source directory with your clone location. Open MCP: List Servers in VS Code and start precisionpdf.
VS Code Learning Mode — setup and use
The optional extension lives in vscode-learning/ and is separate from the MCP server. Learning Mode is read-only: selecting or automatically highlighting passages does not add annotations or modify your PDF. The MCP tools above handle persistent highlights.
Start Learning Mode (development installation)
This extension currently runs via VS Code's Extension Development Host rather than a Marketplace installation.
Install VS Code, Python 3.11+, uv, and (for tests) Node.js 20+. From the repository root, run
uv sync --extra dev.Open the extension folder in VS Code, not the repository root:
cd /absolute/path/to/PrecisionPDF-MCP code vscode-learningReview and trust the workspace if prompted, then press F5 (or Run → Start Debugging). A separate Extension Development Host window opens.
In that new window, choose File → Open Folder and open the folder containing your PDF files. This PDF folder is the PDF workspace, not the extension source folder.
Open the Command Palette (Ctrl+Shift+P) and run PrecisionPDF: Open Learning Mode.
Choose a PDF. The reader opens with the PDF on the left and learning tools on the right.
If the extension cannot find the repository, set precisionpdfLearning.repositoryPath in VS Code Settings to your clone's absolute path. If it cannot find uv, set precisionpdfLearning.uvPath to the executable shown by command -v uv.
Manual tutoring — understand a selected passage
Choose Manual tutoring.
Drag across words in the PDF to select the text you want to discuss.
Enter a question, for example, “Explain this passage simply, with a practical example.”
Click Ask with Copilot. VS Code may ask you to authorize this extension to use an available Copilot language model.
Type follow-up questions using the composer at the bottom; Ctrl+Enter sends a question. Navigating pages or selecting a new passage retains the visible discussion, but changes the active evidence.
Use New discussion to clear history, or Clear selection to drop only the active selection.
Copy prompt lets you manually paste a question with page context into another chat, such as Codex or Antigravity. This is not an automatic subscription or account integration.
Guided Reading — document-wide questions and highlighted evidence
Choose Guided Reading.
Enter a question, then select a Search behavior:
Automatic: a short term like
black boxor “Where does it mention ‘black box’?” is treated as a local exact-phrase search. Questions such as “Explain why deep learning models are called black boxes” use Copilot.Find exact wording (local; no Copilot): scan all indexed pages for occurrences of the phrase. Click a result to jump to and temporarily highlight the match. The full match count is reported, with at most 150 clickable results.
Guided explanation (Copilot): ask, for example, “What are the main ideas of this PDF?” or “Why are neural networks difficult to interpret?”
Click Find / Analyze.
For Copilot-guided analysis, inspect the estimated number of model requests and approve before the extension sends extracted PDF text.
Read the Answer from reviewed direct evidence and navigate its supporting passages with Previous, Next, or Play / Pause (default 12 seconds per step). Click an evidence item to navigate directly to its page.
Optional contextual examples are shown separately, not as direct answers. After exact search, Explore related ideas with Copilot offers a separate non-exhaustive, AI-assisted tour.
Exact wording search and AI interpretation are different: exact search does not detect every semantic discussion of a concept, and the guided tour is not a complete inventory of relevant ideas. The reader checks document fingerprints, page positions, and exact source text before showing guided highlights, but these checks do not prove that an AI explanation is correct.
Copilot access, privacy, and limitations
Local exact search: no Copilot request or additional API key.
AI tutoring / guided explanations: use available GitHub Copilot models through VS Code's Language Model API; existing plan limits and quotas apply. The extension has no automatic Codex or Antigravity model integration.
The Python PDF-rendering bridge makes no outbound network requests. PDF text sent to Copilot can leave your machine. Manual questions are sent only after you click Ask; document-wide guided analysis requests explicit confirmation.
Best suited to ordinary selectable, horizontal PDF text. Scanned PDFs (no built-in OCR), encrypted documents, rotated pages, and complex layouts may be unsupported.
Guided whole-PDF analysis has limits of 60 pages, 350,000 indexed characters, 1,600 excerpts, and 30 analysis batches, plus synthesis and relevance-review requests. Oversized documents are rejected rather than summarized as though fully analyzed.
Neither mode changes the original PDF. To save a highlight or change an existing one, use the separate MCP annotation tools.
For detailed instructions, controls, limitations, and feature history, see vscode-learning/README.md.
Test Learning Mode
From the repository root:
npm --prefix vscode-learning test
uv run pytest -qThe JavaScript suite uses Node's built-in test runner and needs no npm install for this repository. Automated tests do not replace testing the webview and Copilot integration in the Extension Development Host.
Suggested MCP annotation workflow
Ask the AI to call
read_pdf_pageto inspect a particular page.Ask it to call
propose_highlightwith a passage from the page. Inspect the returned matched text, page and rectangles.Approve and call
apply_highlightusing the exact returnedfingerprint. Use an output filename such aslesson-annotated.pdf.Open the output in Okular and review it. Use
render_pdf_pageto capture a PNG.For the next highlight, propose against the annotated copy and apply with
file=output_file=lesson-annotated.pdf,overwrite_annotated_copy=true. Keep the original separate.
Important: Proposal/apply separation and client-side manual tool permissions help user review but are not a cryptographic human-approval gate. AI clients may call permitted tools automatically; choose Manual permissions if you want to inspect each edit before it is allowed.
MCP annotation scope and limitations
The MCP annotation server does not provide OCR for scanned PDFs or independently decide which text is important. Learning Mode's experimental AI evidence selection is a separate feature.
Word-level matching, unusual layouts, and rotated text require care; validate highlights on complex PDFs.
No network calls made by the server. The AI host/provider may still send document text to its model; consider your privacy needs.
Verify each visual highlight in Okular before trusting it. PDFs with complex layout need further tests.
Annotation counts may include annotations that already existed in the source PDF.
Changes to
*-annotated.pdfare atomic file replacements, not PDF-incremental saves. Keep backups as appropriate.
Edit or remove an existing highlight
Use list_annotations(file, page) on an existing *-annotated.pdf document to inspect page, xref, color, opacity, and stored annotation content. Identify the exact target before editing.
To recolor: call
propose_annotation_update(file, page, xref, color, opacity?), review the current annotation and proposed values, then (only after user permission) pass the returnedfingerprinttoapply_annotation_update(file, page, xref, expected_fingerprint, color, opacity?). Omit opacity to preserve the original.To remove: call
propose_annotation_removal(file, page, xref), review the target, then (only after user permission) callapply_annotation_removal(file, page, xref, expected_fingerprint).Proposals never change the PDF. Each application edits exactly one identified highlight in the existing annotated copy; it does not delete the file or rebuild highlights from scratch. It saves to a temporary PDF, verifies other annotations are unchanged, then atomically replaces that working copy.
Editing is limited to
*-annotated.pdffiles insidePRECISIONPDF_ROOT. Original PDFs, invalid colors, wrong-page or non-highlight xrefs, and stale SHA-256 fingerprints are rejected. Other annotations and their object references are checked after saving.A successful edit changes the PDF fingerprint; run a new proposal before the next edit. Keep backups for important documents, and visually verify changes in Okular.
Client safety: MCP tool permission prompts remain the approval mechanism. The server checks the fingerprint and target but cannot independently authenticate a human's approval. Do not grant automatic write permission if you want to review each change. Do not use rm or a shell-based rebuild as a workaround for an unsupported edit.
License
MIT.
Available Tools
10 toolsapply_annotation_removalB
Remove ONE existing highlight after explicit user approval.
Refuses to edit original PDFs, stale files, and non-highlight annotations.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | Yes | ||
| xref | Yes | ||
| expected_fingerprint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does add value by disclosing rejection conditions (original PDFs, stale files, non-highlight annotations) and an approval gate. However it omits the permission/auth model, what side effects or irreversible changes occur on success, and what a successful result looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the core action plus its approval gate are front-loaded. Efficient, though the brevity borders on under-specification for a 4-parameter mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 4 undocumented required params, no annotations, and no output schema, the description is thin. It should explain the fingerprint/identity param, what 'stale' means operationally, and the success/error outcome, none of which are covered elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all four required parameters (file, page, xref, expected_fingerprint) are undocumented. The description only hints at the singular target via 'ONE existing highlight'; it never explains the fingerprint's role or how page/xref identify a highlight, so it fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove ONE existing highlight') with the singular scope emphasized, which is more precise than the bare name. It implies the apply/propose split vs siblings like propose_annotation_removal, but never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a real workflow precondition ('after explicit user approval') and a set of exclusions ('refuses to edit original PDFs, stale files, and non-highlight annotations'). It stops short of naming propose_annotation_removal as the intended preparatory step, which is the most relevant alternative an agent would weigh.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_annotation_updateA
Change ONE existing highlight after explicit user approval.
Requires a fresh fingerprint and an existing *-annotated.pdf copy. Never use shell commands to delete or reconstruct the PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | Yes | ||
| xref | Yes | ||
| color | Yes | ||
| opacity | No | ||
| expected_fingerprint | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses meaningful safety constraints (user approval required, fingerprint freshness, do not use shell commands to delete or reconstruct the PDF), but says nothing about reversibility, side effects on other annotations, or failure modes when the fingerprint is stale.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the core action, then prerequisites, then the safety prohibition. Every sentence earns its place and nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations, no output schema, and 0% schema coverage across six parameters, the description covers workflow and safety but leaves parameter meaning and post-call effects unaddressed. Adequate on workflow, incomplete on invocation detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain six undocumented parameters. It only gestures at expected_fingerprint ('fresh fingerprint') and the file prerequisite ('*-annotated.pdf copy'); xref, page, color, and opacity are left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change ONE existing highlight'), and the qualifiers 'ONE' and 'existing' implicitly separate this from the create-oriented apply_highlight and the propose_* siblings. It stops short of naming an alternative outright, so it is clear but not maximally differentiating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition for use ('after explicit user approval') plus setup requirements, a fresh fingerprint and an existing *-annotated.pdf copy. It does not explicitly route the agent to propose_annotation_update versus apply_annotation_update, so guidance is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_highlightA
Apply a proposed exact-match highlight with a checked source fingerprint.
New output must not exist. For subsequent updates, the input and output may be the same *-annotated.pdf file when overwrite_annotated_copy is true. Do NOT call without showing the proposal to the user for review.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | Yes | ||
| color | No | yellow | |
| opacity | No | ||
| occurrence | No | ||
| exact_quote | Yes | ||
| output_file | Yes | ||
| expected_fingerprint | Yes | ||
| overwrite_annotated_copy | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose meaningful behavior: a precondition that the output must not exist, an overwrite path that permits input and output to be the same annotated PDF, and a human-review gate. It still doesn't say what happens on a fingerprint mismatch or what the call returns, which are notable gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each doing work, with the core action front-loaded and the constraints following. No filler or restatement of the tool name. Slightly dense phrasing but appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, no annotations, and 5 required parameters, the description covers the safety and workflow essentials but leaves key operational questions unanswered: how the fingerprint is verified/mismatch handling, and the meanings of the required quote/page params. Adequate for the happy path, incomplete for correct invocation in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 9 parameters, so the description must compensate but largely doesn't. It touches only expected_fingerprint (the 'checked' fingerprint), file/output_file, and overwrite_annotated_copy; page, exact_quote, color, opacity, and occurrence are left entirely undocumented in both schema and prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource: applying a proposed exact-match highlight with a verified source fingerprint. This clearly differentiates it from the propose_* siblings (proposal step) and the apply_annotation_* siblings (updates/removals), even though it never names the sibling it pairs with. 'Exact-match' and 'checked source fingerprint' are concrete scoping details an agent can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states two explicit usage constraints: the output must not already exist, and the tool must not be called without showing the proposal to the user first. The overwrite_annotated_copy case is described for subsequent updates. What's missing is an explicit pointer to propose_highlight as the required preceding step, so the workflow is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_annotationsB
Read existing PDF annotations, including stored colors and object references.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read-only operation and discloses that colors and object references are returned, but it does not cover permissions, pagination, or whether the result spans all pages when page is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no wasted words. It efficiently conveys the core purpose and output details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with no output schema or annotations, the description covers the basic purpose and some return content. However, it omits scope behavior for the optional page parameter, leaving a meaningful gap for callers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'file' or 'page' parameters. While the parameter names are relatively intuitive, the description adds no meaning beyond the schema and fails to clarify the optional page filter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('existing PDF annotations'), and adds output detail ('stored colors and object references'). This clearly distinguishes it from sibling tools like apply_highlight, read_pdf_page, and propose_annotation_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives such as read_pdf_page or list_pdfs. The description also omits any mention of the optional page parameter or when to omit it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pdfsA
List PDF files within the configured local workspace (up to 200).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses a hard cap ('up to 200'), which signals possible truncation, but omits whether listing recurses into subdirectories, what order results come in, or what happens when the workspace holds more than 200 files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the resource and scope front-loaded and the result cap appended. No filler or redundancy; every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool with no output schema and no annotations, the description covers the essentials (what is listed, from where, and the cap). It stops short of describing the return shape (names vs. paths) or the behavior past the 200-file limit, but the low tool complexity makes this nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a no-arg tool applies. The description appropriately adds no invented parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('List') and resource ('PDF files') scoped to a 'configured local workspace,' which is unambiguous. It is inherently distinguishable from siblings like read_pdf_page, render_pdf_page, and list_annotations, which operate on page contents or annotations rather than enumerated files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this tool versus alternatives, nor any prerequisites (e.g., whether a workspace must be pre-configured). The intended discovery role is only inferable from the name and the sibling set, so guidance is essentially absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_annotation_removalB
Preview removal of ONE existing highlight without modifying the PDF.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | Yes | ||
| xref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the key trait: the PDF is not modified. That is a meaningful behavioral claim. It does not say what the preview returns, whether the proposal is persisted or handed to apply_annotation_removal, or how errors on a missing xref are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler; the preview semantics and the non-mutation guarantee are both front-loaded where an agent will read them first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so return-value explanation is not strictly required, and the non-destructive intent is clear. But with undocumented parameters and no annotation coverage, the definition leaves the agent guessing how to obtain a valid xref and what the preview actually produces.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters (file, page, xref) have 0% schema description coverage, so the description must compensate and it does not. 'ONE existing highlight' hints that a single annotation is targeted, but nothing explains that xref is the annotation reference, how it is obtained (e.g., from list_annotations), or the page/file conventions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Preview removal') plus a tightly scoped resource ('ONE existing highlight'), and the modifier 'without modifying the PDF' implicitly contrasts it with the apply-side siblings. It stops short of naming apply_annotation_removal directly, so sibling routing relies on inference from the propose/apply naming pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Preview' implies the dry-run-before-apply workflow, which is adequate context for the propose/apply pair. However, it never states when to use this instead of apply_annotation_removal, nor any prerequisite (e.g., that a preview should precede the mutation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_annotation_updateA
Preview changing ONE existing highlight's color or opacity; no edits.
Obtain page and xref from list_annotations. Review the proposed edit first.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | Yes | ||
| xref | Yes | ||
| color | Yes | ||
| opacity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it clearly discloses the key safety trait: this is a preview that makes no changes. It does not describe what the proposal artifact contains or whether it expires/is tied to a later apply, so the disclosure is good but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the scope constraint and the no-edit guarantee are front-loaded. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no annotations, no output schema and 0% schema coverage, the description covers intent, a key parameter source and the non-destructive behavior, but says nothing about the returned proposal or how it links to the subsequent apply call. Adequate but with a clear gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 5 parameters, so the description must compensate. It specifies the two mutable fields (color, opacity) and points the agent at list_annotations as the source of page and xref, but file semantics are left entirely to the schema and no format hints (color encoding, opacity range) are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Preview changing"), a scoped resource ("ONE existing highlight") and the exact fields involved (color or opacity), with "no edits" explicitly separating it from the apply_annotation_update sibling. An agent can distinguish this from apply_annotation_update and propose_highlight without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete prerequisite ("Obtain page and xref from list_annotations") and an ordering instruction ("Review the proposed edit first"), which effectively frames the propose-then-apply workflow. It does not name apply_annotation_update as the follow-up tool, so the alternative is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_highlightA
Find exact normalized words and report their locations WITHOUT modifying any PDF.
If passage repeats on the page, specify 1-based occurrence explicitly.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | Yes | ||
| occurrence | No | ||
| exact_quote | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the two most important behaviors: the search is normalization-aware and it performs no PDF mutation (read-only). It does not disclose failure behavior when no match is found, nor what a successful 'proposal' actually is, which matters for a propose/apply tool pair.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the read-only constraint front-loaded and the edge-case rule second. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with no annotations and no output schema, the description covers the mutation-safety question and the key parameter semantics, but omits the return shape ('locations' is vague) and the relationship to apply_highlight, leaving the propose/apply lifecycle incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does for the non-obvious parameters: 'exact normalized words' clarifies exact_quote's matching semantics and the '1-based occurrence' rule clarifies occurrence's conditional purpose. file and page remain undocumented, but they are self-evident.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('find') and resource ('exact normalized words'), and its locations, plus a clear scope qualifier ('WITHOUT modifying any PDF'). This distinguishes it in spirit from apply_highlight, but the sibling is never named, so an agent must infer the propose/apply split from naming convention alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a conditional rule for the repeated-passage case ('specify 1-based occurrence explicitly'), which is genuine usage guidance. However it never says when to prefer this over apply_highlight or that the result is meant to feed a subsequent apply step, so the workflow context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pdf_pageB
Read selectable text from a 1-based PDF page; includes SHA-256 document fingerprint.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does add real context: page numbering is 1-based and the returned data includes a SHA-256 document fingerprint. It omits what happens on pages without selectable text (e.g., scanned PDFs) and gives no error or pagination behavior, leaving notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no padding, front-loading the core action. Efficient, though the fingerprint tail could arguably be trimmed since there is no output schema to explain return values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description covers the essentials (text extraction, 1-based indexing, fingerprint). It still lacks file-format guidance and scanned-PDF limitations that an agent would need to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that 'page' is 1-based, which is genuinely useful, but says nothing about the required 'file' parameter (path vs. id, accepted formats), so half the parameters remain unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('selectable text from a 1-based PDF page'), which distinguishes it from the rendering sibling by emphasizing text extraction rather than image output. However, it never names render_pdf_page or any alternative, so the distinction is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The phrase 'selectable text' hints that image-only/scanned pages are out of scope, but the agent is left to infer this and gets no routing help against render_pdf_page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_pdf_pageB
Render a PDF page (including annotations) to a local PNG for visual review.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | ||
| page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that annotations are baked into the render and that output is a local PNG, but says nothing about where the file is written, whether it overwrites, or how the caller retrieves it — significant gaps for a tool that writes to disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action front-loaded and no filler. Every clause (render, PDF page, annotations, local PNG, visual review) adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and no parameter descriptions, the definition leaves the agent unable to determine the output artifact's location or how to consume it. For a tool whose whole purpose is producing a file, that is a material omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters, so the description must compensate. It only implies a page is rendered and never clarifies the 'file' parameter (path? identifier?) or the 'page' parameter's 1-based indexing and default. No added meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource+output: renders a PDF page to a local PNG. The parenthetical '(including annotations)' and the phrase 'visual review' differentiate it implicitly from text-oriented siblings like read_pdf_page and list_pdfs, though no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'for visual review' implies when to reach for this rather than read_pdf_page, but there is no explicit when-to-use statement, no prerequisites, and no named alternative. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
apply_annotation_removal - First observed
apply_annotation_update - First observed
apply_highlight - First observed
list_annotations - First observed
list_pdfs - First observed
propose_annotation_removal - First observed
propose_annotation_update - First observed
propose_highlight - First observed
read_pdf_page - First observed
render_pdf_page
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose, and the propose_/apply_ pairing cleanly separates preview from committed edits (highlight, update, removal). Read/list/render tools (list_pdfs, read_pdf_page, render_pdf_page, list_annotations) target different resource aspects with no overlap.
All names follow a consistent snake_case verb_noun pattern (list_pdfs, read_pdf_page, propose_highlight, apply_annotation_update, etc.). The propose_*/apply_* convention is applied uniformly across the three annotation operations.
Ten tools is well within the ideal range and each earns its place, covering discovery, reading, rendering, and the full propose/apply lifecycle without redundancy.
The surface covers the full highlight lifecycle (create/update/remove) via paired propose/apply tools, plus listing PDFs, reading text, rendering for review, and listing annotations. No obvious gaps for a local PDF annotation workflow.
Maintenance
Related MCP Connectors
Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.
Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.
Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.
Parse, extract, split, and ask over digital PDFs (text layer, no OCR) from Cursor and Claude.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables PDF manipulation including text, images, annotations, form fields, page operations, and metadata through natural language.16MIT
- FlicenseNot gradedqualityDmaintenanceEnables safe interaction with PDFs, including listing files, extracting highlights with exact text, reading annotations and page text, and viewing metadata, all restricted to configured directories.2-
- AlicenseNot gradedqualityBmaintenanceEnables querying PDF documents using natural language with grounded answers and source citations via a local RAG pipeline.MIT
- AlicenseAqualityAmaintenanceEnables AI agents to inspect and work with PDF files entirely on the local machine, covering page counts, metadata, layout, encryption permissions, scan-vs-text detection, and page rendering. Generated results land in a temporary workspace as short artifact ids that can be chained between tools and exported to real folders on request.1245 PyPI1Apache 2.0