This server has significant quality gaps. While all 9 tools have visible definitions with input schemas and descriptions, the descriptions are universally terse (9-60 chars), parameter documentation is minimal, output schemas are completely undocumented, and error handling provides no recovery guidance. The naming is moderately good (verb-noun format), but schema completeness is poor. Tool quality ranges from 35-55, averaging 42. No tool reaches 60+. This is a typical community-grade server landing in the 'C-/D+' range.
Tools (9)
aluna_memory_searchread onlysource verified57/100
Search Aluna Memory (mem0) for conversation context
No output schemas documented for any tool. LLMs cannot predict response structure, forcing runtime discovery and wasting tokens on exploration. Critical for tool composition.
Descriptions are universally terse (9-60 chars). Baseline for A+ tools is 194 chars. Examples: 'Get status of Rob's active projects' (40 chars), 'Query Rob's truth database for personal knowledge' (49 chars). These lack WHEN to use, prerequisites, or downstream impact guidance required for LLM tool selection.
Add output schemas to all tools. Document response structure with field names, types, and descriptions. Example for search_cognivault: {type: 'object', properties: {results: {type: 'array', items: {type: 'object', properties: {id, title, score, snippet}}, description: 'Array of matching results'}, total_count: {type: 'number'}, next_cursor: {type: 'string'}}}.
Expand all descriptions to 150-250 characters. Include WHEN to use, what data you get back, and any prerequisites. Example: 'Search the CogniVault RAG database for knowledge. Use this to find context about past conversations, projects, or technical details. Returns top N results ranked by relevance. Requires valid search query.'
Add bounds and format constraints to numeric/string parameters. search_cognivault.limit: 'Number of results to return (1-50, default: 5). Higher limits may be slower.' android_fs_list.path: 'Directory path to list (default: /storage/emulated/0). Must be absolute path starting with /. No symlink traversal.'
Implement pagination for list-returning tools. Add offset/limit or cursor to search_cognivault, android_fs_list, and get_project_status. Return total_count or next_cursor in responses so agents can iterate without re-fetching.
Add recovery-oriented error messages. Instead of raw errors, return structured objects: {isError: true, message: 'Project not found', suggestion: 'Available projects: CogniVault, Aluna Memory, Mene Portal. Did you mean one of these?'}. Guide LLM to next steps.
Gate android_cmd_exec behind a dry-run parameter and add a destructiveHint annotation. Require explicit confirmation or offer a preview-command variant that shows what would execute without running it. Add destructiveHint: true to tool definition.
Parameter descriptions are missing or minimal. Example: android_fs_list 'path' param has description 'Directory path (default: /storage/emulated/0)', lacks format examples, constraint ranges, or error cases. search_cognivault 'limit' is 'Number of results (default: 5)', no min/max bounds specified (1-100? 1-1000?). Baseline: 72 chars avg per param description; these average ~40 chars.
No pagination support for list-returning tools. search_cognivault and android_fs_list likely return variable-length results but have no offset/limit params or cursor mechanisms. Large result sets will blow context windows without pagination.
Error handling provides no recovery guidance. All tools throw errors via try-catch with raw error messages (see line 162: 'Kindroid API error: ...'). LLMs see error text but no actionable next steps. Examples: 'Not found' with no suggestion to try a search first; timeout with no retry guidance.
Destructive tool (android_cmd_exec) has no dry-run, confirmation, or permission gating. Shell command execution can delete, modify, or exfiltrate data with zero guard rails. No isDestructive annotation provided in tool definition.
API credentials hardcoded in source. CONFIG object at line 25-30 contains KINDROID_API_KEY and BONNY_AI_ID as string literals in the code. These will appear in git history, logs, and agent traces. Credentials must use server-side secret injection via environment variables (partly done for ANDROID_BRIDGE_URL but not for the sensitive API keys).
No input validation or type enforcement. Parameters are accessed directly (args.message, args.query, args.path) with no guards against null, undefined, injection, or path traversal. android_fs_read could read /etc/passwd if no path validation exists internally.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) in tool definitions. Modern MCP tools should flag read-only vs destructive operations so agents reason about safety. All 9 tools lack these annotations.
No rate limiting or timeout safeguards for external API calls. bonny_kindroid_query has a 90-second timeout (good), but other tools calling Aluna, CogniVault, and Android bridge have no visible timeout config. Runaway agents could hammer endpoints.
Move API credentials to environment variables. KINDROID_API_KEY and BONNY_AI_ID should NOT be in source code. Use: const KINDROID_API_KEY = process.env.KINDROID_API_KEY || ''; throw if missing at startup. This prevents credential leaks in logs and git history.
Add input validation at tool entry points. Validate paths do not contain '..' or leading slashes outside /storage. Validate shell commands are in an allowlist or use a sanitization library. Return actionable errors: 'Path traversal not allowed: must not contain ..'.
Add tool annotations (readOnlyHint, destructiveHint, idempotentHint) to all tool definitions. Example: {name: 'android_cmd_exec', ..., readOnlyHint: false, destructiveHint: true, idempotentHint: false}. This lets agents reason about side effects.
Add explicit timeout configuration to axios calls for Aluna, CogniVault, and Android bridge. Set reasonable timeouts (10-30s) and catch timeout errors with a recovery message: 'Aluna Memory service timed out. Try again in a moment or use search_cognivault instead.'
Add per-tool logging and audit trails. Log who called what, with which parameters, and outcomes. Include timestamps for compliance and debugging. This is especially critical for android_cmd_exec and android_fs_read.
Document which tools require authentication or permissions. Add a 'permissions' field to tool definitions or inline in description. Example: 'Requires Android bridge token (ANDROID_AUTH_TOKEN) and must be called from trusted agent context.'
Split get_project_status into list_projects (returns all) and get_project_status(project_name) (returns one). Current tool conflates two concerns. Also add description of what 'status' means (string enum of possible states, not free-form text).
For tools that call external services (Kindroid, Aluna, CogniVault), document expected response formats in schema OR add a discovery tool like describe_service_response() that returns response structure. This prevents LLMs from guessing field names.
Add idempotency keys or deduplication logic to any tool that could be retried (e.g., bonny_kindroid_query). If agent retries on timeout, prevent duplicate message sends.