MCP server for Zenii AI backend — exposes tools via Model Context Protocol
Zenii MCP server has three tools with partial schemas and moderate descriptions. All three tools are explicitly registered with JSON Schema input definitions visible in source (agent_self_tool.rs, channel_tool.rs, config_tool.rs). However, critical gaps exist: parameter descriptions are sparse or missing, output schemas are undocumented, error handling lacks recovery guidance, and tool naming could be clearer. The server exposes sensitive operations (send messages, update config, modify agent rules) without documented permission models or confirmation patterns. Descriptions average ~150 chars (within baseline 194), but parameter annotations are minimal, most params lack descriptions or have trivial text ('The operation to perform'). No evidence of idempotent operation markers, pagination support, or structured error responses with actionable recovery steps.
Manage your own behavioral notes. Notes you store are automatically available in your context for future conversations when relevant. Use 'learn' to record a discovery, preference, or pattern you want to remember. Use 'rules' to review what you currently know. Use 'forget' to remove outdated notes. Categories: general, channel, scheduling, user_preference, tool_usage. Only store genuinely useful patterns — not ephemeral facts.
Send messages to connected channels, list channels, check status, or discover known contacts. When sending without a recipient, auto-resolves if only one contact exists. Use 'contacts' action to list known recipients. Actions: send, list, status, contacts.
Read or update app configuration. Use 'get' to view current settings (optionally filter by key), 'update' to change whitelisted settings.
Output schemas completely undocumented. LLMs cannot plan downstream tool calls or extract required fields (e.g. channel IDs for follow-up sends) without knowing response structure.
Parameter descriptions are missing or trivial. 'action' is described as 'The operation to perform' (generic filler); 'message', 'recipient', 'key', 'value' lack any description. LLMs cannot infer parameter semantics and will produce invalid calls.
Tool names do not start with action verbs. 'agent_notes', 'channel_send', and 'config' are nouns or noun phrases. Should be 'manage_agent_notes', 'send_channel_message', 'get_config'/'update_config'. LLMs rely on verb-first naming to infer intent before reading descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
No error handling guidance. Tools like 'channel_send' can fail (auth, rate limit, user not found, invalid channel) but no documented recovery paths. Error responses must guide LLM: 'User not found. Try contacts action first.' Without this, agents deadlock on failures.
No permission gates or confirmation patterns on destructive/sensitive operations. 'agent_notes' with 'forget' action and 'channel_send' can modify/send without confirmation. Agents make mistakes, tools modifying state should support dry-run or explicit confirmation.
No input validation constraints documented. 'config' tool accepts arbitrary 'key' and 'value' strings with no format, length, or injection guards specified. LLMs cannot validate inputs, tool must reject invalid configs with actionable error messages.
Conditional parameter requirements not formalized. 'agent_notes' 'forget' action requires 'id' but schema does not mark 'id' as conditional (required only when action=='forget'). 'channel_send' 'send' action requires 'message' and 'recipient' (or resolves recipient), unclear which are truly required per action.
Auto-resolution behavior in 'channel_send' (recipient resolves when 'only one contact exists') is not machine-checkable. LLM cannot verify if auto-resolution will succeed without calling 'contacts' action first. Response must clarify: was recipient auto-resolved or did LLM provide it explicitly?
'config' tool lists 'whitelisted settings' in description but does not enumerate valid keys. LLM cannot determine which config keys are safe to read or modify. Must provide an enum or reference a discoverable list.