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

completion.hasMore must be a boolean

Error message

completion.hasMore must be a boolean

What it means

Error "completion.hasMore must be a boolean" thrown in rohitg00/ai-engineering-from-scratch.

Source

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

    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)
        ):
            raise ProtocolViolation("completion.total must be an integer at least values length")
        has_more = completion.get("hasMore")
        if has_more is not None and not isinstance(has_more, bool):
            raise ProtocolViolation("completion.hasMore must be a boolean")

    if result_type != "task":
        return
    if method != "tools/call":
        raise ProtocolViolation("task result is valid only for tools/call")
    required_strings = ("taskId", "status", "createdAt", "lastUpdatedAt")
    for field in required_strings:
        if not isinstance(result.get(field), str) or not result[field]:
            raise ProtocolViolation(f"task result requires non-empty {field}")
    if result["status"] not in {"working", "input_required", "completed", "cancelled", "failed"}:
        raise ProtocolViolation("task result has an unknown status")
    if "ttlMs" not in result:
        raise ProtocolViolation("task result requires ttlMs")
    ttl_ms = result["ttlMs"]
    if ttl_ms is not None and (
        isinstance(ttl_ms, bool) or not isinstance(ttl_ms, int) or ttl_ms < 0
    ):
        raise ProtocolViolation("task result ttlMs must be null or a non-negative integer")

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:300 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/3285ff6b857fd8d5. Report an issue: GitHub.