# io.github.EigenCharlie/pdf-toolkit-mcp (npm · pdf-toolkit-mcp)

Unofficial PDF toolkit (merge/split/compress/OCR/convert/watermark/protect/...) via iLoveAPI.

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

## Components

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

## Channel facts

- Registry: `npm`
- Package: `pdf-toolkit-mcp`
- Version: `0.1.2`
- 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-04.

- **Supply Chain Security**: 83/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known medium-severity CVE affects hono 4.12.33, reached via @modelcontextprotocol/sdk > hono. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (125 of 126), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to EigenCharlie/pdf-toolkit-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 105 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 68/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2543 tokens (~141/item across 18 items; 18 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 30/100
  - Stability observed for 9 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 99/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 97% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add eigencharlie-pdf-toolkit-mcp -- npx -y pdf-toolkit-mcp
```

### Codex

```bash
codex mcp add eigencharlie-pdf-toolkit-mcp -- npx -y pdf-toolkit-mcp
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add eigencharlie-pdf-toolkit-mcp --command npx --arg -y --arg pdf-toolkit-mcp
```

### Hermes

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

### Other

```json
{
  "mcpServers": {
    "eigencharlie-pdf-toolkit-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "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-04 (score 77, +3)

- [security regression] CVE-2026-69207 affects this package: medium
- [security regression] Known CVEs: partial → fail
- [functional improvement] Stability: unverified → 0.30

### 2026-08-02 (score 74, +22)

- [security regression] Provenance: pass → unverified
- [security regression] Install scripts: pass → unverified
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: EigenCharlie/pdf-toolkit-mcp
- [functional regression] Maintenance: pass → unverified
- [functional regression] License: pass → unverified
- [functional improvement] Dependency health: unverified → partial
- [functional] Licence: MIT

### 2026-08-01 (score 52, −8)

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

### 2026-07-30 (score 60, −30)

- [security regression] Malware scan: pass → unverified
- [security regression] Known CVEs: partial → unverified
- [functional regression] Dependency health: partial → unverified

### 2026-07-29 (score 90, +46)

- [security improvement] Known CVEs: unverified → partial
- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security] The attested source repository moved: EigenCharlie/pdf-toolkit-mcp
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] License: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional] Licence: MIT

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

First indexed and scored.

## MCP tools (18)

### `merge_pdf` (~104 tokens)

Merge two or more PDF files into a single PDF, preserving order. Outputs a .pdf file on disk and returns its path.

Input parameters:

- `input_files` (array, required): Two or more PDF files to merge, in order.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `split_pdf` (~171 tokens)

Split a PDF into multiple PDFs by page ranges (e.g. "1-3,5-7") or into fixed-size chunks. Returns a .zip archive containing the resulting PDFs.

Input parameters:

- `fixed_range` (integer): If set, splits the PDF into chunks of this many pages each.
- `input_file` (string, required): Path to the PDF file to split.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `ranges` (string): Page ranges to extract, e.g. "1-3,5-7". If omitted and fixed_range is set, splits into fixed-size chunks.

### `compress_pdf` (~135 tokens)

Reduce the file size of a PDF. Choose compression_level "low", "recommended" (default), or "extreme". Outputs a .pdf file on disk and returns its path.

Input parameters:

- `compression_level` (string): Compression strength. "extreme" yields the smallest file but may lose quality.
- `input_file` (string, required): Path to the PDF file to compress.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `pdf_to_word` (~111 tokens)

Convert a PDF to an editable Microsoft Word .docx document. Conversion quality depends on the source (scanned PDFs produce poor results; use ocr_pdf first if needed).

Input parameters:

- `input_file` (string, required): Path to the PDF file to convert.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `pdf_to_excel` (~108 tokens)

Convert a PDF to a Microsoft Excel .xlsx spreadsheet. Works best when the source PDF contains clear tabular data; non-tabular PDFs may produce messy results.

Input parameters:

- `input_file` (string, required): Path to the PDF file to convert.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `pdf_to_powerpoint` (~105 tokens)

Convert a PDF to a Microsoft PowerPoint .pptx presentation. Each PDF page becomes an editable slide; conversion quality depends on the source.

Input parameters:

- `input_file` (string, required): Path to the PDF file to convert.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `pdf_to_jpg` (~144 tokens)

Convert a PDF to JPG images. In "pages" mode (default) each page becomes a JPG; in "extract" mode only embedded images are pulled out. Returns a .zip archive of the images.

Input parameters:

- `input_file` (string, required): Path to the PDF file to convert.
- `mode` (string): "pages" renders each PDF page as an image; "extract" extracts embedded images only.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `office_to_pdf` (~136 tokens)

Convert a Microsoft Office document (Word, Excel, or PowerPoint) to a PDF. Accepts .doc, .docx, .xls, .xlsx, .ppt, and .pptx files.

