MCP server bundle that lets Xavani Agent drive the three Enternovate constellation CLIs (gavaza, nyarhi, mhangani) as native tools.
37 tools with consistent naming (verb_noun pattern: gavaza_*, nyarhi_*, mhangani_*) and descriptions extracted from docstrings. However, critical gaps: NO input schemas visible in source code, all tools lack JSON Schema type definitions, required/optional markers, and constraints. Descriptions are present but generic (avg ~120 chars, below 194-char baseline). Parameters documented in docstrings but not in machine-readable schema. No output schemas documented. Error handling minimal, tools return 'ERROR:' prefix strings without recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels (READ_ONLY, WRITE, DESTRUCTIVE). Composition is sound (single responsibility per tool), but schema completeness is the blocker for production use.
Run the POPIA compliance questionnaire from a JSON answers file. ``answers`` is the path to a JSON file mapping item ids to ``"yes" | "no" | "partial"``; ``out`` optionally overrides where the results JSON is written.
Log a breach in the register and print the 72-hour checklist. ``description`` is required (what happened). ``date`` (ISO format, defaults to today), ``categories`` of personal information involved, ``risk`` assessment, and ``status`` are optional.
List all breaches logged in the register.
List the eight POPIA conditions and their compliance checklists.
Attach an evidence file to a checklist item (hashed, local copy).
List recorded evidence, optionally filtered by item id.
NO input schemas visible in source code. All 37 tools lack JSON Schema type definitions, required/optional markers, enums, and constraints. FastMCP registration uses Python type hints (str, int, bool, dict) but these are not serialized to MCP schema format in the provided code.
No output schemas documented. Tools return strings (CLI output) but LLMs cannot infer structure. No documentation of response fields, pagination, or data types. Violates pattern:tool and pattern:response-shaper.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels documented in metadata (READ_ONLY, WRITE, DESTRUCTIVE). LLMs cannot determine safety/reversibility without annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
Remove an evidence entry and its copied file.
Print the POPIA to GDPR mapping table.
Generate POPIA compliance documents. ``docs`` selects which documents to generate (default ``all``); ``out`` is the output directory (default: the gavaza data dir).
Render the POPIA assessment report as JSON (default), Markdown or HTML. The JSON output of the CLI is passed through untouched.
List data subject requests, optionally filtered by status.
Log a data subject request with a 30-day response deadline. ``right`` is one of access, correction, objection, consent_withdrawal.
Update the status of a data subject request. ``new_status`` is one of open, in_progress, completed, rejected.
List the additional POPIA sections (special information, children, cross-border, automated decisions, direct marketing, DSR rights). ``slug`` optionally prints only one section.
Run a web security audit against ``url``. The target must be authorized first (see ``mhangani_authorize``) or the CLI refuses the audit. ``allow_private`` permits auditing private/internal addresses (off by default as a safety guard), ``timeout`` overrides the per-check timeout in seconds, ``rate_delay`` spaces HTTP requests, ``respect_robots`` refuses paths that robots.txt disallows.
List all recorded authorizations.
Remove the authorization for a target host.
Record explicit authorization for a target host. Run this before auditing a host for the first time.
Compare the latest audit with the stored baseline.
Snapshot the latest audit as the posture baseline.
Print the stored posture baseline.
Print the OWASP-aligned check catalogue.
Delete all stored audits and history in ~/.mhangani.
List previous audits stored in ~/.mhangani (newest first).
Render the last audit as JSON (default), Markdown, HTML, or exec. The JSON output of the CLI is passed through untouched.
Show how the posture score moved across the audit history.
Add a typed edge between two nodes. ``source``/``target`` are node ids, ``edge_type`` the relationship type (e.g. owns, works_at), ``props`` optional key/value properties, ``store`` an optional store file.
Add a typed node to the knowledge graph. ``node_id`` is the unique id, ``node_type`` the node type (e.g. Person, Company, Asset), ``props`` optional key/value properties written as ``--prop k=v`` pairs, ``store`` an optional store file.
Find nodes in the knowledge graph. ``node_type`` filters by node type, ``where`` filters by property as ``k=v`` (e.g. ``status=critical``), ``store`` an optional store file.
List the direct neighbors (nodes and edges) of ``node_id``.
Find the shortest path between two node ids in the graph.
Print the active typed schema of the graph as JSON.
Full-text search over the graph's nodes. ``term`` is matched against node ids, types, and property values. Results come back ranked by relevance.
Print knowledge graph statistics (node/edge counts, types).
Print the mutation timeline (every recorded change, newest last).
Reverse the mutation with timeline sequence number ``seq``.
Import local Xavani home data (memories and sessions) into the graph. The import is read-only and sync-only; nothing leaves the machine.
Error handling returns bare 'ERROR:' prefix strings without recovery guidance. No categorization (retryable vs fatal), no invalid value echoing, no suggestions for next steps. Violates pattern:recovery-guide.
Parameter descriptions in docstrings but not machine-readable. Enums (e.g. 'one of access, correction, objection, consent_withdrawal' in gavaza_requests_new) are text-only, not JSON Schema enums. LLMs cannot validate against constraints.