Repository navigation
feat: enhance dynamic tool management with notifications and enable/disable #1429
Description
Activity
- addedenhancementRequest for a new feature that's not currently supportedRequest for a new feature that's not currently supported
on 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.
Reacted by Felix Weinberger- addedready for workEnough information for someone to start working onEnough information for someone to start working onP2Moderate issues affecting some users, edge cases, potentially valuable featureModerate issues affecting some users, edge cases, potentially valuable featurev2Affects the v2 line (2.x on main)Affects the v2 line (2.x on main)
on Oct 6, 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
def get_tool(self, name: str) -> Tool | None: """Get tool by name.""" return self._tools.get(name)
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.- addedP1Significant bug affecting many users, highly requested featureSignificant bug affecting many users, highly requested featureand removedP2Moderate issues affecting some users, edge cases, potentially valuable featureModerate issues affecting some users, edge cases, potentially valuable feature
on Oct 9, 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.
Found a way around this for now:
async def tool_list_update(ctx : Context, names : List[str]) -> List[str]: """ inject the context and use the send_tool_list_changed() to inform client """ for name in names: if name in dynamic_toolset: mcp.add_tool(dynamic_toolset[name], name = name) await ctx.session.send_tool_list_changed() # send the notification return ret
- addedneeds decisionIssue is actionable, needs maintainer decision on whether to implementIssue is actionable, needs maintainer decision on whether to implementand removedready for workEnough information for someone to start working onEnough information for someone to start working on
on Apr 17, 2026
Summary
Enhance the Python SDK's dynamic tool management capabilities to match the TypeScript SDK by adding:
tools/list_changednotifications when tools are added/removedBackground
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_changedwhen tools are modified. This allows clients to know when they should refresh their tool list.Python SDK gap: Currently, when calling
add_tool()orremove_tool(), clients are not notified of the change and may show stale tool lists.2. Enable/Disable Tools
The TypeScript SDK provides
enable()anddisable()methods on tools:Benefits:
Python SDK gap: Only permanent removal via
remove_tool()is supported. No way to temporarily disable/re-enable tools.References
remove_toolmethod)notifications/tools/list_changed