Input parameters:

- `input_file` (string, required): Path to a Microsoft Office file (.doc, .docx, .xls, .xlsx, .ppt, .pptx).
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `html_to_pdf` (~115 tokens)

Convert a local HTML file (.html or .htm) to a PDF. The HTML is rendered server-side; external assets referenced by the file may not be fetched.

Input parameters:

- `input_file` (string, required): Path to an .html or .htm file to convert.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `image_to_pdf` (~121 tokens)

Combine one or more images (.jpg, .jpeg, .png) into a single PDF, one image per page, in the order provided.

Input parameters:

- `input_files` (array, required): One or more image files (.jpg, .jpeg, .png), in the order they should appear in the PDF.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `rotate_pdf` (~182 tokens)

Rotate pages in a PDF by 90, 180, or 270 degrees clockwise. Target specific pages with "pages" (e.g. "1,3,5" or "1-5"), or rotate all pages by default.

Input parameters:

- `input_file` (string, required): Path to the PDF file to rotate.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `pages` (string): Which pages to rotate: "all" (default), or a list like "1,3,5" or "1-5".
- `rotation` (number, required): Clockwise rotation in degrees. Must be 90, 180, or 270.

### `add_page_numbers` (~201 tokens)

Stamp page numbers onto a PDF. Configure starting number, which pages to number, and placement (top/bottom + left/center/right).

Input parameters:

- `horizontal_position` (string): Horizontal placement of the page number. Default: "center".
- `input_file` (string, required): Path to the PDF file to stamp with page numbers.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `pages` (string): Which pages to number: "all" (default) or a range like "1-5" or list "1,3,5".
- `starting_number` (integer): Number to use for the first stamped page. Default: 1.
- `vertical_position` (string): Vertical placement of the page number. Default: "bottom".

### `extract_pdf_pages` (~135 tokens)

Extract a subset of pages from a PDF into a new PDF. Specify pages as a list or range, e.g. "1,3,5-7".

Input parameters:

- `input_file` (string, required): Path to the PDF file to extract pages from.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `pages` (string, required): Pages to extract, e.g. "1,3,5-7". Required.

### `unlock_pdf` (~125 tokens)

Remove password protection from a PDF. Requires the correct password. Produces an unprotected .pdf file on disk.

Input parameters:

- `input_file` (string, required): Path to the password-protected PDF file.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `password` (string, required): The password to unlock the PDF. Handled as a secret and sent only to iLoveAPI.

### `protect_pdf` (~118 tokens)

Add password protection to a PDF. Anyone opening the output will need the supplied password.

Input parameters:

- `input_file` (string, required): Path to the PDF file to protect.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `password` (string, required): Password to set on the PDF. Handled as a secret and sent only to iLoveAPI.

### `add_watermark` (~264 tokens)

Stamp a text or image watermark onto every page of a PDF. For mode="text", provide `text`. For mode="image", provide `image_file` (.jpg/.jpeg/.png). Tune placement, rotation, and opacity as needed.

Input parameters:

- `horizontal_position` (string)
- `image_file` (string): Path to a .jpg/.jpeg/.png image to stamp. Required when mode="image".
- `input_file` (string, required): Path to the PDF file to watermark.
- `layer` (string): Whether the watermark sits above the page content or behind it.
- `mode` (string, required): "text" stamps a text watermark; "image" stamps an image file onto each page.
- `opacity` (integer): Opacity percentage (1-100). Default: 100.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…
- `rotation` (integer): Rotation in degrees (0-360). Default: 0.
- `text` (string): Text to stamp. Required when mode="text".
- `vertical_position` (string)

### `repair_pdf` (~109 tokens)

Attempt to repair a damaged or malformed PDF. Useful for scanned PDFs that fail to open or render correctly in some readers. Produces a .pdf file on disk.

Input parameters:

- `input_file` (string, required): Path to the damaged PDF file to repair.
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

### `ocr_pdf` (~159 tokens)

Run OCR on a PDF to make scanned text selectable/searchable. Accepts one or more language codes (e.g. "eng", "spa"). Large or image-heavy PDFs can take more than 60 seconds.

Input parameters:

- `input_file` (string, required): Path to the PDF file to OCR.
- `languages` (array): ISO 639-2/T 3-letter language codes to detect (e.g. ["eng"], ["spa"], ["eng","spa"]). Default: ["eng"].
- `output_path` (string): Optional output path. If it ends with the expected extension, the file is written there. If it is a directory, the file is placed inside with a timestamped name. Defaults to the same directory as the…

## Diagnostics

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

## Score history

- 2026-08-04: 77
- 2026-08-03: 74
- 2026-08-02: 74
- 2026-08-01: 52
- 2026-07-30: 60
- 2026-07-29: 90
- 2026-07-28: 44
- 2026-07-27: 44

## Links

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