mcpField
S
Signet MCP Tools

Signet MCP Tools

本地服务
github.com/Prismer-AI安全405 周前更新

关于 Signet MCP Tools

Signet MCP Tools 是 Signet 提供的 MCP 服务,通过 stdio 暴露加密签名、验证和内容哈希工具。它面向需要为 AI Agent 工具调用留存可验证证据的开发者与合规团队,验证时仅需公钥,不依赖任何托管平台。

主要功能

  1. 01通过 stdio 提供 MCP 工具
  2. 02加密签名
  3. 03签名验证
  4. 04内容哈希计算

适用场景

  1. 01为 Agent 的工具调用生成可验证的签名记录
  2. 02在审计时离线验证签名内容
  3. 03在 MCP 工作流中检查内容哈希

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"prismer-ai-signet-mcp-tools": {
"command": "npx",
"args": [
"-y",
"@signet-auth/mcp-tools"
]
}
}
}
启动命令npx -y @signet-auth/mcp-tools

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@signet-auth/mcp-tools0.4.1

工具

4

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

Signet

别只记录 Agent 的操作,还要证明这些操作。
为每项 AI Agent 操作提供加密信任与授权证据——身份、委派、策略、回执:均经过签名、哈希链式关联,并可离线验证。不依赖任何提供商。

持续集成 版本发布 许可证 星标 在 Codespaces 中打开

SDK crates.io PyPI npm 包

TypeScript 包: @signet-auth/core · @signet-auth/mcp · @signet-auth/mcp-server · @signet-auth/mcp-tools · @signet-auth/node · @signet-auth/vercel-ai

English 简体中文

▶ 试用在线演示 — 在浏览器中为一次工具调用签名,修改一个字段,观察验证失败。(镜像:GitHub Pages)

在 YouTube 上观看 Signet 演示视频

▶ 演示:签名、审计日志与验证 · ▶ 演示:执行边界与 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 的签名细节;也可以跳转到查看如何拒绝错误请求,观看服务端如何在运行前拦截错误请求。

Signet 演示

此处的第一个演示展示了签名和审计回执。另请参阅 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 条记录保存:事件日志记录、可追溯性、身份识别、完整性
DORAICT 事件日志记录(第 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,并添加一个 PostToolUse hook。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

执行边界演示:在执行前拒绝无效请求

想看动态演示?下载 MP4 或 GIF。

查看 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)

Signet MCP 双向流程演示

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 — 离线验证模拟的 MCP tools/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——无需账号、无需网络,只需查看本地凭证。

Signet 审计仪表板 — 时间线视图,显示每次已签名的工具调用

时间线视图:记录每次工具调用的签名者、工具名称、目标和凭证 ID。可按时间、工具或签名者筛选。

链完整性选项卡会验证整个审计日志的 SHA-256 哈希链——任何篡改或缺口都会精确定位到具体文件和行:

Signet 链完整性检查 — 在第 189 行检测到断点

第 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 对你有用,请为这个仓库点星——这有助于更多团队发现它。

Star History Chart

许可证

Apache-2.0 + MIT 双重许可。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。