Anleitung · Framework
Formfeed in Plain tool calling
MCP ist richtig, wenn der Agent Vorlagen selbst entdecken soll. Soll er immer nur Rechnungen erzeugen, ist ein eigenes Werkzeug einfacher: Sein Schema ist die Rechnung, das Modell kann keine falsche Vorlage wählen, und das SDK übernimmt Wiederholungen und Idempotenz.
Test-Schlüssel anlegen
Melden Sie sich in der App an, öffnen Sie API-Schlüssel und legen Sie einen Schlüssel in der Testumgebung an. Testrenderings werden nicht berechnet, genau richtig, solange ein Agent Ihre Vorlagen noch kennenlernt. Für den Produktivbetrieb wechseln Sie auf einen Live-Schlüssel.
Pakete installieren
Shell npm install @anthropic-ai/sdk @formfeed/sdk zod # or: pip install anthropic formfeedDen Formfeed-Server hinzufügen
Das Werkzeug ruft
renders.createmit fester Vorlage auf. Dieselbe Funktion taugt in jedem Framework als Werkzeug: OpenAI Function Calling, LangChain@tooloder der hier gezeigte Claude Tool Runner.import Anthropic from '@anthropic-ai/sdk'; import { betaZodTool } from '@anthropic-ai/sdk/helpers/beta/zod'; import { Formfeed } from '@formfeed/sdk'; import { z } from 'zod'; const anthropic = new Anthropic(); const formfeed = new Formfeed({ apiKey: process.env.FORMFEED_API_KEY! }); const renderInvoice = betaZodTool({ name: 'render_invoice', description: 'Renders an invoice PDF with the invoice-de template and returns its download URL.', inputSchema: z.object({ number: z.string(), customer: z.object({ name: z.string(), street: z.string(), zip: z.string(), city: z.string() }), lines: z.array(z.object({ description: z.string(), qty: z.number(), price: z.number() })), }), run: async (invoice) => { const render = await formfeed.renders.create({ template: 'invoice-de', data: { invoice } }); const done = render.status === 'succeeded' ? render : await formfeed.renders.waitFor(render.id); return done.download_url ?? `Render ${done.id} failed: ${done.error?.message}`; }, }); const message = await anthropic.beta.messages.toolRunner({ model: 'claude-opus-5-5', max_tokens: 16000, tools: [renderInvoice], messages: [ { role: 'user', content: 'Invoice Olvarest GmbH, Beispielweg 2, 54321 Beispielstadt: 8 h consulting at 120 EUR. Number 2026-0042.', }, ], }); console.log(message.content);import os import anthropic from anthropic import beta_tool from formfeed import Formfeed formfeed = Formfeed(api_key=os.environ["FORMFEED_API_KEY"]) @beta_tool def render_certificate(name: str, course: str, date: str) -> str: """Renders a course certificate as PDF and returns the download URL. Args: name: Full name of the participant. course: Title of the course. date: Completion date as ISO 8601, e.g. 2026-09-10. """ data = {"name": name, "course": course, "date": date} render = formfeed.renders.create(template="certificate", data=data) return render.download_url or f"Render {render.id} is {render.status}" prompt = "Jane Doe finished Analytical Engines 101 today. I need her certificate." runner = anthropic.Anthropic().beta.messages.tool_runner( model="claude-opus-5-5", max_tokens=16000, tools=[render_certificate], messages=[{"role": "user", "content": prompt}], ) message = runner.until_done() print(next(block.text for block in message.content if block.type == "text"))Verbindung prüfen
Führen Sie es mit einem Test-Schlüssel aus: Das Rendering wird nicht berechnet und erscheint im Render-Log der App, samt den Daten, die das Modell geschickt hat, wenn der Workspace Anfragedaten aufbewahrt (eine Einstellung der bezahlten Pläne, voreingestellt aus).
Ausprobieren
- Rechnung
“Rendere Rechnung 2026-0042 an Olvarest GmbH: 8 Stunden Beratung zu 120 € und 20 Stunden Umsetzung zu 110 €. Nimm die deutsche Rechnungsvorlage.”
- Prüfung
“Prüfe, ob orders/2026-0042.json zur Vorlage invoice-de passt, bevor du irgendetwas renderst.”
- HTML
“Mach aus diesen Besprechungsnotizen ein einseitiges PDF. Ohne Vorlage, einfaches HTML genügt.”
Tipps
- Übernehmen Sie die Feldnamen aus dem Schema der Vorlage (
GET /v1/templates/{id}/schema) ins Werkzeugschema; der Editor leitet es aus Ihren Beispieldaten ab. - Das SDK schickt bei jedem Rendering einen Idempotenz-Schlüssel mit, ein wiederholter Werkzeugaufruf erzeugt also keine zweite Rechnung.
Die acht Werkzeuge
- list_templates
- Vorlagen des Workspace mit Slug, Art (PDF, Bild, Word oder PowerPoint), Engine und veröffentlichter Version; filterbar nach Art, Engine, Tag oder Suchtext.
- kostenlos
- get_template_schema
- Das JSON-Schema der Daten, die eine Vorlage erwartet, mit den Beispieldaten, mit denen sie gestaltet wurde. Speichert eine Vorlage kein Schema, wird eines aus den Beispieldaten abgeleitet: ein Anhaltspunkt, kein Vertrag.
- kostenlos
- validate_template
- Prüft eine Vorlage mit den Daten, ohne zu rendern: Syntax, Variablen, die in den Daten fehlen, Fehler, die erst mit diesen Daten auftreten, und die Daten gegen das gespeicherte Schema der Vorlage. Ad-hoc-HTML wird offline geprüft.
- kostenlos
- check_invoice
- Prüft den
_invoice-Block einer E-Rechnung offline, wie die API es vor dem Rendern tut: die Felder, die EN 16931 verlangt, die Summen auf den Cent, Umsatzsteuerkategorien und Codelisten sowie die Regeln Frankreichs. Nennt jedes Feld und jede Regel, die er verletzt. - kostenlos
- render
- Rendert eine Vorlage oder rohes HTML zu PDF, PNG, JPG oder WebP (Word- und PowerPoint-Vorlagen auch zu DOCX oder PPTX) und liefert Download-URL, Seitenzahl und Einheiten. Mit
einvoicewird das PDF eine ZUGFeRD- / Factur-X-E-Rechnung mit dem Bericht des Validators, für eine Einheit mehr (live ab dem Starter-Plan). - 1 Einheit, PDFs je 5 Seiten
- convert_to_pdf
- Wandelt ein Word-, Excel-, PowerPoint-, OpenDocument-, RTF- oder HTML-Dokument bis 20 MB oder das Rendering einer Word- oder PowerPoint-Vorlage in ein PDF um und liefert die Download-URL; das Dokument wird nicht aufbewahrt. Der lokale Server liest eine Datei auch über ihren Pfad. Ab dem Starter-Plan.
- wie ein PDF
- get_render
- Status, Download-URL und Fehler eines Renderings: für Renderings, die der Agent mit
wait: falseeingereiht hat, und für einen frischen Link, wenn der alte abgelaufen ist. - kostenlos
- get_workspace
- Workspace und Organisation, in denen der Server arbeitet, der Tarif, die Umgebung und die Einheiten des Zeitraums: wie viele Renderings noch bleiben.
- kostenlos
Konfigurationsreferenz: Formfeed SDK — Plain tool calling (geprüft 17. Oktober 2026)