PDFOven

Generate PDFs and images from HTML, Markdown, URLs or JSON templates.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
86%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,575Tokens (tool definitions)
~1.7 KBTypical response size
Moderate attention impact (1.23% 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": {
    "pdfoven": {
      "url": "https://pdfoven.com/mcp"
    }
  }
}

Remote endpoints

https://pdfoven.com/mcpstreamable-http

What it can do

Tool inventory

Tools (7)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪render_pdf(html, markdown, url, template, template_id, ...)

Render a PDF from exactly one source: html, markdown, url, template (+data) or template_id (+data). Returns the PDF as a base64 embedded resource. Each successful call uses one render from the account's monthly quota; nothing is stored. Over quota or invalid input returns a tool error explaining why.

Input Schema

{
  "type": "object",
  "properties": {
    "html": {
      "type": "string",
      "description": "HTML document or fragment to render."
    },
    "markdown": {
      "type": "string",
      "description": "Markdown to render."
    },
    "url": {
      "type": "string",
      "description": "Public http(s) URL to capture."
    },
    "template": {
      "type": "string",
      "description": "Inline Handlebars HTML template, filled with `data`."
    },
    "template_id": {
      "type": "string",
      "description": "ID of a saved template (from list_templates), filled with `data`."
    },
    "data": {
      "type": "object",
      "description": "JSON data for template or template_id."
    },
    "css": {
      "type": "string",
      "description": "Extra CSS to apply."
    },
    "options": {
      "type": "object",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "A3",
            "A4",
            "A5",
            "Letter",
            "Legal",
            "Tabloid"
          ]
        },
        "landscape": {
          "type": "boolean"
        },
        "margin": {
          "type": "string",
          "description": "e.g. 0.5in, 12mm, 20px"
        },
        "print_background": {
          "type": "boolean"
        }
      }
    }
  }
}
⚪render_image(html, markdown, url, template, template_id, ...)

Render a PNG image (social card, certificate, chart) from exactly one source: html, markdown, url, template (+data) or template_id (+data). Returns the image inline. Each successful call uses one render from the monthly quota; nothing is stored.

Input Schema

{
  "type": "object",
  "properties": {
    "html": {
      "type": "string",
      "description": "HTML document or fragment to render."
    },
    "markdown": {
      "type": "string",
      "description": "Markdown to render."
    },
    "url": {
      "type": "string",
      "description": "Public http(s) URL to capture."
    },
    "template": {
      "type": "string",
      "description": "Inline Handlebars HTML template, filled with `data`."
    },
    "template_id": {
      "type": "string",
      "description": "ID of a saved template (from list_templates), filled with `data`."
    },
    "data": {
      "type": "object",
      "description": "JSON data for template or template_id."
    },
    "css": {
      "type": "string",
      "description": "Extra CSS to apply."
    },
    "options": {
      "type": "object",
      "properties": {
        "width": {
          "type": "integer",
          "description": "Viewport width in pixels, 16-4000. Default 1280."
        },
        "height": {
          "type": "integer",
          "description": "Viewport height in pixels, 16-4000. Default 800."
        },
        "full_page": {
          "type": "boolean",
          "description": "Capture the full scrollable page instead of the viewport."
        },
        "device_scale_factor": {
          "type": "number",
          "description": "Pixel density, 1-3: 1 standard, 2 retina."
        }
      }
    }
  }
}
🟢list_templates

List every template saved in the PDFOven account, newest first, as JSON with id, name, engine and sample_data. Use an id with render_pdf/render_image (template_id) or get_template. Does not use render quota.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢get_template(template_id)

Fetch one saved template in full: content, css, sample_data and page_options. Use it before update_template to see the current body. Does not use render quota.

Input Schema

{
  "type": "object",
  "properties": {
    "template_id": {
      "type": "string",
      "description": "Template ID, e.g. tpl_1a2b3c (from list_templates)."
    }
  },
  "required": [
    "template_id"
  ]
}
🟡create_template(name, engine, content, css, sample_data, ...)

Save a new reusable template to the account and return its id. Templates are capped per plan (Free 3); at the cap this returns a tool error. Render it later with render_pdf or render_image and template_id plus data.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Display name, 1-100 characters."
    },
    "engine": {
      "type": "string",
      "enum": [
        "handlebars",
        "markdown"
      ],
      "description": "How content is interpreted. Default handlebars."
    },
    "content": {
      "type": "string",
      "description": "Template body: Handlebars HTML ({{field}}, {{#each items}}) or Markdown."
    },
    "css": {
      "type": "string",
      "description": "CSS applied when the template renders."
    },
    "sample_data": {
      "type": "object",
      "description": "Example JSON data, used for previews and as documentation of the fields."
    },
    "page_options": {
      "type": "object",
      "description": "Default PDF page settings for this template.",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "A3",
            "A4",
            "A5",
            "Letter",
            "Legal",
            "Tabloid"
          ]
        },
        "landscape": {
          "type": "boolean"
        },
        "margin": {
          "type": "string",
          "description": "e.g. 0.5in, 12mm, 20px"
        },
        "printBackground": {
          "type": "boolean"
        }
      }
    }
  },
  "required": [
    "name",
    "content"
  ]
}
🟡update_template(template_id, name, engine, content, css, ...)

Change a saved template. Only the fields you pass are replaced; others keep their current values. Future renders with this template_id use the new version immediately.

Input Schema

{
  "type": "object",
  "properties": {
    "template_id": {
      "type": "string",
      "description": "Template ID, e.g. tpl_1a2b3c (from list_templates)."
    },
    "name": {
      "type": "string",
      "description": "Display name, 1-100 characters."
    },
    "engine": {
      "type": "string",
      "enum": [
        "handlebars",
        "markdown"
      ],
      "description": "How content is interpreted. Default handlebars."
    },
    "content": {
      "type": "string",
      "description": "Template body: Handlebars HTML ({{field}}, {{#each items}}) or Markdown."
    },
    "css": {
      "type": "string",
      "description": "CSS applied when the template renders."
    },
    "sample_data": {
      "type": "object",
      "description": "Example JSON data, used for previews and as documentation of the fields."
    },
    "page_options": {
      "type": "object",
      "description": "Default PDF page settings for this template.",
      "properties": {
        "format": {
          "type": "string",
          "enum": [
            "A3",
            "A4",
            "A5",
            "Letter",
            "Legal",
            "Tabloid"
          ]
        },
        "landscape": {
          "type": "boolean"
        },
        "margin": {
          "type": "string",
          "description": "e.g. 0.5in, 12mm, 20px"
        },
        "printBackground": {
          "type": "boolean"
        }
      }
    }
  },
  "required": [
    "template_id"
  ]
}
🔴delete_template(template_id)

Permanently delete a saved template. This cannot be undone, and renders that reference its template_id will fail afterwards. Confirm with the user first.

Input Schema

{
  "type": "object",
  "properties": {
    "template_id": {
      "type": "string",
      "description": "Template ID, e.g. tpl_1a2b3c (from list_templates)."
    }
  },
  "required": [
    "template_id"
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded7 tools