Self-contained MCP server for home automation and personal services: Beeper messaging, Abode security, Bible API, ProtonMail, Graphiti knowledge graph, and UniFi network management
This server has severe quality gaps across all dimensions. Tool definitions are inconsistently documented, with many duplicate tools, missing or generic descriptions, and schemas that lack parameter descriptions. The server exposes 45 tools but has massive quality issues: (1) 8+ duplicate tool definitions (beeper_get_accounts, beeper_search, beeper_search_chats, beeper_search_messages, beeper_get_chat, beeper_list_messages, beeper_send_message, abode_get_mode, abode_set_mode, abode_list_devices appear multiple times), (2) descriptions are generic or missing entirely (e.g., ping='Health check', many tools lack any action context), (3) most parameter descriptions are minimal or absent (e.g., beeper_voice_memos has no descriptions for chat_id/limit), (4) no output schemas documented for any tool, (5) no error handling guidance, (6) no tool-chaining support documented, (7) security-sensitive operations (lock_device, set_mode, send_message) lack permission/confirmation guidance. The code shows strong security practices (rate limiting, audit logging, credential injection) but the tool interface itself is poorly designed for LLM use.
Get details for a specific device
Get current Abode panel mode
Get current Abode alarm mode
Get Abode panel settings
List all Abode automations
List all Abode devices
List all Abode devices
8+ duplicate tool definitions with identical or nearly identical names and schemas. The same tool is registered multiple times (e.g., beeper_get_accounts, beeper_search, beeper_search_chats, beeper_search_messages, beeper_get_chat, beeper_list_messages, beeper_send_message appear twice; abode_get_mode, abode_set_mode, abode_list_devices appear twice). This forces LLMs to reason about which duplicate to invoke and violates the single-canonical-tool principle.
No output schemas documented for any tool. LLMs cannot know what fields to expect in responses, preventing tool-chaining and forcing them to guess downstream field names. The tool definitions declare only input schemas.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | <=2025-11-25 | v2 |
Lock or unlock a device
Lock/unlock device
Set Abode panel mode
Set Abode alarm mode
Switch a device on or off
Trigger an Abode automation
Archive or unarchive a chat
Get message statistics for chats
Clear reminder for a chat
Get connected Beeper accounts
List connected messaging accounts
Get chat details
Get chat details by ID
List all synced Beeper chats
List messages from a chat
List messages from a chat
Get recent messages from a chat room
Search chats and messages
Search across Beeper conversations
Search chats by various criteria
Search chats by title or participants
Search message history across all Beeper conversations
Search messages across chats
Search messages across chats with filters
Send a message to a chat
Send a message
Set a reminder for a chat
List voice memos from Beeper
Get Bible passage
Search Bible
Verse of the day
Add episode to knowledge graph
Get facts from knowledge graph
Search knowledge graph
Health check
Read email by UID
Search ProtonMail inbox
Send email
Parameter descriptions are missing or generic for many tools. Examples: beeper_voice_memos has no descriptions for 'chat_id' or 'limit'; beeper_chat_stats, abode_list_devices, graphiti_get_facts all have empty required arrays but no guidance on what happens when fields are omitted. This violates the requirement that every parameter have a non-empty description.
Destructive and sensitive tools (abode_set_mode, abode_lock_device, beeper_send_message, send_protonmail, beeper_archive_chat) lack confirmation/dry-run patterns or explicit permission gates. No descriptions indicate these operations are irreversible or require confirmation. An LLM could lock a door or send an email without safeguards.
No error recovery guidance. Tool descriptions do not state what to do if a call fails (e.g., 'User not found. Try search_users() first.' or 'This operation requires authentication, check BEEPER_TOKEN environment variable'). LLMs receive raw errors with no actionable next steps.
Tool naming ambiguities. Multiple Beeper tools use nearly identical names (beeper_search, beeper_search_chats, beeper_search_messages). The LLM must infer from minimal descriptions which is correct. Names should be more distinct: search_beeper_messages, search_beeper_chats_by_title, etc.
Inconsistent parameter naming conventions. Some tools use 'chatID' (camelCase), others 'chat_id' (snake_case); some use 'limit', others 'limit' with no type declared. Inconsistency forces LLMs to lookup each tool individually; it does not scale.
Several read-only tools return large result sets (beeper_list_chats, beeper_search_history, beeper_search_messages) but limit parameter is optional with no documented default or max cap. Without pagination, large results blow the context window. A default limit (20 - 50) should be enforced.