Part of #612. Depends on #615, #618, #622.
Swap the agent loop's v1 caller-supplied opts.toolHandlers dispatch for registry-backed tool resolution — the half of #612 that makes toolMode: 'auto' the compressed-stack story (auto-discovered, RBAC-filtered, audited tools) rather than hand-wired handlers.
Scope / acceptance
Seam already in place (PR #848)
The loop's missing-handler split — DECLARED-but-no-handler → hard ClientError(400); UNDECLARED → recoverable "unknown tool" — maps directly onto the registry's resolvable-but-misconfigured vs unknown cases. The swap is a lookup replacement in runSingleToolCall, not a loop rewrite.
🤖 Generated with Claude Code
Part of #612. Depends on #615, #618, #622.
Swap the agent loop's v1 caller-supplied
opts.toolHandlersdispatch for registry-backed tool resolution — the half of #612 that makestoolMode: 'auto'the compressed-stack story (auto-discovered, RBAC-filtered, audited tools) rather than hand-wired handlers.Scope / acceptance
scope.resources— an@export-ed Resource'sget_*/search_*/create_*/… verbs are callable as tools ([MCP] Application profile: tool generation over Resources registry #618).mcpToolsopt-ins ([MCP] Custom Resource opt-in via static mcpTools declaration #622).Seam already in place (PR #848)
The loop's missing-handler split — DECLARED-but-no-handler → hard
ClientError(400); UNDECLARED → recoverable "unknown tool" — maps directly onto the registry's resolvable-but-misconfigured vs unknown cases. The swap is a lookup replacement inrunSingleToolCall, not a loop rewrite.🤖 Generated with Claude Code