rohitg00/ai-engineering-from-scratch · error · ProtocolViolation
completion.total must be an integer at least values length
Error message
completion.total must be an integer at least values length
What it means
Error "completion.total must be an integer at least values length" thrown in rohitg00/ai-engineering-from-scratch.
Source
Thrown at phases/13-tools-and-protocols/31-mcp-conformance-versioning-and-operations/code/main.py:297
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)
):
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 (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:297 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/cd0d75230d96f104.
Report an issue: GitHub.