Zum Inhalt springen

KI-Agenten · Model Context Protocol

Ihr Agent liefert die Daten.
Formfeed macht das Dokument.

Der MCP-Server von Formfeed gibt Claude, Cursor, Copilot, Codex und Ihren eigenen Agenten acht Werkzeuge: Vorlage finden, erwartete Daten lesen, Daten und E-Rechnungen kostenlos prüfen, PDF oder Bild rendern, Office-Dateien in PDF umwandeln, später nach einem Rendering sehen und den Workspace nennen, in dem er arbeitet. Das Layout bestimmen Ihre Vorlagen; der Agent füllt sie nur.

Ab sofort verfügbar: npx -y @formfeed/mcp (Node.js 22+) lokal, oder der gehostete Endpunkt mcp.formfeed.dev mit API-Schlüssel oder Anmeldung mit Ihrem Konto.

So sieht eine Anfrage aus

Rechnung an Olvarest GmbH: 8 Stunden Beratung zu 120 € und 20 Stunden Umsetzung zu 110 €, Nummer 2026-0042.

  1. list_templates { "kind": "pdf", "q": "invoice" }→ invoice-de · jinja2 · v7
  2. get_template_schema { "template": "invoice-de" }→ invoice.number, invoice.date, invoice.lines[] …
  3. validate_template { "template": "invoice-de", "data": { … } }→ ok · 0 errors
  4. render { "template": "invoice-de", "data": { … } }→ succeeded · 1 page · 1 unit
Hier ist Rechnung 2026-0042: eine Seite, 3.760,40 € inklusive USt., mit GiroCode für die Überweisung.rechnung-2026-0042.pdfPDF · 1 Seite · 90 KB

In einer Minute verbunden

Kein SDK, kein Klebecode. Der Server läuft neben Ihrem Client oder gehostet unter mcp.formfeed.dev und spricht mit Ihrem Schlüssel mit der Formfeed-API.

  1. Test-Schlüssel anlegen

    In der App unter API-Schlüssel die Testumgebung wählen. Testrenderings werden nicht berechnet, der Agent kann also so oft probieren, wie er muss.

  2. Server hinzufügen

    Ein Befehl in Claude Code oder Codex, ein paar Zeilen JSON in Cursor, VS Code, Windsurf (heute Devin Desktop) oder Claude Desktop.

  3. Nach einem Dokument fragen

    Der Agent findet die Vorlage, liest ihr Schema, prüft die Daten und gibt Ihnen den Download-Link.

Richten Sie Ihren Client ein

Derselbe Server funktioniert in jedem Client, der MCP spricht. Wählen Sie Ihren; jeder Reiter verlinkt eine vollständige Anleitung mit Prüfschritten und Tipps.

Shell
claude mcp add --transport stdio formfeed \
  --env FORMFEED_API_KEY=ff_test_... \
  -- npx -y @formfeed/mcp

Mit --scope user steht der Server in jedem Projekt bereit. Vollständige Anleitung für Claude Code →

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

Vollständige Anleitung für Claude Desktop →

~/.cursor/mcp.jsonJSON
{
  "mcpServers": {
    "formfeed": {
      "command": "npx",
      "args": ["-y", "@formfeed/mcp"],
      "env": { "FORMFEED_API_KEY": "ff_test_..." }
    }
  }
}

Vollständige Anleitung für Cursor →

.vscode/mcp.jsonJSON
{
  "inputs": [
    { "type": "promptString", "id": "formfeed-key", "description": "Formfeed API key", "password": true }
  ],
  "servers": {
    "formfeed": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@formfeed/mcp"],
      "env": { "FORMFEED_API_KEY": "${input:formfeed-key}" }
    }
  }
}

Vollständige Anleitung für VS Code (GitHub Copilot) →

~/.config/devin/mcp_config.jsonJSON
{
  "mcpServers": {
    "formfeed": {
      "command": "npx",
      "args": ["-y", "@formfeed/mcp"],
      "env": { "FORMFEED_API_KEY": "ff_test_..." }
    }
  }
}

Vollständige Anleitung für Windsurf →

Shell
codex mcp add formfeed \
  --env FORMFEED_API_KEY=ff_test_... \
  -- npx -y @formfeed/mcp

