Zum Hauptinhalt springen
Wenn ein MCP-Tool ein Input-Feld mit format: "file" deklariert, fängt Langdock die Dateireferenz des LLM automatisch ab und löst sie in ein strukturiertes FileData-Objekt auf – bevor der MCP-Server den Aufruf überhaupt erhält.

Funktionsweise in Langdock

Wenn ein User eine Datei im Chat anhängt und das LLM darauf verweist (als Dateiname wie report.pdf, als Speicherpfad wie attachment/<uuid>/<filename> oder /mnt/data/<filename>), fängt Langdock diese Referenz ab und löst sie in ein vollständiges FileData-Objekt auf – bevor es an dein MCP-Tool weitergegeben wird.

Die FileData-Struktur

Dein MCP-Tool erhält folgendes Objekt:
{
  fileName: string;       // ursprünglicher Dateiname, z. B. "report.pdf"
  mimeType: string;       // z. B. "image/jpeg", "application/pdf"
  base64: string;         // vollständiger Dateiinhalt, base64-kodiert
  size: number;           // Größe in Bytes
  lastModified: Date;
}

Der .meta({ format: "file" })-Marker

Das entscheidende Signal für Langdock ist das Hinzufügen von .meta({ format: "file" }) zu deinem Zod-Schema-Feld. Beim Speichern der MCP-Integration erkennt Langdock format: "file" im JSON-Schema und speichert das Feld als FILE-Typ. Bei der Ausführung löst Langdock die Dateireferenz in ein vollständiges FileData-Objekt auf und übergibt es an deinen MCP-Server.

Datei-Input in deinem MCP-Server implementieren

Deklariere das Input-Feld als Zod-Objekt, das der FileData-Struktur entspricht. Verwende nicht z.string() – das MCP-SDK validiert Inputs vor dem Aufruf des Handlers, daher muss das Schema mit dem übereinstimmen, was es tatsächlich erhält:
server.registerTool(
  "process-file",
  {
    inputSchema: {
      file: z
        .object({
          fileName: z.string(),
          mimeType: z.string(),
          base64: z.string(),
          size: z.number().optional(),
        })
        .describe("Zu verarbeitende Datei")
        .meta({ format: "file" }), // teilt Langdock mit, die Referenz aufzulösen
    },
  },
  async ({ file }) => {
    const buffer = Buffer.from(file.base64, "base64");
    // verwende buffer, file.fileName, file.mimeType, etc.
    return {
      content: [{ type: "text", text: `Verarbeitet: ${file.fileName} (${file.size} Bytes)` }],
    };
  },
);

Beispiel-Input und -Output

Wenn Langdock dein Tool aufruft, sendet es ein vollständig aufgelöstes FileData-Objekt:
{
  "file": {
    "fileName": "beispiel.txt",
    "mimeType": "text/plain",
    "base64": "SGVsbG8gd29ybGQ=",
    "size": 11
  }
}
Dein Tool kann dann Metadaten oder verarbeitete Ergebnisse zurückgeben:
{
  "success": true,
  "filename": "beispiel.txt",
  "mimeType": "text/plain",
  "sizeBytes": 11
}

Beispielprojekt

Das Repository langdock_mcp_file_upload ist ein minimaler, funktionierender MCP-Server, der den vollständigen Datei-Input-Flow demonstriert – von der Schema-Deklaration bis zur Verarbeitung des aufgelösten FileData im Tool-Handler.

Verwandte Dokumentation

FAQ

Nutze Datei-Input, wenn das externe MCP-Tool eine Datei untersuchen oder verarbeiten muss, auf die der User in Langdock verweist. Das ist nützlich für Tools, die Dateien parsen, umwandeln, validieren oder in ein anderes System hochladen.
Prüfe, ob das MCP-Tool ein Datei-Input-Feld deklariert, der User auf eine verfügbare Datei verwiesen hat, das Tool den Dateityp unterstützt und das Tool mit dem Datenformat umgehen kann, das Langdock sendet.