You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
feat: enhance dynamic tool management with notifications and enable/disable #1429
Enhance the Python SDK's dynamic tool management capabilities to match the TypeScript SDK by adding:
Automatic tools/list_changed notifications when tools are added/removed
Tool enable/disable functionality (temporary hiding without removal)
Background
The Python SDK currently supports adding and removing tools dynamically (see #1322), but lacks two key features present in the TypeScript SDK:
1. List Changed Notifications
The TypeScript SDK automatically sends notifications/tools/list_changed when tools are modified. This allows clients to know when they should refresh their tool list.
Python SDK gap: Currently, when calling add_tool() or remove_tool(), clients are not notified of the change and may show stale tool lists.
2. Enable/Disable Tools
The TypeScript SDK provides enable() and disable() methods on tools:
consttool=server.tool("myTool", ...,async()=>{ ... });tool.disable()// Hides from list_tools, blocks callstool.enable()// Re-enables the tooltool.remove()// Permanently removes
Benefits:
Temporarily hide tools without losing registration
Re-enable tools without re-registering
Useful for permission-based or state-based tool visibility
Python SDK gap: Only permanent removal via remove_tool() is supported. No way to temporarily disable/re-enable tools.
I'm not entirely sure how this should be implemented. The Typescript SDK returns an object which can be used for removing/enabling/disabling, but I'm not sure this exact thing would work well for Python given that we use decorators for registering tools. Keen to hear other's thoughts.
We could add enable_tool(self, name) and disable_tool(self, name) methods within the FastMCP class, which interfaces with the tool manager. These methods could use the existing
function to retrieve the tool instance, and enable or disable it. Each tool instance would include an is_enabled attribute that can be checked before the tool is executed. From there, we could send a notification via the context manager. we should also maybe do this with resources.
Is there a way to have dynamic tool management? A hacky method should also suffice my use case. But I do think that this is an important feature the SDK should support.
asyncdeftool_list_update(ctx : Context, names : List[str]) ->List[str]:
""" inject the context and use the send_tool_list_changed() to inform client """fornameinnames:
ifnameindynamic_toolset:
mcp.add_tool(dynamic_toolset[name], name=name)
awaitctx.session.send_tool_list_changed() # send the notificationreturnret
Activity
maxisbey commentedon Oct 6, 2025
I'm not entirely sure how this should be implemented. The Typescript SDK returns an object which can be used for removing/enabling/disabling, but I'm not sure this exact thing would work well for Python given that we use decorators for registering tools. Keen to hear other's thoughts.
beaterblank commentedon Oct 9, 2025
We could add
enable_tool(self, name)anddisable_tool(self, name)methods within theFastMCPclass, which interfaces with the tool manager. These methods could use the existingpython-sdk/src/mcp/server/fastmcp/tools/tool_manager.py
Lines 37 to 39 in 61399b3
function to retrieve the tool instance, and enable or disable it. Each tool instance would include an is_enabled attribute that can be checked before the tool is executed. From there, we could send a notification via the context manager. we should also maybe do this with resources.
kuku929 commentedon Dec 17, 2025
Is there a way to have dynamic tool management? A hacky method should also suffice my use case. But I do think that this is an important feature the SDK should support.
kuku929 commentedon Dec 18, 2025
Found a way around this for now: