Return the skill tools that one metadata.include_tools name stands for.
A resolver lets a skill list tools whose real names are only known at runtime,
such as generated MCP tool names, and lets one name stand for several tools.
It's called with the name and the graph's Runtime on every model call after a
skill listing that name is read, and again before one of its tools runs. It can
be sync or async. An async resolver needs the agent's async entry point, such as
ainvoke.
runtime.context.Example:
# e.g. every tool on a Linear MCP connection, whatever their generated names
tools_by_integration = {"linear": linear_tools}
def resolve_skill_tools(name: str, runtime: Runtime) -> list[BaseTool]:
return tools_by_integration.get(name, [])
SkillsMiddleware(backend=backend, sources=["/skills/"], tools=resolve_skill_tools)