
Quirna
io.github.quirna由 GitHub 帳號 quirna 發布v0.1.2更新於 Oct 24, 2026
Ask a human before your agent acts: approval requests decided on a phone.
概覽
Quirna 讓 AI 代理在執行重要動作前,透過手機向真人提出核准請求,只有對方同意後才繼續。
- 可以做什麼
- 依動作類別提出核准請求,可附上標題訊息、識別資訊、環境與風險等級
- 對已存在且仍在等待的核准請求,依 ID 繼續等待結果
- 回傳 authorized 真/假的结构化結果,非核准一律回報為未授權
- 適用情境
- 適用於會執行退款、正式環境部署、破壞性遷移等重要動作的代理,需要由組織政策指定的真人在手機上做出決定,並留下可驗證的簽署紀錄。
- 執行需求
- 透過 npx 或全域安裝 @quirna/mcp 在本機執行。需在 QUIRNA_API_KEY 提供 Quirna 主控台註冊的 System 金鑰,並設定政策,核准人的手機需安裝 Quirna 行動應用程式(目前為封測)。選用變數可設定請求者名稱與 ID、預設環境、等待時間與 API 位址。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Quirna,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
@quirna/mcp
Ask a human before your agent acts. Official Quirna server for the Model Context Protocol.
Add one block of config and your agent gains a tool it can call before doing something consequential — a refund, a production deploy, a destructive migration. A named human approves it on their phone. The agent proceeds only if they said yes, and the decision is signed and kept.
Nothing moves until someone says yes.
Your agent's framework may already have a way to pause for confirmation. This is different in three ways that matter once it is not just you at the terminal:
- The decision leaves the loop. It goes to whoever your policy nominates, on their phone, behind Face ID — not to whoever happens to be watching the agent run.
- Who approves is policy, not prompt. Quorum, risk tier and which group is asked live in your organization's settings. The agent cannot choose its own approvers, and neither can a prompt injection.
- It leaves evidence. Every decision is signed at the moment it is made, and exports to a file a third party can verify without trusting us.
Install
Nothing to install: the config below runs it on demand with npx. To pin it,
npm install -g @quirna/mcp and use quirna-mcp as the command.
Before you start
The mobile app is in private beta. Decisions are made on the phone and nowhere else — the Console configures policies and never decides one — so without the app an approval request is created and then waits until it expires. Write to [email protected] and we will get you in. Everything else below works today.
Then, in the Console:
- A System key. Open Users → Systems and register one for this agent.
You get a key (
ck_…), shown once. - A Policy, which decides who approves a given kind of request and how many of them are needed.
- The app, on the phone of whoever will approve.
Configure your agent
Claude Code — claude mcp add quirna --env QUIRNA_API_KEY=ck_… -- npx -y @quirna/mcp
Cursor (~/.cursor/mcp.json), Claude Desktop
(claude_desktop_config.json) and most other clients take the same shape:
Environment
On the key. It lives in your agent client's config file, which is often in a dotfile and sometimes in a repo. Treat it as a deployment credential: give each agent its own System rather than sharing one, scope it in the Console to the kinds it may request, and rotate it there if the file gets somewhere it should not be. A System key can only ask — it can never approve anything.
The tools
request_approval
Creates the request and waits for a human.
Notably absent: who approves, how many are needed, how long it stays open. Those are the organization's to decide in the Console, once, for every caller — an agent that could pick its own approvers would not be a control.
check_approval
Takes an approval_id and waits for that existing request. Use it when
request_approval came back still pending; calling request_approval again
would put the same action in front of a second human.
What the agent gets back
Anything that is not APPROVED opens with NOT AUTHORIZED, followed by
why, and by an explicit instruction not to perform the action. The structured
result carries authorized: true | false for code that parses instead of
reading.
Asking and getting an answer is a successful tool call, whatever the answer
was — a denial is the product working, not a failure. isError is reserved for
the cases where the tool could not run at all and nothing was learned: Quirna
unreachable, a key rejected, the call aborted. So an agent can tell "a human
said no" from "the approval system is down", which are opposite situations, and
nothing invites it to retry a denial into a second person's hands.
When nobody answers
An agent running unattended at 3am will hit this: the request expires and the action is never authorized. That is the correct outcome, not a bug to design around. If your agent needs to run without anyone awake, the answer is a policy whose condition does not require a human for that case — not a longer timeout.
Two timeouts are in play, and they are not the same:
QUIRNA_WAIT_MS(default 90s) is how long a tool call waits before returning the approval id so the agent can resume. It exists because agent clients kill long tool calls. The request stays live.- The policy's expiry (set in the Console) is how long the request stays open. Only this one can time a request out.
Links
- quirna.com — what it is
- console.quirna.com — policies, groups, systems
@quirna/sdk— for calling Quirna from your own code instead
MIT © Quirna
來源:README.md,提交 8dc9bb8
工具
0版本歷史
1- v0.1.2最新Sep 27, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分