Formfeed

io.github.formfeed-devPublished by GitHub account formfeed-devv0.3.23Updated Nov 3, 2026

Render PDFs and images from templates, validate data and convert Office files to PDF.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowFiles & Storage

Overview

AI-generated overview

Formfeed MCP server that lets an assistant list and edit document templates, validate data, render PDFs and images, and convert Office files to PDF.

What you can do
  • List templates and read their data schema, source, settings and sample data
  • Validate template data and ad-hoc HTML offline, and check e-invoice blocks against EN 16931
  • Render PDFs, images, DOCX and PPTX from stored templates or ad-hoc HTML, and fetch render status and download links
  • Convert Word, Excel, PowerPoint, OpenDocument, RTF and HTML files to PDF
  • Save new templates or changes as drafts, and inspect the workspace, plan and remaining units
When to use it
Useful when an assistant should produce documents from Formfeed templates, check data before rendering, turn existing Office files into PDFs, or prepare ZUGFeRD / Factur-X e-invoices. It also fits agents that draft template changes for a person to publish.
Requirements
Either the hosted endpoint with an Authorization bearer API key or OAuth sign-in to a Formfeed account, or the npm package run locally over stdio. A Formfeed API key in FORMFEED_API_KEY is optional but needed for most tools; FORMFEED_REGION or FORMFEED_BASE_URL select another API host. Template writing needs template:write on the key.
Before you install
A live key (ff_live_) consumes paid units on renders and conversions, while a test key renders with a test mark; check the balance with get_workspace. save_template writes new drafts to the workspace, though nothing is published until a person publishes it. Documents and data are sent to Formfeed's API, and the API key is a secret.

Installation

In SourceWeft

  1. Open Formfeed in the dashboard and add it to a workspace.
  2. Connect the required credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.formfeed-dev%2Fformfeed/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.

{
  "mcpServers": {
    "formfeed": {
      "type": "http",
      "url": "https://mcp.formfeed.dev/mcp"
    }
  }
}

README

@formfeed/mcp

[formfeed MCP server – quality and maintenance score on Glama]

Model Context Protocol server for Formfeed. Gives Claude, Cursor and other agents ten tools: list_templates, get_template_schema, validate_template (free: the data against the template's schema, ad-hoc HTML offline), check_invoice (free and offline: the _invoice block of a ZUGFeRD / Factur-X e-invoice against EN 16931), render (with einvoice, the PDF becomes that e-invoice; an image comes back as a picture the agent can look at), convert_to_pdf (Word, Excel, PowerPoint and OpenDocument to PDF), get_render, get_workspace (which workspace the server works in, and the units left), get_template_source and save_template (a new template or a change as a draft, which a person publishes in Formfeed; needs template:write on the key, or the person's permission for a signed-in agent).

stdio (Claude Desktop, Cursor, Claude Code)

json
{  "mcpServers": {    "formfeed": {      "command": "npx",      "args": ["-y", "@formfeed/mcp"],      "env": { "FORMFEED_API_KEY": "ff_test_…" }    }  }}

A test key renders for free (on the Free plan with a test mark); a live key consumes units. Without FORMFEED_API_KEY the server starts too, with the offline checks only: validate_template with html and engine, and check_invoice. FORMFEED_REGION=us or FORMFEED_BASE_URL select another API host.

Hosted (Streamable HTTP)

https://mcp.formfeed.dev/mcp takes Authorization: Bearer ff_…, or signs in with your Formfeed account when no key is sent (OAuth; the client opens the browser, and you choose the workspace the agent works in). https://mcp.formfeed.dev/mcp/<workspace id> pins another workspace for a signed-in client. Self-host the same endpoint with formfeed-mcp --http --port 8790, plus --auth-server <issuer> for OAuth sign-in against your own Supabase Auth.

Claude Code installs the hosted server together with two skills for writing and checking templates as Formfeed's plugin, from formfeed-dev/skills: https://docs.formfeed.dev/devkit/coding-agents

Documentation: https://docs.formfeed.dev/integrations/mcp

Source: packages/mcp/README.md at commit c0023f8

Tools

10

list_templates

List templates

Lists the templates of the workspace this server works in (the one chosen at sign-in, or the API key's), 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.

Parametersqtagkindengine

get_template_schema

Get the data schema of a template

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.

Parameterstemplaterequired

get_template_source

Read the source of a template

Returns what a template version is made of: the body markup (html), css, head, settings (paper, margins, header, footer, fonts), sample data, data sets, data schema, translations and partials, with the version's checksum. Call it before save_template to change a template the user named, and save what you edited with that checksum as base_checksum. Reads the latest version by default, the newest draft a change builds on; published reads what renders use. Word and PowerPoint templates are documents: for them it returns the settings and data, not the document. Read-only and free.

Parametersversiontemplaterequired

validate_template

Validate a template with data

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, or the version you name) 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.

Parametersdatahtmlengineversiontemplate

save_template

Save a template as a draft

Saves a template as a draft, never published: renders keep using the published version until a person publishes the draft in Formfeed. With template and base_checksum it saves a new version of that template: read it with get_template_source first, change what the user asked for, and pass only the parts you changed (the others are kept from the version you read). With new_template and html it creates a template whose version 1 is the draft. change_note says what changed; the person reads it before publishing. Returns the saved version, the check of the draft with its sample data (fix every error and save again) and review_url, the page where the person reviews and publishes it: hand that to the user. Needs an API key with template:write, or, for a signed-in agent, the person's permission under Account → Connected agents in Formfeed. Word and PowerPoint templates cannot be saved here. Free; a new template counts towards the plan's template limit.

Parameterscssheadhtmli18npartialssettingstemplatedata_setschange_noterequireddata_schemasample_datanew_template+1 more

check_invoice

Check an e-invoice

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.

Parametersinvoicerequiredprofile

render

Render 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; for an image (png, jpg or webp) up to 2 MB the result also carries the picture itself, so look at what you made before handing it on (a PDF comes as its link). 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 or a signed-in agent 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.

Parametersdatahtmlwaitenginelocaleoutputeinvoicefilenametemplate

convert_to_pdf

Convert an office document to PDF

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.

Parameterspathfilenamefile_namelandscaperender_idfile_base64page_rangessingle_page_sheets

get_render

Get a render

Returns the current state of a render: status (queued, rendering, succeeded or failed), download_url with expires_at, page_count, units and error, and the picture of a finished image render up to 2 MB. 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.

Parametersidrequired

get_workspace

Which workspace this server works in

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.

Takes no parameters.

Version history

15
  1. v0.3.23LatestNov 3, 2026
  2. v0.3.22Nov 1, 2026
  3. v0.3.21Oct 29, 2026
  4. v0.3.20Oct 26, 2026
  5. v0.3.19Oct 22, 2026
  6. v0.3.18Oct 19, 2026
  7. v0.3.17Oct 12, 2026
  8. v0.3.16Oct 9, 2026
  9. v0.3.14Oct 7, 2026
  10. v0.3.13Oct 5, 2026
  11. v0.3.12Oct 5, 2026
  12. v0.3.11Oct 2, 2026
  13. v0.3.10Sep 25, 2026
  14. v0.3.9Sep 23, 2026
  15. v0.3.8Sep 22, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listed15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts