关于 Signet MCP Tools
Signet MCP Tools 是 Signet 提供的 MCP 服务,通过 stdio 暴露加密签名、验证和内容哈希工具。它面向需要为 AI Agent 工具调用留存可验证证据的开发者与合规团队,验证时仅需公钥,不依赖任何托管平台。
主要功能
- 01通过 stdio 提供 MCP 工具
- 02加密签名
- 03签名验证
- 04内容哈希计算
适用场景
- 01为 Agent 的工具调用生成可验证的签名记录
- 02在审计时离线验证签名内容
- 03在 MCP 工作流中检查内容哈希
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
4收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
Signet
别只记录 Agent 的操作,还要证明这些操作。
为每项 AI Agent 操作提供加密信任与授权证据——身份、委派、策略、回执:均经过签名、哈希链式关联,并可离线验证。不依赖任何提供商。
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 Agent 刚刚下单、删除了一行数据、发送了一封电子邮件、合并了一个 PR。你能向审计员、客户,或在事故发生后向自己证明它具体做了什么吗?
Signet 是 Agent 操作的独立信任层。每次工具调用都会获得一份已签名的回执,任何人都可以离线验证,无需信任托管 Agent 的平台或存储日志的供应商——而且从 0.11 版起,操作背后的授权本身也附带证明:Agent 的身份(主体)、允许其采取行动的人(委托方),以及允许这项具体操作的人(由授权方签名的决策)。
你的 Agent 在他们的基础设施上运行。证明归你所有。
为什么不直接用日志?
传统日志只能告诉你平台声称发生了什么。它们可以被修改、依赖特定供应商,而且如果不信任写入日志的一方,就无法验证。
Signet 回执则不同。修改任何字段——工具名称、参数、时间戳、签名者——Ed25519 签名都会失效。删除或重新排列条目,SHA-256 哈希链就会失效。验证只需要公钥。无需网络调用、API 或登录。
| 普通日志 | Signet 回执 |
|---|---|
| 由供应商声称事件已发生 | 任何人都可以离线验证 |
| 事后可以修改 | 篡改会导致签名失效 |
| 无法证明顺序 | 删除或重新排列会导致哈希链失效 |
| 信任日志托管方 | 使用公钥验证 |
| 单方面声明 | 支持双方共同签名 |
使用日志进行可观测性监控。需要证据时,使用 Signet。
适用对象
- MCP 构建者——使用
signet proxy包装任意 MCP 服务,为每次tools/call签名,无需修改代码 - 安全 / 合规团队——防篡改审计轨迹,满足《欧盟 AI 法案》第 12 条、SOC 2 CC7.2、ISO 27001 A.8.15 的要求
- 企业 Agent 平台——证明 Agent 做了什么、由谁授权,以及当时生效的是哪项策略
- 框架用户——支持 LangChain、CrewAI、Claude Code、Codex、OpenAI Agents、Vercel AI SDK
- Agent 对 Agent 部署——双方都持有密钥时支持共同签名
如果无法独立验证某次工具调用,就不应无条件信任它。 当审计员要求提供证明、你无法控制的基础设施发生事故,或问题不是“控制台上怎么说”,而是“实际上发生了什么”时,这一点至关重要。
每个 Agent 都拥有一个 Ed25519 身份。每次工具调用都可以签名、追加到哈希链式审计轨迹中、离线验证或在执行前验证、由服务端共同签名、绑定到委托链,并可选择绑定到策略决策。
上方视频展示了完整流程。下方 SVG 展示了 CLI 的签名细节;也可以跳转到查看如何拒绝错误请求,观看服务端如何在运行前拦截错误请求。
此处的第一个演示展示了签名和审计回执。另请参阅 MCP 流程图。
## Signet 提供的功能Signet 为 Agent 操作提供轻量级信任层:
- 签署每次工具调用,使用 Agent 的加密密钥
- 在信任请求之前,离线或在执行边界处验证
- 透明地代理任何 MCP 服务——无需修改 Agent 或服务代码即可签署请求,并在代理路径中进行本地双边审计联签
- 在你能控制双方时,使用双边收据联签服务响应
- 通过
trace_id和parent_receipt_id链接收据,追踪多步骤工作流 - 通过带作用域的委派链授权 Agent,以证明谁允许了该操作
- 满足 YAML 策略时嵌入已签名的
PolicyAttestation,以证明策略符合要求 - 使用仅追加式审计日志和仪表板在本地检查,无需托管控制平面
0.11 版本新增内容
- 规范主体:每个身份都可以携带带作用域的主体 URI(
agent://prismer/deploy-bot),并在收据和委派令牌中签名;acting_for声明由链根进行机器验证。 - 由权限方签名的授权决策:
signet authorize会预先批准一项意图;signet sign --decision会生成由该决策支持的收据(或者使用--authority-key一步完成)。决策通过intent_hash绑定到操作,因此会拒绝将其重放到其他操作上。 - 撤销:
signet revoke使用由签发方签名的记录使委派令牌和决策失效。验证会报告明确状态——revoked会导致验证失败,unknown绝不会被报告为已授权(严格模式使用--require-revocation-known)。证据包会携带撤销记录。 - 条件和限制:策略规则携带类型化义务(
require_approval、sandbox,等等);委派作用域携带约束(--max-calls、--spend-limit)。签署路径会强制执行调用次数预算和收窄不变量(授权可以缩小委派范围,但不能扩大范围)。 - 加固:
verify()现在可以正确验证 v4 收据;未提供状态时,限速策略规则会默认拒绝;委派到期时间绑定到挂钟时间(回填收据时间戳不再能绕过到期检查)。
合规性
Signet 提供审计人员评估 AI Agent 操作时关注的技术控制措施。详情请参阅完整的合规映射。
| 框架 | 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)
为什么要为此仓库点 Star?
Signet 正在开创一个新品类:面向 AI Agent 的可验证工具调用回执。点 Star 不只是收藏,它还能推动将 Agent 操作的加密证据引入生态,让受监管行业、企业平台和框架用户无需从头实现。
- 与 Microsoft Agent Governance Toolkit 合作(示例已合并至 PR #1196)
- 被列为 LangChain 的 ComplianceBackend RFC 贡献者(#35691)
- 推进与 IETF draft-farley-acta-signed-receipts 规范的一致性工作
- 与 NIST NCCoE 的四大支柱相对应,面向 AI Agent 身份和授权(2026 年第四季度互操作性配置文件)
如果你正在构建需要经得起审计、事件调查或第三方追问“拿证据来”的 Agent,请为仓库点 Star、试用并提交 Issue。
如果你刚开始使用,可以从以下五条路径中选择一条:
选择你的路径
- Claude Code:最适合在编码 Agent 中快速上手。在 Claude Code 中运行
/plugin install signet@claude-plugins-official。5 分钟内,你就能使用已签名的工具调用,并在本地~/.signet/audit/留下审计日志。 - Codex CLI:最适合为 Codex 中的 Bash 工具调用签名。将
plugins/codex/复制到~/.codex/plugins/signet,并添加一个PostToolUsehook。5 分钟内,你就能在 Codex 中为 Bash 操作签名,并使用同一审计记录。 - Python SDK:最适合希望在 LangGraph、LlamaIndex、OpenAI Agents、CrewAI 或自有工具运行器中使用回执的场景。从
SigningAgent.create(...)开始,只在需要的地方添加框架 hooks。 - MCP 客户端:最适合能够控制 MCP 客户端或传输层的场景。使用
new SigningTransport(inner, secretKey, "my-agent")封装传输层。5 分钟内,你就能为tools/call请求签名,并在params._meta._signet中附带回执。 - MCP 服务:最适合希望在执行前进行验证的场景。在工具处理程序中调用
verifyRequest(request, {...})。5 分钟内,你就能在执行边界检查签名者、新鲜度、目标绑定以及工具和参数。
查看如何拒绝无效请求
运行最简的执行边界演示:
cd examples/mcp-agent
npm run execution-boundary-demo
查看 examples/mcp-agent/demo-execution-boundary.mjs 获取演示源代码。
委托链:谁授权了这个 Agent?
Signet 回执证明发生了什么。委托链证明是谁允许的。
根身份(个人或组织)以加密方式向 Agent 委托特定范围的权限。权限只能收窄,不能扩大。Agent 的 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),而不是长期或永不过期的令牌。如果 Agent 遭到入侵,委托会自动过期。根据需要重新签发令牌。这与短期 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
- 你需要为编码 Agent、MCP 工具或 CI 自动化建立防篡改审计跟踪
- 你希望在发生事故后,证明是哪位 Agent 请求了某项操作,以及由谁授权
- 你需要可离线验证的回执,不依赖托管服务
- 你希望在签名之前轻量地执行策略,而不在技术栈中添加代理
Signet 的定位
- Signet 是 Agent 操作的信任层,提供签名、审计、验证、委派和策略证明
- Signet 的设计目标是 通过 SDK、插件和 MCP 中间件融入现有 Agent 技术栈
- 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 参考服务
此仓库还包含一个最小化的 MCP 参考服务,演示如何使用 @signet-auth/mcp-server 在服务端进行验证。
cd examples/mcp-agent
npm ci
npm run verifier-server
可用工具:
inspect_current_request— 如果当前 MCP 工具调用包含params._meta._signet,则对其进行验证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 服务或其他执行边界,请在试点配置中使用 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 尚不提供工具调用参数(问题 #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 身份(默认加密) |
signet identity generate --unencrypted | 生成未加密身份(用于 CI) |
signet identity list | 列出所有身份 |
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> | 使用持久化的服务签名身份(信任包需要此选项,以便在重启后将稳定的服务公钥设为信任锚点) |
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。可按时间、工具或签名者筛选。
链完整性选项卡会验证整个审计日志的 SHA-256 哈希链——任何篡改或缺口都会精确定位到具体文件和行:
第 189 行的链已断开:显示预期哈希与实际哈希。这就是“只追加”在实际中的样子。
文档
| 文档 | 说明 |
|---|---|
| 架构 | 系统设计、组件概览、数据流 |
| 安全 | 加密原语、威胁模型、密钥存储 |
| 试点部署操作手册 | 创始人协助试点的端到端操作手册:身份、信任包、代理 --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 能证明什么
- Agent 密钥 X 在时间 T 签署了调用工具 Y 并传入参数 Z 的意图
Signet 目前不能证明什么
- MCP 服务实际执行了该操作(使用
signResponse()进行双边凭证签署,让服务共同签名——已在 v0.4 发布) - signer.owner 确实控制该密钥(计划中:身份注册表)
Signet 首先是一个证据层:它证明发生了什么。它也可以在签名边界和执行边界强制执行检查,但不能替代沙箱、最小权限设计,或在需要时进行人工审批。
相关项目
- Prismer Cloud — 完整的 Agent 框架,包含演进引擎、记忆层、社区,以及内置的 Ed25519/DID 身份。需要完整的 Agent 平台时使用 Prismer Cloud;只需要独立的证明层时使用 Signet。
- Prismer.AI — 开源 AI 研究平台
Star 历史
如果 Signet 对你有用,请为这个仓库点星——这有助于更多团队发现它。
许可证
Apache-2.0 + MIT 双重许可。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。