Vollständige Anleitung für OpenAI Codex CLI →

~/.gemini/settings.jsonJSON
{
  "mcpServers": {
    "formfeed": {
      "command": "npx",
      "args": ["-y", "@formfeed/mcp"],
      "env": { "FORMFEED_API_KEY": "$FORMFEED_API_KEY" }
    }
  }
}

Vollständige Anleitung für Gemini CLI →

~/.config/zed/settings.jsonJSON
{
  "context_servers": {
    "formfeed": {
      "command": "npx",
      "args": ["-y", "@formfeed/mcp"],
      "env": { "FORMFEED_API_KEY": "ff_test_..." }
    }
  }
}

Vollständige Anleitung für Zed →

Assistenten und Editoren

Chat- und Coding-Agenten, die Sie täglich nutzen.

Agenten-Frameworks

Bauen Sie eigene Agenten mit den Formfeed-Werkzeugen.

Automatisierung

Agenten in Workflow-Werkzeugen.

Acht Werkzeuge, nichts Zerstörerisches

Der Server bietet, was ein Agent für ein Dokument braucht, und nichts, was Ihren Workspace verändert: kein Veröffentlichen, kein Löschen, keine Webhooks.

WerkzeugWas es tutKosten
list_templatesVorlagen 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_schemaDas 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_templatePrü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_invoicePrü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
renderRendert 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 einvoice wird 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_pdfWandelt 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_renderStatus, Download-URL und Fehler eines Renderings: für Renderings, die der Agent mit wait: false eingereiht hat, und für einen frischen Link, wenn der alte abgelaufen ist.kostenlos
get_workspaceWorkspace und Organisation, in denen der Server arbeitet, der Tarif, die Umgebung und die Einheiten des Zeitraums: wie viele Renderings noch bleiben.kostenlos

Test-Schlüssel werden nie berechnet. Ein Agent, der sich mit Ihrem Konto angemeldet hat, rendert immer live.

So arbeitet ein Agent damit

Der Server nennt dem Agenten diese Reihenfolge in seinen Anweisungen, und jeder Schritt liefert strukturiertes JSON, mit dem der Agent weiterarbeiten kann.

  1. Vorlage finden list_templates

    Der Agent sucht nach Art oder Name, statt einen Slug zu raten.

  2. Den Vertrag lesen get_template_schema

    Feldnamen, Typen und ein Beispiel kommen aus der Vorlage, der Agent baut also genau die Daten, die Ihr Layout erwartet.

  3. Prüfen vor dem Bezahlen validate_template

    Ein Tippfehler im Feldnamen kommt als Warnung mit Zeile und Spalte zurück, und der Agent korrigiert ihn, ohne eine Einheit zu verbrauchen.

  4. Rendern und übergeben render

    Das Dokument wird in der EU gerendert, und der Agent antwortet mit einem signierten Link.

resultJSON
{
  "template": "invoice-de",
  "version": 7,
  "status": "published",
  "schema": {
    "type": "object",
    "properties": {
      "invoice": {
        "type": "object",
        "properties": {
          "number": { "type": "string" },
          "date": { "type": "string" },
          "lines": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "description": { "type": "string" },
                "qty": { "type": "number" },
                "price": { "type": "number" }
              }
            }
          }
        }
      }
    }
  },
  "sample_data": {
    "invoice": {
      "number": "2026-0042",
      "date": "2026-09-15",
      "lines": [{ "description": "Consulting", "qty": 8, "price": 120 }]
    }
  }
}
resultJSON
{
  "ok": true,
  "template": { "id": "tpl_…", "slug": "invoice-de", "version": 7 },
  "diagnostics": [
    {
      "severity": "warning",
      "code": "unknown-variable",
      "message": "\"customer.vat_id\" is not present in the sample data",
      "line": 18,
      "column": 9
    }
  ]
}
resultJSON
{
  "id": "rnd_7da09ab6cd9946b798c187c2a9350852",
  "status": "succeeded",
  "download_url": "https://cdn.formfeed.dev/o/eu/…/invoice-2026-0042.pdf?exp=…&sig=…",
  "expires_at": "2026-09-17T10:42:00Z",
  "page_count": 1,
  "units": 1,
  "environment": "live",
  "template": { "id": "tpl_…", "slug": "invoice-de", "version": 7 },
  "error": null
}

