Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
LoopPause MCP server — pause agent execution and route human approval requests
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
YOUR_API_KEYValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json
{
"mcpServers": {
"looppause": {
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "your-value"
}
}
}
}Run this in your terminal
claude mcp add looppause --env YOUR_API_KEY=your-value -- npx -y @looppause/mcpFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json
{
"mcpServers": {
"looppause": {
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"servers": {
"looppause": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@looppause/mcp"
],
"env": {
"YOUR_API_KEY": "your-value"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 6, 2026
The registry name was verified with the GitHub account soteeabam, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: YOUR_API_KEY
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (0.2.1) reached the registry 3 months ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, Symantec Cloud DLP AIops
Servers in the same category from other makers, sorted by stars.
Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
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.
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
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