rohitg00/ai-engineering-from-scratch · error · ProtocolViolation
each tool descriptor requires a non-empty name
Error message
each tool descriptor requires a non-empty name
What it means
Error "each tool descriptor requires a non-empty name" thrown in rohitg00/ai-engineering-from-scratch.
Source
Thrown at phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations/code/main.py:273
def validate_method_result(method: str, result: dict[str, Any]) -> None:
result_type = result.get("resultType")
if method == "tools/list":
if result_type != "complete":
raise ProtocolViolation("tools/list must return a complete result")
tools = result.get("tools")
if not isinstance(tools, list):
raise ProtocolViolation("complete tools/list result requires a tools array")
names: set[str] = set()
for tool in tools:
if not isinstance(tool, dict):
raise ProtocolViolation("each tools/list descriptor must be an object")
name = tool.get("name")
description = tool.get("description")
input_schema = tool.get("inputSchema")
if not isinstance(name, str) or not name:
raise ProtocolViolation("each tool descriptor requires a non-empty name")
if name in names:
raise ProtocolViolation("tools/list contains a duplicate tool name")
names.add(name)
if not isinstance(description, str) or not description:
raise ProtocolViolation("each tool descriptor requires a non-empty description")
if not isinstance(input_schema, dict) or input_schema.get("type") != "object":
raise ProtocolViolation("each tool descriptor requires an object-root inputSchema")
if method == "completion/complete":
if result_type != "complete":
raise ProtocolViolation("completion/complete must return a complete result")
completion = result.get("completion")
if not isinstance(completion, dict):
raise ProtocolViolation("completion/complete requires a completion object")
values = completion.get("values")
if not isinstance(values, list) or any(not isinstance(value, str) for value in values):
raise ProtocolViolation("completion.values must be an array of strings")
if len(values) > 100:View on GitHub (pinned to 39ea8a1c6d)
When it happens
Trigger: Thrown at phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations/code/main.py:273 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of rohitg00/ai-engineering-from-scratch@39ea8a1c6d (2026-08-26).
Data as JSON: /api/errors/394128a2b178dce9.
Report an issue: GitHub.