
mcp-server-attestation v0.2.0
MCPサーバー向けのレイヤー2サプライチェーンハードニング — Ed25519署名されたツールマニフェスト、ランタイムスパーンアテステーション、デフォルト拒否引数サニタイザー。マーケットプレイスポイズニング + CVE-2025-69256 + CVE-2025-61591 を防御します。
StudioMeyer MCP Stackの一部 — マヨルカ島で開発 🌴 · 使用したら ⭐ をお願いします
mcp-server-attestation
Model Context Protocolサーバーのためのレイヤー2サプライチェーンハードニング。Ed25519署名されたツールマニフェスト、ランタイムspawnアテステーション、デフォルト拒否引数サニタイザー。
以下の問題への直接的な対応:
- OX Securityのマーケットプレイス汚染、2026年4月 — 11のMCPレジストリのうち9が悪意のあるサーバーを受け入れました。Anthropicの公開見解: 「期待された動作」
- CVE-2025-69256 — Serverless Framework MCP RCE(
child_process.exec()コマンドインジェクション経由) - CVE-2025-61591 — Cursor MCP RCE(OAuthインストールされた悪意のあるサーバーによるspawnハイジャック経由)
このパッケージは、Anthropicが提供しなかったものを実現します: サーバーが公開を許可されるツールと、実行を許可されるspawn呼び出しの暗号検証です。これはドロップイン依存関係であり、ランタイムの置き換えではありません。
私たちからの一言
私たちはこの2年間、自分たちのためにツールやシステムを構築してきました。このリポジトリが小さく、スターが少ないのは新しいからではありません。私たちが構築したものを共有しようと決めたばかりだからです。新しい実験ではなく、長いストーリーに最近のコミットが加わったものです。
私たちはものづくりと共有を愛しています。ソーシャルメディア戦術、グロースハック、スターやフォロワーを追いかけることは好きではありません。だからこのリポジトリは小さいのです。コードは本物で、使われており、イシューには回答します。ご自身で判断してください。
もし役立つなら、共有、テスト、フィードバックが私たちを助けます。改善できる点があれば、イシューがより有用です。これを使って何か構築したら、[email protected]までお知らせください。それが本当に私たちの一日を素晴らしいものにします。
パルマ・デ・マヨルカの小さなスタジオより。
パッケージ (npm workspaces)
| パッケージ | 目的 |
|---|---|
mcp-server-attestation (packages/lib) | ライブラリ: Ed25519署名/検証、マニフェストスキーマ、サニタイザー、spawnアテステーター、TOFUトラストストア。 |
mcp-attest-cli (packages/cli) | CLI mcp-attest: keygen、sign、verify、inspect、fingerprint、check-pin。 |
mcp-attest-demo (packages/demo-server) | リファレンスMCPサーバー(stdio、spec 2025-06-18)。ライブラリを示す5つのツールを公開。 |
インストール
npm install mcp-server-attestation
# CLI:
npm install -g mcp-attest-cli
# Reference MCP server:
npx mcp-attest-demo
Node 20+。外部暗号依存関係なし — node:cryptoのEd25519プリミティブを使用。
5行で始めるサーバークイックスタート
import { verifyManifestStrict, attestSpawnStrict, type SignedManifest } from "mcp-server-attestation";
import signed from "./signed/manifest.json" assert { type: "json" };
// 1. 起動時: 出荷するマニフェストが署名したマニフェストであることを証明する。
verifyManifestStrict(signed);
// 2. すべての child_process.spawn の前に:
attestSpawnStrict(signed as SignedManifest, { command, args });
これが統合のすべてです。2つの関数呼び出し、SaaSもデーモンも不要。
すべてのspawnで署名を再検証したい場合(未検証やすり替えられたマニフェストがゲートに到達するのを防ぐ多層防御)、代わりに単一のフェイルセーフ呼び出しを使用してください。これは最初に検証し、その後アテステーションを行います:
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 |
注釈は正直です: attest_sign_manifestとattest_keygenはディスクにファイルを書き込むため、読み取り専用ではありませんが、既存のデータを破壊しないためdestructiveHintはfalseのままです。ツールごとの機能テーブルについてはdocs/THREAT-MODEL.mdを参照。
CLI
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は不正な署名でコード2、ピン不一致でコード3で終了。
MCP仕様互換性
| 仕様バージョン | ステータス |
|---|---|
| 2024-11-05 | マニフェストで解析可能、リファレンスサーバーの対象外 |
| 2025-03-26 | マニフェストで解析可能、リファレンスサーバーの対象外 |
| 2025-06-18 | 完全対象 |
ライブラリはトランスポートに依存しません。リファレンスサーバーはstdioのみ。
セキュリティモデル
- トラストオンファーストユース(TOFU)がデフォルトです。 初めてサーバーを検証するとき、その公開鍵は
~/.mcp-attest/trust.jsonにピン留めされます(上書き:MCP_ATTEST_TRUST_FILE)。その後の検証では、同じサーバー名に対する新しい鍵はTRUST_PIN_MISMATCHで拒否されます。これにより、Cursorスタイルの悪意のあるアップデートベクトルを捕捉します。 - バンドルされた信頼できる鍵リストはありません。 このパッケージはゲートキーパーとして機能しません。より強い保証が必要な場合は、
--sigstoreをオプトインして、公開鍵フィンガープリントをSigstore Rekor透過ログと相互参照します。 - デフォルト拒否の引数サニタイザー。
shellSafeStringは、すべてのASCIIシェルメタ文字、NUL、CR、LF、VT、FF、NEL、ゼロ幅文字、BOM、RTL/LTRオーバーライド、Trojan-Source分離文字、および全角ラテン紛らわしい文字をブロックします。許可リスト動作には明示的なregex/enum/prefix/literalルール種類が必要です。 - ReDoSセーフな
regexルール。regexルールのパターンは作者によって署名されますが、引数の値は攻撃者によって制御されます。サニタイザーはバックトラッキングを起こしやすいパターン((a+)+のようなネストされた無制限量指定子)を静的に検出し、実行を拒否するため、単一の細工された引数でspawnのホットパスをフリーズさせることはできません。regexルールには入力上限maxLength(デフォルト4096)もあります。 - トラバーサルセーフな
prefixルール。prefixルールはデフォルトで..パスコンポーネントを拒否します(denyTraversal: true、%2e%2eエンコード形式を含む)。そのため、prefix: "/safe/"を満たしていても/safe/../../etc/passwdはブロックされます。 - 検証してからアテステーション。
attestSpawnVerifiedは、1つのフェイルセーフ呼び出しでspawnをアテステーションする前にマニフェスト署名をチェックします — 実際のホットループからspawnごとのEd25519検証を測定していない限り、attestSpawnStrictの代わりにこれを使用してください。 - 正規JSONが署名対象です。 再シリアル化では署名されたバイトを変更できません。
このパッケージが行わないこと(範囲外):
- サーバープロセスをサンドボックス化またはコンテナ化する。
- OAuthフローのハードニング(別の
mcp-oauth-shieldビルド)。 - ネットワーク出力制御。
- 既存サーバーの自動パッチ。
テスト
npm install
npm run typecheck
npm test
テストコーパスにはCVEリプレイフィクスチャ(packages/lib/tests/fixtures/cve-2025-69256-payloads.json、cve-2025-61591-payloads.json)が含まれています。ビルドはリグレッションチェックです: すべてのペイロードがブロックされなければなりません。
配布
- GitHub Actions OIDCと
--provenanceを使用したnpm公開。 - リファレンスサーバーをmcp.soとFastMCPディレクトリに提出。
- ライブラリは別途
mcp-server-attestationとして公開。
StudioMeyerについて
StudioMeyerは、パルマ・デ・マヨルカに拠点を置くAIおよびデザインスタジオで、世界中のクライアントと協業しています。中小企業向けにカスタムウェブサイトとAIインフラを構築しています。プロダクションスタックはClaude Agent SDK、MCP、n8n、Sentry、Langfuse、LangGraphを使用した可観測性と社内ガードレイヤーです。
ライセンス
MITライセンス、Copyright 2026 Matthias Meyer (StudioMeyer)。LICENSEを参照。