[
  {
    "tool": "message_history_read",
    "entry": "desktop/internal/wire/mcp/mcp_handler.go; desktop/internal/wire/mcp/mcp_tools_chat.go",
    "category": "list",
    "default_limit": 20,
    "max_limit": 100,
    "cursor": "before/after",
    "has_more": "before/has_more",
    "per_item_budget": "message content, thread root, attachments",
    "result_budget": "desktop/internal/resultbudget",
    "backend_bound": "server history query limit/cursor",
    "structured_content": "none"
  },
  {
    "tool": "message_search",
    "entry": "desktop/internal/wire/mcp/mcp_handler.go; desktop/internal/wire/mcp/mcp_tools_chat.go",
    "category": "search",
    "default_limit": 20,
    "max_limit": 50,
    "cursor": "top-N or next_cursor",
    "has_more": "top-N or has_more",
    "per_item_budget": "match body, context, attachments",
    "result_budget": "desktop/internal/resultbudget",
    "backend_bound": "server search limit",
    "structured_content": "none"
  },
  {
    "tool": "message_send held-refresh",
    "entry": "desktop/internal/wire/mcp/mcp_tools_chat.go",
    "category": "hidden read path",
    "default_limit": 50,
    "max_limit": 50,
    "cursor": "local inbox page ids",
    "has_more": "has_more/remaining_count",
    "per_item_budget": "held refresh local pending message summary",
    "result_budget": "desktop/internal/resultbudget",
    "backend_bound": "bounded exact-target local inbox page",
    "structured_content": "bounded routing metadata"
  },
  {
    "tool": "message_reaction_list",
    "entry": "desktop/internal/wire/mcp/mcp_tools_reactions.go",
    "category": "detail",
    "default_limit": 0,
    "max_limit": 0,
    "cursor": "reactors use separate page",
    "has_more": "counts-only by default",
    "per_item_budget": "emoji/count only",
    "result_budget": "desktop/internal/resultbudget",
    "backend_bound": "counts query or bounded mutation response",
    "structured_content": "none"
  },
  {
    "tool": "message_attachment_view",
    "entry": "desktop/internal/wire/mcp/mcp_tools_chat.go",
    "category": "single",
    "default_limit": 1,
    "max_limit": 1,
    "cursor": "none",
    "has_more": "none",
    "per_item_budget": "path and metadata only; no binary/base64 inline",
    "result_budget": "desktop/internal/resultbudget",
    "backend_bound": "single attachment lookup",
    "structured_content": "metadata only"
  },
  {
    "tool": "ListScopeMembers",
    "entry": "internal/api/agent/api_messages.go",
    "category": "list",
    "default_limit": 20,
    "max_limit": 100,
    "cursor": "cursor",
    "has_more": "has_more/next_cursor",
    "per_item_budget": "member display row",
    "result_budget": "desktop/internal/resultbudget when exposed",
    "backend_bound": "exact query/role/visibility SQL LIMIT+1",
    "structured_content": "summary only"
  },
  {
    "tool": "local workspace ListTargetDir",
    "entry": "desktop/internal/channel/agentteam/workspacefs/workspace.go",
    "category": "filesystem list",
    "default_limit": 50,
    "max_limit": 200,
    "cursor": "offset cursor",
    "has_more": "has_more/next_cursor",
    "per_item_budget": "file entry metadata",
    "result_budget": "websocket payload budget when exposed to MCP",
    "backend_bound": "paged API reads directory entries incrementally without full ReadDir/sort; compat unpaged caller remains sorted for non-agent surfaces",
    "structured_content": "file metadata only"
  },
  {
    "tool": "local workspace ScanAll",
    "entry": "desktop/internal/channel/agentteam/workspacefs/workspace.go; desktop/internal/channel/agentteam/handler.go; internal/api/daemon/protocol.go; internal/api/workspace/api_machines.go",
    "category": "filesystem list",
    "default_limit": 50,
    "max_limit": 200,
    "cursor": "offset cursor",
    "has_more": "has_more/next_cursor",
    "per_item_budget": "directory summary",
    "result_budget": "websocket payload budget when exposed to MCP",
    "backend_bound": "agent directory list paged incrementally; machine:workspace:scan request/response and server API preserve limit/cursor/has_more metadata; each returned summary scans at most MaxListLimit entries one level deep",
    "structured_content": "directory metadata only"
  },
  {
    "tool": "mutations payloads",
    "entry": "desktop/internal/channel/agentteam/workspacefs/workspace.go; internal/store/taskboard/detail_limits.go",
    "category": "mutation",
    "default_limit": 1,
    "max_limit": 1,
    "cursor": "none",
    "has_more": "none",
    "per_item_budget": "tool-specific strings/maps/arrays, seed file path/content, and git ref/message caps",
    "result_budget": "desktop/internal/resultbudget",
    "backend_bound": "semantic request caps reject oversized writes before mutation; seed files validate full batch before writing",
    "structured_content": "bounded mutation summary"
  }
]