Was Sie fragen können

Jeder Prompt unten funktioniert mit den acht Werkzeugen und einem Workspace, der die passende Vorlage hat.

  • Rechnung

    “Rendere Rechnung 2026-0042 an Olvarest GmbH: 8 Stunden Beratung zu 120 € und 20 Stunden Umsetzung zu 110 €. Nimm die deutsche Rechnungsvorlage.”

  • Zertifikate

    “Hier ist die Teilnehmerliste vom gestrigen Workshop. Erstelle pro Person ein Zertifikat mit der Vorlage certificate und liste die Links auf.”

  • Social-Bild

    “Erstelle das Open-Graph-Bild für unseren Beitrag „Vorlagen gehören in Git“ als PNG.”

  • Prüfung

    “Prüfe, ob orders/2026-0042.json zur Vorlage invoice-de passt, bevor du irgendetwas renderst.”

  • Bericht

    “Mach aus dieser CSV mit Monatsumsätzen den Quartalsbericht samt Balkendiagramm und schick mir das PDF.”

  • Sprache

    “Rendere dieselbe Rechnung noch einmal mit der Locale en-GB für unseren irischen Kunden.”

  • HTML

    “Mach aus diesen Besprechungsnotizen ein einseitiges PDF. Ohne Vorlage, einfaches HTML genügt.”

  • Support

    “Warum ist Rendering rnd_7da09ab6cd9946b798c187c2a9350852 fehlgeschlagen? Zeig mir den Fehler und was an den Daten zu ändern ist.”

Bauen Sie Ihren eigenen Agenten

Jedes große Agenten-Framework kann MCP-Werkzeuge laden. Die Beispiele starten den lokalen Server, geben seine Werkzeuge an das Modell und führen eine Anfrage aus.

agent.tsTypeScript
import { query } from '@anthropic-ai/claude-agent-sdk';

const prompt = 'Render invoice 2026-0042 for Olvarest GmbH: 8 hours of consulting at 120 EUR.';

for await (const message of query({
  prompt,
  options: {
    mcpServers: {
      formfeed: {
        command: 'npx',
        args: ['-y', '@formfeed/mcp'],
        env: { FORMFEED_API_KEY: process.env.FORMFEED_API_KEY! },
      },
    },
    allowedTools: ['mcp__formfeed__*'],
  },
})) {
  if (message.type === 'result' && message.subtype === 'success') {
    console.log(message.result);
  }
}

Vollständige Anleitung für Claude Agent SDK →

agent.pyPython
import asyncio
import os

from agents import Agent, Runner
from agents.mcp import MCPServerStdio


async def main() -> None:
    async with MCPServerStdio(
        name="formfeed",
        params={
            "command": "npx",
            "args": ["-y", "@formfeed/mcp"],
            "env": {"FORMFEED_API_KEY": os.environ["FORMFEED_API_KEY"]},
        },
        cache_tools_list=True,
    ) as formfeed:
        agent = Agent(
            name="Billing assistant",
            instructions="Create documents with the Formfeed tools. Read the schema first.",
            mcp_servers=[formfeed],
        )
        prompt = "Render invoice 2026-0042 for Olvarest GmbH: 8 hours of consulting at 120 EUR."
        result = await Runner.run(agent, prompt)
        print(result.final_output)


asyncio.run(main())

Vollständige Anleitung für OpenAI Agents SDK →

render.tsTypeScript
import { anthropic } from '@ai-sdk/anthropic';
import { createMCPClient } from '@ai-sdk/mcp';
import { Experimental_StdioMCPTransport } from '@ai-sdk/mcp/mcp-stdio';
import { generateText, stepCountIs } from 'ai';

const formfeed = await createMCPClient({
  transport: new Experimental_StdioMCPTransport({
    command: 'npx',
    args: ['-y', '@formfeed/mcp'],
    env: { FORMFEED_API_KEY: process.env.FORMFEED_API_KEY! },
  }),
});

