MCP server for Ech0 — a self-hosted microblog platform. Provides tools to create, read, update, delete posts (echoes), manage tags, search, and more.
Server has 12 tools with consistent naming (verb_noun pattern) and basic descriptions. All tools are explicitly registered with mcp-go framework using WithDescription and parameter builders. However, descriptions are brief (10-50 chars, below the 50-200 char baseline for LLM optimization), and output schemas are completely undocumented. Parameter descriptions exist but lack detail on constraints, formats, and valid ranges. Error handling returns generic error strings without recovery guidance. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications.
Create a new Echo post. Supports markdown content.
Delete an Echo post.
Get a specific Echo post by ID.
Get Echo posts filtered by tag ID.
Get posting heatmap data for activity visualization.
Get inbox messages (notifications, updates, etc).
Get today's Echo posts for review.
Output schemas completely undocumented. Tools return JSON via jsonStr() helper but LLMs cannot infer response structure. No documentation of returned fields, types, or pagination metadata.
Descriptions are too brief (10-50 chars vs 50-200 char baseline). Examples: 'List Echo posts with pagination' (34 chars), 'Get a specific Echo post by ID' (30 chars). Lack context on WHEN to use each tool and what distinguishes similar tools (e.g., get_echo vs list_echoes vs search_echoes).
No tool annotations despite clear risk classifications. delete_echo is DESTRUCTIVE but lacks destructiveHint. like_echo is WRITE but lacks idempotentHint. get_* tools are READ_ONLY but lack readOnlyHint. Agents cannot infer safety properties.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 42 | 2026-07-28+ | v2 |
Like/unlike an Echo post.
List Echo posts with pagination.
List all tags.
Search Echo posts by keyword.
Update an existing Echo post.
Parameter descriptions lack constraint details. 'page' and 'size' in list_echoes/search_echoes have no min/max bounds. 'keyword' in search_echoes has no length limit. 'content' in create_echo has no max length. LLMs will pass unbounded values.
Error handling returns raw error strings without recovery guidance. Example: apiRequest() returns 'request failed: <err>' or 'parse response failed: <data>'. No actionable next steps for LLM (e.g., 'Try search_echoes() first' or 'Check ECH0_URL and ECH0_API_KEY').