MCP server that exposes CLI commands for publishing content to multiple social platforms (Twitter/X, LinkedIn, WeChat, Xiaohongshu) with content adaptation and credential validation.
This MCP server has well-structured tool definitions with clear naming, comprehensive descriptions, and properly typed schemas. All four tools follow verb_noun naming conventions and include detailed docstrings explaining what they do, when to use them, and what they return. Parameter descriptions are generally good. However, there are notable gaps in output schema documentation, error handling lacks actionable recovery guidance in some cases, and the server lacks tool annotations (readOnlyHint/destructiveHint). The code is clean and professional, with semantic error bodies defined, but the error messages could be more specific about recovery steps.
Preview how the content will be reshaped per platform — no posting. Use this BEFORE publishing to see exactly what each platform will receive: Twitter threads with numbering, LinkedIn paragraphs, WeChat HTML, XHS emoji + tags. Free — no network call.
List every platform this publisher can target via the MCP / CLI surface. Returns a list of platform descriptors with display name, auth method, feature flags, and content limits — what an Agent needs to pick the right target. Cheapest call (no network); use to pre-flight before publishing.
Publish a piece of content to one or more platforms in one call. `platforms=None` or `["all"]` fans out to all 4. Per-platform errors are isolated — a Twitter failure won't stop the LinkedIn post. Use `dry_run` (or call `adapt_content`) to preview without posting. Cost depends on platform APIs.
Check whether the credentials for `platform` are present. Reads from env vars > `~/.openclaw/openclaw.json` > `config.json` (same precedence as the CLI). Does not make a network call — only checks key presence. Cheapest pre-flight before `publish_to_platforms`.
publish_to_platforms lacks explicit output schema documentation. The docstring describes the general return pattern but does not specify the structure of per-platform result objects, error isolation behavior, or the shape of per-item success/failure responses. Code returns {'platform': pid, 'success': bool, 'url': str, 'error': {...}} but this is not documented in the tool definition.
Error responses use a semantic _err() helper but lack specific, actionable recovery suggestions for many failure modes. For example, 'unknown_platform' error suggests calling list_supported_platforms(), which is good, but 'auth_missing' error is generic: 'Set the required env vars for {canon}' without listing which specific env vars are required.
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint). List, adapt, and validate tools are read-only and should be marked as such. publish_to_platforms is destructive (when dry_run=false) and should carry a destructiveHint. FastMCP supports tool annotations but they are not present in the code.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
validate_credentials returns a minimal response body with only platform, ready, and _meta. The docstring says it returns 'missing: [env_var, ...]' but this field is never populated in the code. This breaks the documented contract.
publish_to_platforms dry_run mode is documented but not visible in the provided code snippet (function signature cuts off). The parameter exists in the Input schema but the implementation is not shown, making it impossible to verify the behavior.
adapt_content accepts optional 'platform' parameter but if the platform does not exist, returns an _err. However, the tool does not document that omitting platform returns all four platforms by default, this is only mentioned in the description, not in parameter schema constraints.
Platform parameter in multiple tools accepts aliases ('x' for 'twitter', 'xhs' for 'xiaohongshu') but the parameter description says 'target platform id (twitter/x, linkedin, wechat, xiaohongshu/xhs)' which is informal. Should clarify with an enum constraint or explicit 'aliases: x, xhs' statement.