MCP server for reading WeChat (Weixin) public account articles by extracting content, metadata, and converting to Markdown
Single tool 'read_weixin_article' has a reasonable structure but suffers from moderate documentation gaps and lacks proper error handling guidance. The tool name is clear (verb_noun pattern), description exists but is minimal in English context, and input schema is present with basic type info. However, output schema is documented only in docstring (not machine-readable), error handling provides no recovery guidance, and the tool lacks defensive input validation details. The implementation relies on an external binary (url-md) that must be pre-installed, creating an undocumented dependency that could fail silently at runtime.
读取微信公众号文章内容 Args: url: 微信文章URL,格式: https://mp.weixin.qq.com/s/xxx Returns: dict: { "success": bool, "title": str, "author": str, "publish_time": str, "content": str, "error": str | None }
Output schema documented only in docstring, not machine-readable. The @mcp.tool() decorator does not include an explicit output schema in JSON Schema format. LLM cannot parse expected response structure programmatically.
Tool description lacks detail on error scenarios and recovery paths. Description states what the tool does but does not explain: when to call it instead of other tools, what constitutes success/failure, or how to handle common errors (e.g., 'url-md binary not found', network timeouts, paywalled articles).
External dependency (url-md binary) is not documented in tool description. The tool fails at runtime if url-md is not in PATH, but the description does not mention this prerequisite. Users calling this tool via MCP will see cryptic errors instead of actionable guidance.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Error responses lack recovery guidance. Example: when url-md exits with code 11 (blocked by anti-bot), the error message 'url-md failed (blocked by anti-bot)' tells the LLM nothing about what to do next. Should suggest: 'Article may require authentication. Try with a valid WeChat session, or contact the article author for a shared link.'
Input parameter 'url' has only basic type and format check in code (startswith validation), but description does not document accepted formats or rejected patterns. Description should clarify: 'Accepts only Weixin article URLs starting with https://mp.weixin.qq.com/s/. Other URLs will be rejected with an error.'
No timeout documentation in tool description. The scraper.fetch_article() has a 45-second default timeout + 5-second process wait, but this is not exposed in the tool definition. If an article fetch hangs, the LLM has no visibility into why.