# io.github.AryanBV/pdf-toolkit-mcp (npm · @aryanbv/pdf-toolkit-mcp)

Write-capable PDF toolkit MCP: 22 tools to read, create, render, encrypt, merge & fill PDFs.

- Trust score: 67/100 (medium)
- Change this week: +43
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-06

## Components

- npm · `@aryanbv/pdf-toolkit-mcp`: 67/100 (this document), [markdown](https://verifymcp.io/servers/aryanbv-pdf-toolkit-mcp/aryanbv-pdf-toolkit-mcp.md), [page](https://verifymcp.io/servers/aryanbv-pdf-toolkit-mcp/aryanbv-pdf-toolkit-mcp)

## Channel facts

- Registry: `npm`
- Package: `@aryanbv/pdf-toolkit-mcp`
- Version: `0.3.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-06.

- **Supply Chain Security**: 89/100
  - No malware found by supply-chain analysis.
  - Known CVEs were checked across the 243 of 247 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Dependency health was assessed across the 243 of 247 dependencies we could resolve, so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 68 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 83/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3068 tokens (~133/item across 23 items; 22 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add aryanbv-pdf-toolkit-mcp -- npx -y @aryanbv/pdf-toolkit-mcp
```

### Codex

```bash
codex mcp add aryanbv-pdf-toolkit-mcp -- npx -y @aryanbv/pdf-toolkit-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "aryanbv-pdf-toolkit-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@aryanbv/pdf-toolkit-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add aryanbv-pdf-toolkit-mcp --command npx --arg -y --arg @aryanbv/pdf-toolkit-mcp
```

### Hermes

```yaml
mcp_servers:
  aryanbv-pdf-toolkit-mcp:
    command: "npx"
    args: ["-y", "@aryanbv/pdf-toolkit-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "aryanbv-pdf-toolkit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@aryanbv/pdf-toolkit-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-06 (score 67, +32)

- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Schema quality: fail

### 2026-08-02 (score 35, +15)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security] Stability: Stability not yet verified: our sandbox run of this package did not complete, so we have no schema to compare.
- [functional regression] Security disclosure: fail → unverified
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional] Schema quality: Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.
- [functional] Capabilities: Protocol version not yet verified: our sandbox run of this package did not complete, so we never saw its MCP handshake.
- [functional] Tool coverage: Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.
- [functional] Licence: MIT

### 2026-08-01 (score 20, +15)

- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional] Tool coverage: Tool coverage not yet verified: we do not have a sandbox capture of the tool definitions this version of the package serves yet.
- [functional] Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional] Capabilities: Protocol version not yet verified: we do not have a sandbox capture of the MCP handshake this version of the package performs yet.

### 2026-07-31 (score 5, −19)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 24, −3)

- [functional regression] Security disclosure: unverified → fail
- [functional regression] Dependency health: partial → unverified
- [functional] Schema quality: Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.
- [functional] Tool coverage: Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.

### 2026-07-28 (score 27, +2)

- [functional regression] Security disclosure: fail → unverified

### 2026-07-27 (score 25)

First indexed and scored.

## MCP tools (22)

### `pdf_extract_text` (~88 tokens)

Extract text content from a PDF file. Returns first 10 pages by default to avoid exceeding LLM context limits. Use the 'pages' parameter for specific pages.

Input parameters:

- `filePath` (string, required): Absolute path to the PDF file
- `pages` (string): Page range, e.g. '1-5' or '1,3,5'. Defaults to first 10 pages.

### `pdf_get_metadata` (~48 tokens)

Get metadata from a PDF file including title, author, subject, page count, creation/modification dates, and producer information.

Input parameters:

- `filePath` (string, required): Absolute path to the PDF file

### `pdf_get_form_fields` (~54 tokens)

List all form fields in a PDF with their names, types, current values, and required status. Returns hasForm: false for PDFs without forms.

Input parameters:

- `filePath` (string, required): Absolute path to the PDF file

### `pdf_to_markdown` (~171 tokens)

Convert a PDF to clean, reading-order Markdown for LLM consumption: reconstructs up to 2 content columns (plus full-width title/footer bands), infers headings from font size, and detects bullet/numbered lists. Pages with 3 or more columns fall back to single-column reading order. Tables are emitted as plain reading-order text, NOT reconstructed as Markdown tables. Best on clean, digital (text-based) PDFs; degrades on scanned/image-only PDFs (use pdf_render_pages for those) and very complex layouts. Returns the first 10 pages by default.

Input parameters:

- `filePath` (string, required): Absolute path to the PDF file
- `pages` (string): Page range, e.g. '1-5' or '1,3,5'. Defaults to first 10 pages.

### `pdf_search` (~117 tokens)

Search text across a PDF and return matches with a short surrounding snippet and the page number. The query is matched as a literal substring (case-insensitive by default). Searches all pages unless a range is given.

Input parameters:

- `caseSensitive` (boolean): Match case exactly. Defaults to false.
- `filePath` (string, required): Absolute path to the PDF file
- `pages` (string): Page range, e.g. '1-5'. Defaults to all pages.
- `query` (string, required): Literal text to find (matched as a substring)

### `pdf_merge` (~110 tokens)

Merge multiple PDF files into one. AcroForm fields are preserved; fields whose names collide across inputs are auto-renamed (namespaced by source). Set flatten:true to bake field values into static content.

Input parameters:

- `filePaths` (array, required): Array of absolute paths to PDF files to merge, in order
- `flatten` (boolean): Flatten the merged form: bake field values into static content and remove interactivity. Defaults to false.
- `outputPath` (string, required): Absolute path for the merged output PDF

### `pdf_split` (~130 tokens)

Extract specific pages from a PDF into a new file. AcroForm fields on the extracted pages are preserved; fields on omitted pages are dropped. Set flatten:true to bake field values into static content.

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `flatten` (boolean): Flatten the extracted form: bake field values into static content and remove interactivity. Defaults to false.
- `outputPath` (string, required): Absolute path for the output PDF
- `pages` (string, required): Page range to extract, e.g. '1-5' or '1,3,5'

### `pdf_rotate_pages` (~130 tokens)

Rotate pages in a PDF by 90, 180, or 270 degrees. Rotation is additive to any existing rotation. Rotates all pages if no page range is specified.

Input parameters:

- `degrees` (number, required): Rotation angle: 90, 180, or 270 degrees clockwise
- `filePath` (string, required): Absolute path to the source PDF file
- `outputPath` (string, required): Absolute path for the rotated output PDF
- `pages` (string): Page range to rotate, e.g. '1-5' or '1,3,5'. Omit to rotate all pages.

### `pdf_encrypt` (~100 tokens)

Encrypt a PDF with AES-256 password protection. Requires a user password to open. Owner password controls editing permissions (defaults to the user password).

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `outputPath` (string, required): Absolute path for the encrypted output PDF
- `ownerPassword` (string): Password for editing permissions. Defaults to userPassword if omitted.
- `userPassword` (string, required): Password required to open the PDF

### `pdf_compare` (~167 tokens)

Compare two PDFs page by page (by absolute page index) and report text differences. Returns identical:true when text matches. Diffs content-stream-order text (not visual reading order), so it is best for same-layout documents; reflowed or multi-column PDFs produce noisy diffs. Inserting/deleting a page shifts all later pages and reports them as changed. Large diffs are trimmed (truncated:true) to fit the response limit.

Input parameters:

- `filePathA` (string, required): Absolute path to the first (baseline) PDF file
- `filePathB` (string, required): Absolute path to the second (comparison) PDF file
- `pages` (string): Page range to compare, e.g. '1-5' or '1,3,5'. Defaults to all pages.

### `pdf_add_page_numbers` (~130 tokens)

Add page numbers to a PDF. Supports configurable position, format, starting number, and font size.

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `fontSize` (number): Font size for page numbers (6–24). Defaults to 10.
- `format` (string): Number format. Defaults to "Page X of Y".
- `outputPath` (string, required): Absolute path for the output PDF
- `position` (string): Position of page numbers. Defaults to bottom-center.
- `startFrom` (integer): Starting page number. Defaults to 1.

### `pdf_embed_qr_code` (~176 tokens)

Embed a QR code or barcode into a specific page of a PDF at given coordinates. Supports qrcode, code128, datamatrix, ean13, pdf417, and azteccode.

Input parameters:

- `content` (string, required): Data to encode in the QR code or barcode
- `filePath` (string, required): Absolute path to the source PDF file
- `outputPath` (string, required): Absolute path for the output PDF
- `page` (integer, required): Target page number (1-indexed)
- `size` (number): Size of the QR code/barcode in points. Defaults to 100.
- `type` (string): Barcode type. Defaults to qrcode.
- `x` (number, required): X position in points from the left edge
- `y` (number, required): Y position in points from the bottom edge

### `pdf_reorder_pages` (~168 tokens)

Reorder pages in a PDF. Specify the new page order as a comma-separated string (e.g. '3,1,2'). Duplicates are allowed. AcroForm fields are preserved. Set flatten:true to bake field values into static content.

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `flatten` (boolean): Flatten the reordered form: bake field values into static content and remove interactivity. Defaults to false.
- `outputPath` (string, required): Absolute path for the reordered output PDF
- `pageOrder` (string, required): New page order as comma-separated 1-indexed numbers, e.g. '3,1,2,4' or '1,1,2' (duplicates allowed; up to 2000 pages)

### `pdf_delete_pages` (~131 tokens)

Delete specific pages from a PDF, keeping the rest in their original order. AcroForm fields on the remaining pages are preserved. Set flatten:true to bake field values into static content. Cannot delete every page.

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `flatten` (boolean): Flatten the resulting form: bake field values into static content and remove interactivity. Defaults to false.
- `outputPath` (string, required): Absolute path for the output PDF
- `pages` (string, required): Page range to DELETE, e.g. '2' or '1-3,5'

### `pdf_create` (~203 tokens)

Create a new PDF from text content with automatic line wrapping and page overflow. Supports A4, Letter, and Legal page sizes. Provide fontPath for non-Latin text (Arabic, CJK, etc.).

Input parameters:

- `author` (string): PDF document author metadata
- `content` (string, required): Text content for the PDF. Use \n for line breaks.
- `fontPath` (string): Absolute path to a .ttf/.otf font file for non-Latin character support (Arabic, CJK, etc.). The built-in font is Latin-only.
- `fontSize` (number): Font size in points (6–72). Defaults to 12.
- `margin` (number): Page margin in points (0–500). Defaults to 50.
- `outputPath` (string, required): Absolute path for the output PDF file
- `pageSize` (string): Page size. Defaults to A4.
- `title` (string): PDF document title metadata

### `pdf_fill_form` (~158 tokens)

Fill form fields in a PDF. Supports text, checkbox, dropdown, radio, and list-box (multi-select) fields. Provide fontPath for non-Latin text (Arabic, CJK, etc.).

Input parameters:

- `fields` (object, required): Object mapping field names to values. Strings for text/dropdown/radio, booleans for checkboxes.
- `filePath` (string, required): Absolute path to the PDF file with form fields
- `flatten` (boolean): Flatten form fields after filling (makes them non-editable). Defaults to false.
- `fontPath` (string): Absolute path to a .ttf/.otf font file for non-Latin character support.
- `outputPath` (string, required): Absolute path for the filled output PDF

### `pdf_add_watermark` (~201 tokens)

Add a text watermark to PDF pages. Watermark is centered and rotated diagonally by default. Applies to all pages if no page range is specified.

Input parameters:

- `color` (string): Watermark color. Defaults to gray.
- `filePath` (string, required): Absolute path to the source PDF file
- `fontSize` (number): Watermark font size (10–200). Defaults to 50.
- `opacity` (number): Watermark opacity (0.0–1.0). Defaults to 0.3.
- `outputPath` (string, required): Absolute path for the watermarked output PDF
- `pages` (string): Page range, e.g. '1-5' or '1,3,5'. Omit to watermark all pages.
- `rotation` (number): Watermark rotation in degrees (0–360). Defaults to 45 (diagonal).
- `text` (string, required): Watermark text to overlay on pages

### `pdf_embed_image` (~184 tokens)

Embed a PNG or JPEG image into a specific page of a PDF. Supports custom positioning and optional scaling with aspect ratio preservation.

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `height` (number): Image height in points. Omit to use original height (or scale proportionally if width is set).
- `imagePath` (string, required): Absolute path to the PNG or JPEG image file
- `outputPath` (string, required): Absolute path for the output PDF
- `page` (integer, required): Target page number (1-indexed)
- `width` (number): Image width in points. Omit to use original width (or scale proportionally if height is set).
- `x` (number, required): X position in points from the left edge of the page
- `y` (number, required): Y position in points from the bottom edge of the page

### `pdf_create_from_markdown` (~120 tokens)

Create a rich, high-fidelity PDF from Markdown (CommonMark + GFM). Supports headings, bold/italic, links, ordered/bullet lists, tables, fenced code blocks, blockquotes, and horizontal rules.

Input parameters:

- `author` (string): PDF document author metadata
- `markdown` (string, required): Markdown content to render as PDF
- `outputPath` (string, required): Absolute path for the output PDF file
- `pageSize` (string): Page size. Defaults to A4.
- `title` (string): PDF document title metadata

### `pdf_create_from_template` (~170 tokens)

Create a polished PDF from a named template (invoice, report, or letter). Pass structured data matching the template's fields; data is validated against the template's schema.

Input parameters:

- `data` (object, required): Template data. Invoice: companyName, clientName, invoiceNumber, invoiceDate, items[{description, quantity, unitPrice}], taxRate, currency (ISO code or symbol, default USD), dueDate, notes, paymentTer…
- `outputPath` (string, required): Absolute path for the output PDF file
- `templateName` (string, required): Template to use: invoice, report, or letter

### `pdf_flatten` (~66 tokens)

Flatten a PDF's form fields, baking their current values into the page content and removing interactivity. Form-less PDFs are copied unchanged.

Input parameters:

- `filePath` (string, required): Absolute path to the source PDF file
- `outputPath` (string, required): Absolute path for the flattened output PDF

### `pdf_render_pages` (~225 tokens)

Render PDF pages to images so a vision-capable client can read scanned or image-only PDFs. Writes PNG/JPEG files and returns their paths; set inline:true to return image blocks the model can see directly.

Input parameters:

- `dpi` (integer): Render resolution in DPI (36–300). Defaults to 150.
- `filePath` (string, required): Absolute path to the source PDF file
- `format` (string): Output image format. Defaults to png.
- `inline` (boolean): Return rendered pages as inline image blocks the model can see directly instead of writing files. Max 5 pages; DPI is auto-capped so neither dimension exceeds 1500px. Defaults to false.
- `outputDir` (string): Directory for the output images: an absolute path is recommended; a relative path resolves against the server working directory. The directory must already exist. Defaults to the input PDF's director…
- `pages` (string): Page range to render, e.g. '1-5,8'. Defaults to the first 50 pages.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/aryanbv-pdf-toolkit-mcp/aryanbv-pdf-toolkit-mcp#diagnostics

## Score history

- 2026-08-06: 67
- 2026-08-05: 35
- 2026-08-04: 35
- 2026-08-03: 35
- 2026-08-02: 35
- 2026-08-01: 20
- 2026-07-31: 5
- 2026-07-30: 24
- 2026-07-29: 27
- 2026-07-28: 27
- 2026-07-27: 25

## Links

- npm package: https://www.npmjs.com/package/@aryanbv/pdf-toolkit-mcp
- Socket report: https://socket.dev/npm/package/@aryanbv/pdf-toolkit-mcp
- Repository: https://github.com/AryanBV/pdf-toolkit-mcp
- Changelog RSS feed: https://verifymcp.io/servers/aryanbv-pdf-toolkit-mcp/aryanbv-pdf-toolkit-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/aryanbv-pdf-toolkit-mcp/aryanbv-pdf-toolkit-mcp.json
- HTML version of this page: https://verifymcp.io/servers/aryanbv-pdf-toolkit-mcp/aryanbv-pdf-toolkit-mcp