try {
  const { text } = await generateText({
    model: anthropic('claude-opus-5-5'),
    tools: await formfeed.tools(),
    stopWhen: stepCountIs(8),
    prompt: 'Render the certificate for Jane Doe, course "Analytical Engines 101".',
  });
  console.log(text);
} finally {
  await formfeed.close();
}

Vollständige Anleitung für Vercel AI SDK →

agent.pyPython
import asyncio
import os

from langchain.agents import create_agent
from langchain_mcp_adapters.client import MultiServerMCPClient

client = MultiServerMCPClient(
    {
        "formfeed": {
            "transport": "stdio",
            "command": "npx",
            "args": ["-y", "@formfeed/mcp"],
            "env": {"FORMFEED_API_KEY": os.environ["FORMFEED_API_KEY"]},
        }
    }
)


async def main() -> None:
    tools = await client.get_tools()
    agent = create_agent("anthropic:claude-opus-5-5", tools)
    prompt = "Render invoice 2026-0042 for Olvarest GmbH and return the link."
    result = await agent.ainvoke({"messages": [{"role": "user", "content": prompt}]})
    print(result["messages"][-1].content)


asyncio.run(main())

Vollständige Anleitung für LangChain and LangGraph →

src/mastra/agents/documents.tsTypeScript
import { anthropic } from '@ai-sdk/anthropic';
import { Agent } from '@mastra/core/agent';
import { MCPClient } from '@mastra/mcp';

const mcp = new MCPClient({
  servers: {
    formfeed: {
      command: 'npx',
      args: ['-y', '@formfeed/mcp'],
      env: { FORMFEED_API_KEY: process.env.FORMFEED_API_KEY! },
    },
  },
});

export const documentAgent = new Agent({
  name: 'Document agent',
  instructions: 'Render documents with the Formfeed tools. Read the template schema before you render.',
  model: anthropic('claude-opus-5-5'),
  tools: await mcp.listTools(),
});

Vollständige Anleitung für Mastra →

crew.pyPython
import os

from crewai import Agent, Crew, Task
from crewai.mcp import MCPServerStdio

clerk = Agent(
    role="Document clerk",
    goal="Produce finished PDFs from the workspace's Formfeed templates",
    backstory="You read a template's data schema before you render and never guess field names.",
    mcps=[
        MCPServerStdio(
            command="npx",
            args=["-y", "@formfeed/mcp"],
            env={"FORMFEED_API_KEY": os.environ["FORMFEED_API_KEY"]},
        )
    ],
)

task = Task(
    description="Render a certificate for Jane Doe, course Analytical Engines 101, dated today.",
    expected_output="The download URL of the certificate",
    agent=clerk,
)

print(Crew(agents=[clerk], tasks=[task]).kickoff())

Vollständige Anleitung für CrewAI →

agent.pyPython
import asyncio
import os

from anthropic import AsyncAnthropic
from anthropic.lib.tools.mcp import async_mcp_tool
from mcp import ClientSession
from mcp.client.stdio import StdioServerParameters, stdio_client

formfeed = StdioServerParameters(
    command="npx",
    args=["-y", "@formfeed/mcp"],
    env={"FORMFEED_API_KEY": os.environ["FORMFEED_API_KEY"]},
)
prompt = "Render the certificate for Jane Doe, course Analytical Engines 101."


async def main() -> None:
    client = AsyncAnthropic()
    async with stdio_client(formfeed) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()
            tools = (await session.list_tools()).tools
            runner = client.beta.messages.tool_runner(
                model="claude-opus-5-5",
                max_tokens=16000,
                tools=[async_mcp_tool(t, session) for t in tools],
                messages=[{"role": "user", "content": prompt}],
            )
            async for message in runner:
                print(message.content)


asyncio.run(main())

Vollständige Anleitung für Claude API →

invoice-agent.tsTypeScript
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);

Vollständige Anleitung für Plain tool calling →

Coding-Agenten bearbeiten Vorlagen als Dateien

Claude Code, Codex, Cursor und Copilot können HTML und CSS. Mit der Formfeed-CLI sind Ihre Vorlagen Dateien im Repository, und der Agent bekommt dieselben Prüfungen, die Sie selbst ausführen würden.

