
Layer-2-Härtung der Lieferkette für MCP-Server — Ed25519-signierte Tool-Manifeste, Runtime-Spawn-Attestierung, Default-Deny-Argument-Sanitizer. Schützt vor Marketplace-Poisoning + CVE-2025-69256 + CVE-2025-61591.
Teil des StudioMeyer MCP Stack — Gebaut auf Mallorca 🌴 · ⭐ wenn du es nutzt
Direkte Antwort auf:
child_process.exec().Dieses Paket bietet, was Anthropic bewusst weggelassen hat: kryptografische Verifizierung, welche Tools ein Server exponieren darf und welche Spawn-Aufrufe er tätigen darf. Es ist eine Drop-in-Abhängigkeit, kein Laufzeit-Ersatz.
Wir bauen seit zwei Jahren Tools und Systeme für uns selbst. Dass dieses Repo klein ist und wenige Stars hat, liegt nicht daran, dass es neu ist. Es liegt daran, dass wir uns erst jetzt dazu entschieden haben, zu teilen, was wir gebaut haben. Es ist kein frisches Experiment, sondern eine lange Geschichte mit einem kürzlichen Commit.
Wir lieben es, Dinge zu bauen und zu teilen. Wir mögen keine Social-Media-Taktiken, Growth-Hacks oder das Jagen von Stars und Followern. Deshalb ist dieses Repo klein. Der Code ist echt, er wird genutzt, Issues werden beantwortet. Urteile selbst.
Wenn es dir hilft, helfen uns Teilen, Testen und Feedback. Wenn es besser sein könnte, ist ein Issue nützlicher. Wenn du etwas damit baust, sag es uns unter [email protected]. Das macht unseren Tag wirklich.
Aus einem kleinen Studio in Palma de Mallorca.
| Paket | Zweck |
|---|---|
mcp-server-attestation (packages/lib) | Bibliothek: Ed25519 signieren/verifizieren, Manifest-Schema, Sanitiser, Spawn-Attester, TOFU-Vertrauensspeicher. |
mcp-attest-cli (packages/cli) | CLI mcp-attest: keygen, sign, verify, inspect, fingerprint, check-pin. |
mcp-attest-demo (packages/demo-server) | Referenz-MCP-Server (stdio, Spec 2025-06-18), der 5 Tools bereitstellt, die die Bibliothek demonstrieren. |
npm install mcp-server-attestation
# CLI:
npm install -g mcp-attest-cli
# Reference MCP server:
npx mcp-attest-demo
Node 20+. Keine externen Crypto-Abhängigkeiten — nutzt die Ed25519-Primitive von node:crypto.
import { verifyManifestStrict, attestSpawnStrict, type SignedManifest } from "mcp-server-attestation";
import signed from "./signed/manifest.json" assert { type: "json" };
// 1. At startup: prove the manifest you ship is the manifest you signed.
verifyManifestStrict(signed);
// 2. Before every child_process.spawn:
attestSpawnStrict(signed as SignedManifest, { command, args });
Das ist die gesamte Integration. Zwei Funktionsaufrufe, kein SaaS, kein Daemon.
Wenn du die Signatur bei jedem Spawn lieber erneut verifizieren möchtest (Defense-in-Depth gegen ein unverifiziertes oder ausgetauschtes Manifest, das das Gate erreicht), nutze stattdessen den einzelnen Fail-Safe-Aufruf — er verifiziert und attestiert dann:
import { attestSpawnVerified, type SignedManifest } from "mcp-server-attestation";
attestSpawnVerified(signed as SignedManifest, { command, args });
mcp-attest-demo)| # | Name | readOnlyHint | destructiveHint |
|---|---|---|---|
| 1 | attest_verify_manifest | true | false |
| 2 | attest_inspect_spawn | true | false |
| 3 | attest_generate_manifest_template | true | false |
| 4 | attest_sign_manifest | false | false |
| 5 | attest_keygen | false | false |
Die Annotationen sind ehrlich: attest_sign_manifest und attest_keygen schreiben Dateien auf die Festplatte, sind also nicht schreibgeschützt, zerstören aber keine vorhandenen Daten, daher bleibt destructiveHint false. Siehe docs/THREAT-MODEL.md für die Fähigkeitentabelle pro Tool.
mcp-attest keygen --out-dir ./keys --name prod
mcp-attest sign --manifest manifest.json --private-key keys/prod.key --out signed.json
mcp-attest verify --signed signed.json --pin # TOFU pin
mcp-attest verify --signed signed.json --sigstore # opt-in Rekor cross-ref
mcp-attest inspect --signed signed.json --command /usr/bin/echo --arg "hello"
mcp-attest fingerprint --public-key keys/prod.pub
mcp-attest check-pin --server my-server --signed signed.json
verify beendet sich bei ungültiger Signatur mit Code 2, bei PIN-Abweichung mit Code 3.
| Spec-Version | Status |
|---|---|
| 2024-11-05 | im Manifest parsebar, kein Ziel des Referenzservers |
| 2025-03-26 | im Manifest parsebar, kein Ziel des Referenzservers |
| 2025-06-18 | vollständiges Ziel |
Die Bibliothek ist transport-agnostisch. Der Referenzserver ist ausschließlich stdio-basiert.