MCP server for reading WeChat articles - Rust implementation. Provides tools to fetch and parse WeChat official account articles, extracting structured content including title, author, publish time, and article body.
Single tool with adequate naming and visible schema, but significant gaps in parameter validation, output documentation, and error handling. The tool description is present but generic. Input schema exists with basic type definition. No output schema documented. Error responses return unstructured JSON strings rather than proper error objects with recovery guidance. No parameter constraints (enums, patterns, ranges). Tool implementation shows URL validation logic but no guidance in description about what constitutes valid input or what the LLM should do if fetch fails.
读取微信公众号文章内容。接收一个微信文章 URL,使用浏览器渲染页面并提取结构化内容(标题、作者、发布时间、正文)。URL 必须以 https://mp.weixin.qq.com/s/ 开头。
Output schema not documented. Tool returns plain JSON string serialization without declared response structure, making it impossible for LLMs to know what fields to expect (success, error, title, author, publish_time, content). This violates the schema documentation requirement.
No error recovery guidance in description. When the tool fails (invalid URL, timeout, browser error), the description does not tell the LLM what to do next or how to recover. Current description does not mention prerequisite browser availability, timeout behavior, or fallback strategies.
URL parameter lacks format constraint. Parameter description states 'URL 必须以 https://mp.weixin.qq.com/s/ 开头' (must start with https://mp.weixin.qq.com/s/) but this is not formalized as a JSON Schema pattern or enum. Should use regex pattern: '^https://mp\.weixin\.qq\.com/s/[a-zA-Z0-9_-]+$' to make it machine-parseable.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-21 | D | 50 | <=2025-11-25 | v2 |
| 2026-03-09 | D | 51 | - | v1 |
Generic error responses. Tool returns plain text error messages in a 'success: false' JSON wrapper without categorization. No distinction between retryable errors (timeout, network) vs user-fixable (invalid URL) vs fatal (browser not available). LLM cannot decide whether to retry, ask user, or abort.
Tool description is generic and lacks LLM-optimization context. At 149 characters, it describes WHAT the tool does but not WHEN to use it vs other tools, what prerequisites exist (browser must be available), what might go wrong (timeouts, authentication), or what the LLM should do with the returned content. Baseline for A+ tools is 50 - 200 chars with clear WHAT/WHEN/WHY.
No idempotency hints. Tool fetches live web content and may return different results on repeated calls due to article updates or removal. No description notes this behavior or hints that retry logic might produce different outputs. Agents expecting idempotent operations may fail silently.
No rate limiting or timeout guidance. Tool uses chromiumoxide to render pages, which is CPU/memory intensive. Description does not warn about potential timeouts, rate limits, or maximum concurrent calls. LLMs may retry aggressively without knowing the cost.