MCP server for WeChat - Query local WeChat data with skill distillation and message listening
Six tools with basic verb-noun naming (wechat_*) and present descriptions, but significant gaps in parameter documentation and output schema clarity. All tools are READ_ONLY and return JSON strings, but descriptions lack actionable detail on when to use each tool vs. alternatives. Parameter descriptions exist but are minimal (10-30 chars). No output schema documented. Error handling returns generic 'Error: {str(e)}' strings without recovery guidance. Schemas are visible and typed, but lack constraints (enums, ranges). No tool annotations (readOnlyHint, etc.). Composition is reasonable, each tool has one responsibility, but chaining is unclear (e.g., wechat_history requires 'chat_name' but wechat_sessions returns 'username'; unclear if they're interchangeable).
Search WeChat contacts
Read chat history from a specific WeChat conversation
Get new WeChat messages since last check (incremental)
Search WeChat messages by keyword
List recent WeChat chat sessions/conversations
Show unread WeChat sessions
Output schemas not documented. Tools return JSON strings but LLMs cannot infer field structure. wechat_sessions returns 'chat', 'username', 'is_group', 'unread', etc., but this is buried in code, not in tool metadata.
Parameter descriptions are minimal (10-30 chars) and lack actionable constraints. 'msg_type' param in wechat_history lists allowed values in description ('text, image, voice, ...') but should use enum constraint. 'limit' params lack min/max bounds.
Error handling returns generic 'Error: {str(e)}' without recovery guidance. No distinction between retryable (network timeout) vs. user-fixable (chat not found) vs. fatal errors. LLM cannot determine next action.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
Tool chaining unclear. wechat_sessions returns 'username' field, but wechat_history expects 'chat_name' parameter. No documentation on whether these are interchangeable or if a lookup is required.
wechat_contacts has ambiguous parameter design. 'query' and 'detail' are mutually exclusive but not documented. Passing both or neither has undefined behavior. No enum or constraint guidance.