Handoff Watch

Spots stalled agent-to-agent tasks and nudges or reassigns them. Works beside Offhand.

Should I use this

Quality & Safety

B
Description quality
95%
Schema completeness
63%
Naming quality
80%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'scan_handoffs' description contains placeholder textin scan_handoffs
  • INFOTool description contains placeholder or incomplete textin scan_handoffs

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~767Tokens (tool definitions)
~1.3 KBTypical response size
Moderate attention impact (0.60% of 128k context)

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-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools