Plan — Phase 2: MCP-SSF v0.1 + /mcp-audit Skill + Public Repo + Dashboard

Overview

Phase 2 des Projekts public-mcp-audits baut die drei Artefakte, die einen Public-Audit-Track ueberhaupt erst tragen: (a) den Standard (MCP-SSF v0.1), (b) das Tool das den Standard auf einen MCP anwendet (/mcp-audit-Skill), (c) die oeffentliche Buehne (Repo + Dashboard + Methodology-Page). Strategisch nicht „eigener Scanner” sondern „eigener Massstab + Orchestrator existierender Tools” — siehe Origin (Research-Synthese R4): der Scanner-Markt ist gesattigt (Snyk hat invariantlabs/mcp-scan akquiriert, AWS hat Sample-Repo, Cisco hat einen), aber niemand published vergleichbare Score-Cards mit publicer Methodologie. Aufwand-Budget ~10-12 halbtage, gestreckt auf 4 Wochen bis 2026-06-15 — passt zwischen av-voice Phase 2 und Welle 4 Open-WebUI-VF.

Problem Frame

Wir wollen Public-MCP-Audits als Vertriebs-Tueroeffner fuer DSGVO-affine KMU bauen (Origin: project-Index). Pilot-Audit mcp-papierkram hat gezeigt, dass unsere eigenen MCPs sauber gebaut sind (0 CRIT, 3 MED — Daily 8/10), aber:

  • Ohne Standard ist die Aussage „X ist sicher” nicht vergleichbar und nicht zitierbar.
  • Mehrere Public-MCP-Scanner existieren bereits, ein eigener waere Late-Mover ohne Differenzierung.
  • OWASP MCP Top 10 existiert (Phase-3-Beta) — eigene Risiko-Liste waere Brand-Konkurrenz.
  • Long-Term-Wert (siehe Marvin-Antwort): A-Grade-Reports gewinnen das EU-AI-Act-Argument im Sales-Call ohne weitere Diskussion; SEO-Authority-Anker fuer spaetere Stufe-3-Produkte (av-audit) ueberhaupt erst verkaufbar; Risiko ist „Marketing-Stunt ohne Adoption”, daher Community-Standard-Pfad statt AV-only.

Loesung: ein vendor-neutrales Scoring-Framework (CC-BY-4.0 Spec, Apache-2.0 Skill), das auf OWASP MCP Top 10 aufsetzt und durch ein lauffaehiges Tooling-Pipeline (mcp-scan + gitleaks + semgrep + trivy + uv audit + custom checks) operationalisiert wird.

Requirements Trace

  • R1. MCP-SSF v0.1 Spec ist publishable: englisch, vendor-neutral, CC-BY-4.0-lizenziert, ~60-80 Controls in 8 Kategorien, mit Profile-Modell P0-P3 (stdio → hosted-multi-tenant). [origin: Research-Synthese R1]
  • R2. Jede SSF-Control ist auf OWASP MCP Top 10 gemappt (kein paralleles Konkurrieren). [origin: R2]
  • R3. /mcp-audit-Skill produziert eine MCP-SSF-Score-Card (Grade A-F + Number 0-100 + Sub-Scores pro Kategorie) durch Orchestrierung von 7 existierenden Tools + 4-5 Custom-Checks. [origin: R4]
  • R4. Skill liefert Markdown-Report im Cure53/ToB-Hybrid-Format mit Findings-ID MCP-SSF-<jahr>-<target-slug>-NN. [origin: R3]
  • R5. Public-Repo agentic-ventures/mcp-security-audits ist Discovery-fahig: README mit Mission, framework/, audits/, dashboard/, security.txt, Contribution-Guidelines, klare Lizenzen.
  • R6. Dashboard auf audits.agenticventures.de zeigt Score-Card pro auditiertem MCP mit History und Last-Audit-Date — automatisch befuelbar aus audits/*.md-Frontmatter.
  • R7. Methodology-Page auf agenticventures.de erklaert das Framework public, mit Beispiel-Report und Re-Audit-Cadence. Ohne diese Seite ist das Dashboard wertlos (Origin R3: Methodik-Public ist Trust-Anker).
  • R8. Pilot-Re-Audit von mcp-papierkram im neuen Framework validiert Kalibrierung — F1-F3 aus Daily-8/10-Audit muessen sinnvoll in der MCP-SSF-Skala landen.

Scope Boundaries

Explicit Out-of-Scope:

  • Re-Audit von mcp-whatsapp + mcp-vf-hosted — Phase 3, nach Pilot-Kalibrierung.
  • Public-Launch + Marketing-Push (Twitter/LinkedIn/Pitch-Deck-Update, Submit zu OWASP-Project-List, Snyk-Advisor, OpenSSF-Scorecard-Integration) — Phase 4, Ziel EU-AI-Act-Stichtag 2026-08-02.
  • Skalierung auf die restlichen ~10 aktiven MCPs — Phase 5, Q3-Q4 2026 mit Quartals-Cadence.
  • Automatisierte CI-Integration des /mcp-audit-Skills in GitHub-Actions fuer jeden Repo — Nice-to-have, nicht in Phase 2.
  • Eigener Scanner-Code fuer Tool-Poisoning oder Rug-Pull-Detection — wir wrappen mcp-scan (jetzt Snyk-owned).
  • Eigene CVE-Database fuer MCP-Schwachstellen — wir nutzen OSV.dev via uv audit + GHSA.
  • Live-Hosted-Audit-Service („as a Service”) — bleibt av-audit (separate Stufe-3-Roadmap).

Implicit Out-of-Scope (zur Klarstellung):

  • Keine neuen Hosting-Setups: Skill laeuft lokal auf Marvins Maschine, Public-Repo auf GitHub (kostenlos), Dashboard als Static-Site (gehostet auf existierender av-website-Pipeline).
  • Keine neuen MCPs anlegen — wir auditieren nur was schon da ist.

Context & Research

Origin Documents

  • Research-Synthese mit allen Quellen + Tooling-Build-vs-Buy-Matrix: report
  • Pilot-Audit-Output (Kalibrierungs-Baseline): 2026-05-papierkram-audit-raw.md
  • Projekt-Index mit Roadmap-Phasen: _index
  • Existing security-audit-Skill (Anker-Punkt fuer wie /mcp-audit andockt): SKILL
  • MCP Best Practices als Quelle fuer Custom-Semgrep-Rules: mcp-best-practices

Relevant Code and Patterns (Vault-intern)

  • intern/capabilities/skills/*/SKILL.md — alle Skills folgen dem gleichen Frontmatter-Schema (id, type=skill, name, description, purpose, required_mcps, required_tools, inputs, outputs, status). Neue Skills bauen darauf auf.
  • intern/capabilities/skills/security-audit/SKILL.md — 13-Phasen-Audit-Pattern. /mcp-audit ist eine engere, automatisierte Variante dessen, nicht ein Ersatz. Beide existieren parallel: security-audit ist das Audit-Skill fuer beliebige Repos/Deploys (Daily 8/10), /mcp-audit ist die orchestrierte, MCP-spezifische Variante mit fixem Output (SSF-Score-Card).
  • assets/customers/ + assets/firma/ — Vault-Konvention fuer statische Assets.
  • extern/outbound/ — wo Public-Facing-Material ausserhalb von Marvins Hand landet. Public-Reports gehen formal hier durch.

Institutional Learnings (intern/wissen)

External References (verifiziert in Research-Synthese)

Konventions-Hinweise aus CLAUDE.md

  • Rule 15: Framework + Public-Reports + Dashboard + Methodology englisch. Vault + Code-Kommentare + Plan deutsch.
  • Rule 18: alle persistenten Notizen in den Vault, nicht in ~/.claude/projects/.../memory/.
  • Rule 22: keine Kunden-Namen in Public-Repo, generisch („SaaS finance MCP”) — Pilot-Re-Audit darf mcp-papierkram als eigenes MCP zeigen.
  • Rule 8: Secret-Pruefung vor jedem Commit — beim Public-Repo besonders kritisch.

