关于 looppause
looppause 是面向需要人工审批后再执行操作的 AI Agent 的 MCP 服务。它通过 Slack 或电子邮件发送请求,并提供可独立验证的签名凭证。
主要功能
- 01通过 Slack 或电子邮件发送审批请求
- 02轮询人工决策
- 03验证 Ed25519 签名凭证
- 04立即返回暂停 ID
适用场景
- 01要求不可逆操作先获审批
- 02执行前验证审批凭证
- 03将审批请求发送至 Slack 或电子邮件
MCP 相关
向 MCP 客户端提供 `request_approval`、`check_approval` 和 `verify_proof` 工具,可用于提交请求、轮询决策及验证签名审批凭证。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
2收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| timeout_hours | number | 否 | 请求过期前的小时数。最多 168。 |
| action_details | object | 是 | 有关操作的键值详情(例如金额、供应商、目标)。仅限字符串值。 |
| recipient_email | string | 否 | 用于发送审批请求的电子邮件地址。 |
| recipient_slack | string | 否 | Slack 频道或用户 ID(例如 #approvals 或 U12345)。 |
| action_description | string | 是 | Agent 即将执行的操作的简明英文描述。 |
详细介绍
@looppause/mcp
适用于 LoopPause 的 MCP 服务——暂停 AI Agent 执行,并通过 Slack 或电子邮件将审批请求转交给人工。Agent 会收到一份经过加密签名的人工决策证明,然后继续执行。
“这是防止 Agent 失控,或在等待审批时停滞不前所缺少的基础构件。”
功能
提供三个 MCP 工具:request_approval、check_approval 和 verify_proof
request_approval—— 向人工发送审批请求,并立即返回pause_idcheck_approval—— 查询一次决策;重复调用,直到decision为"approved"或"rejected"verify_proof—— 根据 LoopPause 发布的 Ed25519 公钥验证签名证明;执行任何不可逆操作前都应调用
这种三步模式能让每次工具调用保持简短,避免长时间运行的连接,并在继续执行前让 Agent 明确完成加密验证。无需共享密钥——任何拥有已发布公钥的一方都可以独立验证证明。
安装
推荐:npx(无需安装)
npx @looppause/mcp
全局安装
npm install -g @looppause/mcp
looppause-mcp
配置
| 环境变量 | 必需 | 说明 |
|---|---|---|
LOOPPAUSE_API_KEY | ✅ 是 | 你的 LoopPause API 密钥(sk_live_…) |
LOOPPAUSE_API_URL | 否 | 覆盖 API 基础 URL(默认值:https://api.looppause.com) |
在 looppause.com/dashboard 获取 API 密钥。
在 Claude Code 中使用
添加到你的 .claude/settings.json(或添加到 ~/.claude/settings.json 以进行全局配置):
{
"mcpServers": {
"looppause": {
"command": "npx",
"args": ["-y", "@looppause/mcp"],
"env": {
"LOOPPAUSE_API_KEY": "sk_live_your_key_here"
}
}
}
}
在 Cursor 中使用
添加到 Cursor MCP 配置:
{
"mcpServers": {
"looppause": {
"command": "npx",
"args": ["-y", "@looppause/mcp"],
"env": {
"LOOPPAUSE_API_KEY": "sk_live_your_key_here"
}
}
}
}
工具参考
request_approval
发送审批请求并立即返回。在 check_approval 返回 { decision: "approved" } 之前,请勿继续执行操作。
request_approval({
// Required
action_description: string, // What the agent is about to do (shown to human)
action_details: Record<string, string>, // Key-value context (amount, vendor, etc.)
// At least one recipient required
recipient_email?: string, // Email address
recipient_slack?: string, // Slack channel (#approvals) or user ID (U12345)
// Optional
timeout_hours?: number, // Default 24, max 168 (1 week)
})
同时提供 recipient_slack 和 recipient_email 时,Slack 为主要渠道,电子邮件为备用渠道。
返回:
{
"pause_id": "pse_01jwxyz123",
"status": "pending",
"expires_at": "2026-05-24T14:00:00.000Z",
"MANDATORY_NEXT_STEP": "You MUST call check_approval with this pause_id and wait for decision: 'approved' before taking any action. Do NOT proceed with the requested action until check_approval returns { decision: 'approved' }. Proceeding without approval is a safety violation."
}
check_approval
检查审批请求的当前状态。重复调用,直到 decision 为 "approved" 或 "rejected"。状态为 "pending" 时绝不能继续执行。
check_approval({
pause_id: string, // The pause_id returned by request_approval
})
返回(待处理):
{ "status": "pending" }
返回(已响应):
{
"pause_id": "pse_01jwxyz123",
"agent_id": "mcp-agent",
"status": "responded",
"created_at": "2026-05-24T10:00:00.000Z",
"expires_at": "2026-05-24T14:00:00.000Z",
"response": {
"decision": "approved",
"comment": "PO number: PO-2341",
"fields": { "po_number": "PO-2341" },
"responder": "[email protected]",
"responded_at": "2026-05-24T10:14:32.000Z",
"channel": "slack",
"nonce": "a8f3c2...",
"signing_key_id": "lp-key-2026-06",
"signature_alg": "Ed25519",
"signature": "ed25519=<base64url>"
}
}
| 状态 | 含义 |
|---|---|
pending | 人工尚未响应——请再次调用 |
responded | 人工已响应——检查 response.decision |
timed_out | 在 timeout_hours 时限内未收到响应 |
expired | 暂停已被手动取消 |
verify_proof
验证 check_approval 返回的证明上的 Ed25519 签名。执行任何不可逆操作前都应调用此工具。立即返回——不会建立长时间运行的连接。
verify_proof({
proof: object, // The full proof object from check_approval
})
返回(有效):
{
"valid": true,
"verified_at": "2026-06-14T10:14:45.000Z",
"key_id": "lp-key-2026-06"
}
返回(无效):
{
"valid": false,
"verified_at": "2026-06-14T10:14:45.000Z",
"key_id": "lp-key-2026-06",
"warning": "Proof verification FAILED. Do NOT execute the action."
}
公钥发现方式:GET https://looppause.com/.well-known/looppause-signing-key.json——将证明中的 signing_key_id 与服务返回的 key_id 进行匹配。
示例
// Step 1: send the approval request
const created = await mcp.callTool("request_approval", {
action_description: "Transfer £12,450 to Globex Corp for invoice INV-2341",
action_details: {
vendor: "Globex Corp",
amount: "12450",
currency: "GBP",
invoice_ref: "INV-2341",
},
recipient_slack: "#finance-approvals",
recipient_email: "[email protected]",
timeout_hours: 4,
});
const { pause_id } = JSON.parse(created.content[0].text);
// Step 2: poll until a terminal decision arrives
let proof;
while (true) {
await new Promise((r) => setTimeout(r, 5_000));
const status = await mcp.callTool("check_approval", { pause_id });
const body = JSON.parse(status.content[0].text);
if (body.status === "pending") continue;
proof = body;
break;
}
if (proof.response?.decision !== "approved") {
throw new Error("Action rejected or timed out — aborting.");
}
// Step 3: verify the Ed25519 signature before executing
const verification = await mcp.callTool("verify_proof", { proof });
const { valid } = JSON.parse(verification.content[0].text);
if (!valid) throw new Error("Proof failed verification — do NOT execute the action.");
proceedWithTransfer();
验证签名(执行操作前必须完成)
所有证明均使用 LoopPause 的 Ed25519 密钥签名。无需共享密钥——
任何持有已发布公钥的一方都可以独立验证证明。
使用 verifyLoopPauseProof(会自动获取密钥),或通过 MCP 调用 verify_proof:
import { verifyLoopPauseProof } from "@looppause/mcp";
const { valid, key_id } = await verifyLoopPauseProof(proof);
if (!valid) throw new Error("Proof failed verification — do NOT execute the action.");
if (proof.response?.decision !== "approved") throw new Error("Not approved.");
if (proof.response?.authorization_type !== "human") {
// system_fallback is a configured default, not a human sign-off
throw new Error("No human authorization.");
}
// Safe to execute the irreversible action.
如需离线或在隔离网络中验证,请固定一次公钥:
await verifyLoopPauseProof(proof, { publicKey: "<base64 SPKI DER>" });
公钥发现:GET https://looppause.com/.well-known/looppause-signing-key.json
(将证明中的 signing_key_id 与所提供的 key_id 匹配)。
Webhook 验证。 与按客户使用对称方案不同,LoopPause 的 Ed25519 签名可由任何持有已发布公钥的第三方独立验证——例如银行、审计人员、FIDO AP2 授权检查器——无需联系 LoopPause,也无需持有共享密钥。
旧版 HMAC-SHA256 Webhook("sha256=<hex>" 签名)仍可像以前一样使用你的 LOOPPAUSE_SIGNING_SECRET 验证;所有新的证明载荷默认使用 Ed25519。
注册表提交
Smithery.ai
此软件包包含 smithery.yaml,用于自动注入配置。
- Fork 或将
@looppause/mcp发布到 npm - 在 smithery.ai/new 提交 → 输入
@looppause/mcp - Smithery 将读取
smithery.yaml,并向用户显示用于输入 API 密钥的界面
Anthropic MCP 目录
- 确保软件包已以
@looppause/mcp的名称发布到 npm - 通过 Anthropic MCP 目录表单 或可用时的目录提交页面提交
- 列为:
@looppause/mcp— LoopPause 人机协同审批工具
本地开发
# From the monorepo root
cd packages/mcp
npm run build # tsc → dist/ + shebang fix
npm run type-check # type-check only, no emit
npm run dev # tsx watch (no build step)
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。