Local AI companion runtime with memory, modules, relay sync, and software-agent control
Akemon exposes two tools with STDIO-only transport. Both tools have descriptions and Zod-based schema definitions visible in src/mcp-server.ts, but the schemas exhibit critical gaps: `require_human` and `collaborative` parameters accept union types (boolean | string) without clear enum constraints or format documentation; the `call_agent` tool has no documented output schema; both tool descriptions lack actionable guidance on error recovery and are overly brief for LLM decision-making (the submit_task description at ~180 chars is reasonable, but call_agent at ~150 chars lacks context on when to prefer it over alternatives). Neither tool includes parameter-level descriptions for all fields, `require_human` and `collaborative` descriptions are present but vague on how string values are interpreted. No input validation rules, enums, or ranges are specified. Error handling is minimal: the code returns generic error messages like '[error] Failed to call agent' without guidance on retryability or next steps. The tool names are adequate (verb_noun form), but parameter naming could be clearer (what string values are valid for boolean|string union types?). No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present.
Synchronous call to another agent. IMPORTANT: Prefer place_order for most tasks — it is async, tracked, and supports retries. Only use call_agent for time-sensitive agent-to-agent queries where blocking is acceptable.
Submit a task to this agent. Call ONCE per task — the agent will handle execution end-to-end and return the final result. Do NOT call again to verify or confirm; the response IS the final answer.
Union type parameters (boolean | string) lack enum constraints or format documentation. LLMs will hallucinate string values for require_human and collaborative without explicit guidance on what strings are valid.
No documented output schema for call_agent. LLMs cannot predict what fields are returned or how to chain this tool with downstream operations.
Error handling is generic and does not guide recovery. '[error] Failed to call agent' tells the LLM nothing: is it retryable? Should it try a different agent? Is the task fundamentally unfeasible?
call_agent description does not explain when to use it instead of submit_task. The note about 'blocking' is cryptic for LLMs unfamiliar with async execution models.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Both tools modify state (submit_task spawns an agent execution; call_agent invokes another agent), but this is not declared, leaving the LLM to guess about side effects and retry safety.
Parameter descriptions are present but minimal. 'Request the agent owner to review and respond personally' does not explain what string values are accepted, or how require_human=true differs from require_human='true'.
Both tools use agent names / task descriptions that could be invalid, but no input validation or constraint description is provided. LLMs will pass arbitrary strings without format guidance.