looppause について
looppauseは、操作前に人の承認を必要とするAIエージェント向けのMCPサーバーです。Slackまたはメールで承認を依頼し、独立して検証できる署名付き証明を返します。
主な機能
- 01Slackまたはメールで承認を依頼
- 02人の判断をポーリング
- 03Ed25519署名付き証明を検証
- 04一時停止IDを即時返却
活用シーン
- 01不可逆な操作に事前承認を設定
- 02実行前に承認証明を検証
- 03Slackまたはメールに承認依頼を送信
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 | はい | エージェントが実行しようとしている操作を簡潔な英語で記述します。 |
詳細
@looppause/mcp
LoopPause の MCP サーバーです。AI エージェントの実行を一時停止し、承認リクエストを Slack またはメール経由で人間に送信します。エージェントは人間の決定を暗号署名した証明を受け取り、実行を再開します。
「エージェントの暴走や、承認待ちによる停止を防ぐために欠けていたプリミティブです。」
できること
3 つの MCP ツールを公開します。request_approval、check_approval、verify_proof
request_approval— 人間に承認リクエストを送信し、すぐにpause_idを返しますcheck_approval— 決定を 1 回確認します。decisionが"approved"または"rejected"になるまで繰り返し呼び出してくださいverify_proof— LoopPause が公開している Ed25519 公開鍵に照らして署名済みの証明を検証します。取り消し不可能な操作を実行する前に呼び出してください
この 3 段階のパターンにより、各ツール呼び出しを短時間に保ち、長時間接続を避けながら、エージェントが先に進む前に明示的な暗号検証を行えます。共有シークレットは不要です。公開された公開鍵があれば、誰でも独自に証明を検証できます。
インストール
推奨: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) |
API キーは looppause.com/dashboard で取得してください。
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 — 提供された key_id と証明の signing_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 が含まれています。
@looppause/mcpを npm にフォークするか公開します- smithery.ai/new で申請し、
@looppause/mcpを入力します - Smithery が
smithery.yamlを読み取り、ユーザーが API キーを入力するための UI を表示します
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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。