Skip to content

feat(tools): let toolsets replace a failed tools listing - #6749

Open
a2105z wants to merge 2 commits into
google:mainfrom
a2105z:feat/toolset-listing-failure-hook
Open

feat(tools): let toolsets replace a failed tools listing#6749
a2105z wants to merge 2 commits into
google:mainfrom
a2105z:feat/toolset-listing-failure-hook

Conversation

@a2105z

@a2105z a2105z commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Add BaseToolset.on_tools_listing_error so apps can contribute replacement tools when listing fails (default: empty list / current skip behavior)
  • Invoke the hook from LlmAgent tool loading and SkillToolset additional-tool resolution after the existing isolate-and-continue logging
  • Enables per-user OAuth (3LO) MCP flows to surface connect/authorize placeholder tools instead of silently dropping the toolset

Fixes #6748

Test plan

  • pytest tests/unittests/tools/test_base_toolset.py (default + override hook)
  • pytest tests/unittests/agents/test_llm_agent_fields.py -k canonical_tools
  • pytest tests/unittests/tools/test_skill_toolset.py -k resolution_
  • Reviewer: confirm hook is not invoked on direct get_tools() / get_tools_with_prefix() calls (exceptions still propagate there)

@google-cla

google-cla Bot commented Aug 16, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Apps fronting per-user OAuth MCP servers need a seam to contribute
placeholder tools on HTTP 401 instead of the framework silently dropping
the toolset. Add BaseToolset.on_tools_listing_error and invoke it from
the agent and SkillToolset isolate-and-continue paths.
@a2105z
a2105z force-pushed the feat/toolset-listing-failure-hook branch from bb41cc5 to 5a342a6 Compare August 16, 2026 14:26
@a2105z

a2105z commented Aug 16, 2026

Copy link
Copy Markdown
Contributor Author

@googlebot I fixed it.

@varunbiluri varunbiluri left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Staff review: one prefix-contract issue to address.

Comment thread src/google/adk/tools/base_toolset.py
Keep the BaseToolset naming contract on the isolate-and-continue path by
routing listing-error replacements through the shared prefix helper.
@a2105z

a2105z commented Aug 16, 2026

Copy link
Copy Markdown
Contributor Author

@varunbiluri addressed your prefix-contract note in the latest push — thank you again for the staff review. Please take another look when you have a chance, and let me know if there’s anything else you’d like changed.

@varunbiluri varunbiluri left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed 08bcf768. Fallback tools now go through the same copy-and-prefix transformation as successful listings in both the agent and SkillToolset isolation paths, with behavioral coverage at each boundary. The hook contract clearly tells overrides to return unprefixed names. My prefix-contract concern is resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Applications cannot influence what a toolset contributes when tool listing fails (per-user OAuth MCP servers)

3 participants