Signet MCP Tools について
Signet MCP Tools は、Signet プロジェクトの MCP サーバーで、暗号署名、検証、コンテンツハッシュのツールを stdio 経由で公開します。AI エージェントのツール呼び出しに検証可能な証跡が必要な開発者や監査チーム向けです。検証には公開鍵のみが必要で、ホスト型プラットフォームは不要です。
主な機能
- 01stdio 経由で提供される MCP ツール
- 02コンテンツの暗号署名
- 03署名検証
- 04コンテンツハッシュの計算
活用シーン
- 01エージェントのツール呼び出しに対する署名付き記録の作成
- 02監査時のオフラインでの署名検証
- 03MCP ワークフロー内でのハッシュ計算
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
4掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
Signet
エージェントのアクションを記録するだけではなく、証明しましょう。
すべての AI エージェントのアクションに対する、暗号技術に基づく信頼性と認可の証拠 — ID、委任、ポリシー、レシートを署名し、ハッシュチェーンで連結し、オフラインで検証可能にします。特定のプロバイダーに依存しません。
TypeScript パッケージ:
@signet-auth/core ·
@signet-auth/mcp ·
@signet-auth/mcp-server ·
@signet-auth/mcp-tools ·
@signet-auth/node ·
@signet-auth/vercel-ai
▶ ライブデモを試す — ブラウザーでツール呼び出しに署名し、フィールドを変更して、検証が失敗する様子を確認できます。 (ミラー:GitHub Pages)
▶ 解説:署名、監査ログ、検証 · ▶ デモ:実行境界と MCP 統合
単一ホストでのパイロットフロー:すべてのツール呼び出しに署名し、署名済みの証拠バンドルを引き渡して、どのマシンでも再検証できます。signet キーストアは不要です。パイロット運用手順 →
AI エージェントが注文を行い、行を削除し、メールを送り、PR をマージしました。監査担当者や顧客に、あるいはインシデント後の自分自身に、実際に何をしたのかを正確に証明できますか?
Signet は、エージェントのアクションを支える独立した信頼レイヤーです。すべてのツール呼び出しに署名済みのレシートが付与され、エージェントをホストするプラットフォームやログを保存するベンダーを信頼しなくても、誰でもオフラインで検証できます。また、0.11 以降は、アクションの背後にある認可にも独自の証明が付随します。エージェントが誰であるか(プリンシパル)、誰がエージェントに行動を許可したか(委任)、そして誰がこの特定のアクションを許可したか(権限者署名付きの決定)を証明します。
エージェントは相手のインフラ上で動作します。証明はあなたのものです。
なぜ単なるログでは不十分なのですか?
従来のログが伝えるのは、プラットフォームが何が起きたと主張しているかです。ログは変更可能で、プロバイダーに依存しており、ログを書いた当事者を信頼しなければ検証できません。
Signet のレシートは異なります。ツール名、パラメーター、タイムスタンプ、署名者など、どのフィールドでも変更すると Ed25519 署名が無効になります。エントリーを削除したり順序を入れ替えたりすると、SHA-256 ハッシュチェーンが無効になります。検証に必要なのは公開鍵だけです。ネットワーク呼び出しも、API も、ログインも必要ありません。
| 通常のログ | Signet のレシート |
|---|---|
| プロバイダーが、起きたと主張する | 誰でもオフラインで検証できる |
| 事後に変更可能 | 改ざんすると署名が無効になる |
| 順序を証明できない | 削除・順序変更でハッシュチェーンが無効になる |
| ログホストを信頼する | 公開鍵で検証する |
| 一方的な主張 | 双方向の共同署名が可能 |
可観測性にはログを使ってください。証拠が必要なときは Signet を使ってください。
対象ユーザー
- MCP ビルダー —
signet proxyで任意の MCP サーバーをラップし、コードを変更せずにすべてのtools/callに署名できます - セキュリティ/コンプライアンスチーム — EU AI Act Art. 12、SOC 2 CC7.2、ISO 27001 A.8.15 に準拠した、改ざんを検出できる監査証跡を構築できます
- エンタープライズエージェントプラットフォーム — エージェントが何をしたか、誰が許可したか、どのポリシーが適用されていたかを証明できます
- フレームワークのユーザー — LangChain、CrewAI、Claude Code、Codex、OpenAI Agents、Vercel AI SDK に対応しています
- エージェント間のデプロイメント — 両者が鍵を保持している場合、双方向の共同署名が可能です
独立して検証できないツール呼び出しを、無条件に信頼すべきではありません。 これは監査担当者が証明を求めるとき、自分が管理していないインフラでインシデントが発生したとき、あるいは問いが「コンソールには何と表示されているか」ではなく「実際に何が起きたか」であるときに重要です。
各エージェントには Ed25519 ID が割り当てられます。すべてのツール呼び出しに署名し、ハッシュチェーン付きの監査証跡に追加し、オフラインまたは実行前に検証し、サーバーと共同署名し、委任チェーンに紐付け、必要に応じてポリシー決定にも紐付けることができます。
上の動画では、全体のフローを紹介しています。下の SVG では CLI による署名の詳細を確認できます。または、不正なリクエストが拒否される様子を見るに進んで、実行前にサーバーが不正なリクエストをブロックする様子をご覧ください。
この最初のデモでは、署名と監査レシートを紹介します。MCP フロー図もご覧ください。
## Signet が提供する機能Signet は、エージェントのアクションに軽量な信頼レイヤーを追加します。
- 署名:すべてのツール呼び出しに、エージェントの暗号鍵で署名します
- 検証:リクエストをオフライン、または実行境界で検証してから信頼します
- プロキシ:あらゆる MCP サーバーを透過的にプロキシします。エージェントやサーバーのコードに手を加えずにリクエストへ署名し、プロキシ経由でローカルな双方向監査の共同署名を行います
- 共同署名:両側を制御できる場合、双方向のレシートを使ってサーバーの応答に共同署名します
- 追跡:レシートを
trace_idとparent_receipt_idで関連付け、複数ステップのワークフローを追跡します - 認可:アクションを誰が許可したのかを証明する、スコープ付き委任チェーンでエージェントを認可します
- ポリシーの証明:YAML ポリシーが満たされた場合に、署名済みの
PolicyAttestationを埋め込みます - ローカルでの検査:ホスト型のコントロールプレーンを必要とせず、追記専用の監査ログとダッシュボードでローカルに検査できます
0.11 の新機能
- 正規化されたプリンシパル:すべての ID にスコープ付きプリンシパル URI(
agent://prismer/deploy-bot)を持たせることができます。これはレシートと委任トークン内で署名され、acting_forクレームはチェーンのルートによって機械的に裏付けられます。 - 権限者署名付き認可判断:
signet authorizeは 1 つのインテントを事前承認し、signet sign --decisionはそれに裏付けられたレシートを生成します(または--authority-keyを使うと 1 ステップで実行できます)。判断はintent_hashを通じてアクションに結び付けられるため、別のアクションへのリプレイは拒否されます。 - 失効:
signet revokeは発行者署名付きレコードで委任トークンと判断を無効化します。検証では明示的なステータスが報告されます。revokedは失敗し、unknownが認可済みとして報告されることはありません(厳格モードでは--require-revocation-knownを指定します)。証拠バンドルには失効レコードが含まれます。 - 条件と制限:ポリシールールには型付きの義務(
require_approval、sandbox、…)を設定でき、委任スコープには制約(--max-calls、--spend-limit)を設定できます。署名パスでは呼び出し回数の予算と、範囲を狭める不変条件(権限付与によって委任の範囲を狭めることはできても、広げることはできません)を適用します。 - 堅牢性の強化:
verify()が v4 レシートを正しく検証するようになりました。状態が指定されていない場合、レート制限付きポリシールールはフェイルクローズします。委任の有効期限は実時間に基づくため、レシートのタイムスタンプを過去に設定しても回避できなくなりました。
コンプライアンス
Signet は、AI エージェントの運用を評価する際に監査人が確認する技術的な制御を提供します。詳細は、コンプライアンス対応表をご覧ください。
| フレームワーク | Signet が対応する項目 |
|---|---|
| SOC 2 Type II | 署名付き監査証跡(CC7.2)、改ざん検知(CC7.3)、ロールベースのスコープ(CC6.3)、認可の証明(CC8.1) |
| ISO 27001 | イベントログ(A.8.15)、アクセス制御(A.5.15)、認証(A.5.17)、構成管理(A.8.9) |
| EU AI Act | 第 12 条の記録保持:イベントログ、トレーサビリティ、識別、完全性 |
| DORA | ICT インシデントのログ記録(第 17 条)、サードパーティリスクの証拠(第 28~30 条)、監査証跡の完全性 |
| NIST AI RMF | ガバナンス(委任チェーン)、マッピング(署名付きレシート)、測定(監査クエリ)、管理(ポリシーエンジン) |
Signet は認証ではなくツールです。コンプライアンスを支援する制御を提供します。コンプライアンスの状況は、デプロイと構成によって決まります。
30 秒で試す
pip install signet-auth
from signet_auth import SigningAgent
agent = SigningAgent.create("my-agent", owner="team")
receipt = agent.sign("github_create_issue", params={"title": "fix bug"})
assert agent.verify(receipt)
print(receipt.id)
このリポジトリにスターを付ける理由
Signet は、新たなカテゴリーであるAI エージェント向けの検証可能なツール呼び出しレシートを開拓しています。スターを付けることは、単なるブックマークではありません。エージェントのアクションに対する暗号学的な証拠をエコシステムに広めることで、規制対象の業界、エンタープライズプラットフォーム、フレームワークのユーザーが独自に実装する必要がなくなります。
- Microsoft Agent Governance Toolkitと連携しています(例はPR #1196でマージ済みです)
- LangChain の ComplianceBackend RFCで貢献者として名前が挙がっています(#35691)
- IETF draft-farley-acta-signed-receipts仕様への適合に向けて取り組んでいます
- AI エージェントのアイデンティティと認可に関するNIST NCCoE の4つの柱に対応しています(2026年第4四半期の相互運用性プロファイル)
監査やインシデント、あるいは第三者から「証拠を示してください」と求められても問題のないエージェントを構築しているなら、このリポジトリにスターを付けて試し、課題を報告してください。
初めての方は、次の5つの方法から始めてください。
方法を選ぶ
- Claude Code:コーディングエージェントで最も手早く初回実行したい場合に最適です。Claude Code で
/plugin install signet@claude-plugins-officialを実行してください。5分で、署名付きツール呼び出しと~/.signet/audit/のローカル監査ログを利用できます。 - Codex CLI:Codex で Bash ツール呼び出しに署名したい場合に最適です。
plugins/codex/を~/.codex/plugins/signetにコピーし、PostToolUseフックを1つ追加してください。5分で、同じ監査証跡を使って Codex の Bash アクションに署名できます。 - Python SDK:LangGraph、LlamaIndex、OpenAI Agents、CrewAI、または独自のツールランナーでレシートを利用したい場合に最適です。
SigningAgent.create(...)から始め、必要な箇所にだけフレームワークフックを追加してください。 - MCP クライアント:MCP クライアントまたはトランスポートを管理している場合に最適です。
new SigningTransport(inner, secretKey, "my-agent")でトランスポートをラップしてください。5分で、params._meta._signetにレシートを含む署名付きtools/callリクエストを利用できます。 - MCP サーバー:実行前に検証したい場合に最適です。ツールハンドラーで
verifyRequest(request, {...})を呼び出してください。5分で、実行境界で署名者、新しさ、ターゲットのバインド、ツールとパラメーターのチェックを行えます。
不正なリクエストが拒否される様子を見る
最短の実行境界デモを実行します。
cd examples/mcp-agent
npm run execution-boundary-demo
動きのあるデモをご希望ですか?MP4 または GIF をダウンロードしてください。
デモのソースについては、examples/mcp-agent/demo-execution-boundary.mjs を参照してください。
委任チェーン:このエージェントを認可したのは誰ですか?
Signet のレシートは、何が起きたかを証明します。委任チェーンは、誰がそれを許可したかを証明します。
ルートアイデンティティ(人間または組織)が、スコープを限定した権限をエージェントに暗号学的に委任します。権限は縮小のみ可能で、拡大はできません。エージェントの v4 レシートには、認可の証明全体が含まれます。
Owner (alice) → Agent A (tools: [Bash, Read], max_depth: 0)
↓
v4 Receipt: tool=Bash, authorization.chain proves alice → Agent A
# Create a delegation token (expires in 24 hours)
signet delegate create --from alice --to deploy-bot --to-name deploy-bot \
--tools Bash,Read --targets "mcp://github" --max-depth 0 --ttl 24h
# Sign with authorization proof (v4 receipt)
signet delegate sign --key deploy-bot --tool Bash \
--params '{"cmd":"git pull"}' --target "mcp://github" --chain chain.json
# Verify: signature + chain + scope + root trust
signet delegate verify-auth receipt.json --trusted-roots alice
**ベストプラクティス:**有効期間の長いトークンや期限のないトークンではなく、短期間で期限切れになる委任(
--ttl 1h、--ttl 24h)を使用してください。エージェントが侵害された場合、委任は自動的に期限切れになります。必要に応じてトークンを再発行してください。これは、有効期間の短い JWT や X.509 証明書で使用されるものと同じパターンです。
または Python の場合:
from signet_auth import sign_delegation, sign_authorized, verify_authorized
# Delegation functions accept JSON strings for scope, chain, and receipts
token_json = sign_delegation(root_key_b64, "alice", agent_pubkey_b64, "bot", scope_json)
receipt_json = sign_authorized(agent_key_b64, action_json, "bot", f"[{token_json}]")
scope_json = verify_authorized(receipt_json, [root_pubkey_b64])
Signet は、署名する前に YAML ポリシーを適用できます。アクションが許可されると、署名済みレシートには、適用されたポリシーハッシュ、ルール、判断を証明する PolicyAttestation が含まれます。
version: 1
name: production-agents
default_action: deny
rules:
- id: allow-read
match:
tool: Read
action: allow
- id: deny-rm-rf
match:
tool: Bash
params:
command:
contains: "rm -rf"
action: deny
reason: destructive command
signet policy validate policy.yaml
signet policy check policy.yaml --tool Bash --params '{"command":"rm -rf /"}'
signet sign --key deploy-bot --tool Read \
--params '{"path":"README.md"}' --target "mcp://github" --policy policy.yaml
拒否されたアクションでは、レシートが生成される前に処理が失敗します。許可されたアクションでは、ポリシーの判断を証明する署名済みペイロードを含むレシートが生成されます。
チームが Signet を選ぶ場面
- コーディングエージェント、MCP ツール、CI 自動化の改ざん検知可能な監査証跡が必要な場合
- インシデント発生後に、どのエージェントがアクションをリクエストし、誰が承認したかを証明したい場合
- ホステッドサービスに依存せず、オフラインで検証できるレシートが必要な場合
- スタックにプロキシを追加せず、署名前に軽量なポリシー適用を行いたい場合
Signet ができること/できないこと
- Signet は、署名、監査、検証、委任、ポリシーアテステーションを担う、エージェントアクション向けの信頼レイヤーです
- Signet は、SDK、プラグイン、MCP ミドルウェアを使って、既存のエージェントスタックに適合するよう設計されています
- Signet は、未署名、期限切れ、リプレイ、または対象が誤っている MCP リクエストを、実行前に拒否できます
- Signet は、ポリシーファイルを指定すると、署名前にアクションを拒否できます
- Signet は、ホステッドゲートウェイ、常時稼働のコントロールプレーン、またはサンドボックス化や最小権限設計に代わるものではありません
インストール
# CLI
cargo install signet-cli
# Python
pip install signet-auth
# TypeScript (MCP middleware)
npm install @signet-auth/core @signet-auth/mcp
# TypeScript (MCP server verification)
npm install @signet-auth/mcp-server
# TypeScript (Node local audit/operator helpers)
npm install @signet-auth/node
# TypeScript (Vercel AI SDK middleware)
npm install @signet-auth/vercel-ai
# TypeScript (standalone MCP signing server)
npx @signet-auth/mcp-tools
クイックスタート
Claude Code プラグイン
設定不要で、Claude Code のすべてのツール呼び出しに自動で署名できます。
# Option A: From the official Anthropic plugin marketplace
/plugin install signet@claude-plugins-official
# Option B: Add Signet as a marketplace source, then install
/plugin marketplace add Prismer-AI/signet
/plugin install signet@signet
すべてのツール呼び出しに Ed25519 で署名し、~/.signet/audit/ にあるハッシュチェーン形式の監査証跡に記録します。
その他のインストール方法:
# From Git
claude plugin add --from https://github.com/Prismer-AI/signet
# Via signet CLI
signet claude install
Codex プラグイン
Codex CLI のすべての Bash ツール呼び出しに自動で署名できます。
git clone https://github.com/Prismer-AI/signet.git
cp -r signet/plugins/codex ~/.codex/plugins/signet
続いて、~/.codex/hooks.json にフックを追加します。
{
"hooks": {
"PostToolUse": [{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": "node \"$HOME/.codex/plugins/signet/bin/sign.cjs\"",
"timeout": 5
}]
}]
}
}
または、オンデマンド署名ツールとして MCP サーバーを使用します。
codex mcp add signet -- npx @signet-auth/mcp-tools
CLI
# Generate an agent identity
signet identity generate --name my-agent
# Sign an action
signet sign --key my-agent --tool "github_create_issue" \
--params '{"title":"fix bug"}' --target mcp://github.local
# Verify a receipt
signet verify receipt.json --pubkey my-agent
# Audit recent actions
signet audit --since 24h
# Verify log integrity
signet verify --chain
MCP クライアント統合(TypeScript)
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
import { generateKeypair } from "@signet-auth/core";
import { SigningTransport } from "@signet-auth/mcp";
// Generate an agent identity
const { secretKey } = generateKeypair();
// Wrap any MCP transport -- all tool calls are now signed
const inner = new StdioClientTransport({ command: "my-mcp-server" });
const transport = new SigningTransport(inner, secretKey, "my-agent");
const client = new Client({ name: "my-agent", version: "1.0" }, {});
await client.connect(transport);
// Every callTool() is now cryptographically signed
const result = await client.callTool({
name: "echo",
arguments: { message: "Hello!" },
});
すべての tools/call リクエストに、署名済みレシートが params._meta._signet に挿入されます。
MCP サーバーでの検証
MCP サーバーも管理している場合は、実行前にリクエストを検証します。
import { FileNonceCache, verifyRequest } from "@signet-auth/mcp-server";
const nonceCache = new FileNonceCache(".signet/nonces.json");
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const verified = verifyRequest(request, {
trustedKeys: ["ed25519:..."],
maxAge: 300,
nonceCache,
});
if (!verified.ok) return { content: [{ type: "text", text: verified.error }], isError: true };
if (!verified.trusted) return { content: [{ type: "text", text: "untrusted signer" }], isError: true };
console.log(`Verified: ${verified.signerName}`);
// process tool call...
});
Vercel AI SDK 統合
import { generateText } from "ai";
import { openai } from "@ai-sdk/openai";
import { generateKeypair } from "@signet-auth/core";
import { createSignetCallbacks } from "@signet-auth/vercel-ai";
const { secretKey } = generateKeypair();
const callbacks = createSignetCallbacks(secretKey, "my-agent");
const result = await generateText({
model: openai("gpt-4o"),
tools: { myTool },
...callbacks,
prompt: "...",
});
// Every tool call is now signed
console.log(callbacks.receipts);
MCP リファレンスサーバー
このリポジトリには、@signet-auth/mcp-server を使ったサーバー側検証を実演する、最小構成の MCP リファレンスサーバーも含まれています。
cd examples/mcp-agent
npm ci
npm run verifier-server
利用可能なツール:
inspect_current_request—params._meta._signetを含む場合、現在の MCP ツール呼び出しを検証しますverify_receipt— 生の Signet レシートを公開鍵に照らして検証しますverify_request_payload— 合成した MCPtools/callペイロードをオフラインで検証します
環境変数:
SIGNET_TRUSTED_KEYS— カンマ区切りのed25519:<base64>公開鍵SIGNET_REQUIRE_SIGNATURE—trueまたはfalse(デフォルトはtrue)SIGNET_REQUIRE_TRUSTED_SIGNER—trueまたはfalse(デフォルトはtrue)SIGNET_MAX_AGE— レシートの最大有効期間(秒単位、デフォルトは300)SIGNET_EXPECTED_TARGET— 省略可能な期待値receipt.action.target
スタンドアロン MCP 署名サーバー
@signet-auth/mcp-tools は、Signet の署名、検証、コンテンツハッシュ化を MCP ツールとして提供します。あらゆる MCP 対応クライアントに接続できます。
npx @signet-auth/mcp-tools
利用可能なツール:signet_generate_keypair、signet_sign、signet_verify、signet_content_hash。
Python SDK(LangChain/CrewAI/AutoGen など6つ)
pip install signet-auth
from signet_auth import SigningAgent
# Create an agent identity (saved to ~/.signet/keys/)
agent = SigningAgent.create("my-agent", owner="willamhou")
# Sign any tool call -- receipt is auto-appended to audit log
receipt = agent.sign("github_create_issue", params={"title": "fix bug"})
# Verify
assert agent.verify(receipt)
# Query audit log
for record in agent.audit_query(since="24h"):
print(f"{record.receipt.ts} {record.receipt.action.tool}")
通常の Python ツールでは、最も手軽な導入方法はデコレーターレイヤーです。
from signet_auth import SigningAgent, signet_tool
agent = SigningAgent.create("tool-bot", owner="team")
@signet_tool(agent=agent, target="mcp://github.prod", audit_encrypt_params=True)
def create_issue(title: str, repo: str) -> str:
return f"{repo}:{title}"
Python MCP サーバーやその他の実行境界を運用する場合は、パイロット構成で永続的な nonce バックエンドとともに verify_request() を使用します。
from signet_auth import FileNonceChecker, VerifyOptions, verify_request
nonce_checker = FileNonceChecker(".signet/nonces.json")
opts = VerifyOptions(
trusted_keys=["ed25519:..."],
expected_target="mcp://github.prod",
nonce_checker=nonce_checker,
)
result = verify_request(request_params, opts)
if not result.ok:
raise ValueError(result.error or "verification failed")
if not result.trusted:
raise ValueError("untrusted signer")
LangChain 統合
from signet_auth import SigningAgent
from signet_auth.langchain import SignetCallbackHandler
agent = SigningAgent("my-agent")
handler = SignetCallbackHandler(agent)
# Every tool call is now signed + audited
chain.invoke(input, config={"callbacks": [handler]})
# Async chains supported too
from signet_auth.langchain import AsyncSignetCallbackHandler
CrewAI 統合
from signet_auth import SigningAgent
from signet_auth.crewai import install_hooks
agent = SigningAgent("my-agent")
install_hooks(agent)
# All CrewAI tool calls are now globally signed
crew.kickoff()
AutoGen 統合
from signet_auth import SigningAgent
from signet_auth.autogen import signed_tool, sign_tools
agent = SigningAgent("my-agent")
# Wrap a single tool
wrapped = signed_tool(tool, agent)
# Or wrap all tools at once
wrapped_tools = sign_tools([tool1, tool2], agent)
LangGraph との統合
LangGraph は LangChain のコールバックシステムを使用します。同じハンドラーをそのまま使用できます。
from signet_auth import SigningAgent
from signet_auth.langgraph import SignetCallbackHandler
agent = SigningAgent("my-agent")
handler = SignetCallbackHandler(agent)
result = graph.invoke(input, config={"callbacks": [handler]})
LlamaIndex との統合
from signet_auth import SigningAgent
from signet_auth.llamaindex import install_handler
agent = SigningAgent("my-agent")
handler = install_handler(agent)
# All tool call events are now signed
index = ... # your LlamaIndex setup
response = index.as_query_engine().query("What is Signet?")
# Access receipts
print(handler.receipts)
Pydantic AI との統合
from signet_auth import SigningAgent
from signet_auth.pydantic_ai_integration import SignetMiddleware
agent = SigningAgent("my-agent")
middleware = SignetMiddleware(agent)
@middleware.wrap
def my_tool(query: str) -> str:
return f"result: {query}"
Google ADK との統合
from signet_auth import SigningAgent
from signet_auth.google_adk import SignetPlugin
agent = SigningAgent("my-agent")
plugin = SignetPlugin(agent)
# Pass as callback to ADK agent
Smolagents との統合
from signet_auth import SigningAgent
from signet_auth.smolagents import signet_step_callback
agent = SigningAgent("my-agent")
callback = signet_step_callback(agent)
bot = CodeAgent(tools=[...], model=model, step_callbacks=[callback])
OpenAI Agents SDK との統合
from signet_auth import SigningAgent
from signet_auth.openai_agents import SignetAgentHooks
agent = SigningAgent("my-agent")
oai_agent = Agent(
name="assistant",
hooks=SignetAgentHooks(agent),
tools=[...],
)
注: ツール呼び出しの引数はまだフック API で利用できません(issue #939)。署名されるのはツール名のみです。
低レベル API
from signet_auth import generate_keypair, sign, verify, Action
kp = generate_keypair()
action = Action("github_create_issue", params={"title": "fix bug"})
receipt = sign(kp.secret_key, action, "my-agent", "willamhou")
assert verify(receipt, kp.public_key)
双方向レシート(サーバーによる共同署名)
from signet_auth import generate_keypair, sign, sign_bilateral, verify_bilateral, Action
# Agent signs the tool call
agent_kp = generate_keypair()
action = Action("github_create_issue", params={"title": "fix bug"})
agent_receipt = sign(agent_kp.secret_key, action, "my-agent")
# Server co-signs with the response
server_kp = generate_keypair()
bilateral = sign_bilateral(
server_kp.secret_key, agent_receipt,
{"content": [{"type": "text", "text": "issue #42 created"}]},
"github-server",
)
assert verify_bilateral(bilateral, server_kp.public_key)
assert bilateral.v == 3 # v3 = bilateral receipt
仕組み
Your Agent
|
v
SigningTransport (wraps any MCP transport)
|
+---> Signs each tool call (Ed25519)
+---> Appends Action Receipt to local audit log (hash-chained)
+---> Forwards request to MCP server (unchanged)
クライアント側の署名は、サーバーを変更せずに機能します。サーバーも管理している場合は、verifyRequest() と任意の signResponse() を追加して、実行境界での検証と双方向レシートに対応できます。signResponse() は、信頼できる verifyRequest() が正常に完了した後にのみ実行してください。また、双方向署名に最終的な executed/failed/rejected/requires_approval の結果状態を含められるようになりました。
アクションレシート
すべてのツール呼び出しは、署名付きレシートから始まります。より上位のレシートバージョンでは、サーバーによる共同署名(v3)と認可チェーン(v4)が追加されます。
{
"v": 1,
"id": "rec_e7039e7e7714e84f...",
"action": {
"tool": "github_create_issue",
"params": {"title": "fix bug"},
"params_hash": "sha256:b878192252cb...",
"target": "mcp://github.local",
"transport": "stdio"
},
"signer": {
"pubkey": "ed25519:0CRkURt/tc6r...",
"name": "demo-bot",
"owner": "willamhou"
},
"ts": "2026-03-29T23:24:03.309Z",
"nonce": "rnd_dcd4e135799393...",
"sig": "ed25519:6KUohbnSmehP..."
}
署名は、RFC 8785(JCS) の正規化 JSON を使用して、レシート本文全体(アクション+署名者+タイムスタンプ+ノンス)を対象とします。いずれかのフィールドを変更すると、署名は無効になります。
CLI コマンド
| コマンド | 説明 |
|---|---|
signet identity generate --name <n> | Ed25519 ID を生成します(デフォルトで暗号化) |
signet identity generate --unencrypted | 暗号化せずに生成します(CI 用) |
signet identity list | すべての ID を一覧表示します |
signet identity export --name <n> | 公開鍵を JSON としてエクスポートします |
signet sign --key <n> --tool <t> --params <json> --target <uri> | アクションに署名します |
signet sign --hash-only | パラメーターのハッシュのみを保存します(生のパラメーターは保存しません) |
signet sign --output <file> | レシートを標準出力ではなくファイルに書き込みます |
signet sign --no-log | 監査ログへの追記をスキップします |
signet sign --encrypt-params | レシート出力は変更せず、監査ログ内の action.params を暗号化します |
signet sign --policy <path> | 署名の前にポリシーを適用し、PolicyAttestation を埋め込みます |
signet verify <receipt.json> --pubkey <name> | レシートの署名を検証します |
signet verify --chain | 監査ログのハッシュチェーンの整合性を検証します |
signet audit | 最近のアクションを一覧表示します |
signet audit --since <duration> | 時間で絞り込みます(例:24h、7d) |
signet audit --tool <substring> | ツール名で絞り込みます |
signet audit --verify | すべてのレシート署名を検証します |
signet audit --export <file> | レコードを JSON としてエクスポートします |
signet audit --bundle <dir> | オフホスト監査の引き継ぎ用に、移植可能な署名付き証拠バンドル(records.jsonl + manifest.json + hash-summary.txt)を作成します |
signet audit --bundle <dir> --include-trust-bundle <path> | 証拠パッケージにトラストバンドルのスナップショットを埋め込みます |
signet audit --restore <dir> | 以前に作成した証拠バンドルを再検証します(任意のマシンで動作し、signet キーストアは不要です) |
signet audit --export <file> --decrypt-params | 元の監査レコードと、復号されたパラメーターを含む materialized_receipt をエクスポートします |
signet explore | レシートを対話的に閲覧します(テーブル、詳細、統計、チェーンチェック) |
signet explore --show N | 署名、ポリシー、チェーン情報とともにレシート #N を調査します |
signet explore --show N --decrypt-params | 暗号化された action.params をローカルで確認できるように展開します |
signet explore --stats | ツール、署名者、バージョン別のレシート統計を表示します |
signet delegate create ... --ttl 24h | スコープを限定した委任トークンを作成します(有効期間が短いトークン) |
signet delegate sign ... --chain <file> | 委任証明を使って署名し、v4 レシートを生成します |
signet delegate verify-auth <receipt> --trusted-roots <name> | 認証チェーン、スコープ、信頼されたルートを検証します |
signet policy validate <path> | ポリシーの構文を検証し、そのハッシュを出力します |
signet policy check <path> --tool <t> --params <json> | アクションが許可されるかどうかをドライランで確認します |
signet proxy --target <cmd> --key <name> | MCP stdio プロキシとして実行し、すべてのツール呼び出しに透過的に署名します(エフェメラルなサーバーキー) |
signet proxy ... --server-key <name> | 永続的なサーバー署名 ID を使用します(再起動後も安定したサーバー公開鍵をトラストバンドルで固定するために必要です) |
signet proxy ... --policy <path> | 署名の前にポリシーを適用するプロキシとして実行します |
signet verify <bilateral.json> --trust-bundle <bundle> --nonce-store <path> | プロセスの再起動後も有効なリプレイ防止機能を使って、v3 双方向レシートを検証します |
signet claude install | Claude Code プラグイン(PostToolUse 署名フック)をインストールします |
signet claude uninstall | Claude Code プラグインを削除します |
signet dashboard | ブラウザーでローカル監査ダッシュボードを開きます |
CI では、対話型プロンプトまたは SIGNET_PASSPHRASE 環境変数でパスフレーズを渡します。
監査ダッシュボード
signet dashboard を実行すると、監査ログを確認できるローカル Web UI が開きます。アカウントもネットワーク接続も不要で、ローカルのレシートだけを使用します。
タイムラインビュー:すべてのツール呼び出しについて、署名者、ツール名、対象、レシート ID を記録します。時刻、ツール、署名者で絞り込めます。
Chain Integrity タブでは、監査ログ全体の SHA-256 ハッシュチェーンを検証します。改ざんや欠落があれば、該当するファイルと行を特定します。
189 行目でチェーンが破損しています。期待値と実際のハッシュが表示されます。これが「追記専用」の実際の姿です。
ドキュメント
| ドキュメント | 説明 |
|---|---|
| アーキテクチャ | システム設計、コンポーネントの概要、データフロー |
| セキュリティ | 暗号プリミティブ、脅威モデル、鍵の保存 |
| パイロット導入手順書 | 創業者が支援するパイロット導入のエンドツーエンド手順書:ID、信頼バンドル、プロキシの --server-key、永続的なリプレイ、証拠バンドル、結果の記録、侵害発生時の手順 |
| MCP 統合ガイド | SigningTransport を使用した MCP の手順に沿ったセットアップ |
| CI/CD 統合 | GitHub Actions の例、CI 用の鍵管理 |
| 監査ログガイド | 監査ログのクエリ、フィルタリング、ハッシュチェーンの検証 |
| 貢献方法 | ビルド手順、開発ワークフロー |
| 変更履歴 | バージョン履歴 |
プロジェクト構成
signet/
├── crates/signet-core/ Rust core: identity, sign, verify, audit, keystore
├── signet-cli/ CLI tool (signet binary)
├── bindings/
│ ├── signet-ts/ WASM binding (wasm-bindgen)
│ └── signet-py/ Python binding (PyO3 + maturin)
├── plugins/
│ ├── claude-code/ Claude Code plugin (WASM signing + audit)
│ └── codex/ Codex CLI plugin (WASM signing + audit)
├── packages/
│ ├── signet-core/ @signet-auth/core — TypeScript wrapper
│ ├── signet-mcp/ @signet-auth/mcp — MCP SigningTransport middleware
│ ├── signet-mcp-server/ @signet-auth/mcp-server — Server verification
│ ├── signet-mcp-tools/ @signet-auth/mcp-tools — Standalone MCP signing server
│ ├── signet-node/ @signet-auth/node — Node local audit/operator helpers
│ └── signet-vercel-ai/ @signet-auth/vercel-ai — Vercel AI SDK middleware
├── examples/
│ ├── wasm-roundtrip/ WASM validation tests
│ └── mcp-agent/ MCP agent, echo server, and verifier server example
├── docs/ Design docs, specs, plans
├── LICENSE-APACHE
└── LICENSE-MIT
ソースからのビルド
前提条件
- Rust(1.70+)
- wasm-pack
- Node.js(18+)
- Python(3.10+)+ maturin(Python バインディング用)
ビルド
# Rust core + CLI
cargo build --release -p signet-cli
# WASM binding
wasm-pack build bindings/signet-ts --target nodejs --out-dir ../../packages/signet-core/wasm
# TypeScript packages
cd packages/signet-core && npm run build
cd packages/signet-mcp && npm run build
cd packages/signet-mcp-server && npm run build
cd packages/signet-mcp-tools && npm run build
cd packages/signet-node && npm run build
cd packages/signet-vercel-ai && npm run build
# Python binding
cd bindings/signet-py
pip install maturin
maturin develop
テスト
# Rust tests
cargo test --workspace
# Python tests
cd bindings/signet-py && pytest tests/ -v
# WASM roundtrip
node examples/wasm-roundtrip/test.mjs
# TypeScript tests
cd packages/signet-core && npm test
cd packages/signet-mcp && npm test
cd packages/signet-mcp-server && npm test
cd packages/signet-mcp-tools && npm test
cd packages/signet-node && npm test
# Plugin tests
cd plugins/claude-code && npm test
cd plugins/codex && npm test
# Vercel AI SDK tests
cd packages/signet-vercel-ai && npm test
# Reference verifier server smoke test
cd examples/mcp-agent && npm run smoke
セキュリティ
- Ed25519 署名(128 ビットのセキュリティレベル、
ed25519-dalek) - Argon2id 鍵導出(OWASP 推奨の最小要件)
- XChaCha20-Poly1305 による、認証付き関連データ(AAD)を用いた鍵の暗号化
- SHA-256 ハッシュチェーンによる、改ざんを検出できる監査ログ
- RFC 8785(JCS) 準拠の正規化 JSON による、決定論的な署名
鍵は ~/.signet/keys/ に 0600 の権限で保存されます。SIGNET_HOME 環境変数で保存先を変更できます。
Signet が証明すること
- エージェントの鍵 X が、時刻 T にパラメーター Z を指定してツール Y を呼び出す意図に署名したこと
Signet が(現時点で)証明しないこと
- MCP サーバーがアクションを実行したこと(サーバー側の署名を加えるには、
signResponse()を使用した双方向レシートを利用してください。v0.4 でリリース済み) - 署名者の owner が実際にその鍵を管理していること(ID レジストリを今後予定)
Signet はまず証拠レイヤーです。何が起きたかを証明します。また、署名境界と実行境界でチェックを適用できますが、必要に応じてサンドボックス化、最小権限設計、人間による承認を行うことに取って代わるものではありません。
関連プロジェクト
- Prismer Cloud — 進化エンジン、メモリーレイヤー、コミュニティ、Ed25519/DID ID 機能を内蔵した、完全なエージェントハーネスです。完全なエージェントプラットフォームが必要な場合は Prismer Cloud を、単独の証明レイヤーだけが必要な場合は Signet をご利用ください。
- Prismer.AI — オープンソースの AI 研究プラットフォーム
スター履歴
Signet が役に立ったら、このリポジトリにスターを付けてください。より多くのチームに見つけてもらう助けになります。
ライセンス
Apache-2.0 + MIT のデュアルライセンスです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。