signet
Ваш ИИ-агент только что вызвал инструмент. Можете ли вы доказать, что он сделал?
Большинство стеков агентов регистрируют действия постфактум, но никогда не проверяют, что было отправлено на самом деле. Если запрос был перехвачен, изменен или подделан, сторона выполнения не имеет возможности узнать об этом.
Signet решает эту проблему: каждый агент получает идентификатор Ed25519, каждый вызов инструмента подписывается, журнал аудита с хеш-цепочкой записывает все произошедшее, а клиенты или серверы могут проверить запрос перед тем, как доверять ему. 3 строки для подписи. 3 строки для проверки. Открытый исходный код.
Если Signet полезен для вас, поставьте звезду этому репозиторию, чтобы помочь другим командам найти его.
Начните с потока CLI ниже, чтобы увидеть подпись в действии, а затем перейдите к разделу «Увидеть отклонение плохих запросов», чтобы посмотреть, как сервер блокирует неподписанные, измененные, устаревшие или нецелевые запросы перед их выполнением.
Почему Signet
Signet добавляет легкий уровень доверия для действий агентов:
Подписывайте каждый вызов инструмента криптографическим ключом агента
Аудируйте произошедшее с помощью локального журнала с хеш-цепочкой, доступного только для добавления
Проверяйте любую квитанцию действия офлайн, сеть не требуется
Интегрируйте с Claude Code, Codex CLI, клиентами и серверами MCP, фреймворками Python и Vercel AI SDK
Попробуйте за 30 секунд
pip install signet-authfrom 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)Если вы новичок, начните с одного из этих четырех путей:
Выберите свой путь
Claude Code: Лучший выбор для быстрого запуска в агенте кодирования. Выполните
/plugin install signet@claude-plugins-officialв Claude Code. Через 5 минут у вас будут подписанные вызовы инструментов и локальный журнал аудита в~/.signet/audit/.Codex CLI: Лучший выбор для подписи вызовов Bash в Codex. Скопируйте
plugins/codex/в~/.codex/plugins/signetи добавьте один хукPostToolUse. Через 5 минут у вас будут подписанные действия Bash в Codex с использованием того же аудиторского следа.Клиенты 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 для получения исходного кода демонстрации.
Когда команды обращаются к Signet
Вам нужен аудиторский след для агентов кодирования, инструментов MCP или CI-автоматизации
Вы хотите доказать, какой агент запросил действие после инцидента
Вам нужны квитанции, которые можно проверить офлайн без зависимости от хостингового сервиса
Вы хотите иметь доказательства вызова инструментов с подписью, не добавляя прокси или шлюз в свой стек
Что такое Signet и чем он не является
Signet — это уровень аттестации для действий агентов: подпись, аудит и проверка
Signet — это решение, разработанное для встраивания в существующие стеки агентов с помощью SDK, плагинов и промежуточного ПО 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 (Vercel AI SDK middleware)
npm install @signet-auth/vercel-aiБыстрый старт
Плагин 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
Автоматически подписывайте каждый вызов инструмента Bash в Codex CLI:
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-toolsCLI
# 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 { verifyRequest } from "@signet-auth/mcp-server";
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const verified = verifyRequest(request, {
trustedKeys: ["ed25519:..."],
maxAge: 300,
});
if (!verified.ok) return { content: [{ type: "text", text: verified.error }], isError: true };
console.log(`Verified: ${verified.signerName}`);
// process tool call...
});Интеграция с Vercel AI SDK
import { generateText } from "ai";
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-4"),
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._signetverify_receipt— проверяет необработанную квитанцию Signet с помощью открытого ключаverify_request_payload— проверяет синтетическую полезную нагрузкуtools/callMCP офлайн
Переменные окружения:
SIGNET_TRUSTED_KEYS— открытые ключиed25519:<base64>, разделенные запятымиSIGNET_REQUIRE_SIGNATURE—trueилиfalse(по умолчаниюfalse)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 (LangChain / CrewAI / AutoGen + еще 6)
pip install signet-authfrom 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}")Интеграция с 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)Только на стороне агента. Серверы MCP менять не нужно.
Квитанция действия
Каждый вызов инструмента создает подписанную квитанцию:
{
"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..."
}Подпись охватывает все тело квитанции (действие + подписывающий + метка времени + одноразовый номер) с использованием канонического JSON RFC 8785 (JCS). Изменение любого поля делает подпись недействительной.
Команды CLI
Команда | Описание |
| Генерировать идентификатор Ed25519 (по умолчанию зашифрован) |
| Генерировать без шифрования (для CI) |
| Список всех идентификаторов |
| Экспортировать открытый ключ в формате JSON |
| Подписать действие |
|
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Prismer-AI/signet'
If you have feedback or need assistance with the MCP directory API, please join our Discord server