Key Technical Decisions

  • Spec-Lizenz CC-BY-4.0, Code-Lizenz Apache-2.0. Rationale: CC-BY erlaubt freies Zitieren + Mappen + Forken der Spec (Adoption-Hebel); Apache-2.0 ist Standard fuer Sec-Tools, hat Patent-Grant. Beide kompatibel mit OWASP-Project-Submission falls wir spaeter gehen.
  • Vendor-neutraler Brand-Name. Spec heisst „MCP Security Scoring Framework (MCP-SSF)” — kein „Agentic Ventures” im Titel. Im README + Frontmatter steht „maintained by Agentic Ventures, contributions welcome”. Begruendung: Adoption durch andere Sec-Firmen ist Brand-Aversiv wenn das Framework wie Marketing-Material aussieht.
  • Alignment mit OWASP MCP Top 10 via Mapping-File, nicht durch Subset/Erweiterung. Jede SSF-Control hat owasp_mcp_ref: MCP01..MCP10 (oder none wenn ueber OWASP hinaus). Mapping-File ist framework/mappings/owasp-mcp-top-10-v3.md mit Versionierung — wenn OWASP v4 publisht, kommt ein neues Mapping-File daneben.
  • Profile-Modell P0-P3 statt strikter Level. P0=local-stdio, P1=local-HTTP, P2=hosted-OAuth, P3=hosted-multi-tenant. Jeder MCP deklariert sein Profil, daran richten sich Anforderungen aus. Begruendung: ein lokaler stdio-MCP braucht andere Sicherheits-Anforderungen als ein Public-OAuth-Endpoint mit Multi-Tenant.
  • Scoring-Algorithmus: gewichtete Sub-Scores → Aggregate (0-100) → Grade (A+/A/B/C/D/F) → Tier (Bronze/Silver/Gold/Platinum). Sub-Scores pro Kategorie, damit Schwaechen sichtbar. Tier-Label nur fuer Marketing („MCP-SSF Gold”), Grade+Number fuer Technical Review.
  • Skill wrappt 7 Tools + 4-5 Custom-Checks, kein eigener Scanner: gitleaks, trufflehog, uv audit (Fallback pip-audit), semgrep (mit mcp-eigenbau.yml Custom-Ruleset), trivy fs, mcp-scan (Snyk-owned), promptfoo (optional, slow). Custom-Checks: Tool-Surface-Inventory, Raw-Tool-Detection, Bind-Address-Sanity, DSGVO-Klassifikation. Begruendung: Pflege-Aufwand bleibt beim Custom-Ruleset und 4-5 Custom-Checks — alles andere ist Subprocess + SARIF.
  • SARIF als Common-Output-Format. Alle Tools schreiben SARIF in /tmp/mcp-audit-<ts>/, Skill merged via sarif-multitool oder Python-Lib sarif-om. SARIF macht GitHub-Code-Scanning-Upload trivial.
  • Dashboard als Static-Site mit Hugo, gehostet auf existierender av-website-Pipeline unter Subdomain audits.agenticventures.de. Begruendung: keine neue Hosting-Komplexitaet, History via git-Snapshots, Score-Cards aus audits/*.md-Frontmatter automatisch generierbar.
  • Findings-ID-Schema fest: MCP-SSF-<jahr>-<target-slug>-NN. Beispiel: MCP-SSF-2026-papierkram-01. Stabil ueber Re-Audits, zitierbar in Disclosure.
  • Custom-Semgrep-Rules in eigenem Repo-Pfad skills/mcp-audit/rules/mcp-eigenbau.yml (im Vault), per Sync-Skript auch in Public-Repo gespiegelt. Begruendung: Vault ist Source of Truth, Public-Spiegelung ist Read-Only-Distribution.
  • Pilot-Re-Audit als Phase-2-Validation-Gate. Wenn mcp-papierkram’s F1-F3 nach neuem Framework NICHT als die richtigen Punktabzuege auftauchen, ist die Spec nicht kalibriert — Spec wird angepasst, dann Re-Audit nochmal. Iteration bis Kalibrierung sitzt.
  • security.txt nach RFC 9116 im Public-Repo Pflicht, mit mailto:security@agenticventures.de. Begruendung: Vulnerability-Disclosure-Channel fuer Externe ist Trust-Signal und Audit-Item zugleich.

Open Questions

Resolved During Planning

  • Sprache: Englisch fuer alles Public, deutsch im Vault. [resolved: CLAUDE.md Rule 15, Brief]
  • AV-Standard vs Community-Standard: Community-Standard mit AV als Hauptautor + Maintainer. CC-BY-4.0 / Apache-2.0. [resolved: Marvins Bestaetigung vor /plan]
  • Tier-Naming: Bronze/Silver/Gold/Platinum (statt Passing/Silver/Gold) — 4 Stufen mit Platinum als Enterprise-Marker. [resolved: Research-Synthese R1]
  • Severity-Skala: 4-Stufen Critical/High/Medium/Low + separate Hardening-Section. Nicht „Informational” (wird ignoriert, siehe R3). [resolved: Brief]
  • Findings-ID-Schema: MCP-SSF-<jahr>-<target-slug>-NN. [resolved: Brief]
  • Plan-Datei-Pfad: intern/projekte/public-mcp-audits/plan.md (Vault-Konvention), nicht docs/plans/... (Codebase-Default). [resolved: Brief]
  • Mapping-Strategie OWASP MCP Top 10: Crossref-File framework/mappings/owasp-mcp-top-10-vN.md, versioniert. [resolved: Brief + R4]

Deferred to Implementation

  • Exakte Control-Liste der 60-80 SSF-Items. Wird beim Schreiben der Spec festgelegt — 8 Kategorien stehen (Auth, Transport, Tool-Surface, Supply-Chain, Secrets, Observability, Privacy, Operational), Detail-Aufteilung beim Schreiben.
  • Genaue Scoring-Gewichte pro Kategorie. Erste Annaeherung: Auth 15%, Transport 8%, Tool-Surface 15%, Supply-Chain 12%, Secrets 10%, Observability 8%, Privacy 10%, Operational 6%, LLM-Specific 8%, Compliance 8% (Summe 100). Wird beim Pilot-Re-Audit kalibriert.
  • Hugo-Theme fuer das Dashboard. Existierendes av-website-Theme als Basis oder eigenes Sub-Theme? Entscheidung beim Schritt 2.5/2.6 — abhaengig davon ob audits.agenticventures.de als Subpath von av-website oder als getrennte Hugo-Site laeuft.
  • SARIF-Merge-Tool: sarif-multitool (Microsoft, npm) vs custom Python (sarif-om-Lib). Entscheidung beim Skill-Bau — sarif-multitool ist mature aber bringt Node-Dependency, sarif-om ist pure Python. Wahrscheinlich sarif-om weil Skill bereits Python-only ist.
  • Custom-Semgrep-Rules-Anzahl initial. Schaetzung 10-15 Rules zum Start, basiert auf MCP-Best-Practices-Doc. Genaue Liste beim Bau.
  • Wo laeuft /mcp-audit automatisiert. Initial nur manuell von Marvin. CI-Integration (in jedem mcp-*-Repo) ist Phase 3+.
  • Public-Repo-Hosting: Standard-GitHub-Org agentic-ventures oder neue Org mcp-security? Wahrscheinlich agentic-ventures/mcp-security-audits zum Start, mit Option spaeter auf mcp-security/audits zu uebersiedeln wenn Adoption groesser wird. Repo-Move via GH-Redirect ist verlustfrei.
  • Wann wird das audits/ Verzeichnis im Public-Repo befuellt. Nach Pilot-Re-Audit liegt der erste Report drin. Phase 3 fuellt nach.

High-Level Technical Design

Diese Skizze illustriert den intendierten Aufbau und ist Directional Guidance fuer Review, nicht Implementierungs-Spec. Der implementierende Agent behandelt das als Kontext.

Komponenten-Beziehung

graph TB
    Spec["MCP-SSF Spec v0.1<br/>(English, CC-BY-4.0)<br/>framework/mcp-ssf-v0.1.md"]
    Mapping["OWASP-MCP-Top-10 Mapping<br/>framework/mappings/owasp-mcp-top-10-v3.md"]
    Skill["/mcp-audit Skill<br/>(Python, Apache-2.0)<br/>intern/capabilities/skills/mcp-audit/"]
    SemgrepRules["mcp-eigenbau.yml<br/>Custom Semgrep Ruleset"]
    PilotV2["Pilot Re-Audit mcp-papierkram<br/>audits/2026-05-papierkram-v2.md"]
    PublicRepo["Public Repo<br/>agentic-ventures/mcp-security-audits<br/>(GitHub)"]
    Dashboard["Dashboard<br/>audits.agenticventures.de<br/>(Hugo, statisch)"]
    Methodology["Methodology-Page<br/>agenticventures.de/security-audits/methodology"]

    Spec --> Mapping
    Spec --> Skill
    Skill --> SemgrepRules
    Skill --> PilotV2
    Spec --> PublicRepo
    Mapping --> PublicRepo
    PilotV2 --> PublicRepo
    PublicRepo --> Dashboard
    Spec --> Methodology

Skill-Pipeline (Datenfluss /mcp-audit <target-path>)

graph LR
    Input["Target-Repo-Pfad<br/>+ Profil P0-P3<br/>+ Modus schnell/tief"]
    Discovery["Discovery<br/>Tool-Surface-Inventory<br/>+ Stack-Detect"]
    Parallel["Parallel-Spawn<br/>7 Tools + 4-5 Custom-Checks"]
    SARIF["SARIF-Merge<br/>+ Severity-Mapping<br/>+ Dedup"]
    Scoring["Scoring<br/>Sub-Scores → Aggregate<br/>→ Grade → Tier"]
    Output["Outputs<br/>raw.md + draft.md<br/>+ score.json + baseline.json"]

    Input --> Discovery
    Discovery --> Parallel
    Parallel --> SARIF
    SARIF --> Scoring
    Scoring --> Output

Datei-Layout (was entsteht wo)

agentic-ventures/ (Vault, intern, deutsch)
├── intern/projekte/public-mcp-audits/
│   ├── _index.md                              # Phase-Tracking
│   ├── plan.md                                # diese Datei
│   ├── session-prompt-01.md                   # Pilot (done)
│   └── audits/
│       ├── 2026-05-papierkram-audit-raw.md   # Daily 8/10 (done)
│       ├── 2026-05-papierkram-audit-draft.md # interner Draft (done)
│       └── 2026-06-papierkram-v2-raw.md      # Pilot-Re-Audit Phase 2
├── intern/capabilities/skills/mcp-audit/      # NEU
│   ├── SKILL.md                               # Skill-Definition (deutsch)
│   ├── pyproject.toml                         # Python-Package
│   ├── src/mcp_audit/
│   │   ├── __init__.py
│   │   ├── orchestrator.py                    # main, parallel-spawn
│   │   ├── discovery.py                       # Stack-Detect, Profil-Wahl
│   │   ├── wrappers/                          # Subprocess-Wrapper pro Tool
│   │   │   ├── gitleaks.py
│   │   │   ├── trufflehog.py
│   │   │   ├── uv_audit.py
│   │   │   ├── semgrep.py
│   │   │   ├── trivy.py
│   │   │   ├── mcp_scan.py
│   │   │   └── promptfoo.py
│   │   ├── checks/                            # eigene Custom-Checks
│   │   │   ├── tool_surface_inventory.py
│   │   │   ├── raw_tool_detection.py
│   │   │   ├── bind_address_sanity.py
│   │   │   └── dsgvo_classification.py
│   │   ├── sarif_merge.py                     # via sarif-om
│   │   ├── scoring.py                         # Sub-Scores → Aggregate → Grade
│   │   └── report.py                          # Markdown-Generation
│   ├── rules/mcp-eigenbau.yml                 # Custom Semgrep Ruleset
│   ├── templates/                             # Report-Templates
│   │   ├── raw-report.md.j2
│   │   ├── public-draft.md.j2
│   │   └── score-card.json.j2
│   └── tests/
│       ├── test_orchestrator.py
│       ├── test_scoring.py
│       ├── test_sarif_merge.py
│       └── fixtures/                          # Mini-MCP-Repos als Test-Targets
├── intern/runs/
│   └── 2026-06-08-mcp-audit-papierkram-v2/   # Pilot-Re-Audit-Lauf (Datum-Platzhalter)
│       ├── report.md
│       └── baseline.json
└── intern/wissen/prozesse/
    └── public-mcp-audit-pattern.md            # NEU (Cadence, Embargo, Repo-Struktur)

~/source/mcp-security-audits/ (Public Repo, English) — NEU
├── README.md                                   # Mission, Quick-Start, Lizenzen
├── LICENSE-spec                                # CC-BY-4.0
├── LICENSE-code                                # Apache-2.0
├── .well-known/security.txt                    # RFC 9116
├── CONTRIBUTING.md
├── CODE_OF_CONDUCT.md
├── framework/
│   ├── mcp-ssf-v0.1.md                         # die Spec (~30 Seiten)
│   ├── controls/
│   │   ├── 01-auth.md                          # Domain 1, je Control eine Section
│   │   ├── 02-transport.md
│   │   ├── 03-tool-surface.md
│   │   ├── 04-supply-chain.md
│   │   ├── 05-secrets.md
│   │   ├── 06-observability.md
│   │   ├── 07-privacy.md
│   │   ├── 08-llm-specific.md
│   │   ├── 09-operational.md
│   │   └── 10-compliance.md
│   ├── mappings/
│   │   └── owasp-mcp-top-10-v3.md              # Crossref SSF-Control → OWASP-MCP-ID
│   ├── profiles.md                             # P0-P3 Definition
│   └── scoring.md                              # Algorithmus + Grade-Mapping
├── audits/
│   └── 2026-06-mcp-papierkram-v1.md            # erster Public-Audit-Report
├── dashboard/                                  # Hugo-Source (oder Submodule auf av-website)
│   ├── content/
│   │   ├── _index.md                           # Landing
│   │   └── audits/papierkram.md                # Score-Card pro MCP
│   ├── data/scores.csv                         # ein Row pro MCP × Audit
│   └── layouts/                                # Score-Card-Template
└── tools/
    ├── score-to-dashboard.py                   # CSV-Update aus audits/
    └── sync-rules.sh                           # Spiegel mcp-eigenbau.yml aus Vault

agenticventures.de (av-website Hugo, English Subdir) — Schritt 2.7
└── content/en/security-audits/
    ├── _index.md
    └── methodology.md                           # Public-Methodology-Page

Scoring-Algorithmus (Skizze)

Per Kategorie K:
  raw_score_K = Σ (control_pass * weight_within_K) / Σ (weight_within_K)
  sub_score_K = round(raw_score_K * 100)
 
Aggregate:
  total = Σ (sub_score_K * category_weight_K)
 
Grade:
  total ≥ 95 → A+
  total ≥ 85 → A
  total ≥ 75 → B
  total ≥ 65 → C
  total ≥ 50 → D
  else       → F
 
Tier:
  Grade A+/A → Platinum (wenn 0 Critical-Findings, 0 High-Findings) sonst Gold
  Grade B    → Silver
  Grade C    → Bronze
  Grade D/F  → kein Tier (Score wird trotzdem published)
 
Critical-Floor:
  Jedes Critical-Finding cappt Grade bei C, egal wie hoch der Score sonst.
  Jedes High-Finding cappt Grade bei B.

Implementation Units

Unit 1: MCP-SSF v0.1 Spec schreiben

  • Unit 1

Goal: Standard-Dokument schreiben, das publishable und zitierbar ist.

Requirements: R1, R2 (Mapping ist Unit 2)

Dependencies: Keine. Erstes Unit, alles andere baut darauf.

Files (Public-Repo, English):

  • Create: framework/mcp-ssf-v0.1.md — Spec-Hauptdokument (~30 Seiten Markdown, Executive Summary, Profile-Modell, 10 Kategorien-Index, Scoring-Algorithmus, Glossary)
  • Create: framework/profiles.md — P0-P3 Definition mit Anwendungs-Matrix (welche Anforderungen pro Profil verbindlich)
  • Create: framework/scoring.md — Algorithmus-Detail mit Grade-Mapping + Critical/High-Floor-Regeln
  • Create: framework/controls/01-auth.md bis framework/controls/10-compliance.md — 10 Files, je Kategorie eine Datei mit ~6-8 Controls im CIS-Item-Format

Approach:

  • Pro Control das CIS-Item-Format: id (z.B. SSF-AUTH-01), title, applies_to_profile (P0..P3), rationale, audit_steps, remediation, references, automatable (true/false), owasp_mcp_ref (MCP01..MCP10 oder none)
  • 10 Kategorien aus Research-Synthese (urspruenglich 8 + LLM-Specific + Compliance fuer DSGVO-Trennung)
  • 60-80 Controls insgesamt (Schaetzung: ~7 pro Kategorie)
  • Spec-Header mit Version, Datum, Lizenz CC-BY-4.0, Maintainer-Kontakt
  • Cross-Refs auf konkrete Forschungs-Quellen aus Research-Synthese (z.B. Tool-Poisoning → Invariant Labs, Lethal Trifecta → Willison, Cost-Bombs → arxiv 2601.10955)

Patterns to follow:

  • CIS-Benchmark-Item-Layout (Description/Rationale/Audit-Command/Remediation/References) — siehe research-mcp-ssf R1
  • Markdown-Struktur wie Cure53-Public-Reports (klare Section-Hierarchie, keine HTML-Inlines)

Test scenarios:

  • Test expectation: none — Markdown-Spec ohne ausfuehrbares Verhalten, Validierung erfolgt durch (a) Lint via markdownlint, (b) Cross-Ref-Check (jeder SSF-XXX-NN-Control referenziert in mappings/owasp-mcp-top-10-v3.md), (c) Pilot-Re-Audit Unit 4

Verification:

  • markdownlint framework/**/*.md passt ohne Errors
  • Jeder Control hat alle Pflichtfelder (validierbar via simple Python-Script)
  • Spec-Hauptdokument enthaelt Lizenz-Header CC-BY-4.0
  • Profile-Definitionen P0-P3 sind disjunkt und decken die realistischen MCP-Deployment-Pattern ab (lokaler stdio, lokaler HTTP, hosted-oauth-single-tenant, hosted-multi-tenant)

