Skip to main content
Glama
formfeed-dev

formfeed

Official

Formfeed packages

Client libraries, command line tools and integrations for Formfeed, the API for generating PDFs and images from templates. Documentation lives at docs.formfeed.dev.

Package

Registry

What it is

@formfeed/sdk

npm

TypeScript client: renders, batches, templates, webhooks. No dependencies, Web APIs only

formfeed

PyPI

Python client, sync and async

formfeed

npm

CLI: templates as files, offline preview and validation, renders through the API

@formfeed/engine

npm

The template engine (Jinja2, Liquid, Handlebars) the API and the editor use

@formfeed/devkit

npm

Template folders, project config and local rendering

@formfeed/testing

npm

Vitest and Jest matchers for templates

@formfeed/mcp

npm

Model Context Protocol server for AI agents formfeed MCP server – quality and maintenance score on Glama

n8n-nodes-formfeed

npm

n8n community node

Every npm package is built and published from this repository by GitHub Actions with provenance, and the Python package with trusted publishing, so each release can be traced to the commit and workflow run it came from.

Development

Node 22 or newer and pnpm (the version in package.json, corepack enable picks it up):

pnpm install
pnpm nx run-many -t lint test --exclude sdk-python   # TypeScript packages
pnpm nx run-many -t bundle smoke                     # build, pack and try every npm package
cd packages/sdk-python && pip install pytest httpx pydantic && python -m pytest -q

This repository is generated from Formfeed's main repository, where the packages are developed together with the API they talk to. See CONTRIBUTING.md for how issues and pull requests are handled.

Related MCP server: docjet-mcp

Licence

MIT, see LICENSE. Bundled third-party code keeps its own licence; the CLI and MCP packages list it in THIRD_PARTY_LICENSES.md.

Available Tools

8 tools
check_invoiceCheck an e-invoice
Read-only

Checks the _invoice block of an e-invoice offline, as the API does before it renders one: the fields EN 16931 asks for, the totals to the cent, VAT categories and code lists, and France's rules for an invoice between two French businesses. Free, no units, nothing sent. Returns ok and problems, each with the field, the rule (BR-…) where one applies and a message. Nothing is computed for you: change the values a problem names, check again, then call render with einvoice and the block as data._invoice. The validator that runs during the render holds the file to the full rule set and to PDF/A-3b as well.

ParametersJSON Schema
NameRequiredDescriptionDefault
invoiceYesThe _invoice block as it goes into data._invoice: number, issue_date, currency, seller, buyer, lines, tax.breakdown, totals and payment, as https://docs.formfeed.dev/templates/e-invoices#invoice-block describes
profileNoThe profile the render will ask for; en16931 when left out. basic cannot carry a rounding amount and is refused between two French businesses
convert_to_pdfConvert an office document to PDFA

Converts an existing Word, Excel, PowerPoint, OpenDocument, RTF or HTML document (up to 20 MB) to a PDF as it is, without filling in data, and returns the render with status and download_url. To make a document from a template and data, use render instead. Pass exactly one source: render_id, the render of a Word or PowerPoint template (output docx or pptx); path, a file on this machine; or file_base64 with file_name. Every call is a new render that counts units like a PDF; the Free plan cannot convert (Starter and above). The document is converted and not kept.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoAbsolute path of the document on this machine
filenameNoName of the PDF behind download_url, e.g. report.pdf
file_nameNoName of the document, e.g. report.xlsx; the type is read from the content
landscapeNoLandscape for spreadsheets and documents without their own page setup
render_idNornd_ id of a render whose output is docx or pptx, to get that document as a PDF
file_base64NoThe document to convert, base64 encoded; needs file_name
page_rangesNoPages to convert, e.g. 1-3,5; all pages when left out
single_page_sheetsNoEach spreadsheet sheet on one page

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false (not read-only, not idempotent, not destructive), so the description carries the full burden. It discloses that every call creates a new render that counts units, that the Free plan cannot convert, and that the document is 'not kept.' It also specifies the output (render with status and download_url). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact but information-dense, front-loading the core purpose and then covering alternatives, inputs, costs, and storage in a logical sequence. Every sentence earns its place; no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, no output schema, and complex alternatives, the description covers the essential operational context: what inputs are allowed, what is returned, cost implications, and storage behavior. It lacks explicit detail on error conditions or status code meanings, but these are minor for a conversion tool with a sibling 'get_render' for retrieval.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds valuable semantic constraints not in the schema: exactly one source must be provided, and render_id must be from a Word/PowerPoint template. This goes beyond simple parameter names and justifies a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('converts'), lists supported formats and size limit, and clearly differentiates from the sibling 'render' by saying 'To make a document from a template and data, use render instead.' The purpose is unambiguous and distinguishes the tool from all siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly tells when to use this tool vs. render, and provides a critical constraint: 'Pass exactly one source' among render_id, path, or file_base64. It also clarifies plan eligibility and unit counting, which informs decision-making. This is complete usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_renderGet a renderA
Read-only

