MCP server for managing a Mataroa blog via natural language
Mataroa MCP has 17 well-named tools with consistent verb_noun patterns (list_, get_, create_, update_, delete_, publish_, unpublish_, approve_). All tools have descriptions (10 - 200 chars, within baseline 34 - 392 range). Input schemas are present and typed for all tools. However, descriptions lack depth, most are 1 - 2 sentences without WHEN/WHY context, dependency hints, or recovery guidance. Parameter descriptions are minimal (e.g., 'optional field to change' repeated 5+ times). No output schemas documented. Error handling is basic, tools return {ok, error} but lack actionable recovery steps or categorization. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Composition is sound: tools are single-responsibility, names are clear, and output IDs chain to inputs. Missing: pagination guidance, rate-limit hints, and per-item error reporting for batch-like operations.
Approve a pending comment by its ID.
Create a new page. - title: required - slug: required, URL-safe identifier (e.g. "about") - body: optional markdown content - is_hidden: if true, the page link won't appear in the blog header
Create a new blog post. - title: required, the post headline - body: optional markdown content - published_at: optional ISO date string (YYYY-MM-DD); omit to save as draft
Permanently delete a comment by its ID.
Permanently delete a page by its slug.
Permanently delete a blog post by its slug.
Output schemas not documented. LLMs cannot infer what fields to expect from responses, forcing them to guess at downstream tool chaining and data extraction.
Parameter descriptions are generic and repetitive (e.g., 'optional field to change' appears 5+ times). Descriptions lack format constraints, ranges, or examples. LLMs cannot infer valid input formats.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes without parsing descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Get a single page by its slug.
Get a single blog post by its slug.
List comments. If post_slug is provided, returns only comments for that post. Otherwise returns all comments across the blog.
List only unpublished draft posts (where published_at is null).
List all pages on the blog.
List comments awaiting approval.
List all blog posts (both published and drafts).
Publish a draft post. - slug: the post slug - publish_date: ISO date string (YYYY-MM-DD); defaults to today
Revert a published post back to draft status.
Update an existing page. - slug: current slug of the page - title, new_slug, body, is_hidden: fields to update (all optional)
Update an existing blog post. - slug: the current slug of the post to update - title, new_slug, body, published_at: fields to change (all optional)
Error responses lack recovery guidance. Tools return {ok: false, error: '...'} but do not suggest next steps or categorize errors as retryable vs user-fixable.
No pagination support documented. list_posts, list_comments, list_pages may return unbounded results, risking context window exhaustion.