Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
LoopPause MCP server — pause agent execution and route human approval requests
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
YOUR_API_KEY标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"looppause": {
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add looppause --env YOUR_API_KEY=your-value -- npx -y @looppause/mcp运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"looppause": {
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"looppause": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月6日
注册名称已通过 GitHub 账户 soteeabam 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:YOUR_API_KEY
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.2.1)于3个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Symantec Cloud DLP AIops
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Governed Symantec Cloud DLP — 14 MCP tools, read-only with audit.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
MCP server for LoopPause — pause AI agent execution and route approval requests to humans via Slack or email. The agent receives a cryptographically signed proof of the human's decision and resumes.
"The missing primitive so agents don't go rogue — or die waiting for approval."
Exposes three MCP tools: `request_approval`, `check_approval`, and `verify_proof`
pause_id immediatelydecision is "approved" or "rejected"This three-step pattern keeps each tool call short, avoids long-running connections, and gives the agent explicit cryptographic verification before proceeding. No shared secret required — any party with the published public key can independently verify the proof.
npx @looppause/mcp
npm install -g @looppause/mcp
looppause-mcp
| Environment variable | Required | Description |
|---|---|---|
LOOPPAUSE_API_KEY | ✅ Yes | Your LoopPause API key (sk_live_…) |
LOOPPAUSE_API_URL | No | Override the API base URL (default: https://api.looppause.com) |
Get your API key at looppause.com/dashboard.
Add to your .claude/settings.json (or ~/.claude/settings.json for global):
{
"mcpServers": { "looppause": { "command": "npx", "args": ["-y", "@looppause/mcp"], "env": { "LOOPPAUSE_API_KEY": "sk_live_your_key_here" } } } }
Add to your Cursor MCP configuration:
{
"mcpServers": { "looppause": { "command": "npx", "args": ["-y", "@looppause/mcp"], "env": { "LOOPPAUSE_API_KEY": "sk_live_your_key_here" } } } }
request_approvalSends the approval request and returns immediately. Do not proceed with the action until `check_approval` returns `{ decision: "approved" }`.
request_approval({
// Required action_description: string, // What the agent is about to do (shown to human) action_details: Record , // 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) })
When both recipient_slack and recipient_email are provided, Slack is the primary channel and email is the fallback.
Returns:
{
"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_approvalChecks the current status of an approval request. Call repeatedly until decision is "approved" or "rejected". Never proceed while status is `"pending"`.
check_approval({
pause_id: string, // The pause_id returned by request_approval })
Returns (pending):
{ "status": "pending" }
Returns (responded):
{
"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": "sarah@company.com", "responded_at": "2026-05-24T10:14:32.000Z", "channel": "slack", "nonce": "a8f3c2...", "signing_key_id": "lp-key-2026-06", "signature_alg": "Ed25519", "signature": "ed25519= " } }
| Status | Meaning |
|---|---|
pending | Human has not responded yet — call again |
responded | Human responded — check response.decision |
timed_out | No response within timeout_hours |
expired | Pause was manually cancelled |
verify_proofVerifies the Ed25519 signature on a proof returned by check_approval. Call this before executing any irreversible action. Returns immediately — no long-running connection.
verify_proof({
proof: object, // The full proof object from check_approval })
Returns (valid):
{
"valid": true, "verified_at": "2026-06-14T10:14:45.000Z", "key_id": "lp-key-2026-06" }
Returns (invalid):
{
"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." }
Public key discovery: GET https://looppause.com/.well-known/looppause-signing-key.json — match the proof's signing_key_id against the served 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: "sarah@company.com", 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();
All proofs are signed with LoopPause's Ed25519 key. No shared secret required — any party holding the published public key can independently verify the proof. Use verifyLoopPauseProof (fetches the key automatically) or call verify_proof via MCP:
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.
For offline/air-gapped verification, pin the public key once:
await verifyLoopPauseProof(proof, { publicKey: "<base64 SPKI DER>" });
Public key discovery: GET https://looppause.com/.well-known/looppause-signing-key.json (match the proof's signing_key_id against the served key_id).
Webhook verification. Unlike per-customer symmetric schemes, LoopPause's Ed25519 signatures are independently verifiable by any third party holding the published public key — a bank, an auditor, a FIDO AP2 mandate checker — without contacting LoopPause and without holding a shared secret.
Legacy HMAC-SHA256 webhooks ("sha256= " signatures) remain verifiable with your LOOPPAUSE_SIGNING_SECRET as before; Ed25519 is the default for all new proof payloads.
This package includes smithery.yaml for automatic configuration injection.
@looppause/mcp to npm@looppause/mcpsmithery.yaml and present a UI for users to enter their API key@looppause/mcp@looppause/mcp — LoopPause human-in-the-loop approval tool# 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