Returns the current state of a render: status (queued, rendering, succeeded or failed), download_url with expires_at, page_count, units and error. Use it to follow a render started with wait false, or to get a fresh link once the old one has expired; render and convert_to_pdf already return this for the render they just made. Read-only and free; an unknown id returns an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesrnd_ id of the render, as render or convert_to_pdf returned it

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false. The description goes beyond these by adding that the call is free, that an unknown id returns an error, and that download URLs expire. This gives the agent useful operational context beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then usage guidance, then behavioral notes. Every sentence earns its place and the whole thing remains compact despite covering return fields, polling, expiry, alternatives, and error behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description carries the burden of explaining the return value, and it does so thoroughly by listing status values and response fields. It also covers why the tool exists, when alternatives are preferable, cost, and error behavior, which is complete for a simple read-only lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the id parameter is already documented. The description adds value by clarifying that the id comes from a render or convert_to_pdf call and by exposing the unknown-id error behavior, which the schema does not state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Returns the current state of a render', and enumerates the exact fields returned (status, download_url, expires_at, page_count, units, error). It distinguishes itself from siblings by noting render and convert_to_pdf already return this information for a just-created render.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use this tool: to follow a render started with wait false, or to refresh an expired download link. It also names alternatives and their relationship: render and convert_to_pdf already return the same data for the render they just made, so this tool is for later or renewed access.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_template_schemaGet the data schema of a templateA
Read-only

Returns the JSON Schema of the data object a template expects and the sample data it was designed with, from its published version, else its latest draft. Call it after list_templates and before render or validate_template, to build data that fits; ad-hoc html has no stored schema to read. When the template stores no schema, one is inferred from the sample data: treat that as a guide, not a contract. Read-only and free; an unknown slug returns an error.

ParametersJSON Schema
NameRequiredDescriptionDefault
templateYesSlug (e.g. invoice) or tpl_ id, as list_templates returns them

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint, but the description adds valuable context: it is free, returns an error for unknown slugs, and explains that inferred schemas are a guide not a contract. This goes beyond the structured metadata and helps the agent anticipate edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loads the core purpose, and every sentence adds meaningful information. It covers return content, workflow, caveats, and error behavior without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only tool with one parameter and no output schema, the description fully covers what an agent needs: what it returns, which version is used, when to call it, the inference caveat, and error behavior. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter description in the schema is sufficient ('Slug (e.g. invoice) or tpl_ id, as list_templates returns them'). The description adds no additional parameter-level detail, so it neither enhances nor detracts from the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the JSON Schema and sample data for a template's `data` object, specifying the resource and action. It distinguishes itself from siblings by placing it in the workflow (after list_templates, before render/validate_template) and noting ad-hoc html lacks a stored schema, making it unambiguous which tool to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs when to call it ('after list_templates and before render or validate_template') and provides a negative case (ad-hoc html has no stored schema). It also explains the fallback inference behavior, giving the agent clear decision criteria without needing to infer usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_workspaceWhich workspace this server works inA
Read-only