Offline-Prüfung
formfeed validate --json kompiliert jede Vorlage mit der Produktions-Engine und meldet Fehler mit Datei, Zeile und Spalte.
Snapshot-Tests
formfeed test rendert jeden Datensatz und vergleicht mit dem freigegebenen HTML, eine Layoutänderung wird so zum Diff.
Lokale Vorschau
formfeed dev zeigt eine paginierte Vorschau mit Hot Reload; formfeed render erzeugt ein echtes PDF über die API, kostenlos mit einem Test-Schlüssel (formfeed login im Browser speichert einen Live-Schlüssel).
Review im Pull Request
formfeed ci preview rendert die geänderten Vorlagen und schreibt eine Zusammenfassung für den Pull Request.
AGENTS.mdMarkdown
## Formfeed templates

Templates live in `templates/<slug>/` (see `formfeed.json`). After changing one:

1. Run `npx formfeed validate <slug> --json` and fix every error before you continue.
2. Run `npx formfeed test <slug>`. If a snapshot changed on purpose, update it
   with `npx formfeed test <slug> -u` and say so in your summary.
3. Render a real PDF only with a test key (`npx formfeed whoami` names the stored key's
   environment): `npx formfeed render <slug> --data <set>`.
4. Never run `npx formfeed templates push` unless asked: it changes the shared workspace.

Helpers (money, date, qrcode, epcQr, chart, …): https://docs.formfeed.dev/templates/helpers

Fügen Sie das in AGENTS.md oder CLAUDE.md ein, dann folgt der Agent jedes Mal derselben Schleife.

Shell
npx formfeed login ff_test_...          # store a test key: its renders are free
npx formfeed init --from-workspace      # formfeed.json, templates/<slug>/ as files
npx formfeed validate invoice-de --json # errors with file, line, column
npx formfeed test                       # compare approved HTML snapshots
npx formfeed dev invoice-de             # preview with hot reload on :4400
npx formfeed render invoice-de --data many-lines   # true render with that key

Sie bauen ein KI-Produkt? Halten Sie Kunden getrennt.

Ein API-Schlüssel gehört zu genau einem Workspace. Geben Sie jedem Kunden einen eigenen Workspace und jeder Agenten-Sitzung den Schlüssel dieses Kunden: Der Server sieht nur die Vorlagen und Renderings dieses Workspace, egal was im Prompt steht.

Vom Schlüssel erzwungen

Die Abgrenzung passiert in der API, nicht im Prompt, und hält deshalb auch gegen Prompt-Injection. Ein Standardschlüssel hat template:read, render:create, render:read und account:read, sonst nichts.

Test und Live

Entwickeln Sie mit Test-Schlüsseln: Renderings werden nicht berechnet und laufen nach einem Tag ab (im Free-Plan mit Testmarkierung). Zum Start tauschen Sie den Schlüssel, nicht den Code.

Nachvollziehbar

Jedes Rendering des Servers trägt meta.source = "mcp" und steht im Render-Log mit Vorlagenversion und den Hashes seines Reproduzierbarkeitsnachweises; die gesendeten Daten auch, wenn der Workspace Anfragedaten aufbewahrt (eine Einstellung der bezahlten Pläne, voreingestellt aus).

Gleicher Preis

Agenten-Renderings kosten dieselben Einheiten wie jedes andere API-Rendering, in jedem Plan inklusive Free. Rate Limits gelten pro Workspace.

Den HTTP-Endpunkt selbst betreiben

Das Paket liefert auch zustandsloses Streamable HTTP, genau das läuft auf mcp.formfeed.dev. Es speichert weder Sitzungen noch Schlüssel: Jede Anfrage bringt ihren eigenen API-Schlüssel als Bearer-Token mit. Die Anmeldung mit einem Formfeed-Konto bleibt dem gehosteten Endpunkt vorbehalten, weil die API nur Tokens der eigenen Formfeed-Anmeldung annimmt. Betreiben Sie es im eigenen Netz für volle Kontrolle.

Shell
# stateless Streamable HTTP on :8790, the key comes from each request
npx -y @formfeed/mcp --http --host 0.0.0.0 --port 8790

