
Durcissement de la chaîne d'approvisionnement de couche 2 pour les serveurs MCP — manifestes d'outils signés Ed25519, attestation de lancement des processus à l'exécution, assainisseur d'arguments en mode refus par défaut. Défend contre l'empoisonnement de marketplace + CVE-2025-69256 + CVE-2025-61591.
Fait partie de la Stack MCP StudioMeyer — Construit à Majorque 🌴 · ⭐ si vous l'utilisez
Durcissement de la chaîne d'approvisionnement de couche 2 pour les serveurs Model Context Protocol. Manifests d'outils signés en Ed25519, attestation de spawn à l'exécution, assainisseur d'arguments en mode refus par défaut.
Réponse directe à :
child_process.exec().Ce package fournit ce qu'Anthropic a choisi de ne pas fournir : la vérification cryptographique des outils qu'un serveur est autorisé à exposer et des appels spawn qu'il est autorisé à effectuer. C'est une dépendance directement intégrable (drop-in), pas un remplacement de l'exécution.
Nous construisons des outils et des systèmes pour nous-mêmes depuis deux ans. Si ce dépôt est petit et compte peu d'étoiles, ce n'est pas parce qu'il est nouveau. C'est parce que nous venons juste de décider de partager ce que nous avons construit. Ce n'est pas une expérience naissante, c'est une longue histoire avec un commit récent.
Nous aimons construire des choses et les partager. Nous n'aimons pas les tactiques de réseaux sociaux, les growth hacks, ni courir après les étoiles et les abonnés. C'est pourquoi ce dépôt est petit. Le code est réel, il est utilisé, les issues reçoivent des réponses. Jugez par vous-même.
S'il vous est utile, le partage, les tests et les retours nous aident. S'il pourrait être amélioré, une issue est plus utile. Si vous construisez quelque chose avec, écrivez-nous à [email protected]. Cela nous fait sincèrement très plaisir.
Depuis un petit studio à Palma de Majorque.
| Package | Description |
|---|---|
mcp-server-attestation (packages/lib) | Bibliothèque : signature/vérification Ed25519, schéma de manifest, assainisseur, attestateur de spawn, magasin de confiance TOFU. |
mcp-attest-cli (packages/cli) | CLI mcp-attest : keygen, sign, verify, inspect, fingerprint, check-pin. |
mcp-attest-demo (packages/demo-server) | Serveur MCP de référence (stdio, spécification 2025-06-18) exposant 5 outils qui illustrent la bibliothèque. |
npm install mcp-server-attestation
# CLI:
npm install -g mcp-attest-cli
# Reference MCP server:
npx mcp-attest-demo
Node 20+. Aucune dépendance cryptographique externe — utilise les primitives Ed25519 de 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 });
C'est toute l'intégration. Deux appels de fonction, pas de SaaS, pas de démon.
Si vous préférez revérifier la signature à chaque spawn (défense en profondeur contre un manifest non vérifié ou échangé qui atteindrait la barrière), utilisez plutôt l'appel unique à sécurité intégrée — il vérifie puis atteste :
import { attestSpawnVerified, type SignedManifest } from "mcp-server-attestation";
attestSpawnVerified(signed as SignedManifest, { command, args });
mcp-attest-demo)| # | Nom | 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 |
Les annotations sont honnêtes : attest_sign_manifest et attest_keygen écrivent des fichiers sur le disque, ils ne sont donc pas en lecture seule, mais ils ne détruisent pas les données existantes, donc destructiveHint reste false. Voir docs/THREAT-MODEL.md pour le tableau des capacités par outil.
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 se termine avec le code 2 en cas de signature invalide, et le code 3 en cas de non-correspondance du pin.
| Version de la spécification | Statut |
|---|---|
| 2024-11-05 | analysable dans le manifest, non visé par le serveur de référence |
| 2025-03-26 | analysable dans le manifest, non visé par le serveur de référence |
| 2025-06-18 | cible complète |
La bibliothèque est indépendante du transport. Le serveur de référence fonctionne uniquement en stdio.