Aufwand: 2-3 halbtage


Unit 2: OWASP-MCP-Top-10-Mapping

  • Unit 2

Goal: Crossref-Tabelle die jede SSF-Control auf eine OWASP-MCP-Top-10-Risk mappt, oder explizit als none markiert (Beyond-OWASP).

Requirements: R2

Dependencies: Unit 1 (Spec muss stehen, Controls muessen IDs haben)

Files:

  • Create: framework/mappings/owasp-mcp-top-10-v3.md — Mapping-Tabelle + Erklaerungs-Text

Approach:

  • Header: OWASP-MCP-Top-10-Version (3-Beta-Stand 2026-05-18), URL, Datum
  • Tabelle: pro OWASP-MCP-ID (MCP01..MCP10) eine Section, darin Liste der SSF-Controls die diese Risk adressieren
  • Beyond-OWASP-Section: SSF-Controls die OWASP nicht abdeckt (owasp_mcp_ref: none) — z.B. Lethal-Trifecta-Audit, Cost-Bomb-Gate, Cache-Sharing-Disclosure, Tool-Description-Diff-Tracking
  • Reverse-Index ergaenzen: pro SSF-Control die zugeordnete OWASP-MCP-ID (steht eh schon im Frontmatter jeder Control aus Unit 1)
  • Versionierungs-Hinweis: bei OWASP-Update wird owasp-mcp-top-10-v4.md daneben gelegt, alte Mapping bleibt fuer Audit-Reproduzierbarkeit

