rohitg00/ai-engineering-from-scratch · error · ProtocolViolation

each tool descriptor requires a non-empty description

Error message

each tool descriptor requires a non-empty description

What it means

Error "each tool descriptor requires a non-empty description" thrown in rohitg00/ai-engineering-from-scratch.

Source

Thrown at phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations/code/main.py:278

        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:
            raise ProtocolViolation("completion.values must contain at most 100 entries")
        total = completion.get("total")
        if total is not None and (
            isinstance(total, bool) or not isinstance(total, int) or total < len(values)
        ):

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:278 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/999430d1fcf7cfde. Report an issue: GitHub.