Looppause

io.github.soteeabamPublished by GitHub account soteeabamv0.2.1Updated Oct 24, 2026

LoopPause MCP server — pause agent execution and route human approval requests

Overview

AI-generated overview

LoopPause lets an AI agent pause and request human approval through Slack or email, then verify a signed proof of the decision before acting.

What you can do
Request approval: send an approval request with action description and details to a Slack channel or user and/or an email address, returning a pause_id immediately and a timeout of up to one week. Check approval: poll once for the human's decision, repeating until it is approved, rejected, timed out or expired. Verify proof: check the Ed25519 signature on the returned proof against LoopPause's published public key before executing an irreversible action.
When to use it
Use it when an agent is about to take an irreversible or high-value action, such as a payment or transfer, and you want a human to sign off through Slack or email with a verifiable record of the decision.
Requirements
Runs locally over stdio, typically via npx or a global npm install, so Node.js is needed. Requires a LoopPause API key in the LOOPPAUSE_API_KEY environment variable, obtained from the LoopPause dashboard. Network access to the LoopPause API and its published signing key endpoint. At least one recipient (Slack channel or user ID, or email address) per request.
Before you install
The API key is a live secret (sk_live prefix) placed in the client configuration; keep it out of shared files. Approval requests are sent to Slack or email, so action details leave the machine to LoopPause and those recipients. The server only routes approvals; the agent still performs the action, so skipping check_approval or verify_proof defeats the safeguard. Legacy HMAC webhooks use a separate signing secret.

Installation

In SourceWeft

  1. Open Looppause in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

@looppause/mcp

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."


What it does

Exposes three MCP tools: request_approval, check_approval, and verify_proof

  1. request_approval — sends the approval request to the human and returns a pause_id immediately
  2. check_approval — polls once for the decision; call repeatedly until decision is "approved" or "rejected"
  3. verify_proof — verifies the signed proof against LoopPause's published Ed25519 public key; call before executing any irreversible action

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.


Installation

Recommended: npx (no install required)

bash
npx @looppause/mcp

Global install

bash
npm install -g @looppause/mcplooppause-mcp

Configuration

Environment variableRequiredDescription
LOOPPAUSE_API_KEY✅ YesYour LoopPause API key (sk_live_…)
LOOPPAUSE_API_URLNoOverride the API base URL (default: https://api.looppause.com)

Get your API key at looppause.com/dashboard.


Usage in Claude Code

Add to your .claude/settings.json (or ~/.claude/settings.json for global):

json
{  "mcpServers": {    "looppause": {      "command": "npx",      "args": ["-y", "@looppause/mcp"],      "env": {        "LOOPPAUSE_API_KEY": "sk_live_your_key_here"      }    }  }}

Usage in Cursor

Add to your Cursor MCP configuration:

json
{  "mcpServers": {    "looppause": {      "command": "npx",      "args": ["-y", "@looppause/mcp"],      "env": {        "LOOPPAUSE_API_KEY": "sk_live_your_key_here"      }    }  }}

Tool reference

request_approval

Sends the approval request and returns immediately. Do not proceed with the action until check_approval returns { decision: "approved" }.

typescript
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)})

When both recipient_slack and recipient_email are provided, Slack is the primary channel and email is the fallback.

Returns:

json
{  "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

Checks the current status of an approval request. Call repeatedly until decision is "approved" or "rejected". Never proceed while status is "pending".

typescript
check_approval({  pause_id: string,  // The pause_id returned by request_approval})

Returns (pending):

json
{ "status": "pending" }

Returns (responded):

json
{  "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>"  }}
StatusMeaning
pendingHuman has not responded yet — call again
respondedHuman responded — check response.decision
timed_outNo response within timeout_hours
expiredPause was manually cancelled

verify_proof

Verifies the Ed25519 signature on a proof returned by check_approval. Call this before executing any irreversible action. Returns immediately — no long-running connection.

typescript
verify_proof({  proof: object,  // The full proof object from check_approval})

Returns (valid):

json
{  "valid": true,  "verified_at": "2026-06-14T10:14:45.000Z",  "key_id": "lp-key-2026-06"}

Returns (invalid):

json
{  "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.


Example

typescript
// Step 1: send the approval requestconst 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 arriveslet 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 executingconst 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();

Verifying the signature (REQUIRED before executing the action)

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:

typescript
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:

typescript
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=<hex>" signatures) remain verifiable with your LOOPPAUSE_SIGNING_SECRET as before; Ed25519 is the default for all new proof payloads.


Registry submissions

Smithery.ai

This package includes smithery.yaml for automatic configuration injection.

  1. Fork or publish @looppause/mcp to npm
  2. Submit at smithery.ai/new → enter @looppause/mcp
  3. Smithery will read smithery.yaml and present a UI for users to enter their API key

Anthropic MCP directory

  1. Ensure the package is published to npm as @looppause/mcp
  2. Submit via the Anthropic MCP directory form or the directory submission page when available
  3. List as: @looppause/mcp — LoopPause human-in-the-loop approval tool

Local development

bash
# From the monorepo rootcd packages/mcpnpm run build          # tsc → dist/ + shebang fixnpm run type-check     # type-check only, no emitnpm run dev            # tsx watch (no build step)

License

MIT

Source: README.md at commit a373aad

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.2.1LatestSep 16, 2026

Score

40% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.