LaserPDF
LaserPDF's MCP server lets AI assistants inspect, extract, search, OCR, redact, merge, extract pages from, rotate, export tables from, and sanitize PDFs locally.
Get PDF information: page count/sizes, title/author/program/dates, and pages needing OCR; optional password.
Extract text page by page, all pages or selected ranges like
1-3,5; optional password.Search for a word or phrase, case-insensitive and Turkish İ/ı aware, returning matching pages/lines; optional
match_caseand password.OCR scanned pages offline in English/Turkish and write a searchable PDF; can force low-resolution scans, select pages, and overwrite.
Redact words/phrases with black or white boxes and remove underlying text; optionally flatten unsafe pages; write to output, overwrite optional.
Remove hidden metadata: author, title, creating program, dates, XMP, comment authors, edit leftovers, and photo location/camera data.
Merge PDFs and images in order into one PDF.
Extract selected pages to a new PDF in the given order.
Rotate pages clockwise by 90, 180, or 270 degrees, all or selected pages.
Export a table from a page to
.xlsx, with optional area; scanned pages need OCR first.Write tools require an
outputpath and do not overwrite existing files unlessoverwrite: true; encrypted PDFs accept apassword.
LaserPDF
English · Türkçe
A lightweight, fast PDF viewer and editor for Windows. It edits the text that is already in a PDF, signs, redacts, recognizes scanned pages and organizes pages, and everything runs on your PC: no account, no uploads, no tracking.

