MCP server that bridges Matrix chat rooms to Claude, allowing Claude to receive messages from Matrix and send replies back. Supports message forwarding, reactions, permission approval workflows, and media handling (images, audio transcription, video, files).
Single tool 'reply' with adequate schema but significant gaps in description quality and parameter documentation. Tool name lacks action verb clarity (should be 'send_message' or 'send_reply'). Description is 127 chars but lacks WHEN to use it, prerequisites, or state-modification clarity. Parameters have types but descriptions are minimal (room_id: 19 chars, text: 28 chars, thread_root: 37 chars). No output schema documented. No error handling guidance. Baseline for A+ tools: 100% have param descriptions (50-100 chars each); this tool averages 28 chars. No pagination, no structured output guidance.
Send a message back to a Matrix room. Use the room_id from the latest <channel> tag (and the thread_root if the original message was inside a thread).
Tool name 'reply' lacks action verb. Should be 'send_message', 'send_reply', or 'post_message' to signal intent clearly. LLMs infer tool purpose from name before reading description.
Parameter descriptions are too brief (19-37 chars). Baseline for A+ tools: 50-100 chars per param. 'room_id' lacks format hint (e.g. '!abc123:example.com'); 'text' lacks markdown/length constraints; 'thread_root' lacks optional behavior explanation.
Tool description (127 chars) lacks WHEN to use it, prerequisites, or state-modification clarity. Does not state 'This sends a message to a Matrix room' explicitly. Missing: 'Modifies state (sends message)' warning for retry semantics.
No output schema documented. LLMs cannot plan downstream actions or extract event_id for threading without knowing return structure. Should document: {event_id, room_id, timestamp, status}.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 42 | <=2025-11-25 | v2 |
No error handling guidance. If room_id is invalid, thread_root does not exist, or user lacks permissions, LLM receives no recovery path. Should include: 'If room not found, call list_rooms() first. If permission denied, check ALLOWED_SENDERS config.'