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