MCP server for Quire Ink blogging platform, providing tools for content management, media handling, analytics, comments, notes, and site configuration
Strong naming conventions (all tools start with action verbs: get_, list_, create_, update_, delete_, search_, reply_, send_, restore_, compose_, backup_). Descriptions are detailed and contextual (avg ~180 chars), explaining WHAT the tool does and WHEN to use it. Input schemas are present with type declarations for all 32 tools. However, parameter descriptions are inconsistent, some params lack descriptions entirely (e.g., 'page' in list_comments has description but 'contains' in list_settings is sparse). Output schemas are not explicitly documented in the source. Error handling guidance is minimal, no recovery hints or actionable error messages visible. Risk classifications (READ_ONLY, WRITE, REVERSIBLE) are well-defined but not surfaced in tool definitions themselves.
Fetch an image from a URL and add it to the media library (stored on Blob). Supports JPG, PNG, SVG, GIF, WebP. Returns the new media item — use its url as a post featuredImage or inline image.
Snapshot the database and uploads directory as a tar.gz, stored in the Trash. The owner downloads it from the admin. Blocks until done — may take seconds on a large site.
Curate the composed front page: the lead story (latest or pinned), the row of category strips and their order, the popular and latest rows. Passing `strips` REPLACES the strip list, in the given order. Sizes and sources only — the row layout itself is the product's prepared design, not a block composer.
Write a note, or keep a clip (pass sourceUrl, sourceTitle and quote). Status defaults to draft; a draft is private to the owner.
Move a comment to the Trash (soft delete — the owner can restore it in the admin).
Output schemas not documented. Tool descriptions state what is returned (e.g., 'views, visitors, read depth, dwell time, top pages') but formal JSON Schema output definitions are absent from source. LLMs cannot plan downstream tool calls without knowing response structure.
Parameter descriptions inconsistent or sparse. 'contains' in list_settings lacks description; 'page' in list_comments has minimal context. Some numeric params (days, page) lack range constraints (min/max). LLMs cannot validate inputs without explicit bounds.
No error handling guidance. Tool descriptions do not explain failure modes or recovery steps. E.g., delete_comment says 'Move to Trash' but does not explain what happens if the comment ID is invalid or already deleted. No actionable error messages visible.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
Move a file attachment to the Trash (soft delete — the blob is kept; recoverable).
Move a media item to the Trash (soft delete — the blob is kept; recoverable).
Move a note to the Trash (soft delete — recoverable with restore_note).
Subscriber counts (confirmed, pending, unsubscribed) and how many live comments the blog holds. Counts only — the addresses themselves are not available over MCP.
Get one note by slug, including its Markdown body and, for a clip, the passage and its source.
Traffic for ONE post or page over the last N days: views, visitors, read depth, dwell, referrers — the per-page view of the dashboard.
Read the full site settings (read-only).
Traffic summary for the last N days, with the window before it for comparison: views, visitors, read depth, dwell time, top pages, referrers, countries, channels, devices and a per-day series. The same numbers the owner's dashboard shows.
The version this blog runs, whether a newer release exists (the dot beside the version in the admin), and whether the daily check is blocked by the environment.
Bring remote images home: fetch one batch of images that posts/pages still load from OTHER hosts, store them in the media library, and rewrite every reference. Call repeatedly until `remaining` is 0 — stop early when a call reports `moved: 0`, because what is left only fails.
Live comments, newest first, 50 per page. Includes each comment's id for delete_comment.
List the live file attachment library (non-image files), newest first.
List the live media library (images), newest first.
Webmentions this site has received (other pages that link here), newest first, and which passages readers keep most — from clips sent by other Quire Ink notebooks.
List the notebook: every note, drafts included, newest first. A note with a sourceUrl is a clip.
Every setting that can be changed by name: its path, what kind of answer it takes, and what it is set to now. Use this to find the path for update_settings rather than guessing one. Optional `contains` narrows the list to paths matching a word.
List file attachments currently in the Trash.
List media items currently in the Trash.
Reply to a comment under the owner's name. The parent's author is emailed, exactly as if the reply had been typed on the page.
Restore a trashed file attachment back to the live library.
Restore a trashed media item back to the live library.
Bring a trashed note back.
Full-text search across every post and page, drafts included — the owner's own search box. Each hit carries the passage the words were found in.
Send the next issue as a TEST to the owner's own address — rendered exactly like the real thing, inert to click. The recipient is not a parameter, and the real broadcast is not available over MCP: an email cannot be unsent.
Change the site's look from the curated menus: palette (warm, cool, neutral, sunset, forest, ocean), reading font (serif, sans, mono), chrome font, and what a first-time visitor opens in. Free-form colors are not accepted — every option here is one the owner's own screens offer.
Update a note by slug (saveNote overwrites — pass the full note).
Change any site setting by path — call list_settings first to find the path. The value is sanitised exactly as the admin's own Save does, and everything not named is left alone. Two are worth naming before you change them because they affect every page a reader loads: `customCss` and `siteUrl`. The three named arguments are the older shorthand and still work.
Risk classifications (READ_ONLY, WRITE, REVERSIBLE) are metadata but not surfaced in tool definitions. LLMs cannot infer which tools are safe to retry or have irreversible consequences without explicit annotations in the schema.
Complex parameter objects lack detailed field documentation. compose_homepage accepts 'lead', 'strips', 'popular', 'latest' objects but their internal structure is not described. LLMs must guess field names and types.