{"name":"dev.workers.notdown-app.handoff/human-approval-decision-gate-and-shareable-result-page-publisher","slug":"handoff-human-approval-decision-gate-and-shareable-result-page-publisher","title":"Handoff — shareable agent result pages + human-in-the-loop approval gates","description":"Followable agent result pages + human-in-the-loop yes/no approval gates before irreversible actions.","url":"https://mcp.market/server/handoff-human-approval-decision-gate-and-shareable-result-page-publisher","rating":null,"grade":"C","score":60,"certified":false,"status":"active","category":"ai","tags":["ai"],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":null,"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":null,"website":"https://handoff.notdown-app.workers.dev","version":"0.5.0","remotes":[{"type":"streamable-http","url":"https://handoff.notdown-app.workers.dev/mcp/{key}","variables":{"key":{"description":"Your private namespace. No signup, no email: just invent any secret string of 16+ characters — it becomes your namespace on first use. Tools: publish_page, update_page, list_pages, delete_page, request_decision, get_decision, list_decisions.","isRequired":true,"format":"string","isSecret":true}}}],"packages":[],"tools":[{"name":"delete_page","description":"Delete a page you published, by id.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}},{"name":"get_decision","description":"Read the current state of a decision gate you created with request_decision. Returns status (pending / resolved / timed_out), the chosen answer (once answered or auto-resolved), and timing. Poll this to find out what the human decided; if status is still 'pending' no one has answered yet and it hasn't expired.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"gate_id":{"type":"string"}},"required":["gate_id"]}},{"name":"list_decisions","description":"List the decision gates you have created, newest first, with their status and answers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"type":"number"}}}},{"name":"list_pages","description":"List the pages you have published, newest first, with their URLs and view counts.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"limit":{"type":"number"}}}},{"name":"publish_page","description":"Publish text or markdown as a clean, shareable public web page and get back a URL you can hand to a human. Use this whenever you produce a report, summary, plan, table, or any result a person should read in a browser instead of the chat window. The page is FOLLOWABLE: the human can subscribe to it via RSS/JSON (returned as feed_url/json_url) and gets the new version whenever you re-publish — so they never have to ask you for an update. To keep ONE page updated across runs/sessions, pass a stable `slug`: publishing again with the same slug overwrites the same page at the same URL — no need to remember a generated id. Mention the subscribe option when you hand over the link.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"title":{"type":"string","description":"Page title (shown at top and in the browser tab)."},"content":{"type":"string","description":"The page body. Markdown is supported (headings, lists, links, code, bold/italic, blockquotes)."},"format":{"type":"string","enum":["markdown","text"],"description":"How to render content. Default markdown."},"slug":{"type":"string","description":"Optional stable name for a page you intend to keep updating (e.g. \"deploy-status\", \"nightly-report\"). Re-publishing with the same slug updates that same page in place at the same URL. Perfect for a fresh-context agent that can't remember a generated id — just reuse the slug. Omit for a one-off page with a random id."}},"required":["content"]}},{"name":"request_decision","description":"Ask a specific human for a bounded yes/no (or pick-one) decision BEFORE you do something irreversible or high-stakes — deploy, send, delete, charge, merge, publish. Returns a gate_url you hand to the person: they open it in a browser and click one option, no login. Unlike a followable page (awareness), this is a real gate — exactly one authorized answer that resolves the decision, or it auto-resolves to a safe default at expiry so your run never hangs forever. Then call get_decision to read what they chose. The gate page is a durable audit trail of what was asked, what was answered, and when. Use this instead of blocking on a human in chat, or when the human isn't watching the session.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"question":{"type":"string","description":"The decision to put to the human, phrased as a clear question (e.g. \"Deploy build 1a2b to production?\")."},"detail":{"type":"string","description":"Optional context shown under the question — a diff summary, what will happen, links. Markdown supported."},"options":{"type":"array","items":{"type":"string"},"description":"The choices (2-6). Default [\"approve\",\"deny\"]."},"safe_default":{"type":"string","description":"Which option to auto-pick if no one answers before expiry. Default = the last/most-conservative option."},"expires_in_seconds":{"type":"number","description":"How long the gate stays open before auto-resolving to safe_default. Default 86400 (24h), max 30 days."},"notify_url":{"type":"string","description":"Optional https webhook. Handoff POSTs a JSON payload to it when the gate is created ({event:'gate.created', gate_url, question, options, expires_at}) and again when a human answers or it auto-resolves ({event:'gate.answered', answer, status}). Point this at a push/notification channel so the human is alerted to the pending decision instead of you having to deliver the link yourself. Best-effort, https only."}},"required":["question"]}},{"name":"update_page","description":"Update the title and/or content of a page you previously published; the URL never changes. Use this to keep one stable link current across sessions or runs — a live status page, a running changelog, an append-as-you-go log, or a dashboard the recipient can bookmark once and always see fresh. Each update notifies anyone subscribed to the page's RSS/JSON feed, so updating is how followers stay in the loop.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"}},"required":["id"]}}],"scan":{"score":60,"grade":"C","scanned_at":"2026-09-19T20:07:08.846Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T20:07:08.865Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 210ms"]},"poisoning":{"score":15,"max":15,"notes":["7 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 3 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["no repository listed"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"},{"id":"maint.no-repo","severity":"low","component":"maintenance","title":"No source repository listed"}],"inputs":{"probes":[{"url":"https://handoff.notdown-app.workers.dev/mcp/{key}","reachable":true,"authRequired":false,"latencyMs":210,"serverInfo":{"name":"Handoff","version":"0.2.0"}}],"packages":[],"repo":{"found":false},"icon":{"url":null,"source":"none"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}