mcp

get_audit_pdf

MCP-Tool, das eine signierte Download-URL für den Marken-PDF-Bericht eines Audits liefert. Stösst ein Rendering an, falls das PDF noch nicht bereit ist.

Was dieses Tool tut

get_audit_pdf liefert eine signierte Download-URL für den Marken-PDF-Bericht eines gegebenen Audits. Wenn noch kein PDF gerendert wurde, stösst es ein Rendering an und gibt den Status queued zurück.

  • Nimmt eine audit_id (denselben Wert, den run_audit zurückgegeben hat).
  • Liefert audit_id, pdf_url und status (ready oder queued).
  • Die signierte URL ist kurzlebig; behandle sie als Wegwerf-URL und ruf sie sofort ab.
  • Bei status: queued ruf das Tool nach ein paar Sekunden erneut auf oder triff die URL, sobald das Rendering fertig ist.
  • White-Label-Branding (Logo, Firmenname, Theme) folgt dem Plan und den Dashboard-Einstellungen des Nutzers.

Warum es wichtig ist

Das PDF ist die Liefergabe, die die meisten Berater und Agenturen ihren Kunden in die Hand drücken. Wenn ein Agent eine signierte URL greifen kann, kann ein einziger MCP-Aufruf einen End-to-End-Workflow “Audit und Bericht” abschliessen, der zuvor einen Dashboard-Tab erforderte.

Konkrete Workflows:

  • Ein “Kundenreport”-Agent führt run_audit aus, pollt get_audit, ruft dann get_audit_pdf auf und hängt die signierte URL an einen E-Mail-Entwurf.
  • Ein “Archiv des letzten Quartals”-Agent läuft durch list_audits, holt jedes PDF und legt es in Drive oder S3 ab, mit der URL und created_at als Dateinamen.

So nutzt du es

get_audit_pdf ist unter der Haube ein POST: Der erste Aufruf stösst ein Rendering an, wenn der Cache kalt ist. Wenn das PDF kürzlich gerendert wurde, kommt die URL sofort zurück. Andernfalls rechne mit 5-15 s Renderzeit; polle das Tool alle paar Sekunden.

Input-Schema

{
  "type": "object",
  "properties": {
    "audit_id": { "type": "string", "minLength": 1 }
  },
  "required": ["audit_id"]
}

Beispiel-Response

{
  "audit_id": "aud_01HZ8X9YP7K3T2N6Q5",
  "pdf_url": "https://cdn.metricspot.com/reports/aud_01HZ8X9YP7K3T2N6Q5.pdf?signature=...",
  "status": "ready"
}

Wenn das Rendering noch läuft:

{
  "audit_id": "aud_01HZ8X9YP7K3T2N6Q5",
  "pdf_url": "",
  "status": "queued"
}

Claude Code

claude mcp add --transport http metricspot https://mcp.metricspot.com/mcp \
  --header "Authorization: Bearer ms_live_xxxxxxxxxxxxxxxxxxxxxxxx"

Prompt:

Hol das PDF für das Audit aud_01HZ8X9YP7K3T2N6Q5 von MetricSpot und gib mir den Download-Link.

Cursor

.cursor/mcp.json:

{
  "mcpServers": {
    "metricspot": {
      "url": "https://mcp.metricspot.com/mcp",
      "headers": {
        "Authorization": "Bearer ms_live_xxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Prompt:

Hol das neueste Audit für example.com, warte auf das PDF und lade es nach ./reports herunter.

Python (pollen bis ready, dann herunterladen)

import httpx, time, json

HEADERS = {
    "content-type": "application/json",
    "accept": "application/json, text/event-stream",
    "authorization": "Bearer ms_live_xxxxxxxxxxxxxxxxxxxxxxxx",
}

def call(name, args):
    r = httpx.post("https://mcp.metricspot.com/mcp", headers=HEADERS, json={
        "jsonrpc": "2.0", "id": 1, "method": "tools/call",
        "params": {"name": name, "arguments": args},
    }, timeout=60.0)
    return json.loads(r.json()["result"]["content"][0]["text"])

for _ in range(10):
    pdf = call("get_audit_pdf", {"audit_id": "aud_01HZ8X9YP7K3T2N6Q5"})
    if pdf["status"] == "ready":
        break
    time.sleep(3)

with httpx.stream("GET", pdf["pdf_url"]) as r:
    with open("report.pdf", "wb") as f:
        for chunk in r.iter_bytes():
            f.write(chunk)

Node / TypeScript (roher HTTP)

import { writeFile } from "node:fs/promises";

const res = await fetch("https://mcp.metricspot.com/mcp", {
  method: "POST",
  headers: {
    "content-type": "application/json",
    accept: "application/json, text/event-stream",
    authorization: "Bearer ms_live_xxxxxxxxxxxxxxxxxxxxxxxx",
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "tools/call",
    params: {
      name: "get_audit_pdf",
      arguments: { audit_id: "aud_01HZ8X9YP7K3T2N6Q5" },
    },
  }),
});
const pdf = JSON.parse((await res.json()).result.content[0].text);
if (pdf.status === "ready") {
  const file = await fetch(pdf.pdf_url);
  await writeFile("report.pdf", Buffer.from(await file.arrayBuffer()));
}

Häufige Fehler

CodeWannAktion
UNAUTHORIZED (401)Fehlendes oder ungültiges Bearer-TokenSchlüssel ausstellen unter https://app.metricspot.com/settings/api-keys
AUDIT_NOT_FOUND (404)audit_id gehört nicht zu diesem KontoRufe list_audits für gültige ids auf
FORBIDDEN (403)PDF-Export erfordert auf manchen Konten einen kostenpflichtigen PlanUpgrade unter https://app.metricspot.com/billing
UPSTREAM_FAILED (5xx)Aussetzer des Render-DienstesEinmal erneut versuchen; retryable: true ist gesetzt

Häufig gestellte Fragen

Wie lange ist die signierte URL gültig?

Kurzlebig: Minuten, nicht Stunden. Die URL ist für einen einmaligen Download signiert und rotiert bei jedem Aufruf. Rufe lieber get_audit_pdf erneut auf, anstatt die URL selbst zu cachen; die Response ist günstig, wenn das Rendering bereits abgeschlossen ist.

Kann ich das PDF-Branding anpassen?

Branding (Logo, Firmenname, Akzentfarbe, Footer) wird im Dashboard unter Einstellungen → Branding gesetzt und automatisch auf PDFs angewendet, die für dieses Konto gerendert werden. Das MCP-Tool akzeptiert in v1 keine Per-Call-Überschreibungen.

Was steht im PDF, das nicht in get_audit ist?

Das PDF ist die menschenlesbare Liefergabe: Deckblatt, Executive Summary, Module-Sektionen mit Screenshots und dieselbe Liste von Befunden mit längeren Empfehlungs-Texten. get_audit ist das strukturierte JSON für Agenten; das PDF ist die Version, die du einem Kunden in die Hand drücken würdest.

Quellen

Zuletzt aktualisiert 2026-05-13