What happened?
When a task-capable tool is defined on a child FastMCP server and that server is mounted into a parent server, the parent server's tools/list output does not include execution.taskSupport for the mounted tool.
Expected:
- the mounted tool should advertise task support the same way the child tool does
Actual:
- the mounted tool appears in
tools/list, but execution is None
Example Code
import asyncio
from fastmcp import FastMCP
child = FastMCP("child")
@child.tool(task=True)
async def foo() -> dict:
return {"ok": True}
parent = FastMCP("parent")
parent.mount(child)
async def demo():
child_tools = await child.list_tools()
parent_tools = await parent.list_tools()
child_tool = next(t for t in child_tools if t.name == "foo")
parent_tool = next(t for t in parent_tools if t.name == "foo")
print("child:", child_tool.to_mcp_tool(name=child_tool.name).execution)
print("parent:", parent_tool.to_mcp_tool(name=parent_tool.name).execution)
if __name__ == "__main__":
asyncio.run(demo())
Observed output:
- child:
ToolExecution(taskSupport='optional')
- parent:
None
Version Information
FastMCP: 3.1.0
Python: 3.13
OS: linux
What happened?
When a task-capable tool is defined on a child FastMCP server and that server is mounted into a parent server, the parent server's
tools/listoutput does not includeexecution.taskSupportfor the mounted tool.Expected:
Actual:
tools/list, butexecutionisNoneExample Code
Observed output:
ToolExecution(taskSupport='optional')NoneVersion Information