MCP server for agent-driven aMule control. It talks to aMule through the External Connections protocol using amulecmd, and optionally exposes read-only search over a user-provided SQLite file catalog.
amule-mcp has 6 tools with basic schemas and descriptions, but significant gaps limit production readiness. Tool names follow verb_noun convention (amule_status, amule_search, amule_download, ec_raw, amule_files, amule_queue), which is good. However, descriptions are inconsistent in depth and actionability. amule_search has a detailed description explaining scope/filtering; amule_status and amule_queue are terse. Parameter descriptions exist but lack constraint details (e.g., no min/max for limit, no enum for scope despite mentioning valid values). Output schemas are not documented, responses are inferred from code (dicts with 'raw', 'error', 'results' fields). Error handling is minimal: ec() raises RuntimeError with truncated output; no recovery guidance. No tool annotations (readOnlyHint/destructiveHint). amule_download is marked WRITE but lacks confirmation/dry-run pattern. Overall, definitions are functional but below production baseline (194 char avg description; 100% of A+ tools have param descriptions, this server has ~70%).
Start a download. target = full ed2k:// link or result number from the last search.
Read download files from disk in a version-tolerant way.
Download queue with progress and speed when available.
Search the eD2k/Kad network and filter results. scope: 'global' (all servers), 'kad', or 'local'. ext: extension filter, e.g. 'mp3' or 'mp3|flac' (regex). min_mb/max_mb: minimum/maximum size in MB (0 = ignored). min_sources: minimum source count. Results are sorted by sources descending.
Get aMule status: ED2K/Kad, high/low ID, up/down speed, queue.
Run a read-only EC command for diagnostics. Allowed prefixes: show/status/stats/results/get/help/list.
Output schemas not documented. Responses are inferred dicts (e.g., amule_search returns {query, scope, total_found, after_filter, results, raw}; amule_status returns {raw, ed2k, kad, up, down}). LLMs cannot plan downstream calls without knowing field names and types.
Parameter constraints missing. amule_search 'limit' has no min/max (code caps at 50, but description doesn't state this). 'scope' mentions valid values in description but not as enum. 'ext' regex filter lacks format guidance. LLMs cannot validate inputs without explicit constraints.
Minimal error handling. ec() raises RuntimeError with truncated output ([:400]). No recovery guidance (e.g., 'Connection failed, check AMULE_HOST and AMULE_EC_PWD'). amule_search returns {error: ...} but other tools do not. Agents cannot self-correct.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Destructive tool (amule_download) lacks confirmation/dry-run. No pattern to prevent accidental downloads. Agents can trigger downloads without user approval.
amule_files and amule_queue descriptions are terse (<40 chars). 'Read download files from disk in a version-tolerant way' and 'Download queue with progress and speed when available' lack context on when to use them vs other tools or what they return.