Small: built with Tauri, so it uses the web engine that ships with Windows (WebView2) instead of bundling a browser like Electron apps do. The Store package is about 38 MB, most of it fonts for Chinese, Japanese and Korean and the text recognition models.
Rendering: pdf.js (Firefox's PDF engine). Editing and saving: pdf-lib.
13 languages: English, Turkish, German, Spanish, French, Italian, Polish, Portuguese (Brazil), Russian, Indonesian, Japanese, Korean and Chinese (Simplified). The system language is picked on first start. Light and dark themes.
Works with AI assistants: a built-in MCP server lets Claude Desktop and other MCP clients work with your PDFs on your PC.
Edit existing text | Sign and annotate |
|
|
Text recognition (OCR) | Organize pages (dark theme) |
|
|
Features
Viewing
Fast on-demand rendering: documents with hundreds of pages open instantly
Zoom (Ctrl + wheel, fit width or page), page navigation, thumbnails and bookmarks panel
Search (Turkish İ/ı aware), select and copy text
Links (internal links jump to the page, external links open in the browser)
Tabs for several documents, recent files, presentation mode (F5), night reading mode
Opening another PDF while LaserPDF is running opens it in a new tab
Editing
Edit existing text: click a line and type. The old text is removed from the page and the new text is written in its place without damaging colored or patterned backgrounds. Size, color and bold/italic are kept; the font is replaced with the closest match (letter widths are identical for Arial/Helvetica, Times, Courier and Calibri).
Add text with font, size, bold/italic, alignment, color, background and border
Images: PNG, JPG, WebP, GIF, BMP, or paste from the clipboard (Ctrl+V)
Signatures: draw, type your name or use an image; signatures are saved for next time
Stamps: APPROVED, DRAFT, CONFIDENTIAL, date stamp or your own text
Markup: highlight, underline and strike out text; pen and highlighter
Shapes: rectangle, ellipse, line, arrow (color, fill, width, opacity)
Whiteout (redaction): the text and links under the box are deleted from the file when you save. If something under it cannot be removed (an image, a scanned page, a form field), LaserPDF offers to turn that page into an image
Sticky notes saved as real PDF note annotations
Form filling: text fields, checkboxes and drop-down lists
Every object can be moved, resized, rotated, duplicated, copied and pasted
Annotations panel listing every comment page by page
Undo / redo (150 steps)
Pages
Reorder pages by drag and drop, in the sidebar or the full-screen Organize pages view
Rotate, delete, duplicate, insert blank pages
Insert pages from other PDFs or images; drop files onto the sidebar
Extract selected pages to a new PDF, split a document into files of N pages
Flatten a page (turn it into an image for permanent redaction)
Tools
Merge PDFs, create a PDF from images, new blank document
Page numbers, header/footer (e.g.
CONFIDENTIAL · Page {n} / {total}) and watermarksDocument properties (title, author, subject, keywords)
Remove hidden information on save: creator program, dates, XMP data, comment authors and the location/camera data of photos. Location data of inserted photos is always removed
Text recognition (OCR): recognizes scanned pages and adds an invisible text layer, so the text can be searched, selected and copied. English and Turkish, fully offline (Tesseract). Suggested when a scanned document is opened; scans below 150 dpi get an explanation instead of a long, failing run
Table to Excel: draw a box around a table and save it as .xlsx. Ruled tables use the lines on the page, other tables the position of the text; amounts become numbers, codes and dates stay text. Scanned tables can be exported after text recognition
Export a page as PNG/JPEG, reduce file size (by rasterizing scanned documents), print
Open password-protected PDFs
Related MCP server: quillpdf-mcp
Install
Microsoft Store (recommended): LaserPDF. Updates are automatic.
Installer:
LaserPDF_<version>_x64-setup.exeor.msion the Releases page. Release builds also include macOS (.dmg, unsigned: right-click → Open the first time) and Linux (.deb,.AppImage) packages, which get less testing than the Windows version.
Build from source
Requirements: Node.js 20+, Rust and the Tauri prerequisites.
npm install
npm run tauri dev # desktop app in development mode
npm run tauri build # installers in src-tauri/target/release/bundleTests (run the app in Chromium and check the saved PDFs):
npm testBrowser-only development server:
npm run dev # http://localhost:1420Every push to main builds the Windows installers and the Store package (Actions → Build desktop apps → Artifacts). Pushing a v* tag, or running the workflow with a version, builds all platforms and publishes a release. Update the version in package.json, src-tauri/tauri.conf.json and src-tauri/Cargo.toml first.
Use with AI assistants (MCP)
Started with --mcp, LaserPDF runs as a Model Context Protocol server without opening a window. AI assistants that support MCP, such as Claude Desktop, can then work with PDFs on your PC. LaserPDF does the processing locally; nothing else (Node.js, Python) needs to be installed.
Tool | What it does |
| Page count, size, title, author and other properties |
| Text of all or selected pages |
| Find words or phrases, with page numbers |
| Recognize scanned pages (English and Turkish) and save a searchable PDF |
| Black out or white out words and remove them from the file |
| Remove author, programs, dates, XMP and photo location data |
| Join PDFs and images into one PDF |
| Save selected pages as a new PDF |
| Split a PDF into files of N pages |
| Rotate all or selected pages |
| Page numbers or a header/footer such as |
| A large, semi-transparent text such as CONFIDENTIAL across the pages |
| Make scans and image-heavy PDFs smaller (pages become images) |
| Save a table from a page as .xlsx |
Tools that write files only write to the output path they are given and never overwrite an existing file unless overwrite: true is set.
claude_desktop_config.json:
{
"mcpServers": {
"laserpdf": {
"command": "laserpdf",
"args": ["--mcp"]
}
}
}"command": "laserpdf" works with the Microsoft Store version. If you used the installer, give the full path instead, e.g. "C:\\Users\\<you>\\AppData\\Local\\LaserPDF\\laserpdf.exe" (backslashes are doubled in JSON).
The Dockerfile runs the Linux build as an MCP server in a container (with a virtual display), for MCP directories and clients that start servers that way.
Privacy
LaserPDF works offline. It has no account, no ads, no analytics and makes no network requests; your files stay on your PC. When you connect it to an AI assistant over MCP, the assistant receives the results of the tools it calls, and what it does with them is governed by that assistant's own privacy terms.
Keyboard shortcuts
Shortcut | Action |
Ctrl+O / Ctrl+S / Ctrl+Shift+S | Open / Save / Save as |
Ctrl+P | |
Ctrl+F | Search |
Ctrl+Z / Ctrl+Y | Undo / Redo |
Ctrl + / Ctrl − / Ctrl+0 | Zoom in / Zoom out / 100% |
Ctrl+Tab, Ctrl+W | Switch tabs, close tab |
F5 / Esc | Start / leave presentation mode |
Space (hold) | Temporary hand tool |
V H E T | Select, Hand, Edit text, Add text |
M U K | Highlight, Underline, Strike out |
P I | Pen, Highlighter |
R O L A | Rectangle, Ellipse, Line, Arrow |
W N | Whiteout, Note |
Delete, Ctrl+D, Ctrl+C / Ctrl+V | Delete, duplicate, copy/paste the object |
Arrow keys (×10 with Shift) | Nudge the selected object |
Project structure
src/
app.ts UI: toolbar, tabs, menus, shortcuts
viewer.ts Page layout, on-demand rendering, zoom, form and link layers
interact.ts Selecting, moving, resizing and rotating objects; drawing tools
objects.ts On-screen rendering of annotation objects
export.ts Saving with pdf-lib (writes objects into the PDF content)
erase.ts Removes edited and redacted text from page content streams
meta.ts Hidden information removal, JPEG metadata stripping
stream-iterator.ts Stream iteration for WebKit webviews (Linux, macOS)
ocr.ts Text recognition (Tesseract) and the invisible text layer
table.ts Table detection and .xlsx writing
mcp.ts MCP tools (runs in a hidden window in --mcp mode)
doc.ts Document model, undo / redo history
sidebar.ts Thumbnails, page organizer, bookmarks
search.ts Search
dialogs.ts Signature, page numbers, watermark, properties and other dialogs
platform.ts Desktop (Tauri) and browser file access
src-tauri/ Rust side: window, file access, file associations, MCP stdio bridgeNotes and limitations
"Edit text" removes the old text from the page. Where it cannot (for example text inside a form XObject), the old text is covered and stays in the file. Whiteout always deletes the text under it; images cannot be cut, so pages with an image under a whiteout box are offered to be flattened when saving. You can also right-click any page and choose Flatten (secure redaction).
Encrypted PDFs can be opened; their pages are saved as images.
Edited right-to-left text (Arabic, Hebrew) is not shaped yet.
Added text uses the embedded Arimo, Tinos, Cousine, Carlito and Caladea fonts (same letter widths as Arial, Times New Roman, Courier New and Calibri; Caladea is close to Cambria). DejaVu covers other characters and Noto Sans covers Chinese, Japanese and Korean, so text looks right in every PDF reader.
License
LaserPDF is licensed under the GNU GPL v3.0 or (at your option) any later version.
Open source components: pdf.js (Apache-2.0), pdf-lib and @pdf-lib/fontkit (MIT), Tauri (MIT/Apache-2.0), Lucide icons (ISC), Arimo, Tinos and Cousine fonts (SIL Open Font License 1.1, public/fonts/LICENSE-Arimo-Tinos-Cousine.txt), Carlito and Caladea fonts (SIL Open Font License 1.1, public/fonts/LICENSE-Carlito-Caladea.txt), DejaVu fonts (Bitstream Vera license, public/fonts/LICENSE-DejaVu.txt), Noto Sans JP/SC/KR fonts (SIL Open Font License 1.1, public/fonts/LICENSE-Noto.txt), HarfBuzz (MIT), fflate (MIT), Tesseract, tesseract.js and the Tesseract language models (Apache-2.0, public/tesseract/LICENSE-Tesseract.txt).
Available Tools
15 toolsadd_page_numbersAdd page numbersAIdempotent
Writes page numbers, or a header/footer such as "Confidential - Page {n} of {total}", onto every page or the chosen pages of a PDF and saves the result as a new PDF. The text is placed at the chosen corner or edge, and stays real, searchable text. For a large diagonal stamp across the page, use add_watermark. The original is not changed, and an existing output file is only replaced with overwrite: true. Encrypted PDFs cannot be saved.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| color | No | Text colour (default dark grey), as #rrggbb. | |
| pages | No | Pages as 1-based numbers and ranges, e.g. "1-3,5". All pages when omitted; a page outside the document is an error. | |
| start | No | Number of the first page (default 1). | |
| format | No | Text with {n} for the page number and {total} for the page count (default "{n}"). | |
| margin | No | Distance from the page edge in points (default 24). | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| position | No | Default bottom-center. | |
| font_size | No | Default 10. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true): it discloses non-destructive-by-default behavior, the exact overwrite escape hatch, the encryption limitation, and that the added text remains real searchable text rather than a raster overlay. These are the traits an agent actually needs before invoking.
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?
Four sentences, front-loaded with purpose and output, then alternative, then safety constraints. No filler and no repetition of schema fields.
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, the description supplies what would otherwise be missing: the result is a new PDF, the original is preserved, the text is searchable, and encryption blocks saving. An 11-parameter mutation tool is fully covered by description plus schema.
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 coverage is 100%, so baseline is 3, but the description adds real value by demonstrating the format parameter with a concrete template ('Confidential - Page {n} of {total}') and clarifying placement ('chosen corner or edge'). It does not cover color, margin, font_size or page-range syntax, which the schema already handles.
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 ('write page numbers ... onto every page or chosen pages of a PDF and saves the result as a new PDF') and immediately distinguishes itself from add_watermark, the nearest sibling. An agent can tell what this produces without opening the 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?
Names the explicit alternative for a different need ('For a large diagonal stamp across the page, use add_watermark'), and states the conditions that gate the write: original untouched, existing output replaced only with overwrite: true, encrypted PDFs cannot be saved. Routing and preconditions are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_watermarkAdd a watermarkAIdempotent
Writes a large, semi-transparent, rotated text (e.g. CONFIDENTIAL, DRAFT) across the middle of every page or the chosen pages of a PDF and saves the result as a new PDF; the page content stays readable underneath. For small text in a corner or a footer, use add_page_numbers. The original is not changed, and an existing output file is only replaced with overwrite: true. Encrypted PDFs cannot be saved.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| text | Yes | Watermark text. | |
| angle | No | Rotation in degrees; negative values rise to the right (default -45). | |
| color | No | Text colour (default red), as #rrggbb. | |
| pages | No | Pages as 1-based numbers and ranges, e.g. "1-3,5". All pages when omitted; a page outside the document is an error. | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| opacity | No | 0.05 to 1 (default 0.2). | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| font_size | No | Default 64. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, but the description adds real context beyond them: the original is never modified, an existing output is only replaced with overwrite:true, and encrypted PDFs cannot be saved even with a password. The encryption limitation is partly echoed in the password parameter schema, which keeps this from being maximal.
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?
Front-loads the action and visual outcome, then the sibling alternative, then the safety caveats. No sentence is redundant and no filler is present despite covering five distinct facts.
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 10-parameter file-mutating tool with no output schema, the description covers what is produced, that the source is untouched, overwrite gating and encryption limits — the essentials an agent needs to call it safely. It stops short of describing the call's return value or the failure mode when an invalid page range is passed, which is a minor residual 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 100%, so every parameter (angle, color, pages, opacity, font_size, overwrite, password) is already documented in the schema with defaults and formats. The description only alludes to rotation and transparency generically and adds no syntax, units, or constraints beyond the schema, so the baseline of 3 is correct.
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 — writing rotated, semi-transparent text across a PDF's pages and saving a new file — plus the visual result ('page content stays readable underneath'). It explicitly differentiates itself from the sibling add_page_numbers, so an agent can route between the two without opening either 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?
Explicitly names the alternative for a related need ('For small text in a corner or a footer, use add_page_numbers') and states the conditions for replacing an existing output file. It does not discuss prerequisites such as password availability until the encryption caveat, but the primary routing decision is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compress_pdfCompress a PDFAIdempotent
Makes a PDF smaller by redrawing every page as a JPEG image at the chosen quality, and returns the size before and after. Best for scans and photo-heavy files; for documents that are mostly text it usually makes the file larger, which the result then says. The text is no longer selectable afterwards: run recognize_text on the result to make it searchable again. To get separate image files instead, use pdf_to_images. The original is not changed, and an existing output file is only replaced with overwrite: true. Encrypted PDFs cannot be compressed.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| quality | No | low: 96 dpi, smallest; medium: 144 dpi (default); high: 200 dpi. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, destructive=false, idempotent=true); the description goes well beyond them by disclosing the lossy side effect (text is no longer selectable), the non-mutation of the original, the conditional replacement of the output file via overwrite, and the encrypted-input failure mode. It is consistent with the annotations rather than contradicting them.
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?
Effectively concise for the amount of load-bearing information: mechanism first, then suitability, then the lossy consequence and its remedy, then the sibling alternative, then file-safety semantics, then the encryption limitation. No sentence is redundant with the schema or annotations.
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?
There is no output schema, so the description compensates by stating what is returned ('the size before and after'). Combined with the side-effect, safety, and precondition disclosures, an agent has everything needed to call this correctly on the first try.
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 100%, so path, output, quality, password and overwrite are already documented with dpi values and defaults. The description reinforces overwrite and quality behavior but adds no new parameter syntax or constraints beyond the schema, so the baseline of 3 applies.
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+resource (compress a PDF) plus the exact mechanism ('redrawing every page as a JPEG image at the chosen quality'), which tells an agent how the output differs from the input. It also names the sibling pdf_to_images as the alternative for a different output shape, so it is distinguishable 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?
Explicit when-to-use ('Best for scans and photo-heavy files'), when-not ('for documents that are mostly text it usually makes the file larger'), the follow-up step ('run recognize_text on the result'), the alternative tool for a different goal (pdf_to_images), and a hard precondition (encrypted PDFs cannot be compressed). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_tableExport a table to ExcelAIdempotent
Reads the table on one page of a PDF and writes it as an .xlsx workbook, and returns the rows found as a preview. Without an area, a table drawn with lines is found by itself; otherwise the whole page is read. Rows and columns follow the table's lines when it has them; amounts (1.234,56 or 1,234.56) become numbers, codes and dates stay text. Use it for tables you want to calculate with; for plain text use extract_text. Scanned pages need recognize_text first; a page without text is an error. The original is not changed, and an existing output file is only replaced with overwrite: true.
| Name | Required | Description | Default |
|---|---|---|---|
| area | No | Optional area in points from the page's top-left corner. | |
| page | Yes | Page number (1-based). | |
| path | Yes | Absolute path of the PDF. | |
| output | Yes | Absolute path of the .xlsx file to write. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give coarse hints (readOnlyHint=false, destructiveHint=false, idempotentHint=true); the description adds real specifics beyond them: the original file is untouched, an existing output is only replaced when overwrite is true, line-less pages fall back to whole-page reading, a text-less page is an error, and numeric parsing rules. These are consistent with, not contradictory to, the annotations.
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?
Purpose and output artifact are front-loaded in the first clause, and every subsequent sentence carries distinct information (fallback behavior, parsing rules, prerequisites, safety). It is dense and somewhat packed with semicolon-joined clauses, but no sentence is filler.
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, yet the description covers the return value ('returns the rows found as a preview'), the failure mode, prerequisites, and file-safety behavior. For a 6-parameter write tool with nested area and an encrypted-PDF caveat, nothing an agent needs to invoke it correctly is missing.
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 coverage is 100%, so the schema already documents area, page, path, output, password, and overwrite, making 3 the baseline. The description adds behavioral meaning for area (auto-detection of a lined table vs whole-page reading when omitted) and for overwrite, which goes beyond the structured field text.
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 ('reads the table on one page of a PDF') plus the concrete artifact produced ('writes it as an .xlsx workbook'), and explicitly differentiates itself from extract_text. An agent can distinguish it from extract_text, pdf_to_images, and get_pdf_info 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 an explicit selection rule ('Use it for tables you want to calculate with; for plain text use extract_text') and a prerequisite ('Scanned pages need recognize_text first'). Both the when-to-use and the when-not-to-use cases are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_pagesExtract pagesAIdempotent
Writes the chosen pages of a PDF to a new PDF, in the order given ("3,1" puts page 3 first). Use it to pull out or reorder pages; to cut a whole document into equal parts, use split_pdf. The original is not changed, and an existing output file is only replaced with overwrite: true. Fails with a message for an invalid or out-of-range page and for encrypted PDFs.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| pages | Yes | Pages to keep, in the order wanted, e.g. "3,1-2" (each page is written once; repeats are ignored). | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/idempotent/non-destructive profile, but the description adds real value beyond them: the original file is untouched, an existing output is only replaced with overwrite:true, and it fails on invalid/out-of-range pages and encrypted PDFs. It doesn't say what error text or return value looks like, so it stops short of a 5.
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 dense sentences, front-loaded with the core behavior and ordering example before routing and failure modes. Every clause carries information; no filler.
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 local write tool with no output schema, the description covers mutation scope, overwrite semantics, ordering, sibling routing and failure modes such as encrypted PDFs. An agent has everything needed 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 coverage is 100%, so the schema already documents all five parameters including the pages syntax and overwrite default. The description reinforces ordering with the "3,1" example but adds no syntax or format detail the schema lacks, so the baseline 3 applies.
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 ('Writes the chosen pages of a PDF to a new PDF') plus the ordering semantics, and explicitly contrasts itself with the sibling split_pdf. An agent can distinguish it from merge_pdfs, rotate_pages and split_pdf 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 the positive use case ('use it to pull out or reorder pages') and names the exact alternative with its selecting condition ('to cut a whole document into equal parts, use split_pdf'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_textExtract textARead-only
Extracts the text layer of a PDF and returns it as plain text, one "--- Page N ---" section per page, in reading order. Use it to read, summarize or quote a document; to find where a word occurs, search_pdf is faster, and for tables export_table keeps rows and columns. Scanned pages have no text layer and come back marked as empty: run recognize_text on the file first, then extract from its output. Encrypted PDFs need their password. Very long documents stop after about 400,000 characters with a note; ask for fewer pages. Read-only; the file is not changed.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| pages | No | Pages as 1-based numbers and ranges, e.g. "1-3,5". All pages when omitted; a page outside the document is an error. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavioral detail: the exact output framing, empty results for scanned pages with the recovery path, the ~400,000-character truncation cap with a note, and that encrypted files need a password. That is exactly the extra context annotations cannot carry.
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?
Four dense sentences, zero filler, with the core purpose front-loaded and alternatives, edge cases, and limits following in a logical order. Every sentence carries actionable 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?
There is no output schema, so the description must describe the return value — and it does precisely, including per-page delimiters ordering, the empty-page marker, and the truncation behavior. Edge cases (scanned, encrypted, oversized) are all covered.
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 100%, so path, pages range syntax, and password behavior are already fully documented in the schema; the baseline is 3. The description reinforces password semantics ('encrypted PDFs need their password') but adds no syntax or format detail beyond what the schema provides.
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 (extracts the text layer of a PDF) plus the return format (plain text, '--- Page N ---' sections, reading order). It explicitly distinguishes itself from siblings search_pdf and export_table, so an agent can route correctly 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 explicit when-to-use ('read, summarize or quote a document') and names the alternatives with their selecting conditions (search_pdf for locating words, export_table for tables). It also documents the prerequisite for scanned files (run recognize_text first) and the password requirement for encrypted PDFs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pdf_infoPDF informationARead-only
Reads a PDF's overview and returns it as text: page count, page sizes in mm, title, author, subject, keywords, creating program, dates, whether it is encrypted, and which pages have no text layer (scans that need recognize_text). Call it first on an unknown file to decide what to do next; for the text itself use extract_text, to find a word use search_pdf. Read-only. An encrypted PDF needs its password; a missing or damaged file is reported as an error.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description reinforces read-only while adding real context: encrypted PDFs require a password, missing/damaged files surface as errors, and scanned pages without a text layer are flagged as needing recognize_text. It doesn't describe output formatting or pagination, but for a read-only inspector this is well beyond the annotation baseline.
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?
Front-loaded with what it returns, then routing guidance, then behavioral notes. Three dense sentences with semicolon-delimited lists; every clause carries distinct information and nothing is wasted.
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, the description must convey the return payload, and it does so field by field. It also covers the password requirement, the error case for missing/damaged files, and downstream routing, leaving no gap an agent needs before calling it.
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 100%, so both parameters are already documented in the schema. The description's remark that an encrypted PDF needs its password restates the schema text rather than extending it, so the baseline 3 applies.
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 (reads a PDF's overview, returns text) followed by an explicit enumeration of what the overview contains (page count, sizes in mm, metadata fields, encryption status, pages lacking a text layer). This clearly separates it from extract_text and search_pdf, which it names.
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 an explicit when-to-use rule ('Call it first on an unknown file to decide what to do next') and routes to alternatives with conditions ('for the text itself use extract_text, to find a word use search_pdf'). Exclusions and alternatives are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_pdfsMerge PDFsAIdempotent
Joins several PDFs and images (JPEG, PNG, WebP, GIF, BMP, AVIF) into one new PDF, in the order given: all pages of each PDF, and each image centred on an A4 page of its own. Use it to combine documents or turn photos and scans into a PDF; to take pages out, use extract_pages or split_pdf, and to turn pages into images, use pdf_to_images. The inputs are not changed, and an existing output file is only replaced with overwrite: true. Fails with a message when a path cannot be read, when no file is a PDF or image, and for encrypted PDFs; other files in the list are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes | Absolute paths of the PDFs and images, in the order wanted (at least one). | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the non-destructive, idempotent, closed-world profile, but the description adds substantial context on top: inputs are left unchanged, an existing output is replaced only with overwrite:true, non-PDF/image entries are silently skipped, and it fails on unreadable paths, all-invalid lists, and encrypted PDFs. These failure modes and side effects are exactly the behavioral detail annotations cannot express.
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?
The core operation is front-loaded in the first clause, followed by layout rules, alternatives, and failure modes in one dense paragraph. Every clause carries information, though the single block is slightly long for easy scanning.
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, the description still covers ordering, layout, side effects, overwrite gating, skip behavior, and error conditions. An agent has everything it needs to invoke this correctly without guessing.
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 100%, so the baseline would be 3, but the description adds meaning for paths by specifying ordering is significant and that non-PDF/image entries are skipped rather than erroring, and it clarifies the existence/overwrite interaction for output. Only minor overlap with what the schema already says about overwrite keeps this from a 5.
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 (joins) and resource (PDFs and images into one new PDF), plus the exact ordering and image-to-A4-page layout semantics. It also names the sibling tools for the inverse operations (extract_pages, split_pdf, pdf_to_images), so an agent can place it precisely in the toolset.
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 explicit when-to-use ("combine documents or turn photos and scans into a PDF") and explicit when-not, routing removals to extract_pages/split_pdf and page-to-image conversion to pdf_to_images. The alternatives are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pdf_to_imagesSave pages as imagesAIdempotent
Saves every page, or the chosen pages, of a PDF as PNG or JPEG images named -01.png, -02.png, ... (by page number) in an existing folder, and lists the files with their pixel sizes. Use it to share a page as a picture, insert it into a slide or chat, or look at a page's layout; to read the text, use extract_text, and to make a smaller PDF, use compress_pdf. The PDF is not changed; existing images are only replaced with overwrite: true. Encrypted PDFs cannot be converted.
| Name | Required | Description | Default |
|---|---|---|---|
| dpi | No | Resolution, 36 to 600 (default 150; 72 is screen size, 300 is print quality). | |
| path | Yes | Absolute path of the PDF. | |
| pages | No | Pages as 1-based numbers and ranges, e.g. "1-3,5". All pages when omitted; a page outside the document is an error. | |
| format | No | png (default) is sharp for text and drawings; jpeg is smaller for photos and scans. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| base_name | No | Start of the file names (default: the PDF's name). | |
| overwrite | No | Allow replacing an existing file (default false). | |
| output_dir | Yes | Absolute path of an existing folder for the images. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=false, and the description adds real context beyond them: the source PDF is not modified, existing images are only replaced with overwrite: true, and encrypted PDFs cannot be converted. It also describes the return (files listed with pixel sizes) despite having no output schema.
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?
Front-loaded with the core action and output convention, then use cases, then alternatives, then caveats. The opening sentence is dense and long, but each clause carries information an agent needs; there is no filler.
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?
Covers output format/naming, return summary, mutation semantics, overwrite behavior, and the encryption limitation. With no output schema, the description still supplies everything needed to invoke the tool 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 coverage is 100%, so the baseline is 3, but the description adds semantics beyond the schema: the page selection maps to the <base>-NN naming convention, and overwrite is tied explicitly to replacement of existing images. It adds some meaning without restating every field.
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+resource (saves PDF pages as PNG/JPEG images) and even specifies the output naming pattern. It explicitly distinguishes itself from extract_text (read text) and compress_pdf (smaller PDF), so an agent can route correctly without opening a 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 concrete use cases (share a page as a picture, insert into a slide or chat, inspect layout) and names the alternatives for the adjacent intents: extract_text for text and compress_pdf for shrinking. Both when-to-use and when-to-use-something-else are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recognize_textRecognize text (OCR)AIdempotent
Recognizes the text of scanned pages or images (Turkish and English, offline, no upload) and writes a copy of the PDF with an invisible text layer, so the text can be searched, selected and copied. Use it when get_pdf_info lists pages without text or extract_text returns them empty; then run extract_text, search_pdf or export_table on the output. Pages that already have text are left as they are. Scans below 150 dpi are skipped unless force is true, as their text is mostly misread. Takes a few seconds per page. The original is not changed, and an existing output file is only replaced with overwrite: true.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF or image. | |
| force | No | Also recognize low-resolution scans. | |
| pages | No | Pages as 1-based numbers and ranges, e.g. "1-3,5". All pages when omitted; a page outside the document is an error. | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: offline/no-upload operation, language coverage, that low-DPI scans are skipped unless force is true, runtime of seconds per page, that the original is unchanged, and that an existing output is only replaced with overwrite: true. This is exactly the extra context annotations can't convey.
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?
Purpose is front-loaded and every following clause carries new operational information — trigger condition, follow-up tools, skip rule, timing, and file-safety semantics. No sentence is redundant.
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, the description still defines the return artifact (a new PDF with a searchable text layer), the safety model, and the downstream workflow, which is everything an agent needs to invoke and chain this tool 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 coverage is 100%, so the baseline is 3, but the description adds real meaning: the rationale for force (low-resolution scans are mostly misread) and the destructive condition gated by overwrite. Minor parameters like pages and password are left entirely to the 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?
States a specific verb+resource ('recognizes the text of scanned pages or images') plus the concrete artifact produced ('writes a copy of the PDF with an invisible text layer'), which cleanly separates it from sibling read-only tools like extract_text and get_pdf_info.
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 an explicit trigger ('use it when get_pdf_info lists pages without text or extract_text returns them empty'), names the follow-up tools to run on the output, and states the exclusion that pages already containing text are left untouched. Alternatives and conditions are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
redact_pdfRedact textAIdempotent
Permanently blacks out (or whites out) every occurrence of the given words or phrases in a new copy of a PDF: each is covered with a box and the text underneath is removed from the file, so it cannot be selected, searched or copied. Use it for names, numbers or other content visible on the pages; for hidden information such as the author, use remove_metadata (often both before sharing), and use search_pdf first to check what will be hit. Something under a box that cannot be cut (an image or scan) is converted to an image when flatten_unsafe is true, otherwise left hidden and reported. Returns the number of occurrences redacted; nothing is written when none is found. The original is not changed, and an existing output file is only replaced with overwrite: true. Encrypted PDFs cannot be saved.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| color | No | Box colour (default black). | |
| terms | Yes | Words or phrases to redact. | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). | |
| match_case | No | ||
| flatten_unsafe | No | Convert pages with content that cannot be cut to images (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: text is removed from the file (not just visually covered), the original is untouched, an existing output is replaced only with overwrite:true, encrypted PDFs cannot be saved, the occurrence count is returned, and nothing is written on a zero-match run. These are real behaviors an agent must know before calling. No contradiction with annotations - destructiveHint=false and idempotentHint=true are consistent with writing a new copy.
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?
The destructive outcome and the new-copy semantics are front-loaded in the first sentence, and the follow-up clauses each carry distinct operational information. It is a dense paragraph, though, and could be broken into shorter sentences for faster scanning.
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 an 8-parameter write tool with no output schema, the description closes the important gaps: return value (occurrence count), failure/edge cases (encrypted PDFs, existing output file, zero matches), and the handling of uncuttable content. An agent has enough to invoke this 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 coverage is already 88%, so the schema carries most parameter meaning, but the description adds genuinely useful semantics: flatten_unsafe converts uncuttable image/scan pages to images versus leaving them hidden and reported, and overwrite governs replacement of an existing output. It does not explain match_case's default or matching behavior, which is the one remaining 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 ('Permanently blacks out ... every occurrence of the given words or phrases in a new copy of a PDF') and immediately distinguishes the operation from nearby siblings by naming remove_metadata for hidden content and search_pdf for previewing matches.
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?
Explicit when-to-use and when-not rules: use for visible page content, use remove_metadata for hidden metadata ('often both before sharing'), and use search_pdf first to check what will be hit. Alternatives and sequencing are stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_metadataRemove hidden informationAIdempotent
Writes a copy of a PDF with its hidden information removed: author, title, subject, keywords, creating program, dates, XMP metadata, comment authors, leftovers of earlier edits and photo location/camera data. Use it before sharing a file; the visible pages stay exactly the same. To remove visible text, use redact_pdf; to only read the information, use get_pdf_info. The original is never changed, and an existing output file is only replaced with overwrite: true. Encrypted PDFs cannot be saved this way.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true), the description discloses non-obvious behavior: the original is never modified, an existing output file is only replaced with overwrite: true, and encrypted PDFs cannot be saved this way. These are exactly the failure modes an agent needs to know before calling a write 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 sentences, no filler, front-loaded with the operation and the list of removed data, then routing to alternatives, then the mutation/encryption caveats. Every sentence carries distinct 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 output schema, the description covers what is produced (a copy at the output path), what is left untouched, overwrite semantics, and the encryption limitation. An agent has everything needed to invoke it correctly and to anticipate failure conditions.
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 coverage is 100%, so the baseline is 3; the description nonetheless adds real meaning by tying overwrite to file replacement behavior and clarifying the encryption nuance — a password allows reading but not saving a new PDF. It reinforces rather than duplicates the schema, though it does not extend the path/output parameters.
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 ('Writes a copy of a PDF') and then enumerates precisely what hidden information is stripped: author, title, subject, keywords, creating program, dates, XMP, comment authors, edit leftovers, and photo location/camera data. This lets an agent distinguish it from every sibling, including the close ones (redact_pdf, get_pdf_info), without opening a 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 an explicit use case ('Use it before sharing a file') and names two alternatives with the condition that selects each: redact_pdf for visible text, get_pdf_info to only read the information. This is a complete when-to-use / when-not-to-use / alternative map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_pagesRotate pagesAIdempotent
Rotates every page, or the chosen pages, clockwise by 90, 180 or 270 degrees and writes the whole document to a new PDF. Use it for sideways or upside-down scans; page content is not altered, only its display rotation, which is added to any rotation the page already has. The original is not changed, and an existing output file is only replaced with overwrite: true. Fails with a message for an invalid page range and for encrypted PDFs.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| pages | No | Pages as 1-based numbers and ranges, e.g. "1-3,5". All pages when omitted; a page outside the document is an error. | |
| output | Yes | Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true. | |
| degrees | Yes | Clockwise turn added to the current rotation. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| overwrite | No | Allow replacing an existing file (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: rotation is additive to existing page rotation, content is not altered, the original is untouched, an existing output is replaced only with overwrite:true, and it fails with a message for invalid page ranges and encrypted PDFs. This is exactly the mutation-safety context the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=true) cannot convey on their own.
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 front-loaded sentences with zero filler: purpose and parameter range first, then the use case and rotation semantics, then side effects and failure modes. Every clause carries information an agent needs.
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 output schema, the description covers side effects, overwrite behavior, additive rotation, encryption limits, and error conditions. The only gap is what the call returns on success (e.g. the new file path), which the agent must infer.
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 100%, and all six parameters are documented in the schema, including the enum and the overwrite/password semantics. The description's parameter-level statements (added rotation, invalid page range error, overwrite-only replacement) largely restate the schema rather than adding new syntax or format detail, so the baseline 3 applies.
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 (rotates), resource (pages of a PDF), scope (all pages or a chosen subset), parameter range (90/180/270 clockwise), and the outcome (writes a new PDF). Nothing among the siblings overlaps: none of merge/split/extract/compress rotate pages.
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 an explicit trigger scenario: 'Use it for sideways or upside-down scans'. That tells the agent when the tool applies. It stops short of naming alternatives or exclusions (e.g. when not to use it vs. pdf_to_images or extract_pages), so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pdfSearch textARead-only
Finds every occurrence of a word or phrase in a PDF and returns the count and, for each match, the page number and the line it is on (up to 500). Matching is literal text (no wildcards or regular expressions), case-insensitive by default and Turkish İ/ı aware; a phrase is found within one line of text. Use it to locate something without reading the whole document; to read pages use extract_text, and to black out what was found use redact_pdf with the same words. Scanned pages have no text and give no matches until recognize_text is run. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| query | Yes | Word or phrase to find, as plain text. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| match_case | No | Only match the exact upper/lower case (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint already covering safety, the description adds substantial behavior: literal-only matching (no wildcards/regex), case-insensitive default with Turkish İ/ı awareness, phrase matching constrained to a single line, a 500-match cap, and the scanned-page limitation. These are non-obvious traits that materially affect expectations.
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 dense paragraph, front-loaded with what the tool returns, followed by matching semantics and then routing to siblings. Every clause carries information an agent needs; nothing is redundant boilerplate.
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, the description steps in to describe the return values (count, page number, line, capped at 500) and covers the encrypted-PDF password caveat via the schema. Nothing essential to calling this correctly is missing.
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 coverage is 100%, so the baseline is 3. The description nonetheless adds meaning: it clarifies the default case-insensitivity that the match_case parameter toggles, states query is plain literal text, and explains matching is line-bounded, which the schema does not convey.
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 ('Finds every occurrence of a word or phrase in a PDF') and even specifies the return shape (count plus page number and line per match). It is immediately distinguishable from extract_text (reading pages) and redact_pdf (blacking out matches) which it names directly.
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?
Explicitly routes the agent: 'use it to locate something without reading the whole document; to read pages use extract_text, and to black out what was found use redact_pdf with the same words.' It also flags the when-not case for scanned pages, which require recognize_text first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
split_pdfSplit a PDFAIdempotent
Splits a PDF into new files of a given number of pages each (the last may be shorter), named -01.pdf, -02.pdf, ... in an existing folder, and lists them. Use it to cut a long document into equal parts; for chosen pages or a different order, use extract_pages. The original is not changed; if any of the files exists, nothing is written unless overwrite is true. Encrypted PDFs cannot be split.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path of the PDF. | |
| password | No | Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it. | |
| base_name | No | Start of the file names (default: the PDF's name). | |
| overwrite | No | Allow replacing an existing file (default false). | |
| output_dir | Yes | Absolute path of an existing folder for the new files. | |
| pages_per_file | Yes | Pages in each file (at least 1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly false, idempotent, non-destructive); the description goes well beyond that by disclosing that the original is unchanged, that nothing is written if any target file exists unless overwrite is true, and that encrypted PDFs cannot be split. These are exactly the failure/idempotency behaviors an agent needs.
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?
Front-loads the core action and keeps the alternative-tool guidance and the caveats in compact clauses. It is dense but every clause carries information; only the parenthetical about the shorter last file borders on the obvious.
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 write tool with no output schema, the description covers what is produced (named files and a listing), where it goes, the overwrite/atomicity rule, and the encryption limitation, leaving no material gap for correct invocation.
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 coverage is 100%, so the baseline is 3; the description adds value by clarifying the naming derivation (base-01, base-02, ...) and tying overwrite to the all-or-nothing write behavior, though it does not elaborate on password or pages_per_file beyond the 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?
States a specific verb and resource (splits a PDF), plus the exact output shape (new files of N pages each, last may be shorter) and even the naming convention <base>-01.pdf. It explicitly contrasts itself with the sibling extract_pages, so an agent can distinguish the two without opening the schemas.
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?
Names the scenario it is for ('cut a long document into equal parts') and the alternative for a different need ('for chosen pages or a different order, use extract_pages'), plus the precondition that the output folder must already exist.
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.
15 tool updates
v1.0.9- Changed
add_page_numbers3 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / pages / descriptionPrevious value: -"Pages, e.g. \"1-3,5\" (1-based). All pages when omitted."New value: +"Pages as 1-based numbers and ranges, e.g. \"1-3,5\". All pages when omitted; a page outside the document is an error." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
add_watermark3 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / pages / descriptionPrevious value: -"Pages, e.g. \"1-3,5\" (1-based). All pages when omitted."New value: +"Pages as 1-based numbers and ranges, e.g. \"1-3,5\". All pages when omitted; a page outside the document is an error." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
compress_pdf2 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
export_table1 field changed- changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
extract_pages3 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / pages / descriptionPrevious value: -"Pages to keep, e.g. \"1-3,5\"."New value: +"Pages to keep, in the order wanted, e.g. \"3,1-2\" (each page is written once; repeats are ignored)." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
extract_text2 fields changed- changed
Input schema / properties / pages / descriptionPrevious value: -"Pages, e.g. \"1-3,5\" (1-based). All pages when omitted."New value: +"Pages as 1-based numbers and ranges, e.g. \"1-3,5\". All pages when omitted; a page outside the document is an error." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
get_pdf_info1 field changed- changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
merge_pdfs2 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / paths / descriptionPrevious value: -"Absolute paths, in order."New value: +"Absolute paths of the PDFs and images, in the order wanted (at least one)."
- Added
pdf_to_images - Changed
recognize_text3 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / pages / descriptionPrevious value: -"Pages, e.g. \"1-3,5\" (1-based). All pages when omitted."New value: +"Pages as 1-based numbers and ranges, e.g. \"1-3,5\". All pages when omitted; a page outside the document is an error." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
redact_pdf2 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
remove_metadata2 fields changed- changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
rotate_pages4 fields changed- added
Input schema / properties / degrees / descriptionAdded value: +"Clockwise turn added to the current rotation." - changed
Input schema / properties / output / descriptionPrevious value: -"Absolute path of the PDF to write."New value: +"Absolute path of the new PDF. If the file exists, the call fails unless overwrite is true." - changed
Input schema / properties / pages / descriptionPrevious value: -"Pages, e.g. \"1-3,5\" (1-based). All pages when omitted."New value: +"Pages as 1-based numbers and ranges, e.g. \"1-3,5\". All pages when omitted; a page outside the document is an error." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
- Changed
search_pdf3 fields changed- added
Input schema / properties / match_case / descriptionAdded value: +"Only match the exact upper/lower case (default false)." - changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it." - added
Input schema / properties / query / descriptionAdded value: +"Word or phrase to find, as plain text."
- Changed
split_pdf1 field changed- changed
Input schema / properties / password / descriptionPrevious value: -"Password, if the PDF is encrypted."New value: +"Password, if the PDF is encrypted. Without it an encrypted PDF cannot be opened; with it, it can be read, but tools that write a new PDF cannot save it."
8 tool updates
- Added
add_page_numbers - Added
add_watermark - Added
compress_pdf - Added
export_table - Removed
ocr_pdf - Added
recognize_text - Added
split_pdf - Removed
table_to_excel
10 tool updates
v1.0.6- First observed
extract_pages - First observed
extract_text - First observed
get_pdf_info - First observed
merge_pdfs - First observed
ocr_pdf - First observed
redact_pdf - First observed
remove_metadata - First observed
rotate_pages - First observed
search_pdf - First observed
table_to_excel
TDQS
Scored across 15 tools
Each tool targets a distinct operation, and descriptions explicitly disambiguate near-neighbors (extract_pages vs split_pdf, add_page_numbers vs add_watermark, redact_pdf vs remove_metadata). Cross-references like 'to find a word use search_pdf' actively steer selection, leaving virtually no overlap.
All names use snake_case and are predominantly verb-first (extract_text, rotate_pages, add_watermark, compress_pdf). A couple deviate from the verb_noun shape (pdf_to_images, get_pdf_info), but the pattern stays predictable and readable.
Fifteen tools is well within the ideal range and each maps to a genuine, non-redundant PDF operation (read, OCR, redact, transform, convert). Nothing feels padded or thin for a document toolkit.
The surface covers the full common lifecycle: inspect, read, search, OCR, redact, scrub metadata, merge, split, extract, rotate, export tables, watermark, number, compress, and rasterize. Notable gaps are password/encryption handling (tools fail on encrypted PDFs rather than setting or removing passwords) and form filling, but core workflows are complete.
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.
Convert PDFs/images to Word, Excel, and Markdown. Split, merge, and watermark PDF files.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables PDF file manipulation including merging, splitting, extracting pages, extracting text, excluding pages, and reordering pages.25 npm1MIT
- AlicenseAqualityBmaintenanceA local-first PDF tool for merging, splitting, rotating, watermarking, Bates-numbering, cleaning metadata, and counting pages — all operations happen on your machine with no network transmission.1546 npm1MIT
- FlicenseBqualityAmaintenanceEnables local, offline document extraction and manipulation—PDF first but also HTML, DOCX, XLSX, PPTX, EML, EPUB, Markdown, and plain text—through tools for probing, locating, extracting, converting, assembling, OCR, protecting, and redacting documents, with nothing leaving the machine.7-
- AlicenseAqualityAmaintenanceLocal MCP server for PDFs: read PDFs into Markdown with tables, charts and OCR, export to Word, PowerPoint, EPUB and Excel, and merge, split, fill, compare and edit PDFs. Works only inside the folders you allow; nothing is uploaded.30Apache 2.0



