Implement SEP-986: Tool name validation (#1655)

This commit is contained in:
Felix Weinberger 2025-11-24 16:46:57 +00:00 • committed by GitHub
commit 091afb82dc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 334 additions and 0 deletions

View file

@ -11,6 +11,7 @@ from pydantic import BaseModel, Field
from mcp.server.fastmcp.exceptions import ToolError
from mcp.server.fastmcp.utilities.context_injection import find_context_parameter
from mcp.server.fastmcp.utilities.func_metadata import FuncMetadata, func_metadata
from mcp.shared.tool_name_validation import validate_and_warn_tool_name
from mcp.types import Icon, ToolAnnotations
if TYPE_CHECKING:
@ -56,6 +57,8 @@ class Tool(BaseModel):
"""Create a Tool from a function."""
func_name = name or fn.__name__
validate_and_warn_tool_name(func_name)
if func_name == "<lambda>":
raise ValueError("You must provide a name for lambda functions")

View file

@ -90,6 +90,7 @@ from mcp.shared.context import RequestContext
from mcp.shared.exceptions import McpError
from mcp.shared.message import ServerMessageMetadata, SessionMessage
from mcp.shared.session import RequestResponder
from mcp.shared.tool_name_validation import validate_and_warn_tool_name
logger = logging.getLogger(__name__)
@ -422,6 +423,7 @@ class Server(Generic[LifespanResultT, RequestT]):
if isinstance(result, types.ListToolsResult): # pragma: no cover
# Refresh the tool cache with returned tools
for tool in result.tools:
validate_and_warn_tool_name(tool.name)
self._tool_cache[tool.name] = tool
return types.ServerResult(result)
else:
@ -429,6 +431,7 @@ class Server(Generic[LifespanResultT, RequestT]):
# Clear and refresh the entire tool cache
self._tool_cache.clear()
for tool in result:
validate_and_warn_tool_name(tool.name)
self._tool_cache[tool.name] = tool
return types.ServerResult(types.ListToolsResult(tools=result))