Patterns to follow:

  • ASVS-Mapping-Style: Tabellen-basiert, Source-of-Truth-Verweis
  • ATT&CK-zu-CIS-Mapping als Inspiration (NIST hat das gemacht — siehe csrc.nist.gov)

Test scenarios:

  • Test expectation: low — Mapping ist statische Tabelle, Validation erfolgt via Cross-Ref-Check-Skript:
    • Happy path: jede SSF-Control-ID kommt entweder in der OWASP-MCP-NN-Section oder in der Beyond-OWASP-Section vor (kein Doppel-Mapping, keine Leerstellen)
    • Edge case: SSF-Control mit owasp_mcp_ref: none muss in Beyond-OWASP-Section auftauchen

Verification:

  • Python-Cross-Ref-Skript: jede SSF-XXX-NN aus framework/controls/*.md ist in Mapping-File abgedeckt; jede OWASP-MCP-ID hat mindestens eine zugeordnete Control
  • Beyond-OWASP-Section liefert das Differential-Argument: „MCP-SSF deckt N Items ab, die OWASP nicht hat — siehe …”

Aufwand: 0.5 halbtag


Unit 3: /mcp-audit Skill bauen (Orchestrator + Wrappers + Custom-Checks)

  • Unit 3

Goal: Lauffaehiger Skill, der /mcp-audit <target-repo> nimmt, 7 Tools + 4-5 Custom-Checks parallel spawnt, SARIF merged, MCP-SSF-Score-Card produziert.

Requirements: R3, R4

Dependencies: Unit 1 (Spec definiert Scoring-Algorithmus und Control-IDs)

Execution note: Test-first fuer scoring.py (Algorithmus muss exakt sein, gut testbar mit Fixtures). Custom-Checks ebenfalls test-first wo Logik nicht-trivial ist. Wrapper sind Subprocess-Glue, da reicht Smoke-Test.

Files (Vault, deutsch fuer Kommentare):

  • Create: intern/capabilities/skills/mcp-audit/SKILL.md — Skill-Definition Frontmatter + Trigger + Inputs/Outputs
  • Create: intern/capabilities/skills/mcp-audit/pyproject.toml — Python-Package mit Deps (sarif-om, click, jinja2)
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/orchestrator.py — main, parallel-spawn, Modus-Handling (schnell/tief)
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/discovery.py — Stack-Detect (Python/Node/…), Profil-Auto-Detect (stdio/HTTP/oauth basierend auf _index.md)
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/gitleaks.py — Subprocess-Wrapper, schreibt SARIF nach /tmp/mcp-audit-<ts>/gitleaks.sarif
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/trufflehog.py
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/uv_audit.pyuv audit --output-format json, mappt auf SARIF
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/semgrep.py — semgrep --config=auto --config=rules/mcp-eigenbau.yml --sarif
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/trivy.pytrivy fs --format sarif
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/mcp_scan.pyuvx mcp-scan@latest --json, JSON→SARIF-Transform
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/wrappers/promptfoo.py — optional, nur im tief-Modus, langsam
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/checks/tool_surface_inventory.py — AST-Scan auf @mcp.tool + Hash-Snapshot fuer Rug-Pull-Diff
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/checks/raw_tool_detection.py — Pattern-Match auf raw_* Tool-Namen + dict-Input ohne Pydantic
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/checks/bind_address_sanity.py — grep auf host="0.0.0.0" + Auth-Provider-Check
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/checks/dsgvo_classification.py — Frontmatter-Scan + Custom-Semgrep-Rules fuer PII-Logging
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/sarif_merge.pysarif-om Lib, dedup ueber (rule_id, location-uri, message-hash)
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/scoring.py — Sub-Score → Aggregate → Grade → Tier nach Spec
  • Create: intern/capabilities/skills/mcp-audit/src/mcp_audit/report.py — Jinja2-Templates, generiert raw.md + draft.md + score.json + baseline.json
  • Create: intern/capabilities/skills/mcp-audit/rules/mcp-eigenbau.yml — Custom Semgrep Ruleset (Initial ~10-15 Rules aus MCP-Best-Practices)
  • Create: intern/capabilities/skills/mcp-audit/templates/raw-report.md.j2
  • Create: intern/capabilities/skills/mcp-audit/templates/public-draft.md.j2
  • Create: intern/capabilities/skills/mcp-audit/templates/score-card.json.j2
  • Create: intern/capabilities/skills/mcp-audit/tests/test_scoring.py
  • Create: intern/capabilities/skills/mcp-audit/tests/test_sarif_merge.py
  • Create: intern/capabilities/skills/mcp-audit/tests/test_orchestrator.py
  • Create: intern/capabilities/skills/mcp-audit/tests/test_raw_tool_detection.py
  • Create: intern/capabilities/skills/mcp-audit/tests/fixtures/mini-mcp-clean/ — minimaler FastMCP-Test-Target, Score sollte hoch sein
  • Create: intern/capabilities/skills/mcp-audit/tests/fixtures/mini-mcp-broken/ — bewusst kaputter Test-Target mit bekannten Findings (Raw-Tools, Bind 0.0.0.0, hardcoded Secret), Score sollte niedrig sein

Approach:

  • Architektur entspricht Skizze in Research-Synthese R4
  • Sub-Process-Wrappers sind dumm: Tool-Aufruf, SARIF-File einlesen, an Merger weitergeben. Fehler → Tool wird als „nicht-ausgefuehrt” markiert im Report, kein Crash
  • Custom-Checks sind Python-Module mit einheitlichem Interface: run(target_path: Path, profile: str) -> list[SarifResult]
  • Discovery autodetected: Profil aus _index.md-Frontmatter (hosting-Feld), oder per CLI-Flag --profile P2 overridebar
  • Modus schnell (default): nur Tools 1-6 (skip promptfoo) + Custom-Checks, Konfidenz-Gate 8/10. Modus tief: alle 7 Tools + promptfoo, Gate 2/10
  • Output: gleicher Pattern wie security-audit-Skill — raw.md, public-draft.md, baseline.json. Plus neu: score-card.json mit Grade/Number/Sub-Scores
  • Skill registriert sich in intern/capabilities/skills/_index.md mit Trigger-Phrasen

Patterns to follow:

  • SKILL — Frontmatter-Layout, Modus-Handling, Run-Log-Konvention
  • mcp-papierkram/src/mcp_papierkram/server.py — Python-Code-Stil im Vault
  • mcp-best-practices — Quelle fuer Semgrep-Rules

Test scenarios:

  • Happy path (scoring.py):
    • Eingabe: leere Findings-Liste fuer P2-MCP → Score 100, Grade A+, Tier Platinum
    • Eingabe: 3 Medium-Findings ueber 2 Kategorien fuer P2-MCP → Score ~75-85, Grade B, Tier Silver
    • Eingabe: 1 Critical-Finding → Grade max C trotz Rest-Score 95+, Tier nicht zugeteilt
    • Eingabe: 1 High-Finding (kein Critical) → Grade max B
  • Edge case (scoring.py):
    • Eingabe: Findings ueber alle 10 Kategorien gleichverteilt → Aggregate gewichtet korrekt
    • Eingabe: 0 Findings → Score 100 nur wenn alle automatable Controls dieser Profile bestanden, sonst niedriger
    • Eingabe: Profil P0 (stdio-lokal) → Controls die nur fuer P2/P3 verbindlich sind, werden ignoriert
  • Error path (scoring.py):
    • Eingabe: SARIF mit unbekannter Severity → Mapping-Fehler, Skill bricht ab mit klarem Hinweis
    • Eingabe: SARIF ohne ruleId → Skill skippt das Item, loggt Warning
  • Integration (orchestrator):
    • Lauf gegen fixtures/mini-mcp-clean → Score ≥ 85, Grade A oder besser, keine Critical/High
    • Lauf gegen fixtures/mini-mcp-broken → Score < 50, mindestens 2 High-Findings (Raw-Tools, 0.0.0.0-Bind), mindestens 1 Critical (hardcoded Secret)
    • Lauf mit --profile P0 gegen fixtures/mini-mcp-broken → Score hoeher als mit --profile P2 (weil weniger Controls anwendbar)
    • Lauf bricht ab und gibt Exit-Code 1 wenn gitleaks nicht im PATH ist und Modus schnell (Pflicht-Tool im schnellen Modus)
  • SARIF-Merge:
    • Eingabe: gleicher Finding (gleicher rule_id, gleiche Location) von zwei Tools → wird einmal im Output gemerged
    • Eingabe: SARIF mit verschiedenen runs[] → korrekt zusammengefuehrt
    • Eingabe: SARIF-Schema-Verletzung → klare Error-Message, Skill failt sauber

Verification:

  • pytest intern/capabilities/skills/mcp-audit/tests/ gruen
  • uv run mcp-audit ./intern/capabilities/skills/mcp-audit/tests/fixtures/mini-mcp-clean liefert Score-Card mit Grade A+ und schreibt 4 Output-Files (raw.md, public-draft.md, score.json, baseline.json)
  • uv run mcp-audit ./intern/capabilities/skills/mcp-audit/tests/fixtures/mini-mcp-broken liefert Score-Card mit Grade D oder schlechter und mindestens 3 Findings ueber 2+ Severities
  • Skill ist in intern/capabilities/skills/_index.md registriert mit Trigger-Phrasen

Aufwand: 3-4 halbtage


Unit 4: Pilot-Re-Audit mcp-papierkram mit MCP-SSF (Kalibrierungs-Gate)

  • Unit 4

Goal: Den Pilot-Audit von mcp-papierkram mit dem fertigen /mcp-audit-Skill nochmal laufen lassen, das Ergebnis gegen den Daily-8/10-Lauf vom 2026-05-18 vergleichen. Validiert Spec + Skill in einem Rutsch. Wenn F1-F3 nicht sinnvoll in der MCP-SSF-Skala landen → Spec/Skill anpassen.

Requirements: R8

Dependencies: Unit 1 (Spec), Unit 3 (Skill)

Files:

  • Create: intern/runs/2026-06-08-mcp-audit-papierkram-v2/report.md — Lauf-Log (Datum Platzhalter, beim Anlegen auf Ist-Tag setzen)
  • Create: intern/runs/2026-06-08-mcp-audit-papierkram-v2/baseline.json — Score-Card-Output
  • Create: intern/projekte/public-mcp-audits/audits/2026-06-papierkram-v2-raw.md — neuer Raw-Report
  • Modify: intern/projekte/public-mcp-audits/_index.md — Status-Update auf Phase-2-Kalibrierung-done

Approach:

  • Skill-Lauf: mcp-audit ~/source/mcps/mcp-papierkram --profile P0 --mode tief. Profile P0 weil mcp-papierkram primaer stdio/lokal-HTTP ist (kein Multi-Tenant Hosted-Pfad direkt — gehostet wird es nur via mcp-vf-hosted).
  • Vergleich gegen Daily-8/10-Lauf:
    • F1 (uv.lock fehlt) → soll in MCP-SSF unter Supply-Chain-Kategorie als SSF-Control-Treffer auftauchen, Severity MED, automatable=true
    • F2 (Raw-Tools default on) → soll unter Tool-Surface als Control-Treffer, Severity MED, automatable=true
    • F3 (HTTP-Bind ohne Auth-Sanity) → soll unter Transport oder Tool-Surface, Severity MED, automatable=true
  • Kalibrierungs-Check: wenn F1-F3 nicht auftauchen oder mit falscher Severity → entweder Spec-Control fehlt (Spec anpassen) oder Custom-Check fehlt (Skill anpassen). Iterieren bis sitzt.
  • Erwarteter Grade-Range fuer mcp-papierkram nach v2: B oder besser (3 MED, 0 CRIT, 0 HIGH, eigentlich saubere Codebase). Wenn deutlich schlechter, Spec ist zu hart kalibriert.

Patterns to follow:

  • report als Vergleichs-Baseline
  • Run-Log-Schema aus _meta/schemas

Test scenarios:

  • Test expectation: integration — der Lauf IST der Test
  • Happy path: F1, F2, F3 tauchen alle mit korrekter Severity und Kategorie in v2-Report auf, Grade ist B oder besser, Re-Audit-Baseline ist mit Daily-8/10-Baseline kompatibel (gleiche IDs lassen sich nachverfolgen)
  • Edge case: TENTATIVE-Findings aus Daily-Lauf (T1 data:dict ohne Pydantic, T2 PDF-Size-Cap) tauchen im tief-Modus als zusaetzliche Findings auf, im schnell-Modus nicht
  • Error path: wenn ein Pflicht-Tool fehlt, Skill bricht sauber ab und sagt was zu installieren ist

Verification:

  • v2-Raw-Report ist generiert, MCP-SSF-Score-Card im Frontmatter
  • F1-F3 sind im Report mit korrekten SSF-Control-IDs verlinkt
  • Grade im erwarteten Range (B oder besser fuer Profil P0)
  • intern/projekte/public-mcp-audits/_index.md Status auf „Phase 2 Kalibrierung done” gesetzt

Aufwand: 1 halbtag (Lauf 1-2h, Anpassungs-Iterationen evtl. 1-2 Runden)


Unit 5: Public-Repo agentic-ventures/mcp-security-audits anlegen

  • Unit 5

Goal: GitHub-Repo angelegt, Struktur steht, erste Files committed, Lizenzen + security.txt + Contribution-Guidelines vorhanden.

Requirements: R5

Dependencies: Unit 1 (Spec muss da sein), Unit 2 (Mapping), Unit 4 (erster Pilot-Report)

Files (alles im neuen Public-Repo ~/source/mcp-security-audits/):

  • Create: README.md — Mission („vendor-neutral security scoring framework for MCP servers, maintained by Agentic Ventures”), Quick-Start, Badge-Anleitung, Lizenz-Hinweise, Roadmap-Link
  • Create: LICENSE-spec — CC-BY-4.0
  • Create: LICENSE-code — Apache-2.0
  • Create: .well-known/security.txt — RFC 9116 (Contact: mailto:security@agenticventures.de, Expires: +12 Monate, Preferred-Languages: en,de, Canonical: https://github.com/agentic-ventures/mcp-security-audits/.well-known/security.txt)
  • Create: CONTRIBUTING.md — wie Beitragen, Stil-Regeln, PR-Prozess
  • Create: CODE_OF_CONDUCT.md — Contributor Covenant v2.1 (Standard)
  • Create: framework/ — Files aus Unit 1 + 2 (Spec, Profile, Scoring, Controls, Mapping)
  • Create: audits/2026-06-mcp-papierkram-v1.md — erster Public-Audit-Report (aus Unit 4, redacted/cleaned)
  • Create: tools/sync-rules.sh — Bash-Script, das mcp-eigenbau.yml aus dem Vault hierhin spiegelt
  • Create: .github/workflows/markdown-lint.yml — CI fuer Markdown-Konsistenz
  • Create: .github/workflows/cross-ref-check.yml — CI fuer Spec/Mapping-Konsistenz (Python-Skript aus Unit 1/2)
  • Create: .github/ISSUE_TEMPLATE/audit-report.md — Template fuer extern eingereichte Audits
  • Create: .github/ISSUE_TEMPLATE/control-feedback.md — Template fuer Feedback auf einzelne Controls
  • Modify: intern/firma/web-properties.md — neue Property audits.agenticventures.de eintragen

Approach:

  • Repo neu anlegen unter agentic-ventures-Org auf GitHub, public, Apache-2.0/CC-BY-4.0-Dual-License
  • Standard-Repo-Hygiene: branch-protection auf main (require-pr-review), Dependabot enabled fuer den tools/-Pfad
  • Bevor erster Push: gitleaks lokal laufen lassen (Behavior Rule 8 — Secret-Pruefung)
  • Kundennamen-Check (Rule 22): grep -ri "vibefactory\|vibe.factory\|becker\|wohrle\|erlei" ueber Public-Repo-Inhalt → muss 0 Treffer liefern
  • README mit klarem „Why this exists”-Block, der den Standard-Slot-Argument macht (siehe Origin Bottom-Line)
  • security.txt mit Expires-Datum 2027-05-18

Patterns to follow:

  • Public-OSS-Repo-Hygiene wie OWASP-Projekte (CONTRIBUTING + CODE_OF_CONDUCT + ISSUE_TEMPLATE + SECURITY-Section in README)
  • OpenSSF-Best-Practices-Badge-Kriterien als Checkliste (https://www.bestpractices.dev/de/criteria/0)

Test scenarios:

  • Happy path: Repo clonebar, markdownlint durch CI gruen, Cross-Ref-Check durch CI gruen
  • Edge case: Kein Datei mit visibility: internal ist im Public-Repo (grep -r "visibility: internal" . liefert 0)
  • Error path: Pre-Push-Gitleaks findet keine Secrets (Exit-Code 0)
  • Integration: ein extern eingereichtes Issue mit dem audit-report-Template ist parsebar und kategorisierbar

Verification:

  • Repo public auf https://github.com/agentic-ventures/mcp-security-audits
  • README rendert mit Mission-Statement, Quick-Start, Lizenz-Hinweise
  • .well-known/security.txt ist via curl https://raw.githubusercontent.com/agentic-ventures/mcp-security-audits/main/.well-known/security.txt abrufbar
  • CI passes (markdownlint + cross-ref-check)
  • Lokal: gitleaks detect --source ~/source/mcp-security-audits liefert keine Findings

Aufwand: 2 halbtage


Unit 6: Dashboard-Skelett audits.agenticventures.de

  • Unit 6

Goal: Statische Dashboard-Site mit Score-Card-Page-Template, History-View, automatischer Befuellung aus audits/*.md-Frontmatter.

Requirements: R6

Dependencies: Unit 5 (Public-Repo + Pilot-Audit-Report im audits/-Ordner)

Files:

  • Create: ~/source/mcp-security-audits/dashboard/config.toml — Hugo-Config (oder Submodul-Ref auf av-website wenn als Subpath gehostet)
  • Create: ~/source/mcp-security-audits/dashboard/content/_index.md — Landing („MCP Security Audits — Public Score-Cards”)
  • Create: ~/source/mcp-security-audits/dashboard/content/methodology.md — Kurzform-Methodology (Detail-Link auf agenticventures.de/security-audits/methodology aus Unit 7)
  • Create: ~/source/mcp-security-audits/dashboard/content/audits/mcp-papierkram.md — Score-Card-Page fuer das erste auditierte MCP
  • Create: ~/source/mcp-security-audits/dashboard/data/scores.csv — ein Row pro MCP × Audit-Date (mcp,audit_date,profile,score,grade,tier,crit,high,med,low,report_path)
  • Create: ~/source/mcp-security-audits/dashboard/layouts/_default/single.html — Score-Card-Template (Grade-Badge gross, Number-Score, Sub-Scores pro Kategorie als kleine Bars, History-Tabelle, Last-Audit-Date prominent, Methodology-Link)
  • Create: ~/source/mcp-security-audits/dashboard/layouts/_default/list.html — Uebersichts-Tabelle aller auditierten MCPs sortiert nach letztem Audit-Datum
  • Create: ~/source/mcp-security-audits/dashboard/assets/css/main.css — minimal, Brand-Farben analog av-website
  • Create: ~/source/mcp-security-audits/tools/score-to-dashboard.py — liest audits/*.md-Frontmatter, schreibt dashboard/data/scores.csv, erzeugt dashboard/content/audits/<mcp>.md falls fehlt
  • Create: ~/source/mcp-security-audits/.github/workflows/dashboard-build.yml — Hugo-Build + Deploy auf Cloudflare Pages oder GH-Pages (Entscheidung beim Bau, default Cloudflare Pages weil av-website auch dort)
  • Modify: intern/capabilities/aws/_index.md oder intern/firma/web-properties.md — DNS-Eintrag fuer audits.agenticventures.de dokumentieren

Approach:

  • Hugo wegen av-website-Konvention (siehe web-properties)
  • Theme: minimal eigenes, keine Newsletter-Floskeln, Anlehnung an Mozilla-Observatory-Look (Grade-Badge gross, Number daneben, Sub-Scores als horizontale Bars, klare Typografie)
  • Score-Card-Page rendert aus Markdown-Frontmatter:
    ---
    mcp: mcp-papierkram
    audit_date: 2026-06-XX
    audit_id: MCP-SSF-2026-papierkram-01
    profile: P0
    framework_version: v0.1
    score: 87
    grade: A
    tier: Gold
    sub_scores:
      auth: 90
      transport: 85
      tool_surface: 80
      supply_chain: 75
      secrets: 100
      observability: 90
      privacy: 95
      llm_specific: 85
      operational: 80
      compliance: 90
    findings:
      critical: 0
      high: 0
      medium: 3
      low: 0
    history:
      - {date: 2026-06-XX, score: 87, grade: A}
    next_audit_due: 2027-06-XX
    ---
  • tools/score-to-dashboard.py liest die Audit-Reports und generiert/aktualisiert die Score-Card-Pages — Idempotent
  • DNS: audits.agenticventures.de als CNAME auf Cloudflare Pages oder als Subpfad in av-website (default Subdomain weil saubere Trennung)

Patterns to follow:

  • Mozilla Observatory Score-Card-Layout
  • av-website Hugo-Konvention fuer URL-Struktur + CSS-Custom-Properties
  • securityheaders.com Pattern fuer „Re-Test Button” → bei uns „Re-Audit Schedule” Link

Test scenarios:

  • Happy path: hugo --minify baut ohne Errors, score-to-dashboard.py generiert valide scores.csv aus audits/2026-06-mcp-papierkram-v1.md
  • Edge case: Score-Card-Page ohne history-Feld (erster Audit) rendert ohne Tabelle, mit „first audit” Hint
  • Edge case: Score-Card-Page mit gleichem Datum-Eintrag in History dedupliziert
  • Error path: Audit-Report mit fehlendem Score im Frontmatter → score-to-dashboard.py failt mit klarer Error-Message, deployed nichts
  • Integration: lokal hugo server, Score-Card-Page fuer mcp-papierkram zeigt Grade A + Number 87 + 10 Sub-Score-Bars + Last-Audit-Date + Methodology-Link

Verification:

  • Site rendert lokal via hugo server ohne Errors
  • Score-Card-Page fuer mcp-papierkram zeigt alle Frontmatter-Felder
  • GitHub-Workflow dashboard-build.yml deployed auf Cloudflare Pages bei Push auf main
  • audits.agenticventures.de aufrufbar nach DNS-Setup
  • Visuelle Pruefung: Grade-Badge erkennbar, Methodology-Link funktioniert (auch wenn Ziel Unit 7 noch nicht da ist — dann 404 ist akzeptabel)

Aufwand: 2 halbtage


Unit 7: Methodology-Page auf av-website

  • Unit 7

Goal: Vollstaendige Public-Erklaerung des Frameworks auf agenticventures.de/security-audits/methodology — Trust-Anker fuer das Dashboard.

Requirements: R7

Dependencies: Unit 1 (Spec), Unit 5 (Public-Repo fuer Cross-Links)

Files:

  • Create: ~/source/av-website/content/en/security-audits/_index.md — Section-Index („Security Audits”)
  • Create: ~/source/av-website/content/en/security-audits/methodology.md — die Hauptseite
  • Create: ~/source/av-website/content/en/security-audits/example-report.md — annotierter Beispiel-Report (basierend auf Pilot-Re-Audit)
  • Create: ~/source/av-website/content/en/security-audits/faq.md — FAQ („Why MCP-SSF and not OWASP MCP Top 10?” → wir alignen, MCP-SSF operationalisiert. „How often is an MCP re-audited?” → 12 Monate. „What does the Tier mean?” → Tabelle. „Can I submit my MCP for audit?” → Issue-Template-Link)
  • Modify: ~/source/av-website/config.toml — Menu-Eintrag „Security Audits” hinzufuegen
  • Modify: intern/firma/web-properties.md — Property agenticventures.de/security-audits/methodology eintragen

Approach:

  • Methodology-Page enthaelt:
    • Was ist MCP-SSF (3-4 Saetze, kein Marketing-Sprech)
    • Profile P0-P3 als Tabelle
    • 10 Kategorien als kurze Beschreibung
    • Scoring-Algorithmus (kurz + Link auf Public-Repo fuer Detail)
    • Grade-Mapping + Tier-Mapping als Tabelle
    • Re-Audit-Cadence (12 Monate, oder event-driven nach Major-Release)
    • Wie reichst Du Deinen MCP ein (Issue-Template-Link)
    • Lizenz-Statement (CC-BY-4.0 Spec, Apache-2.0 Tooling)
    • Maintainer-Kontakt (security@agenticventures.de)
  • Example-Report-Page zeigt einen anonymisierten Beispiel-Audit-Report mit Annotationen („Hier sehen Sie die Sub-Score-Aufschluesselung”, „So liest sich ein Hardening-Recommendation”, …)
  • FAQ adressiert die haeufigsten Sales-Einwaende vorab

Patterns to follow:

Test scenarios:

  • Test expectation: none — statische Markdown-Seite, Validation via Build + Visual Review
  • Happy path: hugo --minify durch av-website baut ohne Errors, Menu zeigt neuen Eintrag
  • Edge case: Cross-Links auf Public-Repo (github.com/agentic-ventures/mcp-security-audits) sind klickbar
  • Integration: Dashboard-Methodology-Link aus Unit 6 zeigt auf diese Page → resolved 200

Verification:

  • agenticventures.de/security-audits/methodology (nach Deploy) zeigt Content
  • FAQ enthaelt mindestens 6 Fragen + Antworten
  • Example-Report-Page hat mindestens 5 Annotation-Sektionen
  • Methodology-Page enthaelt klaren Re-Audit-Cadence-Statement + Maintainer-Kontakt

Aufwand: 1 halbtag


System-Wide Impact

  • Interaction graph:
    • /mcp-audit orchestriert 7 externe Tools — Tool-Versionen muessen gepinnt sein, sonst SARIF-Format-Drift bricht Merge.
    • Dashboard liest aus Public-Repo, Public-Repo liest (via Sync) aus Vault — Sync-Pfad muss klar dokumentiert sein, sonst Vault-Edits gehen ins Public verloren.
    • Skill registriert sich im _index.md und in CLAUDE.md-Skill-Routing (Rule 20).
  • Error propagation:
    • Wenn ein Tool nicht im PATH ist, soll Skill warnen (schnell-Modus optionale Tools) oder failen (Pflicht-Tools).
    • Wenn SARIF-Format ungueltig ist, Skill skippt das Tool und annotiert im Report (kein Crash).
    • Wenn score-to-dashboard.py einen Audit-Report ohne Score findet, failt der Build und blockiert Deploy.
  • State lifecycle risks:
    • Baseline-Files zwischen Audits muessen kompatibel bleiben — Format-Change ist Breaking-Change und braucht Version-Bump in MCP-SSF Spec.
    • History-Eintraege im Dashboard werden append-only behandelt; bei Spec-Version-Wechsel wird neue History-Spur gestartet (kein retroactive-rescore).
  • API surface parity:
    • Public-Repo ist read-only-Spiegel des Vaults fuer framework/, mcp-eigenbau.yml. Vault ist Source of Truth.
    • audits/*.md koennen direkt im Public-Repo entstehen (Pilot-Re-Audit-Output landet erst im Vault, dann redacted im Public-Repo).
  • Integration coverage:
    • Pilot-Re-Audit Unit 4 ist der Integrations-Test fuer Unit 1+3 zusammen.
    • Dashboard-Build via Unit 6 ist der Integrations-Test fuer Unit 5 (Public-Repo-Struktur).
  • Unchanged invariants:
    • security-audit-Skill bleibt unangetastet — /mcp-audit ist eine engere, automatisierte Variante daneben, kein Ersatz.
    • Bestehende Mcp-Server-Code (mcp-papierkram etc.) wird im Rahmen dieses Plans NICHT geaendert. F1-F3-Fixes sind separater Quickwin (~1.5h, parallel zum Plan oder davor).
    • CLAUDE.md Behavior Rules bleiben unangetastet — der neue Skill folgt allen Konventionen.

Risks & Dependencies

RiskLikelihoodImpactMitigation
R1 Niemand zitiert MCP-SSF (Sunk Cost)MediumHighCommunity-Standard-Pfad: CC-BY-4.0/Apache-2.0, vendor-neutraler Name, Submission an OWASP-MCP-WG (cosai-oasis/ws4) als Mapping-Beitrag, Discovery via OpenSSF-Best-Practices-Badge-Listing fuer den Public-Repo, Pitch-Deck-Update erst nach 2 Public-Audits damit Reports vorzeigbar sind
R2 OWASP MCP Top 10 ändert sich (v4 publisht)HighMediumMapping-File ist versioniert (owasp-mcp-top-10-v3.md-v4.md). Bestehende SSF-Controls bleiben stabil, Crossref wird ergaenzt. CI prueft Konsistenz, sodass v4-Mapping nicht alte SSF-Controls bricht.
R3 mcp-scan/Snyk-Akquise → Lizenz-WechselLowHighWrappen-Layer trennt Skill-Logik von mcp-scan-spezifischer Aufruf-Syntax. Eigene wrappers/mcp_scan.py ist 50-100 Zeilen — bei Lizenz-Wechsel zu proprietary innerhalb 1-2 halbtage umstellbar auf Cisco mcp-scanner oder AWS-Sample. Letzte freie mcp-scan-Version (pre-Snyk-Akquise-Tag) wird im Skill-pyproject.toml als Fallback gepinnt.
R4 EU-AI-Act-Stichtag 2026-08-02 setzt DruckHighMediumPhase 2 schliesst bis 2026-06-15 (~4 Wochen ab heute). Phase 3 (3 MCPs re-auditieren) hat dann 6 Wochen Puffer bis Stichtag. Wenn Phase 2 sich verzoegert, wird Phase 3 verkleinert auf nur mcp-vf-hosted (das wichtigste hosted MCP), Rest verschoben. Phase 4 Launch ist nicht hart an den Stichtag gebunden.
R5 Tooling-CVE-Drift im Wrap-SetMediumMediumuv-lock im Skill-Repo, monatlicher Re-Check via uv audit (passt zur quarterly Audit-Cadence des Plans selbst). Reife OSS (gitleaks, trivy) haben hohe Vertrauens-Baseline. Wenn ein Tool einen Critical-CVE hat, wrapper laesst sich in 30 min auf alternative Tool umstellen.
R6 Public-Audit deckt eigenes Critical-Finding aufMediumHighPilot-Re-Audit Unit 4 ist Pre-Public-Gate. Wenn Critical/High in mcp-papierkram auftaucht → STOP, Fix-Sprint zuerst, dann Public-Push. Embargo-Policy fuer Critical/High wird im pattern-File public-mcp-audit-pattern (separates kleines Doc, entsteht zwischen Phase 2 und Phase 4) festgeschrieben.
R7 4 parallele Workstreams (av-voice, Welle 4, Kunden, MCP-SSF)HighMediumHalbtags-Slots fix planen (ein Tag pro Woche dediziert MCP-SSF), Phase 2 nicht eskalieren wenn Kunden-Arbeit reinkommt. Plan ist auf 4 Wochen gestreckt nicht 5 halbtage am Stueck. ADHS-Pattern: Aversive Spec-Schreib-Sessions in 90-min-Bloecke zerlegen, Skill-Bau (kreativer) als Reward dahinter.
R8 Custom-Semgrep-Rules erzeugen False Positives die Score verzerrenMediumLowInitial-Ruleset bewusst klein (10-15 Rules), jede Rule wird im Pilot-Re-Audit auf FPs ueberprueft. Konfidenz-Gate im schnell-Modus (8/10) filtert noisy Rules raus. Rules sind versioniert, einzeln deaktivierbar via Skill-Flag.
R9 Dashboard rendert visuell schwachMediumMediumMozilla-Observatory-Look als Vorlage, simple CSS ohne Framework-Abhaengigkeit. Wenn nach Unit 6 die Optik schwach ist, Iteration im Phase-4-Vorlauf, kein Blocker fuer Phase 3.

Documentation / Operational Notes

  • Skill in Vault-Index registrieren: intern/capabilities/skills/_index.md bekommt mcp-audit-Eintrag mit Trigger-Phrasen („audit X gegen MCP-SSF”, „score den MCP”, „SSF-Lauf”).
  • CLAUDE.md Routing-Tabelle aktualisieren: Eintrag fuer „Public MCP Audits Framework” mit Pointer auf Plan + Spec.
  • Re-Audit-Cadence-Datei: intern/wissen/prozesse/public-mcp-audit-pattern.md (entsteht zwischen Phase 2 und 3) enthaelt: Severity-Policy, Embargo-Regeln, Cadence (12 Monate), Disclosure-Channel.
  • Schedule-Trigger: Marvin-/schedule fuer Quartals-Re-Audit-Erinnerung — kommt mit Phase 5, nicht Phase 2.
  • Marketing-Asset-Quartalsplan: Logo-Variante „MCP-SSF Gold/Silver” als PNG-Set fuer Pitch-Decks. Phase 4.
  • DSGVO-Footprint: Public-Repo + Dashboard hosten keine personenbezogenen Daten. security.txt-Inbox security@agenticventures.de wird Marvin manuell pruefen — keine automatisierte Triage.

Sources & References

Naechster Schritt nach Plan-Approval

Eine Aktion: Unit 1 starten — framework/mcp-ssf-v0.1.md Skelett + erste 2 Kategorien (Auth + Tool-Surface, weil das die zwei mit der meisten MCP-spezifischen Substanz sind). Wenn die zwei Kategorien sitzen, ist das Item-Format kalibriert und die restlichen 8 Kategorien folgen schneller.

Optional davor: F1-F3-Quickwin in mcp-papierkram fixen (~1.5h, parallel-laufbar, macht Unit 4 sauberer weil Re-Audit dann nicht 3 alte Findings nochmal listet).

Bei Plan-Approval per go: ich starte Unit 1 direkt. Bei Aenderungswuenschen am Plan: erst Iteration.