PDFluent
PYPI · PDFLUENT-MCP
Read, search and fill PDFs as markdown, text, tables, forms. Your documents stay on your machine.
Available components
Last scanned (6 hours ago)
Scores higher than 68% of PyPI servers
Category Documents and Files
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. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 30 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (AGPL-3.0-only OR LicenseRef-PDFluent-Commercial).Pass
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability61
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 1651 tokens (~183/item across 9 items; 9 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management43
- Stability observed for 13 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +16
- Malware scan: unverified → pass ▲ security
- 4 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- 3 Nov 26 +20
- Malware scan: unverified → pass ▲ security
- Stability: unverified → 0.37 ▲ functional
- Package version: 0.2.0 → 0.3.0 functional
- 27 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- 24 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 23 Oct 26 51
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed pypi/pdfluent-mcp@0.3.0
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 30 packages
| Packages resolved | 30 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
extract_blocks ~290
A local PDF as blocks, in reading order, with where each one came from. Each block has ``kind`` (paragraph, heading, list_item, table_cell, header, footer), ``text``, ``page`` (0-based), ``bbox`` ([x0, y0, x1, y1] in PDF points, origin bottom-left) and ``confidence``: the probability of the learned model that decided the block's kind, or null where no model did -- null means unknown, not low. Headings carry ``level``, list items ``level`` and ``ordinal``, table cells ``row``, ``column``, ``row_span``, ``column_span`` and ``header``. ``pages_needing_vision`` lists the pages in the window whose text layer is missing: nothing this returns for them is the page's content. Args: path: The PDF's absolute path on this machine. pages: The 0-based pages to return; omit for the whole document, up to the server's page limit. include_furniture: Keep running heads and page numbers (kinds header and footer); they are left out by default because they repeat on every page and crowd out the content.
| Name | Type | Req | Description |
|---|---|---|---|
| include_furniture | boolean | – | – |
| pages | – | – | – |
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
extract_markdown ~189
A local PDF as markdown, in reading order. Headings become ``#`` to ``###``, list items ``-`` and ``1.``, a table a pipe table (or HTML where markdown cannot hold its shape), and a change of page an HTML comment. Running heads and page numbers are left out. Args: path: The PDF's absolute path on this machine. pages: The 0-based pages to return; omit for the whole document, up to the server's page limit. The whole document is still read, because what a block is gets decided against the rest of it. quality: ``"fast"`` (default) or ``"balanced"``, the layout-model tier, which needs the models installed on this machine.
| Name | Type | Req | Description |
|---|---|---|---|
| pages | – | – | – |
| path | string | yes | – |
| quality | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
extract_tables ~153
The tables of a local PDF as rows of cell text. ``tables`` holds one entry per table in reading order: ``page`` (0-based), ``rows`` (a list of rows, each a list of cell strings, every row the table's width) and ``header_rows`` (how many leading rows are header rows). A spanning cell sits at its first row and column; the cells it covers are empty strings. Args: path: The PDF's absolute path on this machine. pages: The 0-based pages to look at; omit for the whole document, up to the server's page limit.
| Name | Type | Req | Description |
|---|---|---|---|
| pages | – | – | – |
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
extract_text ~127
The plain text layer of a local PDF, page by page. Each page starts with ``<!-- page N -->`` (N 0-based). No reading-order repair and no structure: use extract_markdown for that. A page with no text layer (a scan) yields nothing here; get_metadata names those pages. Args: path: The PDF's absolute path on this machine. pages: The 0-based pages to return; omit for the whole document, up to the server's page limit.
| Name | Type | Req | Description |
|---|---|---|---|
| pages | – | – | – |
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
fill_form ~229
Fill the form fields of a local PDF and write the result to a new file. ``values`` maps a field name from list_form_fields to its new value: a string for a text field, a check box or a combo box, a list of strings for a multi-select list box. The input file is never changed; ``out_path`` must be a different path inside an allowed root, and one that does not exist yet unless ``overwrite`` is true. A symbolic link at ``out_path`` is refused either way. The result names the fields that were ``set`` and the names that were ``unknown``; nothing is written when no field was set. Args: path: The absolute path of the PDF to fill. values: Field name to new value. out_path: The absolute path to write the filled PDF to. overwrite: Replace a file that already exists at out_path.
| Name | Type | Req | Description |
|---|---|---|---|
| out_path | string | yes | – |
| overwrite | boolean | – | – |
| path | string | yes | – |
| values | object | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
get_metadata ~161
What a local PDF is, before reading it. ``pages``, ``title``, ``author``, ``subject``, ``created``, ``modified``, ``format`` (the PDF version), ``encrypted`` with the ``encryption`` filter name, ``has_forms`` with the ``form_fields`` count, the number of ``signatures`` and ``bookmarks``, and ``pages_needing_vision``: the 0-based pages that draw ink but carry no text layer. A document that needs a password to open answers ``encrypted: true`` and ``needs_password: true`` and nothing else. Args: path: The PDF's absolute path on this machine.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
list_form_fields ~121
The interactive form fields of a local PDF. ``fields`` holds one entry per field: ``name`` (the fully qualified name fill_form takes), ``type`` (text, button, choice, signature or unknown), ``value`` (the current value, or null) and ``page`` (0-based, or null when the field has no widget on a page). An empty list means the document has no AcroForm fields. Args: path: The PDF's absolute path on this machine.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
search ~137
The pages of a local PDF that mention ``query``, with a snippet each. ``pages`` lists every matching 0-based page. ``snippets`` gives up to three windows of text around the match on each of the first twenty matching pages, so an agent can decide which pages to read in full with extract_markdown. Matching is case-insensitive on the text layer; a scanned page cannot match. Args: path: The PDF's absolute path on this machine. query: The text to look for, as written in the document.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| query | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
vision_advice ~115
Which pages of a local PDF are worth sending to a vision model, and why. ``advice`` holds one entry per page. ``needs_vision`` is true when any reason holds. Today only ``no_text_layer`` is measured -- the page draws ink but yields no text, as a scan does; ``low_confidence_table`` and ``figure`` are always false until the engine can measure them. Args: path: The PDF's absolute path on this machine.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | object | yes | – |
No examples provided.
How do I install the PDFluent MCP server?
PDFluent runs locally as a PyPI package, launched with uvx pdfluent-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · pdfluent-mcp
claude mcp add pdfluent-pdfluent-mcp -- uvx pdfluent-mcp
What is the PDFluent MCP server?
PDFluent is an MCP server listed in the public MCP registry as io.github.pdfluent/pdfluent-mcp. Read, search and fill PDFs as markdown, text, tables, forms. Your documents stay on your machine. This page covers its PyPI package (pdfluent-mcp).
Is the PDFluent MCP server safe to use?
PDFluent scores 72 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the PDFluent MCP server expose?
PDFluent exposes 9 tools: extract_markdown, extract_text, extract_tables, extract_blocks, get_metadata, and 4 more. Their descriptions and schemas cost roughly 1,522 tokens of context every time the server is loaded.
Is the PDFluent MCP server still maintained?
PDFluent is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.