Handoff Watch
Spots stalled agent-to-agent tasks and nudges or reassigns them. Works beside Offhand.
Should I use this
Quality & Safety
Findings (3)
- HIGH
- MEDIUMin scan_handoffs
- INFOin scan_handoffs
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"handoff": {
"url": "https://handoff.cloudforbots.com/mcp"
}
}
}Remote endpoints
https://handoff.cloudforbots.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟡scan_handoffs(board, tasks, stall_minutes, fail_limit, nudges_before_reassign, ...)
Pass the tasks your agents handed each other (e.g. the result of Offhand list_todos) and get back which are stalled or failing and what to do. A task is stalled when it is claimed (in_progress) or handed over but untouched for stall_minutes, and failing when it is blocked or has failed fail_limit times. Ladder: nudge the assignee, nudge again, then reassign to a backup agent (or ask the person). Pro acts: records each nudge with a cooldown so nobody is pinged twice, and POSTs the nudge to the agent's webhook if you give one. Free watch-only takes no action and returns would_nudge / would_reassign. It never changes a task in Offhand itself and never takes a task another agent holds; reassigning returns an Offhand add_task call for your agent to make.
Input Schema
{
"type": "object",
"properties": {
"board": {
"type": "string",
"description": "A stable name for this task list, e.g. \"offhand\" or \"team-ops\". Cooldowns and the escalation ladder are tracked per board."
},
"tasks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"status": {
"type": "string",
"description": "Offhand status: open, in_progress, blocked, done, need_review (also accepts todo, claimed, failed)."
},
"assignedTo": {
"type": "string",
"description": "Agent the task was handed to (alias: assignee)."
},
"updatedAt": {
"type": "string",
"description": "ISO time of the last status change or note (alias: updated_at)."
},
"idle_minutes": {
"type": "number",
"description": "Instead of updatedAt: minutes since the last activity."
},
"failures": {
"type": "integer",
"description": "Failed attempts so far (optional)."
},
"backup": {
"type": "string",
"description": "Agent that may take it over (optional)."
}
},
"required": [
"id"
]
},
"description": "Up to 200 tasks."
},
"stall_minutes": {
"type": "integer",
"description": "Minutes without activity before a task counts as stalled. Default 60."
},
"fail_limit": {
"type": "integer",
"description": "Failures before a task counts as failing. Default 2."
},
"nudges_before_reassign": {
"type": "integer",
"description": "Nudges before suggesting a reassign. Default 2."
},
"backup_agent": {
"type": "string",
"description": "Default agent to hand stalled work to."
},
"webhooks": {
"type": "object",
"description": "Optional map of agent name to an https URL that wakes it (Pro posts nudges there)."
}
},
"required": [
"tasks"
]
}🟢nudge_log(board)
List the latest nudges and reassigns (Pro) or would-nudges (free) for one board or all boards on your key.
Input Schema
{
"type": "object",
"properties": {
"board": {
"type": "string",
"description": "A stable name for this task list, e.g. \"offhand\" or \"team-ops\". Cooldowns and the escalation ladder are tracked per board."
}
}
}🟢weekly_report
Draft a plain-English report of the last 7 days: stalled tasks found, nudges and reassigns made (Pro) or that would have been made (free). Read-only; sends nothing.
Input Schema
{
"type": "object",
"properties": {}
}🟢usage_and_upgrade
Show today's usage for your key or IP and the $9/month upgrade link. Free tier: 500 calls/day. Not metered.
Input Schema
{
"type": "object",
"properties": {}
}Community
Evidence