MCP server for verified macOS WeChat automation and monitoring
wechat-fastbridge demonstrates solid definition quality with explicit tool registration, complete input schemas using Zod, and good parameter documentation. All 6 tools are clearly defined with verb-noun naming (wechat_status, wechat_read, wechat_send, wechat_send_media, wechat_wait, wechat_inbox_wait). Input schemas are well-constrained with type definitions, min/max bounds, enums, and defaults. However, descriptions are notably brief (10-60 chars), falling short of the 50-200 char LLM-optimized baseline. Output schemas are not explicitly documented, responses are shaped by the `reply()` and `compact()` functions, but the structure is not formally declared in tool definitions. Error handling exists but is minimal: the `exclusive()` wrapper catches errors and calls `errorReply()`, which returns a fixed error structure, but lacks actionable recovery guidance or categorization (retryable vs fatal). The `wechat_send_media` tool includes inline validation for conditional parameters (FILE_PATH_REQUIRED, STICKER_QUERY_REQUIRED), which is good, but other tools lack similar guardrails. No tool annotations for destructiveness or idempotency beyond read-only hints. No pagination support despite tools that might return variable-length data (wechat_read, wechat_wait context arrays). Security is strong: no API keys in parameters, native macOS-only execution prevents unauthorized access, and the `exclusive()` mutex ensures thread-safe serial execution. Tool composition is well-designed, each tool has a single responsibility, and tools chain via shared chat/signature identifiers.
Wait for changed previews in allowed chats.
Read a chat; with after, return its delta and smart context.
Send verified text.
Send one verified file or sticker.
Check readiness.
Wait for one chat's delta and smart context.
Descriptions are too brief (10 - 60 chars across all tools). LLM-optimized descriptions should be 50 - 200 chars, explaining WHAT the tool does, WHEN to use it vs similar tools, and WHAT it returns. Current descriptions lack context for informed tool selection.
Output schemas are not explicitly documented. Tools return structured objects (messages, context, signature, events, ok flag) via the reply()/compact() shaper, but LLMs cannot see these field definitions. This forces the LLM to infer output structure, increasing hallucination risk.
Error handling lacks actionable recovery guidance. errorReply() returns {ok: false, error: CODE, detail: TEXT}, but does not categorize errors as retryable, user-fixable, or fatal. LLMs cannot determine next steps without explicit guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 56 | 2025-06-18+ | v2 |
Conditional parameter dependencies (e.g., wechat_send_media requires 'path' if kind='file', requires 'query' if kind='sticker' and collection='search') are enforced via inline validation, not JSON Schema. This violates the constraint specification principle and forces LLMs to reason about inter-param logic.
No pagination support. Tools like wechat_read return up to 20 messages and accept a limit param, but there is no next_cursor, page token, or continuation mechanism documented. If a chat has >20 messages, the LLM cannot fetch all results.
Tool annotations for idempotency and destructiveness are incomplete. wechat_send and wechat_send_media set idempotentHint=false, but there is no guidance on idempotency keys, retry safety, or deduplication. Agents may not know whether repeated calls with identical parameters are safe.