pendnt
What it does
Human approvals, notifications, inbound webhooks, wake-ups for headless agents. Free trial: /try
- Connects 在云端运行
- Account or key Needs Authorization
- Category 开发者工具
安装
选择你使用的 AI 应用,然后复制设置。
通过 2/4 项检查 · 你的提问会经过开发者的服务器(api.pendnt.dev) · ✓ 命令已检查 2026年11月13日
第一步:你用哪个 AI?
选择你用的应用,步骤会显示在下方。
可连接 Claude · 约 5 分钟
需要 pendnt 的密钥(在开发者网站创建) · 在 claude.ai 或桌面应用设置一次,即可在聊天中使用 · 免费账户可添加 1 个 · Team/Enterprise 方案由所有者(Owner)添加
打开 Claude 的 Connectors 页面
CustomizeConnectors
点击“Add” → “Custom” → “Web”,填写这 2 项
把这里的内容复制到 Claude 中同名的输入框,然后点击 Continue
Name · 名称pendntRemote MCP server URL · 地址https://api.pendnt.dev/mcp在 Request headers 下添加这个名称和值
Header 名称Authorization值Bearer <在这里粘贴你的密钥>只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 Claude 检测到的登录设置页点击 Continue · Authentication 按作者说明选择(Sign in now、Sign in when needed 或 No sign in),然后点击 Add
在聊天中开启
+Connectorspendnt
试一试
用 pendnt 告诉我你能帮我做什么,然后做一件给我看✓ 如果 Claude 说正在使用 pendnt,或回答中出现 pendnt 的工具名称,就表示连接成功
菜单名称已于 2026年11月11日 对照 Anthropic 帮助页面核实 · 你的界面可能因版本略有不同
ChatGPT 暂时无法连接 pendnt
pendnt 连接时需要你自己的密钥,但 OpenAI 帮助页面只说明了 OAuth 登录,没有我们能核实的填密钥方式
你可以改用这些方式
A · 使用能连接 pendnt 的应用
- 需要 pendnt 的密钥(在开发者网站创建) · 在 claude.ai 或桌面应用设置一次,即可在聊天中使用 · 免费账户可添加 1 个 · Team/Enterprise 方案由所有者(Owner)添加
- 需要 pendnt 的密钥(在开发者网站创建)
- 需要 pendnt 的密钥(在开发者网站创建)
- 需要 pendnt 的密钥(在开发者网站创建)
B · 开发者工具 类中能连接 ChatGPT 的其他服务器
从同类中使用较多的里挑选,仅限用地址即可连接、无需密钥的
- Sentry✓ ChatGPT
- Compiler Explorer✓ ChatGPT
- GitDiagram✓ ChatGPT
可连接 Claude Code · 约 5 分钟
需要 pendnt 的密钥(在开发者网站创建)
打开终端
Mac:按 Command+空格,输入 Terminal · Windows:打开 PowerShell
粘贴这条命令并按 Enter
claude mcp add --transport http --scope user pendnt https://api.pendnt.dev/mcp --header 'Authorization: Bearer your-value'按 Enter 前,把“your-value”改成你的密钥
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 Claude Code 中输入 /mcp
应能看到 pendnt 在列表中并显示已连接
试一试
用 pendnt 告诉我你能帮我做什么,然后做一件给我看✓ 如果 Claude Code 说正在使用 pendnt,或回答中出现 pendnt 的工具名称,就表示连接成功
菜单名称已于 2026年11月11日 对照 Anthropic 帮助页面核实 · 你的界面可能因版本略有不同
可连接 Cursor · 约 5 分钟
需要 pendnt 的密钥(在开发者网站创建)
填写你的密钥
在 pendnt 的设置中,Authorization 还是空的,填入你的密钥并保存
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 Cursor 中以 Agent 模式打开 AI 聊天
试一试
用 pendnt 告诉我你能帮我做什么,然后做一件给我看✓ 如果 Cursor 说正在使用 pendnt,或回答中出现 pendnt 的工具名称,就表示连接成功
菜单名称已于 2026年11月11日 对照 Cursor 帮助页面核实 · 你的界面可能因版本略有不同
可连接 VS Code · 约 5 分钟
需要 pendnt 的密钥(在开发者网站创建)
填写你的密钥
在 pendnt 的设置中,Authorization 还是空的,填入你的密钥并保存
只把密钥粘贴到应用的输入框里,不要粘贴到聊天中或发给任何人
在 VS Code 中以 Agent 模式打开 AI 聊天
试一试
用 pendnt 告诉我你能帮我做什么,然后做一件给我看✓ 如果 VS Code 说正在使用 pendnt,或回答中出现 pendnt 的工具名称,就表示连接成功
菜单名称已于 2026年11月11日 对照 VS Code 帮助页面核实 · 你的界面可能因版本略有不同
开发者专用:终端命令和 JSON 设置
通过网页连接
Claude Code
claude mcp add --transport http --scope user pendnt https://api.pendnt.dev/mcp --header 'Authorization: Bearer your-value'Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"pendnt": {
"url": "https://api.pendnt.dev/mcp",
"headers": {
"Authorization": "Bearer your-value"
}
}
}
}VS Code (mcp.json)
{
"servers": {
"pendnt": {
"type": "http",
"url": "https://api.pendnt.dev/mcp",
"headers": {
"Authorization": "Bearer your-value"
}
}
}
}需要你填写的值
- Bearer API key from https://pendnt.dev (format: 'Bearer aio_ '). Free tier available, no card required.
这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
一览
哪些应用可以使用它
依据这个服务器的连接方式和各应用自己的文档,检查于 2026年11月10日。
通过互联网连接,适用于
ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatOpen WebUIRaycast
它能做什么
服务器要求先登录,才会列出它的工具。
基础检查i
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月13日
- ✓ 通过
作者与仓库一致
注册名称已通过域名 pendnt.dev 验证(注册中心会核实域名所有权)
- ✓ 通过
仍在维护
代码最后更新于2个月前
- – 不适用
有许可证
不适用:由 pendnt.dev 的所有者自己运行的云端服务器,你不会运行仓库里的代码
- ! 注意
端点有响应
拒绝访问(HTTP 401),且未提供 OAuth 登录。可能需要密钥,也可能是拦截机器人,尚未确认。
- ! 注意
使用 OAuth 登录
需要你自己复制粘贴密钥或令牌
- … 尚未检查
工具描述中没有隐藏指令
尚未检查;我们会在检查端点时读取工具列表
讨论
提问、分享技巧或报告无法使用。按“有帮助”数量排序。
用户评价
还没有评价
与“开发者工具”中的其他服务器比较i
- 星标数多于此分类中其他 5829 个服务器的 0%
- 发布到注册中心的时间比此分类中其他 5829 个服务器的 37% 更新
- 基础检查结果等于或优于此分类中其他 5829 个服务器的 10%
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
常见问题
pendnt 安全吗?
它在 4 项适用的基础检查中通过了 2 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
它需要哪些密钥或代码?
你需要填写:Authorization
它在我的电脑上运行还是在云端?
它在作者的云端运行。通过互联网连接,无需安装,但你发送的内容会经过作者的服务器。
它还在维护吗?
GitHub 仓库最后更新于2个月前,最新版本(0.2.0)于2个月前进入注册中心。
哪些应用可以使用它?
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。它通过 URL 连接,因此也能用于接受远程 MCP 的应用,例如网页版 ChatGPT(Business 及以上为完整 MCP;Pro 为只读)。
有什么可以替代它?
同一分类中有:REA, GitHub, Serena MCP: the IDE for your agent
同类别的其他选择
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Serena MCP: the IDE for your agent
A powerful toolkit for coding, providing semantic retrieval and editing capabilities.
作者的 README
打开 README
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
pendnt (Claude Code plugin)
Try it in 10 seconds — no account:
curl https://api.pendnt.dev/try?plain=1returns a 72-hour trial key (20 requests) with a quickstart.
Wires a Claude Code session — interactive or headless (claude -p) — up to a pendnt workspace: durable human approvals, notifications, and a "run finished" ping, without the agent needing a terminal.
"pendnt" is a placeholder product name. It's kept in exactly one place — PRODUCT_NAME in lib/config.mjs — plus the name fields in plugin.json, marketplace.json and .mcp.json, and the matching MCP server name registered in /app/src/routes/mcp.ts. Rename all of those together and it's renamed everywhere that matters.
This plugin ships two independent ways to answer permission prompts headlessly — pick one (or both; --permission-prompt-tool takes priority when both are wired up, see §1a below):
- A `PermissionRequest` hook (
hooks/permission-request.mjs) — works with plainclaude -p, no extra flags. Runs automatically before every tool-use prompt. - The `permission_prompt` MCP tool, via
--permission-prompt-tool mcp__pendnt__permission_prompt— Claude Code's own dedicated mechanism for headless permission prompts (seeINTEGRATIONS.md§1a).
Plus a Notification hook and a Stop hook that both relay to POST /v1/notify — see What's included below.
Install
Local marketplace (for trying this out before publishing anywhere)
This repo doubles as its own local marketplace — .claude-plugin/marketplace.json lists this plugin with source: "./", pointing at the same directory plugin.json lives in. From Claude Code:
/plugin marketplace add Pendnt/pendnt-plugin
/plugin install pendnt@pendnt
(or non-interactively: claude plugin marketplace add Pendnt/pendnt-plugin && claude plugin install pendnt@pendnt)
To publish for real later, split marketplace.json out into its own repo with source pointing at this plugin's repo (see INTEGRATIONS.md §1d for the marketplace manifest shape and github/git-subdir/npm/archive source types), then claude plugin marketplace add / from anywhere.
Env vars
| Variable | Required | Default | Meaning |
|---|---|---|---|
PENDNT_API_KEY | yes | — | Authorization: Bearer for every call to the API (aio_..., from POST /dev/bootstrap locally, or your real workspace's API key in production). Without it, the PermissionRequest/Notification/Stop hooks all fail closed (deny / no-op) rather than erroring the session. |
PENDNT_URL | no | https://api.pendnt.dev | Base URL of the pendnt REST API — not including /mcp or /v1. Point this at http://localhost:8787 for local dev against wrangler dev (see below). |
PENDNT_APPROVAL_TIMEOUT_S | no | 600 (10 min) | Total wall-clock budget the PermissionRequest hook spends re-polling before it gives up and denies. Each individual poll is capped server-side at 25s (wait_s), so the hook loops GET /v1/requests/:id?wait_s=25 until this budget runs out. |
Set them in your shell, or in .claude/settings.json under env — see settings.json docs. .mcp.json's ${PENDNT_URL:-...} / ${PENDNT_API_KEY} syntax is Claude Code's own env-var expansion for .mcp.json values (headers *and* URLs) — see INTEGRATIONS.md §1e.
What's included
- `.mcp.json` — registers the
pendntremote MCP server (${PENDNT_URL:-https://api.pendnt.dev}/mcp,Authorization: Bearer ${PENDNT_API_KEY}) so all 14 tools (request_approval,check_request,permission_prompt,notify,create_endpoint,list_endpoints,wait_for_event,schedule_wakeup,list_wakeups,cancel_wakeup,kv_get,kv_set,kv_delete,whoami) are available to the model directly, undermcp__pendnt__— exceptpermission_prompt, which Claude Code removes from its own visible tool list once named by--permission-prompt-tool(see below), since it's meant to be called by the CLI itself, not by the model. - `hooks/hooks.json` — wires three hooks (shape matches
settings.json'shookskey, seeINTEGRATIONS.md§1d): - `PermissionRequest` →
hooks/permission-request.mjs. Fires before every tool-use prompt. POSTs a summary of the tool call toPOST /v1/requests(kind: "approval",wait_s: 25,timeout_s: $PENDNT_APPROVAL_TIMEOUT_S), then re-pollsGET /v1/requests/:id?wait_s=25until it's answered or the totalPENDNT_APPROVAL_TIMEOUT_Sbudget elapses. Prints exactly one JSON object perINTEGRATIONS.md§1b'sPermissionRequestcontract:json { "hookSpecificOutput": { "hookEventName": "PermissionRequest", "decision": { "behavior": "allow", "updatedInput": {} } } }or{"behavior": "deny", "message": "..."}. Fails closed on every error path (missing API key, network failure, operator denies, request expires, timeout) — the only way to getallowis an explicit approval. An operator using the answer page's free-text box (always shown, even forkind: "approval"requests) is treated as approval only if the text starts with yes/y/allow/approve/ok — anything else denies with that text as the reason. - `Notification` →
hooks/notify.mjs. Relaysnotification_type/messagetoPOST /v1/notify. Cannot block Claude Code (per the hook's own semantics) and never tries to — always exits 0. - `Stop` →
hooks/stop.mjs. Relays a"run finished"message toPOST /v1/notifyat the end of every turn. Never returns{"decision":"block"}— it only notifies, it doesn't keep the agent going. - `lib/` — the three hook scripts' shared bits:
config.mjs(env vars + thePRODUCT_NAMEconstant),client.mjs(thinfetchwrappers for/v1/requestsand/v1/notify),stdin.mjs(hook stdin JSON parsing). No npm dependencies — plain Node 18+ (fetch,AbortController) is enough.
The --permission-prompt-tool path (§1a)
Instead of (or in addition to — Claude Code prefers --permission-prompt-tool over hooks when both apply) the PermissionRequest hook, you can point Claude Code's dedicated permission-prompt mechanism directly at the permission_prompt MCP tool this plugin's .mcp.json registers — the one tool in this server purpose-built for this flag (see /app/README.md's permission_prompt section for the full contract):
export PENDNT_API_KEY=aio_...
export PENDNT_URL=https://api.pendnt.dev # or http://localhost:8787 for local dev export MCP_TOOL_TIMEOUT=600000 # ms — must exceed PERMISSION_PROMPT_WAIT_S (default 540s)
claude -p --permission-prompt-tool mcppendntpermission_prompt "deploy to prod"
Three things worth knowing before you rely on this path:
- Claude Code blocks the first turn until the
pendntMCP server connects, capped byMCP_TIMEOUT(default 30s, env var, milliseconds) — bump it if your network is slow:export MCP_TIMEOUT=60000(fromINTEGRATIONS.md§1a). - As of CLI ≥2.1.199, an
allowfrom a--permission-prompt-toolis converted todenyfor any MCP tool call flagged_meta["anthropic/requiresUserInteraction"]— this prompt tool can't rubber-stamp those regardless of what the operator answers (also fromINTEGRATIONS.md§1a). - `permission_prompt` holds the MCP tool call open server-side for up to
PERMISSION_PROMPT_WAIT_S(env var on/app, default 540s = 9 min) waiting for the operator, unlike every other tool's ≤25swait_s. Claude Code's ownMCP_TOOL_TIMEOUT(its per-tool-call timeout, ms, default 30000) must be set higher than that or the CLI gives up first — henceexport MCP_TOOL_TIMEOUT=600000above.
Unlike request_approval, permission_prompt *does* return Claude Code's exact {behavior, updatedInput, updatedPermissions, interrupt} / {behavior:"deny", message, interrupt} contract natively — an allow echoes the original input back as updatedInput, a deny (or an unanswered timeout) carries a human-readable message. That's the same translation the PermissionRequest hook below does by hand for its own hook-shaped contract; permission_prompt does it as the MCP tool result directly, which is what --permission-prompt-tool actually reads.
Headless example
export PENDNT_API_KEY=aio_...
export PENDNT_URL=https://api.pendnt.dev export MCP_TOOL_TIMEOUT=600000
claude -p --permission-prompt-tool mcppendntpermission_prompt \ "review open PRs and merge the ones that pass CI"
Or, with the PermissionRequest hook doing the work instead (no extra flag needed once the plugin is installed):
export PENDNT_API_KEY=aio_...
export PENDNT_URL=https://api.pendnt.dev
claude -p "review open PRs and merge the ones that pass CI"
Either way, every tool-use prompt now creates a durable approval request instead of blocking on a terminal that doesn't exist — check your configured channels (email/web inbox — see /app/README.md's "Channels" section for what's actually implemented today), answer from your phone, and the agent resumes.
Running the hook locally against wrangler dev
From /app:
cd ../app
npm install npm run db:migrate:local npm run dev # http://localhost:8787
In another terminal, bootstrap a workspace + API key (see /app/README.md) and point the plugin's env vars at it:
BOOT=$(curl -s -X POST http://localhost:8787/dev/bootstrap -d '{}')
export PENDNT_API_KEY=$(echo "$BOOT" | jq -r .api_key) export PENDNT_URL=http://localhost:8787
Then either run a hook script directly, feeding it the JSON a real Claude Code hook invocation would send on stdin (useful for iterating on the hook without a full Claude Code session):
echo '{"session_id":"s1","cwd":"'"$PWD"'","tool_name":"Bash","tool_use_id":"toolu_1","tool_input":{"command":"deploy prod"}}' \
| PENDNT_APPROVAL_TIMEOUT_S=60 node hooks/permission-request.mjs
...or install the plugin locally (/plugin marketplace add Pendnt/pendnt-plugin from Claude Code, see Install) and drive a real session — with PENDNT_URL/PENDNT_API_KEY exported in the shell Claude Code runs in, every tool-use prompt round-trips through your local wrangler dev instance. Answer the request the same way /app/README.md's curl walkthrough does: compute the HMAC signature yourself (it's a pure function of the request id and SIGNING_SECRET) and POST /a/ / , or watch the log delivery channel's console output from wrangler dev for the answer link once a real channel is wired up.
Caveats
- No npm dependencies by design (
fetch/AbortControlleronly) — every hook script runs under plainnode hooks/*.mjs, nonpm installstep inside the plugin itself. - The
PermissionRequesthook's fail-closed defaults (missing key, network error, timeout → deny) are a deliberate safety choice, not a limitation to work around — a headless agent with nobody to ask should not proceed by default. hooks/hooks.json'sNotificationmatcher is not narrowed to specificnotification_types — every notification (including ones that aren't permission-prompt-related) gets relayed. Narrow the matcher or filter insidehooks/notify.mjsif that's noisier than you want.
Guides
Practical writeups on running agents unattended, at pendnt.dev/guides: --dangerously-skip-permissions alternatives · [claude -p on cron](http