Returns the workspace and organisation this server acts in, the plan, the environment (live or test) and the units of the current period: included, used and the balance of prepaid units. Call it when the user asks where a document will land or how many renders are left, or when list_templates returns nothing you expected. A signed-in agent works in the workspace chosen when it was connected, which the person changes in Formfeed under Account → Connected agents; an API key works in the workspace it was made for. Read-only and free.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly/destructive/openWorld), while the description adds genuinely new behavior: no cost ('free'), and the resolution rules for which workspace is used — signed-in agent uses the connection-time workspace, API key uses the key's workspace. That explains surprising scoping results an agent could otherwise misread.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and payload, then triggers, then the workspace-resolution caveat. Every sentence earns its place, though the Formfeed UI path ('Account → Connected agents') is marginally more detail than an agent needs to select or invoke the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden itself and does so thoroughly (workspace, organisation, plan, environment, included/used/prepaid balance). Nothing needed to call it or interpret the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline applies. The description instead spends its words on what the (parameterless) call returns, which is the right use of space.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Returns the workspace and organisation this server acts in') and enumerates the payload: plan, environment, and per-period unit counts. It also implicitly separates itself from siblings like list_templates by naming the diagnostic condition under which it is the right call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete triggers: user asks where a document will land, how many renders are left, or list_templates returns something unexpected. That last one explicitly routes the agent away from list_templates and toward this tool when results look wrong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_templatesList templatesA
Read-only

Lists the templates of the workspace the API key belongs to, most recently changed first: id, slug, name, kind (pdf, image, docx for Word, pptx for PowerPoint), engine, tags and published_version. Call it first to find the slug that get_template_schema, validate_template and render take; skip it when the user already named the template. Returns every match in one answer, without archived templates, and an empty list when nothing matches. A template whose published_version is null has never been published, so render cannot use it yet. Read-only and free.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoText to find in the name or slug, case-insensitive (e.g. invoice)
tagNoOnly templates with this tag; exact match, tags are lowercase with dashes (e.g. billing)
kindNoOnly templates that produce this kind of document
engineNoOnly templates written in this template language

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and non-destructive, but the description adds meaningful behavior beyond that: ordering by most recent change, exclusion of archived templates, an empty list on no match, and the null published_version meaning render cannot use the template. The statement 'Read-only and free' reinforces the annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it covers output fields, ordering, usage guidance, edge cases, and safety in a compact paragraph. Key guidance is front-loaded and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description sufficiently documents what the response contains, the available filter fields, the behavior with archived templates and empty results, and the special meaning of null published_version. It also provides enough context for an agent to decide when to call this tool versus its siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and each parameter already has a clear description with examples and enum details. The tool description does not add significant parameter-level semantics beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Lists the templates of the workspace the API key belongs to', and specifies the returned fields and ordering. It also differentiates itself from sibling tools by explaining that it provides the slug used by get_template_schema, validate_template, and render.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit guidance is given: 'Call it first to find the slug... skip it when the user already named the template.' It also names the sibling tools that depend on this lookup and clarifies that archived templates are excluded and an empty list is returned when nothing matches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

renderRender a document

Creates a document by filling a stored template, or ad-hoc html, with data: a PDF or image, or DOCX, PPTX or PDF from Word and PowerPoint templates. Returns the render with status and download_url. Use it to make a document from data; to turn an existing office file into a PDF, use convert_to_pdf. Stored templates render their published version, so one whose published_version is null fails with template_not_found. Every call is a new render: a live key consumes units, a test key is free (watermarked on the Free plan). A render that fails returns status failed and an error with code and message; validate_template finds most causes beforehand. With einvoice the PDF becomes a ZUGFeRD / Factur-X e-invoice built from data._invoice (check the block with check_invoice first): the render then carries einvoice, the validator's report, and a refused invoice names the fields and rules to fix. The link expires at expires_at; get_render issues a fresh one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoValues for the template, shaped as get_template_schema describes; leave out when it needs none
htmlNoA complete HTML document to render instead of a stored template, up to 5 MB
waitNoMost renders are finished when the call returns; true also waits for one that continues in the background, false returns it as it is (queued or rendering) to check later with get_render
engineNoTemplate language of html, when it contains expressions to fill from data
localeNoBCP 47 tag for helpers and translations, e.g. de-DE
outputNoLeft out, the template decides: PDF for PDF templates and html, its image format for image templates, its default output for Word and PowerPoint templates. Word templates render docx or pdf, PowerPoint templates pptx or pdf
einvoiceNoMakes the PDF a ZUGFeRD / Factur-X e-invoice whose XML is built from data._invoice: true for the defaults, an object to choose, false to switch off what the template declares. PDF only; live renders from the Starter plan, test keys on Free make 20 marked ones a day
filenameNoName of the file behind download_url, e.g. invoice-2026-0042.pdf
templateNoSlug or tpl_ id of a stored template; pass this or html
validate_templateValidate a template with dataA
Read-only

