{"ok":true,"site":{"host":"handoffhelper.com","url":"https://handoffhelper.com/","type":"live","desc":"HANDOFF is a multiplayer ops room where humans and agents work the same support case through WebMCP tools.","tools":[{"name":"get_workspace","kind":"answer","impl":"imperative","description":"Use this read-only tool at the start of a HANDOFF session to inspect the live case queue, unread flags, severity, status, and refund state. Do not use it to change a case or infer full case details; call get_case for a specific case before acting.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_case","kind":"answer","impl":"imperative","description":"Use this read-only tool first for the judge demo case: call get_case with case_id CASE-1042, then draft_customer_reply with tone apologetic, then propose_refund with amount_usd 2388, then issue_refund, then send_customer_reply. Do not use it to modify state; choose an update or proposal tool for changes.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."}},"required":["case_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"update_case_status","kind":"act","impl":"imperative","description":"Use this tool to update a case workflow status after you have enough context and can explain why in a note. Do not use it for money movement, sending customer replies, on-call paging, or resolving a gated case; those have dedicated approval tools.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."},"status":{"type":"string","enum":["open","waiting_on_customer","in_progress","resolved","refund_pending","refunded"],"description":"New case status."},"note":{"type":"string","maxLength":240,"description":"Short operational note explaining why the status changed."}},"required":["case_id","status","note"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"add_comment","kind":"act","impl":"imperative","description":"Use this tool to add an agent-authored note to the current case timeline for human review. Public-to-customer visibility means the note is customer-visible context only; it never sends a customer message. Do not use this tool to send replies or change money state.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."},"body":{"type":"string","maxLength":800,"description":"Comment body to add to the timeline."},"visibility":{"type":"string","enum":["public_to_customer","internal"],"description":"Whether this is internal context or a customer-visible note. Neither option sends a reply."}},"required":["case_id","body","visibility"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"draft_customer_reply","kind":"act","impl":"imperative","description":"Use this tool after get_case for CASE-1042 to create or replace a visible customer reply draft. For the judge demo, pass tone apologetic and a goal that apologizes for the duplicate charge and explains the refund path; then call propose_refund with amount_usd 2388. This tool does not send anything.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."},"goal":{"type":"string","maxLength":240,"description":"Goal for the reply, such as apologize and explain the refund path."},"tone":{"type":"string","enum":["calm","apologetic","firm"],"description":"Reply tone."}},"required":["case_id","goal","tone"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"send_customer_reply","kind":"transact","impl":"imperative","description":"Use this destructive tool at the end of the judge sequence after get_case, draft_customer_reply, propose_refund, and issue_refund have completed. Do not call it before a draft exists or before refund approval is complete. It opens a visible human approval gate and waits for Jordan; no customer reply is sent unless Jordan approves.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."}},"required":["case_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"propose_refund","kind":"act","impl":"imperative","description":"Use this tool after drafting the CASE-1042 customer reply to propose amount_usd 2388 for the duplicate Pro Annual charge. It creates a visible pending approval and does not move money by itself; then call issue_refund to open the human approval gate.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."},"amount_usd":{"type":"number","minimum":0,"maximum":10000,"description":"Refund amount in USD. For CASE-1042 use 2388."},"reason":{"type":"string","maxLength":240,"description":"Operational reason for the proposed refund."}},"required":["case_id","amount_usd","reason"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"issue_refund","kind":"act","impl":"imperative","description":"Use this destructive tool after propose_refund in the judge sequence for CASE-1042. Do not call it before a refund has been proposed. It opens a visible 'Refund $2,388 to Maya Chen?' approval gate and waits for Jordan; the refund state does not change to issued unless Jordan approves. After approval, call send_customer_reply.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."}},"required":["case_id"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"page_oncall","kind":"act","impl":"imperative","description":"Use this destructive tool only when billing-primary or incident response needs to be interrupted for the case. It requests human approval and does not page until approved. Do not use it for routine notes, status changes, or customer replies.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."},"message":{"type":"string","maxLength":160,"description":"Concise page message for billing-primary."}},"required":["case_id","message"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_pending_approvals","kind":"answer","impl":"imperative","description":"Use this read-only tool to inspect all pending human approval gates across HANDOFF. Do not use it to approve, reject, or apply side effects; the human must approve in the UI.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"resolve_case","kind":"act","impl":"imperative","description":"Use this destructive tool only when the case is truly ready to close and you can provide a concise resolution summary. It requires human approval and refuses to resolve a P1 with an unissued requested refund pending. Do not use it while customer, refund, or on-call work remains unresolved.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"case_id":{"type":"string","pattern":"^CASE-[0-9]{4}$","description":"Case identifier such as CASE-1042."},"resolution_summary":{"type":"string","maxLength":240,"description":"Short summary of the final resolution."}},"required":["case_id","resolution_summary"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"get_session","kind":"answer","impl":"imperative","description":"Use this read-only tool to inspect the live agent session for CASE-1042: session id, owner, watchers, status, elapsed time, agent state, and current plan step. Use it before redirect_agent or handoff_session so you know who is steering.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"list_watchers","kind":"answer","impl":"imperative","description":"Use this read-only tool to list teammates watching SES-1042 without changing ownership. If Sam is absent, the human can click Join as Sam or the session can later be handed off to Sam.","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"redirect_agent","kind":"act","impl":"imperative","description":"Use this session-control tool when the active human wants to steer Handoff with a short instruction. It updates SES-1042 to redirected and writes a timeline event, but it does not approve refunds, send replies, or page anyone.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"instruction":{"type":"string","maxLength":180,"description":"Short steering instruction for the live agent session."}},"required":["instruction"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"handoff_session","kind":"act","impl":"imperative","description":"Use this session-control tool to transfer ownership of SES-1042 between Jordan and Sam. It changes the live session owner and writes a timeline event; it does not approve money movement or send customer replies.","annotations":{"readOnlyHint":false,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"to_participant":{"type":"string","enum":["sam","jordan"],"description":"Participant who should become the live session owner."}},"required":["to_participant"],"additionalProperties":false},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Productivity & Business","apiSurface":"spec","toolCount":15}}