MCP server exposing AxonRelay governance ledger and task coordination as tools. Operates at the service/SQLAlchemy layer to drive task creation, approval workflows, and LangGraph Platform integration from MCP-aware clients like Claude Code.
AxonRelay exposes 21 tools with consistent naming (verb_noun pattern) and reasonable descriptions (avg ~150 chars). All tools have input schemas with type definitions and parameter descriptions. However, output schemas are not documented in the source, responses are serialized via helper functions (task_to_dict, etc.) but the LLM cannot see the structure. Error handling is minimal; most tools raise ValueError with generic messages. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. Parameter descriptions are adequate but lack format constraints (enums, ranges). The review_pending_task tool references elicitation (not supported by this server) without fallback guidance.
Approve a task that's WAITING_APPROVAL. Optionally include comment / edit.
Create a new agent definition.
Create a new task and allocate a LangGraph Platform thread.
Delete an agent definition.
Get a single actor by ID.
Get a single agent definition by ID.
List claims (territory assertions) in the system.
Output schemas not documented. Tools return serialized dicts (task_to_dict, actor_to_dict, etc.) but LLMs cannot see the field structure, types, or required fields. This forces LLMs to guess at response shape and risks extraction errors.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk levels (READ_ONLY, WRITE, DESTRUCTIVE) in the spec but not exposed to the MCP protocol. LLMs cannot distinguish safe reads from destructive writes without reading descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Get the full draft history for a task.
Get the single human actor representing the operator.
List coordination sessions.
Get a task with its assignments, drafts, and approvals.
List actors (human and AI) in the system.
List agent definitions, optionally filtered by type and active status.
List approvals for a task.
List tasks awaiting the operator's approval (the unified inbox).
List tasks across the operator's workspace, newest first.
Reject a task; revision loop continues unless the iteration cap is hit.
Interactively review a WAITING_APPROVAL task. Shows the current draft and reviewer feedback, then asks for your decision through the MCP client's native elicitation prompt, records it in the tamper-evident ledger, and resumes the graph. Clients that do not support elicitation should use approve_task / reject_task directly instead. If the task changes between display and decision (the draft no longer matches what was shown, or it is no longer waiting), the call returns status="stale_decision" and records nothing, so you never approve unseen content.
Kick off graph execution on Platform. Blocks until interrupt or completion.
Update an existing agent definition.
Verify the tamper-evident approval hash chain for a task. Returns {"valid": bool, "broken_at": approval id or None, "count": int, "legacy": int}. valid=False means a recorded approval was altered or reordered after the fact; "legacy" counts pre-hash-chain rows that are not covered.
review_pending_task references elicitation (MCP client native prompts) but server declares elicitation=false. Description says 'asks for your decision through the MCP client's native elicitation prompt' but this feature is not supported. Fallback guidance is present but confusing.
Error handling is minimal. Most tools raise ValueError with generic messages ('Task {task_id} not found'). No recovery guidance, no categorization (retryable vs fatal), no suggestions for next steps. LLMs cannot self-correct.
Parameter descriptions lack format constraints. 'status' param accepts enum values but description lists them as prose ('one of draft, waiting_review, ...') instead of formal enum constraint. 'limit' has no min/max bounds. LLMs may pass invalid values.