MCP Audit — Standardisiertes Audit-Vorgehen
Reproduzierbares Audit von MCP-Servern gegen einen versionierten Best-Practice-Katalog. Verwende diesen Skill wenn der User (1) einen MCP-Server gegen Best Practices prüfen will, (2) Sicherheitsfindings für einen Server dokumentieren möchte, (3) den
Install in one line
CLI$ mfkvault install mcp-audit-standardisiertes-audit-vorgehenRequires the MFKVault CLI. Prefer MCP?
Free to install — no account needed
Copy the command below and paste into your agent.
Instant access • No coding needed • No account needed
What you get in 5 minutes
- Full skill code ready to install
- Works with 1 AI agent
- Lifetime updates included
Description
--- name: mcp-audit description: Reproduzierbares Audit von MCP-Servern gegen einen versionierten Best-Practice-Katalog. Verwende diesen Skill wenn der User (1) einen MCP-Server gegen Best Practices prüfen will, (2) Sicherheitsfindings für einen Server dokumentieren möchte, (3) den MCP Audit Tracker (Notion) abarbeitet, (4) fragt «ist mein Server sicher / production-ready / standard-konform», (5) den Begriff «Audit», «Findings», «Compliance-Check», «Best Practice» im MCP-Kontext erwähnt, (6) einen Refactoring-Plan für einen bestehenden Server erstellt, oder (7) für mehrere Server einen vergleichenden Audit-Report erstellen möchte. Auch bei allgemeinen Aussagen wie «ist der Server gut gebaut?», «was muss ich noch fixen?», «entspricht das den Standards?» diesen Skill anwenden. --- # MCP Audit — Standardisiertes Audit-Vorgehen Dieser Skill kodiert ein reproduzierbares Audit-Verfahren für MCP-Server gegen den im Anhang dokumentierten Best-Practice-Katalog (PDF-Quelle, ~50 Checks in sieben Kategorien). Ziel: bei 30+ Servern im Portfolio dieselbe Methodik anwenden, ohne dass der menschliche Auditor (oder Claude) bei jedem Server das PDF neu interpretiert. **Das Mantra in drei Zeilen:** 1. **Profil zuerst, Checks danach** — applicability filtert alles 2. **Evidenz schlägt Vermutung** — jeder Befund braucht Code-Stelle oder konkretes Verhalten 3. **Severity ohne Mitleid** — `critical` blockiert Produktion, Punkt Jeder Audit folgt sechs Schritten in dieser Reihenfolge. Abweichungen sind möglich, müssen aber im Audit-Report dokumentiert werden. --- ## Schritt 1: Profil laden **Ziel:** Den Server-Kontext aus dem Notion MCP Audit Tracker (DB-ID `a2736a65-677d-4cf3-9f94-e874f74a1975`) holen, damit nachfolgende Schritte die richtigen Checks filtern können. ### 1.1 Pflichtfelder aus dem Tracker Bevor ein Audit beginnt, müssen diese Felder in der Audit-Tracker-Karte gesetzt sein: | Feld | Werte | Verwendung im Audit | |---|---|---| | `Transport` | `stdio-only` / `dual` / `HTTP/SSE` | filtert Netzwerk-Checks | | `Auth-Modell` | `none` / `API-Key` / `OAuth-Proxy` | filtert OAuth-Checks | | `Datenklasse` | `Public Open Data` / `Verwaltungsdaten` / `PII` | filtert PII-Checks und CH-Compliance | | `Schreibzugriff` | `read-only` / `write-capable` | filtert HITL-Checks | | `Deployment` | `local-stdio` / `Railway` / `Render` / `andere` | filtert Cloud-Checks | | `Repo URL` | GitHub-URL | für Code-Review-Schritte | Wenn ein Pflichtfeld fehlt, wird der Audit gestoppt und der User aufgefordert, das Feld zu füllen. **Audits mit unvollständigem Profil sind wertlos** — applicability wird falsch berechnet, die Findings werden unverlässlich. ### 1.2 Profil-Notation für interne Verwendung Während des Audits arbeitet Claude mit einem konsolidierten Profil-Objekt: ```yaml profile: name: zurich-opendata-mcp repo: https://github.com/malkreide/zurich-opendata-mcp transport: dual auth_model: none data_class: Public Open Data write_access: read-only deployment: [local-stdio, Railway] prio: 14 # aus Tracker-Formel ``` Dieses Profil ist die **einzige Wahrheit** für `applies_when`-Auswertung in Schritt 3. --- ## Schritt 2: Check-Katalog laden **Ziel:** Den vollständigen Katalog (`checks/*.md`) parsen und nach `category` + `severity` indizieren. ### 2.1 Sieben Kategorien | Kategorie | Quelle | Typische Anzahl Checks | Status v0.5.0 | |---|---|---|---| | `ARCH` | PDF Sec 2 + Anhang A — Tool-Design, Annotations, Idempotency, Repo-Struktur, Spec-Versionierung | 10–12 | 12 / 12 ✅ | | `SDK` | PDF Sec 3 — FastMCP, TypeScript, Zod, Lifecycle | 5–7 | 5 / 5 ✅ | | `SEC` | PDF Sec 4 + Anhang B — Security (grösste Kategorie) | 20–25 | 23 / 23 ✅ | | `SCALE` | PDF Sec 5 — Transport, LB, Container, Gateway | 5–7 | 6 / 6 ✅ | | `OBS` | PDF Sec 6 + Anhang B10 — Logging, Errors, SIEM, Tracing | 5–7 | 6 / 6 ✅ | | `HITL` | PDF Sec 7 — Sampling, Human-in-the-Loop | 4–5 | 5 / 5 ✅ | | `CH` | Custom — DSG/EDÖB, Schweiz-Compliance | 5–8 | 8 / 8 ✅ | | `OPS` | Anhang C — Test-Strategie, Doku, Phasenarchitektur | 3–5 | 3 / 3 ✅ | | **Total** | | **~65** | **68 / 68 ✅** | ### 2.2 Severity-Stufen | Stufe | Bedeutung | Konsequenz | |---|---|---| | `critical` | Sicherheitslücke oder Compliance-Bruch | Blockiert Produktion. Muss vor Release gefixt sein. | | `high` | Architektureller Mangel mit signifikantem Risiko | Im laufenden Sprint fixen, max. 1 Sprint Karenz. | | `medium` | Best-Practice-Verletzung, kein akutes Risiko | Im nächsten Sprint planen. | | `low` | Polish, Optimierung, Stilistik | Backlog. Bei Tippfehler-Audits: low + auto-fix. | ### 2.3 Check-Schema Jeder Check ist eine eigenständige Markdown-Datei im Format: ```markdown --- id: SEC-001 title: "Confused Deputy: Per-Client Consent Flow" category: security severity: critical applies_when: 'auth_model == "OAuth-Proxy"' pdf_ref: "Sec 4.1" evidence_required: 3 --- # Body mit Description, Verification, Pass Criteria, Remediation ``` Details siehe `templates/finding.md` und beliebige Datei in `checks/`. --- ## Schritt 3: Applicability-Filter **Ziel:** Aus den ~50 Checks nur diejenigen auswählen, die für das aktuelle Server-Profil tatsächlich relevant sind. Ohne diesen Filter überfluten irrelevante Findings den Report (z.B. OAuth-Checks für stdio-only-Server ohne Auth). ### 3.1 Auswertung der `applies_when`-Klausel Die Klausel ist ein Boolean-Ausdruck gegen die Profil-Felder: | Operator | Beispiel | Bedeutung | |---|---|---| | `==` | `transport == "HTTP/SSE"` | exakter String-Vergleich | | `!=` | `auth_model != "none"` | Negation | | `.includes(...)` | `deployment.includes("Railway")` | Multi-Select-Membership | | `and` / `or` | `transport == "HTTP/SSE" and auth_model == "OAuth-Proxy"` | Verknüpfung | | `always` | `always` | Check ist universell, läuft immer | ### 3.2 Typische Filter-Muster **stdio-only-Server ohne Auth, Public Open Data, read-only:** - Anwendbar: alle `ARCH`, alle `SDK`, ~5 `SEC` (basale Best Practices), `OBS`-Logging-Basics, einige `CH` - Nicht anwendbar: SSRF, OAuth-Flow, Session-Hijacking, Stateful-LB, Sandboxing - Geschätzt: **~15–20 Checks** **HTTP/SSE-Server mit OAuth-Proxy, Cloud-Deployment, Verwaltungsdaten:** - Anwendbar: praktisch alles - Geschätzt: **~45–55 Checks** ### 3.3 Applicability-Report (vor Audit-Start) Bevor der eigentliche Audit beginnt, gibt Claude diese Übersicht aus: ``` === Audit applicability for zurich-opendata-mcp === Profile: dual transport, no auth, Public Open Data, read-only, Deployment: [local-stdio, Railway] Applicable checks: 23 / 50 ARCH: 7/7 (universal) SDK: 6/6 (universal) SEC: 4/18 (cloud-relevant subset) SCALE: 3/6 (Railway-relevant subset) OBS: 3/5 (universal subset) HITL: 0/4 (no write access, no sampling) CH: 0/6 (Public Open Data, no PII) Severity breakdown of applicable checks: critical: 4 high: 11 medium: 6 low: 2 ``` **Wichtig:** Wenn ein Check nicht anwendbar ist, erscheint er **gar nicht** im Report — nicht einmal als «N/A». Das hält Reports fokussiert und vermeidet Audit-Müdigkeit. --- ## Schritt 4: Check-Ausführung **Ziel:** Jeden anwendbaren Check methodisch verifizieren — entweder automatisch (grep, AST, curl) oder via manuellem Code-Review. ### 4.1 Drei Verifikationsmodi Jeder Check definiert in seiner `verification:`-Sektion einen oder mehrere Modi: | Modus | Wann | Beispiel | |---|---|---| | `automated` | Pattern existiert/fehlt im Repo | `grep -r "expose_headers" src/` für SDK-004 | | `code_review` | Logische Prüfung erforderlich | OAuth-State-Single-Use bei SEC-010 | | `config_check` | Repo-Settings, CI, Branch-Protection | `cat .github/workflows/*.yml` für OBS-Checks | | `runtime_test` | Live-API-Verhalten testen | `curl -H "X-Forwarded-For: 169.254.169.254"` für SEC-004 | ### 4.2 Audit-Reihenfolge: Severity descending Innerhalb der anwendbaren Checks läuft der Audit in dieser Reihenfolge: 1. Alle `critical`-Checks zuerst (Showstopper früh erkennen) 2. Dann `high` 3. Dann `medium` 4. `low` zuletzt (oder skippen falls knappe Zeit) **Wenn ein `critical`-Check fehlschlägt, kann der Audit nicht «pass» erhalten** — egal wie gut die anderen Checks ausgehen. ### 4.3 Evidenz-Sammlung pro Check Für jeden ausgeführten Check wird strukturiert dokumentiert: ```yaml check_run: id: SEC-001 status: pass | fail | partial | skip evidence_collected: 4 # tatsächlich beobachtet evidence_required: 3 # Mindestmaß aus Check-Def findings: - "Per-client consent UI in src/oauth/consent.py:42" - "X-Frame-Options: DENY in src/middleware/security.py:18" - "State parameter validated single-use in src/oauth/state.py:55" gaps: - "Cookies nutzen __Secure- prefix statt __Host- — schwächere Subdomain-Isolation" evaluator_notes: | Die Implementierung ist 90% korrekt. __Host- statt __Secure- wäre der vollständige Schutz gemäss Best Practice. ``` ### 4.4 Pass-Criteria Ein Check besteht **nur dann** als `pass`, wenn: - Alle Pflicht-Pass-Criteria im Check erfüllt sind - Mindestens `evidence_required` Punkte beobachtet wurden - Keine `gaps` der Severity ≥ Check-Severity vorliegen Sonst: `partial` (wenn 50%+ erfüllt) oder `fail`. --- ## Schritt 5: Finding-Dokumentation **Ziel:** Pro fehlgeschlagenem Check ein strukturiertes Finding erzeugen, das direkt in einen Remediation-Plan überführbar ist. ### 5.1 Finding-Template Verwendet `templates/finding.md`: ```markdown ## Finding: <CHECK-ID> — <CHECK-TITLE> **Severity:** critical | high | medium | low **Status:** open | in-remediation | accepted-risk | closed **Server:** <server-name> **Check-Reference:** <ID> **PDF-Reference:** Sec X.Y ### Observed Behavior <Was wurde im Code/Verhalten beobachtet?> ### Expected Behavior <Was würde der Best-Practice-Katalog verlangen?> ### Evidence - File: `path/to/file.py:42` - Excerpt: ... - Test output: ... ### Risk Description <Welcher konkrete Schaden kann entstehen?> ### Remediation <Konkrete Schritte, idealerweise mit Code-Diff.> ### Effort Estimate S (< 1d) | M (1-3d) | L (1-2w) | XL (>2w) ``` ### 5.2 Findings-Anzahl zurück in Audit Tracker Nach Abschluss des Audits wird die `Findings`-Spalte in der Notion-Karte aktualisiert: ```python # Pseudo-code für Tracker-Update total_findings = sum(1 for r in check_runs if r.status in ("fail", "partial")) update_audit_tracker(server=name, findings=total_findings, status="Findings dokumentiert") ``` ### 5.3 Audit-Status-Transition | Vorher | Nach Audit | Bedingung | |---|---|---| | `Triagiert` | `In Audit` | Schritt 1-3 abgeschlossen | | `In Audit` | `Findings dokumentiert` | alle Checks gelaufen, Findings erfasst | | `Findings dokumentiert` | `In Remediation` | Fix-Arbeit gestartet | | `In Remediation` | `Abgeschlossen` | alle critical/high Findings closed | --- ## Schritt 6: Audit-Report **Ziel:** Einen kompakten, an verschiedene Stakeholder versendbaren Bericht produzieren. ### 6.1 Report-Struktur (Template `templates/audit-report.md`) 1. **Executive Summary** (3 Sätze): Server X, Y Findings, Z davon critical/high. Production-ready: ja/nein. 2. **Profile-Snapshot** (aus Audit Tracker) 3. **Applicability-Übersicht** (welche Kategorien/Stufen wurden geprüft) 4. **Findings-Tabelle** (sortiert nach Severity) 5. **Detail-Findings** (eines pro fehlgeschlagenem Check, vollständig) 6. **Remediation-Plan** (Effort-Schätzung pro Finding, Vorschlag-Reihenfolge) 7. **Audit-Metadata** (wer, wann, Skill-Version, Check-Katalog-Version) ### 6.2 Sprache und Adressaten - **GL / KI-Fachgruppe:** Deutsch, Executive Summary + Findings-Tabelle reichen - **Entwickler / Maintainer:** Deutsch oder Englisch, vollständiger Detail-Report - **Externe Auditoren / Compliance:** Englisch, vollständig + Profile-Snapshot --- ## Anti-Patterns (vermeiden) 1. **«Wir machen den Audit, sobald alles fertig ist»** — Audits sind iterativ. Server in Phase 1 auditieren, nicht erst in Phase 3. 2. **«Der Server ist Open Data, also kein Audit nötig»** — falsch. Auch Public-Data-Server haben Tool-Design-, SDK- und Resilienz-Risiken. 3. **«Findings als Issues in GitHub anlegen reicht»** — nein, ohne strukturierte Severity und Effort werden sie ignoriert. Notion-Karte ist Single Source of Truth. 4. **«Ich überspringe `low`-Findings»** — okay, aber dokumentieren als «not-audited», nicht stillschweigend ignorieren. 5. **«Der Check passt nicht ganz, ich mache es einfach so wie ich denke»** — wenn ein Check nicht passt, ist das ein Indikator dass der Katalog erweitert werden muss. Im Skill-Repo ein Issue eröffnen. 6. **«Audit-Report ohne Remediation-Plan»** — wertlos. Findings ohne Fix-Vorschlag werden nicht angegangen. --- ## Eselsbrücken & Metaphern - **Profile zuerst:** *«Ein Audit ohne Profil ist wie ein Arzt ohne Anamnese — falsche Diagnose garantiert.»* - **Applicability-Filter:** *«Bei stdio-only ohne Auth ist Confused Deputy genauso relevant wie Erdbebensicherung in Reykjavík — gar nicht.»* - **Severity-Disziplin:** *«`critical` heisst critical. Wer die Stufe inflationiert, hat irgendwann nur noch `critical`.»* - **Evidenz-Pflicht:** *«Ein Finding ohne `path/to/file.py:42` ist eine Meinung, kein Befund.»* --- ## Qualitätschecklist vor Abschluss eines Audits **Schritt 1 — Profil** - [ ] Alle 6 Pflichtfelder im Audit Tracker gesetzt - [ ] Repo-URL erreichbar - [ ] Audit-Status auf `In Audit` gesetzt **Schritt 2-3 — Vorbereitung** - [ ] Check-Katalog Version notiert - [ ] Applicability-Filter ausgeführt - [ ] Applicability-Report erstellt **Schritt 4 — Ausführung** - [ ] Alle anwendbaren Checks abgearbeitet (kein Skip ohne Begründung) - [ ] Checks in Severity-Reihenfolge ausgeführt (`critical` zuerst) - [ ] Pro Check Evidenz mit Datei + Zeilen-Referenz dokumentiert **Schritt 5 — Findings** - [ ] Pro fehlgeschlagenem Check ein Finding nach Template - [ ] Effort-Schätzung S/M/L/XL gesetzt - [ ] Tracker-Findings-Anzahl aktualisiert - [ ] Audit-Status auf `Findings dokumentiert` gesetzt **Schritt 6 — Report** - [ ] Executive Summary auf 3 Sätze - [ ] Findings-Tabelle nach Severity sortiert - [ ] Remediation-Plan mit Reihenfolge-Vorschlag - [ ] Audit-Metadata vollständig (Datum, Skill-Version, Katalog-Version) --- ## Versionierung des Check-Katalogs Wenn das PDF aktualisiert wird oder neue Best Practices auftauchen: 1. Im Skill-Repo unter `checks/` neue `.md`-Datei mit nächster ID anlegen 2. `evidence_required` und `applies_when` mit Care befüllen 3. CHANGELOG-Eintrag im Repo-Root 4. Bestehende Server, die schon ein Audit hatten, **nicht automatisch reauditiert** — sondern bei nächstem Refactoring oder geplantem Re-Audit 5. Severity-Änderungen an bestehenden Checks: **immer** Re-Audit bei `critical` oder `high` **Eselsbrücke:** *«Ein neuer Check ist ein neuer Vertrag. Bestehende Audits sind nicht rückwirkend ungültig, aber bei nächstem Audit gilt der neue Katalog.»* --- ## Übergabe & Folge-Skills Nach erfolgreichem Audit: - **Findings als GitHub-Issues** anlegen via [`github-repo`](../github-repo/SKILL.md)-Skill (mit Labels `audit`, `severity:critical`, etc.) - **DSG/Compliance-Findings** als Notion-Karte im Use-Case-Register, falls relevant - **Bei Pattern-Wiederholung** über mehrere Server: ein Reference-Template-MCP-Repo bauen, das alle Best Practices erfüllt, und Server iterativ darauf migrieren
Security Status
Scanned
Passed automated security checks
Related AI Tools
More Grow Business tools you might like
Linear
FreeManaging Linear issues, projects, and teams. Use when working with Linear tasks, creating issues, updating status, querying projects, or managing team workflows.
codex-collab
FreeUse when the user asks to invoke, delegate to, or collaborate with Codex on any task. Also use PROACTIVELY when an independent, non-Claude perspective from Codex would add value — second opinions on code, plans, architecture, or design decisions.
Rails Upgrade Analyzer
FreeAnalyze Rails application upgrade path. Checks current version, finds latest release, fetches upgrade notes and diffs, then performs selective upgrade preserving local customizations.
Asta MCP — Academic Paper Search
FreeDomain expertise for Ai2 Asta MCP tools (Semantic Scholar corpus). Intent-to-tool routing, safe defaults, workflow patterns, and pitfall warnings for academic paper search, citation traversal, and author discovery.
Hand Drawn Diagrams
FreeCreate hand-drawn Excalidraw diagrams, flows, explainers, wireframes, and page mockups. Default to monochrome sketch output; allow restrained color only for page mockups when the user explicitly wants webpage-like fidelity.
Move Code Quality Checker
FreeAnalyzes Move language packages against the official Move Book Code Quality Checklist. Use this skill when reviewing Move code, checking Move 2024 Edition compliance, or analyzing Move packages for best practices. Activates automatically when working