Checks a template and its data without rendering: free, no units, nothing stored, no document produced. Call it before render when you assembled the data yourself, or after writing ad-hoc html. With template, the API checks the published version (else the latest) as a render would: syntax, header and footer, errors only this data triggers, and the data against the stored JSON Schema (a wrong type or a missing required field is an error). With html and engine it compiles offline and reports syntax errors, unknown filters and variables missing from data. Returns ok and diagnostics (severity, code, message, plus path, line and column, or part and paragraph for Word and PowerPoint). Warnings leave ok true: settle each before rendering.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoThe data the document will be rendered with, shaped as get_template_schema describes. Left out, a stored template is checked with its sample data
htmlNoTemplate source to check offline, when there is no stored template; pass this or template
engineNoTemplate language of html; required with html
templateNoSlug or tpl_ id of a stored template; pass this or html

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/destructiveHint annotations, the description explains side effects (free, no units, nothing stored, no document), version selection (published else latest), what each mode checks, and the ok/diagnostics return contract including warnings leaving ok true. This is strong behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place and the main point is front-loaded. It is a single long paragraph that could be more scannable, but the length is justified by two distinct modes and a non-trivial return contract.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four optional params, two modes, no output schema, and no required fields, the description is complete: it explains return shape (ok and diagnostics with severity, code, message, location), mode-specific checks, and how to handle warnings. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining how template is resolved (published/latest), that html is compiled offline, and that data is validated against a stored JSON Schema. This elevates the parameter guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and object: 'Checks a template and its data without rendering', and immediately distinguishes it from render by stating no document is produced. It also separates the stored-template and html modes, so an agent can tell this tool apart from render and convert_to_pdf.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Call it before render when you assembled the data yourself, or after writing ad-hoc html.' It names the render sibling as the follow-up operation, but it does not explicitly state when not to use the tool or name alternative validation paths.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv0.3.17
    • Addedcheck_invoice
    • Changedrender1 field changed
      • addedInput schema / properties / einvoice
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "boolean"
        +    },
        +    {
        +      "properties": {
        +        "display_check": {
        +          "description": "What a value of the XML that the PDF does not show does: a warning in the report (default) or a failed render",
        +          "enum": [
        +            "warn",
        +            "strict"
        +          ],
        +          "type": "string"
        +        },
        +        "flavour": {
        +          "description": "One specification under two names; the default factur-x and zugferd make the same file",
        +          "enum": [
        +            "factur-x",
        +            "zugferd"
        +          ],
        +          "type": "string"
        +        },
        +        "profile": {
        +          "description": "en16931 (default) carries the whole European standard; basic is the smallest full invoice and is refused between two French businesses",
        +          "enum": [
        +            "en16931",
        +            "basic"
        +          ],
        +          "type": "string"
        +        },
        +        "xml": {
        +          "description": "both also stores the XML as a file of its own, linked as einvoice.xml_url",
        +          "enum": [
        +            "embedded",
        +            "both"
        +          ],
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  ],
        +  "description": "Makes the PDF a ZUGFeRD / Factur-X e-invoice whose XML is built from data._invoice: true for the defaults, an object to choose, false to switch off what the template declares. PDF only; live renders from the Starter plan, test keys on Free make 20 marked ones a day"
        +}
  2. 1 tool updatev0.3.14
    • Addedget_workspace
  3. 6 tool updatesv0.3.10
    • Changedconvert_to_pdf5 fields changed
      • changedInput schema / properties / file_base64 / description
        Previous value: -"The document, base64 encoded"New value: +"The document to convert, base64 encoded; needs file_name"
      • changedInput schema / properties / filename / description
        Previous value: -"Name of the PDF"New value: +"Name of the PDF behind download_url, e.g. report.pdf"
      • changedInput schema / properties / page_ranges / description
        Previous value: -"Pages to convert, e.g. 1-3,5"New value: +"Pages to convert, e.g. 1-3,5; all pages when left out"
      • changedInput schema / properties / path / description
        Previous value: -"Absolute path of a document on this machine"New value: +"Absolute path of the document on this machine"
      • changedInput schema / properties / render_id / description
        Previous value: -"rnd_ id of a render whose output is docx or pptx"New value: +"rnd_ id of a render whose output is docx or pptx, to get that document as a PDF"
    • Changedget_render1 field changed
      • addedInput schema / properties / id / description
        Added value: +"rnd_ id of the render, as render or convert_to_pdf returned it"
    • Changedget_template_schema1 field changed
      • changedInput schema / properties / template / description
        Previous value: -"Template slug or tpl_ id"New value: +"Slug (e.g. invoice) or tpl_ id, as list_templates returns them"
    • Changedlist_templates4 fields changed
      • addedInput schema / properties / engine / description
        Added value: +"Only templates written in this template language"
      • addedInput schema / properties / kind / description
        Added value: +"Only templates that produce this kind of document"
      • changedInput schema / properties / q / description
        Previous value: -"Search in name and slug"New value: +"Text to find in the name or slug, case-insensitive (e.g. invoice)"
      • addedInput schema / properties / tag / description
        Added value: +"Only templates with this tag; exact match, tags are lowercase with dashes (e.g. billing)"
    • Changedrender6 fields changed
      • addedInput schema / properties / data / description
        Added value: +"Values for the template, shaped as get_template_schema describes; leave out when it needs none"
      • changedInput schema / properties / engine / description
        Previous value: -"Engine for html that contains template syntax"New value: +"Template language of html, when it contains expressions to fill from data"
      • addedInput schema / properties / filename / description
        Added value: +"Name of the file behind download_url, e.g. invoice-2026-0042.pdf"
      • changedInput schema / properties / html / description
        Previous value: -"Raw HTML instead of a template"New value: +"A complete HTML document to render instead of a stored template, up to 5 MB"
      • changedInput schema / properties / template / description
        Previous value: -"Template slug or tpl_ id"New value: +"Slug or tpl_ id of a stored template; pass this or html"
      • changedInput schema / properties / wait / description
        Previous value: -"Wait for the render to finish (sync renders finish immediately)"New value: +"Most renders are finished when the call returns; true also waits for one that continues in the background, false returns it as it is (queued or rendering) to check later with get_render"
    • Changedvalidate_template4 fields changed
      • addedInput schema / properties / data / description
        Added value: +"The data the document will be rendered with, shaped as get_template_schema describes. Left out, a stored template is checked with its sample data"
      • changedInput schema / properties / engine / description
        Previous value: -"Required with html"New value: +"Template language of html; required with html"
      • changedInput schema / properties / html / description
        Previous value: -"Template source when no slug is given"New value: +"Template source to check offline, when there is no stored template; pass this or template"
      • changedInput schema / properties / template / description
        Previous value: -"Template slug or tpl_ id"New value: +"Slug or tpl_ id of a stored template; pass this or html"
  4. 6 tool updatesv0.3.7
    • First observedconvert_to_pdf
    • First observedget_render
    • First observedget_template_schema
    • First observedlist_templates
    • First observedrender
    • First observedvalidate_template

TDQS

A4.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool has a distinct resource+action: list_templates, get_template_schema, validate_template, render, convert_to_pdf, get_render, get_workspace. The descriptions explicitly disambiguate the closest pair (render vs convert_to_pdf, render vs get_render), leaving no realistic misselection.

Naming Consistency4/5

Six of seven names follow a clean verb_noun pattern (get_workspace, list_templates, get_template_schema, validate_template, convert_to_pdf, get_render). Only the bare verb 'render' deviates, which is a minor but noticeable break in the otherwise consistent scheme.

Tool Count5/5

Seven tools is well-scoped for a template rendering service: discovery (list_templates, get_template_schema, get_workspace), validation (validate_template), and execution (render, convert_to_pdf, get_render) each earn their place with no filler.

Completeness4/5

The core lifecycle — find template, inspect schema, validate, render/convert, poll status — is fully covered with no dead ends. Minor gaps remain (no template upload/create, no list of prior renders or cancel operation), but agents can work around them via the returned download_url and render_id.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables PDF and image generation from templates, JSON, HTML, or URLs through the PDF Gen Studio API. Supports rendering, template management, and multiple output formats.
    11 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables creating professional documents (invoices, contracts, certificates, proposals, reports) via the DocuQueue API, with tools for template management, filling, previewing, and PDF generation.
    1
    MIT