# health check for your load balancer
curl http://localhost:8790/healthz
compose.yamlYAML
services:
  formfeed-mcp:
    image: node:22-alpine
    command: npx -y @formfeed/mcp --http --host 0.0.0.0 --port 8790
    restart: unless-stopped
    ports: ["127.0.0.1:8790:8790"]

FAQ

Welche Clients werden unterstützt?
Jeder Client, der das Model Context Protocol spricht: Claude Code, Claude Desktop, Cursor, VS Code mit GitHub Copilot, Windsurf (heute Devin Desktop), OpenAI Codex, Gemini CLI, Zed, Cline und die oben genannten Agenten-Frameworks. Der lokale Server braucht Node.js 22 oder neuer. Ein Client, der aus der offiziellen MCP-Registry installiert, findet den Server als io.github.formfeed-dev/formfeed.
Kosten Agenten-Renderings extra?
Nein. Ein Rendering über MCP kostet dieselben Einheiten wie jedes andere: eine Einheit pro PDF mit bis zu fünf Seiten oder pro Bild, eine mehr für eine E-Rechnung. Auflisten, Schema-Abfragen und Prüfen sind kostenlos, Test-Schlüssel werden nie berechnet. Wie viele Einheiten jeder Plan enthält, steht bei den Preisen.
Funktioniert es in ChatGPT oder Claude.ai im Browser?
Ja. Browser-Clients binden entfernte Server als Konnektoren mit OAuth-Anmeldung ein: Geben Sie https://mcp.formfeed.dev/mcp ein, melden Sie sich mit Ihrem Formfeed-Konto an und wählen Sie den Workspace, in dem der Agent arbeitet. Der Agent handelt dann als Sie in diesem Workspace, mit höchstens vier Scopes (template:read, render:read, render:create, account:read) und nie mehr, als Ihre Rolle erlaubt: Er liest Vorlagen, prüft, rendert und wandelt um, immer live, seine Renderings verbrauchen also Einheiten. Den Workspace ändern oder den Agenten widerrufen Sie in der App unter Konto → Verbundene Agenten. Mit Zwei-Faktor-Authentifizierung erlauben Sie den Agenten aus einer Sitzung, die Ihren Code bestanden hat; einer, den Sie vor dem Einschalten erlaubt haben, wird mit 403 abgewiesen, bis Sie ihn neu verbinden.
Kann der Agent Vorlagen anlegen oder ändern?
Nicht über MCP: Der Server liest Vorlagen nur und rendert sie, ein Agent kann also kein kaputtes Layout veröffentlichen. Coding-Agenten ändern Vorlagen als Dateien mit der CLI, und Sie entscheiden, wann sie hochgeladen und veröffentlicht werden.
Kann der Agent ohne Vorlage rendern?
Ja. render nimmt auch rohes HTML, auf Wunsch mit Jinja2-, Liquid- oder Handlebars-Syntax, für einmalige Dokumente.
Wo werden die Daten verarbeitet?
In der EU. Rendering und Datenbank laufen in Frankfurt, gerenderte Dateien liegen in der EU. Der MCP-Server selbst speichert nichts; er reicht jeden Aufruf mit Ihrem Schlüssel an die API weiter.
Brauche ich überhaupt MCP?
Nein. Wenn der Agent immer nur eine Art Dokument erzeugt, packen Sie einen API-Aufruf in ein eigenes Werkzeug: siehe einfaches Tool Calling.

Integrationen· MCP-Dokumentation· @formfeed/mcp auf npm

Aus dem Blog

  • Den Agenten die Daten schreiben lassen, nicht das HTML →

    Ein KI-Agent, der das HTML eines Dokuments schreibt, schreibt jedes Mal ein neues Dokument. Einer, der eine geprüfte Vorlage füllt, schreibt dasselbe. Was die Vorlage dem Modell noch falsch zu machen lässt, und wie man es kostenlos prüft, bevor etwas gedruckt wird.

Heute mit dem Rendern beginnen

Der kostenlose Plan enthält 100 Einheiten im Monat und kostenlose Testrenderings. Wechseln Sie den Plan, wenn Sie mehr brauchen.