pdf-tools

Free PDF tools for AI agents: merge, split, rotate, watermark, page numbers, metadata, flatten.

Should I use this

Quality & Safety

A
Description quality
85%
Schema completeness
98%
Naming quality
88%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (5)

  • LOWTool 'merge_pdfs' description lacks action verbin merge_pdfs
  • LOWTool 'extract_pages' description lacks action verbin extract_pages
  • LOWTool 'watermark_pdf' description lacks action verbin watermark_pdf
  • LOWTool 'add_page_numbers' description lacks action verbin add_page_numbers
  • LOWTool 'flatten_pdf' description lacks action verbin flatten_pdf

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,085Tokens (tool definitions)
~806 BTypical response size
Moderate attention impact (0.85% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "pdf-tools": {
      "url": "https://pdfia.com/mcp"
    }
  }
}

Remote endpoints

https://pdfia.com/mcpstreamable-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪merge_pdfs(files)

Merge multiple PDF files into one, in the order given. Returns the merged PDF as base64.

Input Schema

{
  "type": "object",
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "The PDF file, base64-encoded (max 10 MB)"
      },
      "description": "2+ PDFs, base64-encoded, in merge order"
    }
  },
  "required": [
    "files"
  ]
}
🟢split_pdf(file, ranges)

Split a PDF into parts. Provide ranges like "1-3, 5, 8-10" (each comma group becomes one output PDF), or omit ranges to get every page as its own PDF. Returns base64 files.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "ranges": {
      "type": "string",
      "description": "e.g. \"1-3, 5, 8-10\"; omit for one file per page"
    }
  },
  "required": [
    "file"
  ]
}
🟢extract_pages(file, pages)

Extract the given pages into a new PDF (original order). Returns base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "pages": {
      "type": "string",
      "description": "Page list like \"2, 5-7\" (1-based)"
    }
  },
  "required": [
    "file",
    "pages"
  ]
}
🔴remove_pages(file, pages)

Delete the given pages from a PDF. Returns the remaining document as base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "pages": {
      "type": "string",
      "description": "Page list like \"2, 5-7\" (1-based)"
    }
  },
  "required": [
    "file",
    "pages"
  ]
}
🟢rotate_pdf(file, degrees, pages)

Rotate pages clockwise by 90, 180, or 270 degrees. Rotates all pages unless a page list is given. Returns base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "degrees": {
      "type": "number",
      "enum": [
        90,
        180,
        270
      ]
    },
    "pages": {
      "type": "string",
      "description": "Optional page list like \"1, 3\"; omit to rotate all"
    }
  },
  "required": [
    "file",
    "degrees"
  ]
}
⚪watermark_pdf(file, text, opacity, size, color)

Stamp a diagonal text watermark (e.g. "CONFIDENTIAL", "DRAFT") across every page. Returns base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "text": {
      "type": "string",
      "description": "Watermark text"
    },
    "opacity": {
      "type": "number",
      "description": "0.02–1, default 0.15"
    },
    "size": {
      "type": "number",
      "description": "Font size in points, 8–200, default 60"
    },
    "color": {
      "type": "string",
      "enum": [
        "gray",
        "red",
        "blue"
      ],
      "description": "Default gray"
    }
  },
  "required": [
    "file",
    "text"
  ]
}
🟡add_page_numbers(file, position, start, format, size)

Stamp page numbers onto every page of a PDF. Returns base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "position": {
      "type": "string",
      "enum": [
        "bottom-center",
        "bottom-right",
        "bottom-left",
        "top-center"
      ],
      "description": "Default bottom-center"
    },
    "start": {
      "type": "number",
      "description": "First number, default 1"
    },
    "format": {
      "type": "string",
      "enum": [
        "n",
        "page-n",
        "n-of-total"
      ],
      "description": "Default n"
    },
    "size": {
      "type": "number",
      "description": "Font size 6–24, default 12"
    }
  },
  "required": [
    "file"
  ]
}
🟢get_pdf_metadata(file)

Read a PDF's document properties (title, author, subject, keywords, creator, producer, dates, page count).

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    }
  },
  "required": [
    "file"
  ]
}
🟡set_pdf_metadata(file, title, author, subject, keywords, ...)

Rewrite a PDF's document properties. Pass empty strings to strip identifying metadata before sharing. Returns base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    },
    "title": {
      "type": "string"
    },
    "author": {
      "type": "string"
    },
    "subject": {
      "type": "string"
    },
    "keywords": {
      "type": "string",
      "description": "Comma-separated"
    },
    "creator": {
      "type": "string"
    },
    "producer": {
      "type": "string"
    }
  },
  "required": [
    "file"
  ]
}
⚪flatten_pdf(file)

Flatten fillable form fields into permanent page content so answers can't be edited. Returns base64.

Input Schema

{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "description": "The PDF file, base64-encoded (max 10 MB)"
    }
  },
  "required": [
    "file"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools
verifiedversion not recorded10 tools