Skip to main content
Glama
formfeed-dev

formfeed

Official

Convert an office document to PDF

convert_to_pdf

Convert Word, Excel, PowerPoint, OpenDocument, RTF, or HTML files (up to 20 MB) to PDF and return a status and download URL.

Instructions

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.

Input 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

Output Schema

NameRequiredDescriptionDefault
idYesrnd_ id of the render
pdfaNoThe PDF/A verdict (PDF/A-2b or PDF/A-3b), when the template declares it
errorYesWhy a failed render failed
unitsYesUnits the render counted
statusYes
einvoiceNoThe e-invoice report, when the render made one
templateYesThe template and version rendered; null for html and conversions
expires_atYesWhen download_url stops working; get_render issues a fresh one
page_countYes
environmentYes
download_urlYesSigned link to the file; null until the render succeeded
accessibilityNoThe PDF/UA-1 verdict, when the template declares it

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.3.22
    • addedOutput schema / properties / pdfa
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "The PDF/A verdict (PDF/A-2b or PDF/A-3b), when the template declares it",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
  2. Changed1 schema field changedv0.3.19
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "accessibility": {
      +      "additionalProperties": {},
      +      "description": "The PDF/UA-1 verdict, when the template declares it",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "download_url": {
      +      "description": "Signed link to the file; null until the render succeeded",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "einvoice": {
      +      "additionalProperties": {},
      +      "description": "The e-invoice report, when the render made one",
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "environment": {
      +      "enum": [
      +        "live",
      +        "test"
      +      ],
      +      "type": "string"
      +    },
      +    "error": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "message": {
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Why a failed render failed"
      +    },
      +    "expires_at": {
      +      "description": "When download_url stops working; get_render issues a fresh one",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "id": {
      +      "description": "rnd_ id of the render",
      +      "type": "string"
      +    },
      +    "page_count": {
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "enum": [
      +        "queued",
      +        "rendering",
      +        "succeeded",
      +        "failed"
      +      ],
      +      "type": "string"
      +    },
      +    "template": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "canary": {
      +              "type": "boolean"
      +            },
      +            "channel": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "id": {
      +              "type": "string"
      +            },
      +            "slug": {
      +              "type": "string"
      +            },
      +            "version": {
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "id",
      +            "slug",
      +            "version"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The template and version rendered; null for html and conversions"
      +    },
      +    "units": {
      +      "description": "Units the render counted",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "status",
      +    "download_url",
      +    "expires_at",
      +    "page_count",
      +    "units",
      +    "environment",
      +    "template",
      +    "error"
      +  ],
      +  "type": "object"
      +}
  3. Changed5 schema fields changedv0.3.10
    • 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"
  4. First observedv0.3.7

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond annotations: discloses unit consumption ('Every call is a new render that counts units like a PDF'), plan gating, the fact that the source is not retained, the 20 MB cap, and that the response carries status/download_url. Annotations only say readOnly=false, idempotent=false, destructive=false; the description adds the material cost and retention behavior. Minor gap: no mention of failure/error behavior or how long download_url stays valid.

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-loads what it does, then the alternative, then the input rule, then the cost/limits. Dense and nearly every clause carries information, though the second and third sentences are long run-ons that could be split for scanning.

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 an 8-parameter, zero-required conversion tool, the description covers inputs, exclusivity rule, size limit, plan eligibility, cost model, retention, and the sibling alternative; return values are covered by the existing output schema. Nothing an agent needs to call 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 coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: the exactly-one-source constraint (required list is empty and there is no oneOf), and clarification that render_id must be a docx/pptx render. It does not explain landscape, page_ranges, single_page_sheets or filename beyond the schema, but those are already well documented.

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 (converts) and enumerates the exact resource types accepted (Word, Excel, PowerPoint, OpenDocument, RTF, HTML) plus size limit, and explicitly contrasts with the sibling 'render' for the template+data case. An agent can distinguish this from render without opening any schema.

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?

Names the alternative tool and the condition that selects it ('To make a document from a template and data, use render instead'), and gives an explicit rule for mutually exclusive inputs ('Pass exactly one source') with the three valid variants. It also flags a hard eligibility constraint (Free plan cannot convert).

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