mcpField
L
looppause

looppause

本地服务
github.com/soteeabamAI 与智能体012 周前更新

关于 looppause

looppause 是面向需要人工审批后再执行操作的 AI Agent 的 MCP 服务。它通过 Slack 或电子邮件发送请求,并提供可独立验证的签名凭证。

主要功能

  1. 01通过 Slack 或电子邮件发送审批请求
  2. 02轮询人工决策
  3. 03验证 Ed25519 签名凭证
  4. 04立即返回暂停 ID

适用场景

  1. 01要求不可逆操作先获审批
  2. 02执行前验证审批凭证
  3. 03将审批请求发送至 Slack 或电子邮件

MCP 相关

向 MCP 客户端提供 `request_approval`、`check_approval` 和 `verify_proof` 工具,可用于提交请求、轮询决策及验证签名审批凭证。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"soteeabam-looppause": {
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "<YOUR_API_KEY>"
}
}
}
}
启动命令npx -y @looppause/mcp
需要配置的环境变量
YOUR_API_KEY密钥Your API key for the service

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

安装包
npm@looppause/mcp0.2.1

工具

2

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

参数类型必填说明
timeout_hoursnumber否请求过期前的小时数。最多 168。
action_detailsobject是有关操作的键值详情(例如金额、供应商、目标)。仅限字符串值。
recipient_emailstring否用于发送审批请求的电子邮件地址。
recipient_slackstring否Slack 频道或用户 ID(例如 #approvals 或 U12345)。
action_descriptionstring是Agent 即将执行的操作的简明英文描述。

详细介绍

@looppause/mcp

适用于 LoopPause 的 MCP 服务——暂停 AI Agent 执行,并通过 Slack 或电子邮件将审批请求转交给人工。Agent 会收到一份经过加密签名的人工决策证明,然后继续执行。

“这是防止 Agent 失控,或在等待审批时停滞不前所缺少的基础构件。”


功能

提供三个 MCP 工具:request_approval、check_approval 和 verify_proof

  1. request_approval —— 向人工发送审批请求,并立即返回 pause_id
  2. check_approval —— 查询一次决策;重复调用,直到 decision 为 "approved" 或 "rejected"
  3. 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,用于自动注入配置。

  1. Fork 或将 @looppause/mcp 发布到 npm
  2. 在 smithery.ai/new 提交 → 输入 @looppause/mcp
  3. Smithery 将读取 smithery.yaml,并向用户显示用于输入 API 密钥的界面
Anthropic MCP 目录
  1. 确保软件包已以 @looppause/mcp 的名称发布到 npm
  2. 通过 Anthropic MCP 目录表单 或可用时的目录提交页面提交
  3. 列为:@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

评论

支持 Markdown

第一次接触 MCP?

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

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