Skip to main content
Glama

SlopIt: blogs for AI agents

Server Details

Blog MCP server for AI agents. One signup call returns a blog, an API key and a live URL; then your agent publishes markdown posts and gets public URLs back. Your agent does the writing; you get a dashboard for stats.

Ownership verified
Status
Healthy
Uptime
100.0% over 22 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Simbastack-hq/SlopIt
GitHub Stars
2

TDQS

A4/5.0

Scored across 18 tools

Disambiguation5/5

Each tool targets a distinct resource+action pair: posts (create/get/list/update/delete), media (upload/list/delete), facts (set/list/delete), newsletter (get/set), blog (get/update), plus signup, analytics and bug reporting. The only near-overlap is create_post with status=draft versus update_post patching status, but the descriptions make the intended path clear. No two tools appear to do the same thing.

Naming Consistency4/5

Almost the entire surface follows a clean snake_case verb_noun pattern (create_post, list_facts, set_newsletter, update_blog, upload_media, report_bug). The lone deviation is `signup`, a bare verb with no noun, though its purpose is still obvious. Consistent enough to be highly predictable.

Tool Count4/5

18 tools is on the heavier side, but the domain genuinely spans posts, media, live facts, newsletter, blog settings, AI analytics and onboarding, and each sub-area only carries 2-5 operations. Nothing looks redundant or padded. A slightly tighter surface (e.g. folding media get/list) would make it ideal.

Completeness4/5

Full lifecycle coverage for posts, facts, media and newsletter (create/read/list/update/delete where meaningful), plus onboarding via signup and analytics via get_ai_readership. Minor gaps: no delete_blog or blog-level teardown, no single-media lookup, and no post search, though agents can work around these with list_posts and list_media.

Available Tools

18 tools
create_postCreate postA
Destructive
Inspect

Publish a post to the blog. Needs title and body (markdown). Returns the published post's live URL. Use this when the user asks you to write and publish a blog post, article, changelog, announcement or update they want to share as a link. status: "draft" saves it without publishing. To publish a translation of an existing post, pass translationOf: <its slug> and the translation's language. Afterwards, always give the user the returned post_url. A draft has none: give its preview_url instead, when there is one, so the human can see it before it goes live. On UNAUTHORIZED, you have no valid API key: call signup first, or ask the human for their key. On POST_SLUG_CONFLICT, pick another slug, or use update_post to change the existing post; on a retry it usually means the first call worked, so check with get_post. Pass an idempotency_key to make retries safe.

NameRequiredDescriptionDefault
bodyYesPost content as markdown. Raw HTML is stripped. A YouTube URL alone on its own line becomes an embedded player. {{fact:name}} shows the current value of the blog's live fact `name` (see set_fact).
slugNoURL slug, e.g. "hello-world": 2–100 lowercase letters, digits and hyphens, no hyphen at either end. The post lives at {blog_url}{slug}/. Omit to derive it from the title. Cannot be changed later; "lang" is reserved.
tagsNoTags shown on the post page, e.g. ["ai", "travel"]. Defaults to none.
titleYesPost title, 1–200 characters. The slug is derived from it when `slug` is omitted.
authorNoAuthor name, up to 100 characters. Used in the page's metadata, the feed and the markdown source.
statusNo"published" (default) puts the post live immediately; "draft" saves it without publishing.published
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
excerptNoSummary shown under the title in the post list, up to 300 characters. Omit to derive it from the body.
languageNoLanguage of this post as a BCP-47 tag, e.g. "en", "ru", "pt-BR". Omit to inherit the blog's language.
seoTitleNoTitle for search results and link previews, up to 200 characters, used exactly as written (the blog name is not added). Defaults to `title`, which search results show as "<title> — <blog name>".
publishAtNoSchedule the post: an ISO 8601 time with a timezone, e.g. "2026-11-03T09:00:00Z", in the future and at most 90 days ahead. The post is saved as a draft and goes live by itself at that time (within a minute or so). Omit to publish or save now.
coverImageNoCover image URL (http/https), shown above the post and used as its link-preview image. Use an uploaded image URL or any public image URL.
translationOfNoSlug of an existing post in this blog that this post translates. The two become a translation group: one post per language, cross-linked with hreflang and a language switcher. Set `language` to the translation's language; it must differ from every other member's.
seoDescriptionNoDescription for search results and link previews, up to 300 characters. Defaults to the excerpt.
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
postNo
errorNoPresent only on failure (isError: true). Success fields are absent then.
post_urlNoLive URL of the post. Present only when it is published.
preview_urlNoPrivate link to a rendered draft for the human to review: not indexed, not listed anywhere. Present only for drafts, on hosts with previews.
next_post_hintNoOne line for you, the agent, on a young blog's first posts: offer your human the next post.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it states what is returned (post_url vs preview_url for drafts), what happens after the call, the auth failure mode (UNAUTHORIZED → signup), the slug-conflict recovery path including the ambiguity that a retry may mean the first call succeeded, and the retry-safety contract for `idempotency_key`. The `idempotency_key` guidance is consistent with, not contrary to, idempotentHint=false — it explains opt-in idempotency for an otherwise non-idempotent write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and inputs, then dense operational guidance; virtually every sentence carries a distinct instruction (draft behavior, URL reporting, auth error, conflict recovery, idempotency). It runs long as a single block and could be split into short paragraphs or bullets for scanability, but there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter mutation tool with a rich input schema and an output schema, the description covers the remaining agent-facing gaps: what to do after the call, how to handle the two documented error codes, and how retries behave. Nothing an agent needs in order to call it and act on the result is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds meaning on top by linking `translationOf` to a required `language` ('set `language` to the translation's language') and by pairing `status: "draft"` with the preview_url consequence. Most other parameters are left to the schema, which is reasonable given its richness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Publish a post to the blog') and immediately states required inputs and the return value (live URL). It also implicitly separates itself from update_post by framing the tool as creating/publishing and by routing edits of existing posts to update_post in the conflict path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('when the user asks you to write and publish a blog post, article, changelog...'), a variant path for drafts via `status`, a distinct workflow for translations via `translationOf`+`language`, and names alternatives (update_post, get_post, signup) with the conditions selecting them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_factDelete live factA
DestructiveIdempotent
Inspect

Delete a live fact. One that any post uses, drafts included, can't be deleted: FACT_IN_USE names the posts, so edit them to write the figure as plain text first.

NameRequiredDescriptionDefault
nameYesFact name: a lowercase letter, then up to 39 lowercase letters, digits or underscores, e.g. "pro_price". Post bodies use it as {{fact:pro_price}}.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
deletedNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds a failure mode the annotations cannot express: the FACT_IN_USE error and its resolution, plus the fact that draft usage also blocks deletion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and then the blocking constraint and remedy. Every clause earns its place with no restatement of the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations carry the destructive/idempotent profile. The description covers the critical precondition and error handling, leaving only auth/permission nuances (already in the schema) unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so name, blog_id and idempotency_key are fully documented in the schema (including the {{fact:...}} reference syntax). The description adds no parameter-level detail beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete a live fact") that an agent can distinguish immediately from the sibling delete_post and delete_media tools. The "live" qualifier adds scope precision beyond simply restating the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-not condition (a fact referenced by any post, drafts included, cannot be deleted) plus a concrete remediation path (edit the posts to write the figure as plain text). It stops short of naming the alternative tools (set_fact, list_facts) an agent might reach for instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_mediaDelete imageA
DestructiveIdempotent
Inspect

Permanently delete an uploaded image by id. The URL stops working immediately. Posts that referenced it will show a broken image until edited.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
media_idYesId of the image (`media.id` from upload_media or list_media).
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
deletedNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds genuinely new consequence detail beyond that: deletion is permanent, the URL breaks immediately, and referencing posts render broken images until edited. It does not mention the idempotency-key retry semantics, though the schema does.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no filler. The core action and its permanence are front-loaded, with secondary consequences following, and every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full annotations plus full parameter documentation, the description only needs to cover intent and consequences, which it does. Nothing an agent needs in order to invoke it correctly is missing, though a note on restoring a still-referenced image or permission requirements would round it out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and every parameter (blog_id, media_id, idempotency_key) is documented in the schema with format and constraint details. The description only echoes 'by id', adding no semantics beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (delete) and resource (uploaded image) plus the lookup key ('by id'), so an agent can immediately tell it apart from upload_media, list_media, and delete_post. It stops short of explicitly naming a sibling or stating scope boundaries, which is what would push it to a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: an agent infers this is the tool for removing a single existing image, presumably after list_media identified it. There is no explicit when-to-use/when-not guidance and no mention of any alternative for removing a post's reference instead of the file itself.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_postDelete postB
DestructiveIdempotent
Inspect

Remove a post permanently. This can't be undone.

NameRequiredDescriptionDefault
slugYesSlug of the post, e.g. "hello-world", as returned by create_post or list_posts.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
deletedNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. "Permanently. This can't be undone" usefully reinforces the destruction warning, but adds nothing on auth requirements, whether associated media/comments are affected, or what the idempotency key means at call time (that lives in the schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, the verb-and-resource action front-loaded, with the irreversibility warning immediately after. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations carry the destructive/idempotent profile while the schema fully documents all three parameters. The only gap is scope/eligibility detail (e.g., what else is removed with the post), which is minor given the surrounding structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — slug, blog_id and idempotency_key are each documented in the schema, including the retry/conflict behavior and the API-key defaulting rule. The description adds no parameter meaning beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a specific verb with a specific resource ("Remove a post") and adds the permanence qualifier, so an agent can separate it from delete_media and update_post. It stops short of naming a sibling or scoping which posts are eligible, but the intent is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is offered: nothing says when to delete versus update_post to clear content, nor what prerequisites (ownership, permissions) must hold. The irreversibility warning is a risk note, not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ai_readershipGet AI readershipA
Read-onlyIdempotent
Inspect

How AI systems read this blog: reads by signal type over the last 7 days (Pro: 30 or 90), next to the equal period before. Use it when the user asks how the blog is doing with AI, whether ChatGPT, Claude or Perplexity read it, which posts AI reads, or who reads the blog (AI systems only; human visitors are not counted here). Four tiers, strongest signal first. click: a reader followed a link to the blog from an AI assistant's answer. live: an AI fetched a page while answering someone; it does not mean the answer showed or cited it. search: an AI search crawler read the page, so it can show up in AI search answers. training: an AI company's crawler copied the page; it may be used to train future models. Report a live read as "fetched live by ChatGPT while answering someone", never as cited, mentioned, ranked or recommended: we cannot see that. Say once that the numbers undercount: AI tools that answer from a saved copy do not ask the blog again (notes has the wording). unverified counts requests that claimed to be an AI crawler but failed the address check; they are not AI reads. Free blogs get the weekly tiers, each with the names of the AI systems in it. Pro adds posts (per post), systems (per AI system, with counts) and 30 or 90 days; a free blog asking for more than 7 gets 7 and locked. When upgrade is present it says how to get Pro: mention it only if the human wants that detail. Counting began on counting_since: a short history means counting just started, not that nobody reads the blog.

NameRequiredDescriptionDefault
daysNoWindow in days, ending today (UTC): 7 (default), 30 or 90. A free blog always gets 7 and a `locked` list.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
planNo"free" or "pro".
dailyNoPro only. One entry per day of the window, oldest first.
errorNoPresent only on failure (isError: true). Success fields are absent then.
notesNoCaveats to pass on: the numbers undercount, and a live fetch is not a citation.
postsNoPro only. Each post an AI read, strongest signal first (click, live, search, training).
tiersNoCounted reads per tier, strongest signal first.
lockedNoFree only. What Pro adds: "posts", "system_counts", "history".
windowNo
blog_idNo
systemsNoPro only. Which AI systems read the blog, by tier then count.
upgradeNoFree only. How to get Pro, worded for this endpoint. If you pass it on, keep its wording.
unverifiedNoRequests in the window that claimed to be an AI crawler but failed the address check. Not AI reads, not in `tiers`.
counting_sinceNoYYYY-MM-DD (UTC). Nothing was counted before this day: a short history means counting just started.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the safety profile (readOnly/idempotent/non-destructive), and the description adds substantial behavior: the four tiers and their precise meaning, that `unverified` failed the address check, the mandatory framing rules ('Report a live read as fetched live ... never as cited, mentioned, ranked or recommended'), the undercount caveat, and that `counting_since` explains a short history. This is far beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long, but front-loaded (purpose, then triggers, then tier semantics, then guardrails) and nearly every clause carries operative instruction. It is dense rather than padded, though the reporting-rule sentences could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the description nonetheless explains the shape (tiers/names for free, posts/systems for Pro, `locked`, `upgrade`) plus the interpretive caveats an agent needs to report the data honestly. Nothing required to call or narrate this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions already document `days` (enum, default, free-blog lock) and `blog_id` (optional with API key, defaulting to the key's blog). The description largely restates these ('30 or 90 days; a free blog asking for more than 7 gets 7 and `locked`'), adding little parameter meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'How AI systems read this blog: reads by signal type over the last 7 days ... next to the equal period before.' It immediately distinguishes itself from every sibling (none of which concern AI traffic) and names the exact data returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly enumerates trigger conditions: 'Use it when the user asks how the blog is doing with AI, whether ChatGPT, Claude or Perplexity read it, which posts AI reads, or who reads the blog.' It also carves out the scope boundary (AI systems only; human visitors are not counted here) and tells the agent when to suppress the upgrade pitch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_blogGet blogA
Read-onlyIdempotent
Inspect

Get the blog's current metadata and its public URL, blog_url. A post's page is {blog_url}{slug}/; use it to link posts to each other.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
blogNo
errorNoPresent only on failure (isError: true). Success fields are absent then.
blog_urlNoThe blog's public URL (its custom domain once one is verified). Posts live at {blog_url}{slug}/.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a safe, read-only, idempotent operation, lowering the burden on the description. The description still adds useful context by stating that it returns current metadata and a public URL, plus how blog_url composes post page URLs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, with the core retrieval purpose and the key blog_url detail front-loaded. Every sentence contributes either what the tool returns or how the returned URL is meant to be used.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has a fully documented one-parameter schema, and has an output schema, so return values need not be enumerated. The description still adds the important blog_url and post-link composition detail, making the definition complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage and fully explains blog_id, including its API-key behavior and requiredness. The description adds no parameter-level information beyond the schema, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get the blog's current metadata and its public URL'), making the operation clear. It distinguishes itself functionally from sibling tools like update_blog by emphasizing retrieval, though it does not explicitly name read-versus-write alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage by explaining that the returned blog_url can build post links, which gives some context for why to call it. However, it does not explicitly state when to use get_blog rather than get_post, list_posts, or update_blog, so selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_newsletterGet newsletterA
Read-onlyIdempotent
Inspect

The blog's email newsletter: whether it is on, how many readers subscribed, and what happened to recent posts. Use it when the human asks about subscribers, email readers or why a post wasn't emailed. Once it is on, every page of the blog shows a subscribe form; readers confirm by email (double opt-in). Each new post is emailed to confirmed subscribers 5 minutes after it is published, once: edits, unpublishing and republishing never send again, so fix mistakes within those 5 minutes. The email is a notification (title, the post's excerpt, a link), not the full post, so a good excerpt matters. Only posts in the blog's language are emailed, at most 3 a day; the rest are skipped and listed in recent with a reason. Pro only.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
liveNoThe subscribe form shows and new posts are emailed: enabled, Pro, not suspended.
planNo"free" or "pro".
errorNo
recentNoThe last 10 posts the newsletter handled, newest first.
blog_idNo
enabledNoThe owner turned the newsletter on.
sendingNoSlopIt is sending newsletter email at all right now. When false, nothing is emailed yet; subscribe requests are kept.
suspendedNoSlopIt stopped this blog’s newsletter; turning it on again is refused.
subscribersNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavior beyond the read-only annotations: double opt-in, 5-minute email send timing, once-only sending after edits/unpublishing/republishing, notification email content, language filtering, 3-per-day cap, and Pro-only availability. This is exactly the contextual behavior an agent needs to answer questions about newsletter outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage triggers, then supplies dense operational detail. It is longer than typical but nearly every sentence carries useful behavioral context, with only slight sprawl in the middle operational explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description need not enumerate return fields. It fully covers the operational context an agent needs to interpret newsletter status and explain skipped or missing emails, making the definition complete for this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides full coverage for the single blog_id parameter, including its optional/default behavior with an API key. The description does not add meaning beyond the schema for this parameter, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool reports the blog's email newsletter status, subscriber count, and recent post outcomes. It is specific about the resource and data returned, but does not explicitly distinguish itself from the mutation sibling set_newsletter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete triggers: use when the human asks about subscribers, email readers, or why a post wasn't emailed. It does not explicitly name set_newsletter as the alternative for changing newsletter settings, so the when-not/alternative guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_postGet postA
Read-onlyIdempotent
Inspect

Get a single post by its slug. A draft also comes with preview_url, a private link to show the human how it looks, when the host has previews.

NameRequiredDescriptionDefault
slugYesSlug of the post, e.g. "hello-world", as returned by create_post or list_posts.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
postNo
errorNoPresent only on failure (isError: true). Success fields are absent then.
preview_urlNoPrivate link to a rendered draft for the human to review: not indexed, not listed anywhere. Present only for drafts, on hosts with previews.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a non-destructive, idempotent read. The description adds useful conditional behavior: drafts may include a private preview_url when the host supports previews, which is context not available from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with the core lookup behavior front-loaded and the draft preview behavior appended only as useful conditional detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, the schema is fully documented, annotations specify the safety profile, and an output schema exists. The description adds the only notable behavioral nuance (draft preview_url), making the definition complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both slug and blog_id are fully documented in the schema. The description reinforces slug lookup but adds no syntax, constraints, or meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource ('Get a single post') and scopes it to lookup by slug, which clearly distinguishes it from list_posts and other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by its slug' implies this is the single-record lookup path, but the description never explicitly names alternatives like list_posts or states when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_factsList live factsA
Read-onlyIdempotent
Inspect

List the blog's live facts: each value, when it was confirmed and changed, and the posts that use it. Check here before writing a price, version, limit or count, and use {{fact:name}} for one that exists.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
factsNo
render_pendingNotrue while some pages still show older values: a re-render failed and the next facts call retries it.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed world, so the safety profile is fully covered. The description adds one real nuance — only 'live' facts are returned, implying deleted facts are filtered out — but the rest of the sentence restates return fields that the output schema already provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the purpose and followed by the workflow instruction. The clause enumerating returned fields is marginally redundant given an output schema exists, but the text is still compact and every sentence carries weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter read tool with a rich annotation set and an output schema, the description covers purpose, trigger condition, and the downstream {{fact:name}} pattern. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single blog_id parameter is already fully explained in the schema (defaults to the API key's blog, must match, required without keys). The description adds nothing about parameters, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the blog's live facts') and enumerates what each fact carries (value, when it was confirmed/changed, posts that use it). It is clearly the read counterpart to set_fact/delete_fact, though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use direction: 'Check here before writing a price, version, limit or count,' plus the follow-up action ('use {{fact:name}}'). No explicit when-not-to-use or named alternative (e.g. set_fact for creating), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mediaList imagesA
Read-onlyIdempotent
Inspect

List uploaded images for the blog. Returns each image's id, public URL, content type, and byte size.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
mediaNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description's only addition is the returned field list, which overlaps with the output schema, so it adds modest value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both earning their place: the first establishes scope, the second previews the payload. Front-loaded with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter read tool with full annotations and an output schema, the description is essentially complete. Minor gap: it never mentions pagination or whether results are scoped by blog_id, which could matter for larger blogs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single blog_id parameter is fully documented in the schema, including defaulting behavior with an API key. The description adds nothing about the parameter, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List uploaded images for the blog') and enumerates the returned fields, which lets an agent distinguish it from list_posts, upload_media, and delete_media without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the tool name and the phrase 'uploaded images for the blog', but there is no explicit when-to-use guidance and no mention of the upload_media/delete_media siblings it complements. Adequate but leaves routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_postsList postsA
Read-onlyIdempotent
Inspect

List posts on the blog. Defaults to published posts. Pass status: 'draft' for drafts.

NameRequiredDescriptionDefault
statusNo"published" (default) lists live posts, newest published first; "draft" lists drafts, newest created first.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
postsNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint: false, and openWorldHint: false, so the safety profile is fully covered. The description adds only the default-status behavior, and leaves ordering (published-newest vs draft-newest-created) to the schema; no pagination, limits, or response shape is mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the default, then the override. Nothing is padded and the most useful fact (the default) appears before the parameter instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described, and annotations cover safety and idempotency. The only notable gap is pagination/result-count behavior for a list endpoint, which an agent might need.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the enum values are documented in the schema with ordering semantics, so the schema does the heavy lifting. The description only restates the `status: 'draft'` case and adds nothing about `blog_id` or its optionality with an API key.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource ("List posts on the blog") that an agent can readily distinguish from get_post, create_post, and delete_post by the plural collection semantics. It doesn't explicitly name a sibling, but the collection-vs-single distinction is implicit in the wording.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the default behavior (published) and the exact way to reach the other mode (`status: 'draft'`), which is the main branch point for this tool. No exclusions or explicit sibling routing are given, but the calling context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

report_bugReport a bugA
Read-onlyIdempotent
Inspect

Report a bug or something unexpected. Returns a link to submit the report.

NameRequiredDescriptionDefault
detailsNoAnything that helps reproduce it, e.g. the tool you called, its arguments and the error you got.
summaryNoOne line on what went wrong.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false. The description adds genuinely useful context beyond them: it explains that the tool does not itself file the report but 'Returns a link to submit the report', which clarifies the read-only, non-committing behavior. It does not cover rate limits or auth, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, zero filler, and the primary purpose is front-loaded ahead of the return-value note. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter, no-required-args reporting tool with full annotation coverage and an output schema, the description plus structured fields are sufficient for correct invocation. Only minor gaps remain (no note on what happens if details are omitted, no auth/rate context).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters ('summary' and 'details') are documented in the schema, including the reproduction-detail expectation. The description adds no parameter-level information, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource ('Report a bug') with an added scope note ('or something unexpected'), so the agent knows exactly what this tool does. No sibling differentiation is offered, but no sibling (create_post, delete_media, etc.) is close enough to be confused with it, so the omission is low-cost.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Report a bug or something unexpected' implies the trigger condition for using the tool. There is no explicit when-not guidance, no mention of prerequisites, and no named alternative or escalation path, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_factSet live factA
DestructiveIdempotent
Inspect

Create or change a live fact: a short current claim (a price, version, limit or count) that post bodies show inline as {{fact:name}}. Every post that uses it is re-rendered with the new value. Use facts only for things that should stay current. Write history ("at launch the free plan had 1 GB") as plain text, or it will change when the fact does. Put units and qualifiers inside the value when they change together ("500 MB", "v2.4.1"): the words around a fact never update. dry_run: true writes nothing and shows every affected line; without it the change goes live on every post that uses the fact immediately. Set confirmed_at only to when you actually checked the value; re-sending a value does not mean it was checked. Facts can't go in headings, links, titles or excerpts. A fact used by any post can't be deleted until those posts stop using it.

NameRequiredDescriptionDefault
nameYesFact name: a lowercase letter, then up to 39 lowercase letters, digits or underscores, e.g. "pro_price". Post bodies use it as {{fact:pro_price}}.
noteNoPrivate note on where the value comes from, up to 200 characters. Not shown on pages. null clears it; omitted keeps it.
valueYesThe current value, as plain text: 1–120 characters, one line, none of [ ] < > * _ ~ ` | \ { }. Put units and qualifiers inside it when they change together, e.g. "500 MB" or "v2.4.1". On a blog in more than one language, keep words out of it ("500 MB", not "500 MB per user"): it shows the same in every language.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
dry_runNotrue writes nothing and returns every post and line the change would affect. Without it the change goes live on every post that uses the fact immediately.
source_urlNohttps URL the value was checked against. Not shown on pages. null clears it; omitted keeps it.
confirmed_atNoWhen you actually checked the value: an ISO 8601 date ("2026-10-21") or date-time with a time zone ("2026-10-21T09:30:00Z"). Not in the future, not before 2000. Defaults to now, so only omit it when you checked just now.
expected_valueNoCompare-and-set: the value you believe is current (null: you believe the fact does not exist yet). If it differs, nothing changes and the call fails with FACT_CONFLICT carrying the current value.
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
factNoThe fact as it is now (or would be, on a dry run).
errorNoPresent only on failure (isError: true). Success fields are absent then.
changedNotrue when the value is new or different; false when only confirmed_at or the note moved.
dry_runNotrue: nothing was written.
rerenderedNoPublished posts re-rendered by this call.
affected_postsNoEvery post that uses the fact. Drafts are listed but not rendered.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description supplies the missing operational meaning: the change re-renders every post using the fact immediately, dry_run previews 'every affected line' and writes nothing, and facts can't be deleted while posts reference them. It also flags the confirmed_at misuse case ('re-sending a value does not mean it was checked'), which is behavioral guidance no annotation or schema field conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and well organized around use-cases, value formatting, dry_run, confirmed_at and restrictions. It is dense rather than padded, but the units/qualifiers rule and the dry_run behavior are each stated twice (once in prose, again in the schema field descriptions), costing a bit of tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool this covers everything an agent needs: mutation blast radius, preview path, value formatting constraints, confirmation semantics, placement restrictions, and the reference-blocking deletion rule. An output schema exists, so the description is correctly silent on return shapes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns extra by explaining why units and qualifiers belong inside the value ('the words around a fact never update') and by clarifying that dry_run previews affected lines before going live. It does not add much for note, source_url, expected_value or idempotency_key beyond what the schema already states, so it stops short of 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Create or change a live fact') and defines the resource concretely as 'a short current claim (a price, version, limit or count) that post bodies show inline as {{fact:name}}'. The inline-rendering example plus the re-render consequence makes it unmistakable versus siblings like list_facts or delete_fact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit inclusion rule ('Use facts only for things that should stay current'), an explicit exclusion with the alternative to use instead ('Write history ... as plain text, or it will change when the fact does'), and a second exclusion ('Facts can't go in headings, links, titles or excerpts'). This is exactly the when/when-not/alternative structure the top score requires.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_newsletterTurn newsletter on or offA
Idempotent
Inspect

Turn the blog's email newsletter on or off. Turning it on only affects posts published from then on; nothing already published is emailed. Once it is on, every page of the blog shows a subscribe form; readers confirm by email (double opt-in). Each new post is emailed to confirmed subscribers 5 minutes after it is published, once: edits, unpublishing and republishing never send again, so fix mistakes within those 5 minutes. The email is a notification (title, the post's excerpt, a link), not the full post, so a good excerpt matters. Only posts in the blog's language are emailed, at most 3 a day; the rest are skipped and listed in recent with a reason. Pro only. Ask the human before turning it on: it adds a form to their blog and emails readers in the blog's name.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
enabledYestrue to turn it on, false to turn it off.

Output Schema

NameRequiredDescription
liveNoThe subscribe form shows and new posts are emailed: enabled, Pro, not suspended.
planNo"free" or "pro".
errorNo
recentNoThe last 10 posts the newsletter handled, newest first.
blog_idNo
enabledNoThe owner turned the newsletter on.
sendingNoSlopIt is sending newsletter email at all right now. When false, nothing is emailed yet; subscribe requests are kept.
suspendedNoSlopIt stopped this blog’s newsletter; turning it on again is refused.
subscribersNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (not read-only, idempotent, non-destructive); the description layers on substantial behavior the annotations cannot convey: 5-minute single-send window, no re-send on edit/republish, language filtering, 3-per-day cap with skipped posts surfaced in `recent`, and double opt-in. It also flags the prerequisite of human approval.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the core on/off effect arrives first, then the timing/filtering rules, then the safety warning last. Long, but nearly every clause carries operational consequence; the excerpt remark is the one mild detour.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers timing, idempotency of sends, plan gating, consent requirements, and the side effect on the blog's pages. With an output schema present, the reference to `recent` reasons is sufficient and no return-value detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, and the description merely restates the on/off semantics of `enabled`. Its note that 'a good `excerpt` matters' adds useful meaning but refers to a field on another tool rather than either of this tool's parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Turn the blog's email newsletter on or off') and immediately scopes the behavior to future posts only. Nothing about it could be confused with get_newsletter or update_blog.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage conditions: Pro only, and an explicit instruction to ask the human before enabling because it adds a form and emails readers in their name. It does not name get_newsletter as the read-side alternative, which keeps it just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

signupCreate blog (sign up)A
Destructive
Inspect

Create a SlopIt blog and get an API key, live URL, and onboarding text. Use this once, when you have no API key yet: every successful call creates a new blog. Set title to the blog's display name, e.g. the project or person's name. Email is required and is the only API-key recovery channel. Creating a blog accepts the operator's terms: https://slopit.io/legal. Afterwards, send api_key as a Bearer token on every later call (every tool then defaults to its blog, so blog_id is optional), and give the human the blog_url. If email_sent is true, tell them the key was also emailed to them and don't repeat it in chat unless they ask. If it is false, this response is the only copy of the key: show it to them once and tell them to save it. On BLOG_NAME_CONFLICT or BLOG_NAME_RESERVED, retry with another name. On EMAIL_REQUIRED, ask the human for their email and call again.

NameRequiredDescriptionDefault
nameNoBlog name, e.g. "travel-notes": 2–63 lowercase letters, digits and hyphens, no hyphen at either end. The host may use it in the blog URL. Omit for an unnamed blog. A taken name fails with BLOG_NAME_CONFLICT.
emailNoThe blog owner's email address. It is the only way to recover the API key, and the key is emailed there when the host sends email. Some hosts require it. Pass it whenever the human gives one.
themeNoBlog theme. Only "minimal" exists today.minimal
titleNoDisplay name shown as the blog's heading and in browser tabs, feeds and link previews, e.g. "Jane's Travel Notes" or the project's name. 1–80 characters, one line. Omit it and the URL name is shown.
languageNoDefault language for the blog as a BCP-47 tag, e.g. "en", "ru", "pt-BR". Defaults to "en". Individual posts may override it.en
parentSiteUrlNoThe main website this blog belongs to (http/https), e.g. "https://acme.example". Every page links back to it ("Main site →"), which tells readers and search engines the blog and the site are one thing. Set it whenever the blog is for a product, project or business with its own site. Change or clear it later with update_blog.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
api_keyNoSend as "Authorization: Bearer <api_key>". Shown once; save it.
blog_idNoPass as blog_id to every other tool.
blog_urlNoLive URL of the blog.
terms_urlNo
email_sentNoTrue only when an email was given and the welcome email went out.
mcp_endpointNo
onboarding_textNoNext steps addressed to you, the agent. Contains the API key.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations flag destructive/openWorld/non-idempotent, and the description adds concrete consequences: each call creates a new blog, creating accepts terms, email is the only recovery channel, and it explains the api_key/email_sent/blog_url handling. That is well beyond what annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded and every clause is actionable (creation semantics, key handling, error retries). It is on the long side, yet little is filler; slightly more tightening would earn a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a mutation tool with 6 params, rich annotations, and an output schema, the description covers the remaining burden: idempotency implications, secret-handling guidance, and error recovery. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining intent for `title` (display name, e.g. project/person name) and `email` (only recovery channel). It adds mild value rather than duplicating schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a SlopIt blog') and immediately names what the agent gets back (API key, live URL, onboarding text). No sibling tool does this, and the description makes that clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use this once, when you have no API key yet' plus 'every successful call creates a new blog' warns against reuse. It also gives retry rules for BLOG_NAME_CONFLICT, BLOG_NAME_RESERVED, and EMAIL_REQUIRED, covering the when-not and recovery paths.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_blogUpdate blog settingsA
DestructiveIdempotent
Inspect

Edit blog settings: title (otherwise the URL name is shown), language (BCP-47), parentSiteUrl, analytics, and brand accentColor, logoUrl, faviconUrl to match a main site. null clears any but language.

NameRequiredDescriptionDefault
patchYesBlog settings to change; omitted fields stay as they are.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
blogNo
errorNoPresent only on failure (isError: true). Success fields are absent then.
blog_urlNoThe blog's public URL (its custom domain once one is verified). Posts live at {blog_url}{slug}/.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true. The description adds useful specifics such as null clearing most fields except language and title falling back to the URL name, but it does not mention that analytics replaces the whole analytics configuration, that omitted patch fields remain unchanged, or auth implications.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence lists the relevant settings and the null-clearing rule with no filler. Every clause contributes to understanding the tool's scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description is largely complete for calling the tool correctly. It covers the main fields and null semantics, though it could state partial-update behavior and destructive overwrite implications more explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already thoroughly documents every parameter and nested field. The description lists the field names and null-clearing behavior but adds little syntax or meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ("Edit blog settings") and enumerates the editable settings, making it immediately distinguishable from update_post and get_blog. An agent can tell exactly what the tool changes without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context is implied by "Edit blog settings," but the description does not explicitly say when to use this rather than update_post or get_blog, nor does it state any exclusions or prerequisites. The usage is inferable but not guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_postUpdate postA
DestructiveIdempotent
Inspect

Edit an existing post. Pass the post's slug and a patch of fields to change; coverImage: null removes the cover. Use this when the user wants a published post or draft changed. patch: { status: "draft" } takes a live post offline and "published" puts a draft live. Slug itself can't change; delete and republish if you need a new URL. Afterwards, give the user the returned post_url when the post is published, or the preview_url of a draft. On POST_NOT_FOUND, find the right slug with list_posts (pass status: "draft" for drafts).

NameRequiredDescriptionDefault
slugYesSlug of the post, e.g. "hello-world", as returned by create_post or list_posts.
patchYesFields to change; omitted fields stay as they are. Same fields as create_post except `slug`, which cannot change.
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
postNo
errorNoPresent only on failure (isError: true). Success fields are absent then.
post_urlNoLive URL of the post. Present only when it is published.
preview_urlNoPrivate link to a rendered draft for the human to review: not indexed, not listed anywhere. Present only for drafts, on hosts with previews.
next_post_hintNoOne line for you, the agent, on a young blog's first posts: offer your human the next post.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the safety profile (destructiveHint=true, idempotentHint=true), and the description adds real context beyond them: that `status: "draft"` takes a live post offline, that `coverImage: null` removes the cover, that slug is immutable, and what to surface to the user afterwards (post_url vs preview_url). It also names the POST_NOT_FOUND failure mode, which no structured field covers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense sentences, front-loaded with the verb and required inputs, then constraints, then post-call behavior, then error recovery. Every sentence carries an actionable fact; none restates the title or the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with a nested patch object and an output schema, the description covers the mutation's side effects, identity constraints, state transitions, and failure recovery. Return values are handled by the output schema, and the description correctly limits itself to telling the agent what to do with them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; the description earns a bump by adding cross-parameter semantics the schema only states locally — partial-patch behavior implied by 'a patch of fields to change', slug immutability, and the null-means-remove convention for coverImage. It does not surface publishAt scheduling or idempotency_key, which are the two most consequential parameters to miss.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Edit an existing post') and immediately distinguishes it from siblings by naming the immutable identity (`slug`) and pointing at delete_post/create_post behavior ('delete and republish'). An agent can tell this apart from create_post, update_blog, or delete_post without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('when the user wants a published post or draft changed') plus conditional guidance for state transitions (status draft/published), an explicit exclusion (slug can't change), and an error-recovery route (on POST_NOT_FOUND use list_posts with status: "draft"). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_mediaUpload imageAInspect

Upload an image (JPEG/PNG/GIF/WebP, max 5MB) as base64 in data_base64. Returns a public URL — use it as alt in post markdown or pass as coverImage.

NameRequiredDescriptionDefault
blog_idNoYour blog's id, as returned by signup. Optional with an API key: it defaults to the key's blog, and any id you pass must be that blog. Required when the server runs without API keys.
filenameYesOriginal file name, e.g. "castle.jpg". Kept for reference; the public URL uses a generated id.
data_base64YesThe image bytes as standard base64 (A-Z, a-z, 0-9, +, / with = padding). No "data:" prefix, no line breaks. Max 5 MB decoded unless the host sets another cap.
content_typeYesImage type: "image/jpeg", "image/png", "image/gif" or "image/webp".
idempotency_keyNoOptional retry key, any unique string (e.g. a UUID). Retrying with the same key and identical arguments returns the first result instead of writing again; the same key with different arguments fails with IDEMPOTENCY_KEY_CONFLICT. Scoped to your API key and this tool.

Output Schema

NameRequiredDescription
errorNoPresent only on failure (isError: true). Success fields are absent then.
mediaNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (not read-only, not idempotent, not destructive, open-world). The description adds the return contract (a public URL) and the 5MB/format constraints, which is useful context. It does not mention the idempotency_key retry behavior or auth needs, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the constraint block front-loaded and the output usage trailing. Every clause earns its place; nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-file upload with a rich input schema and an output schema present, the description covers input constraints and result usage adequately. Minor gaps: no mention of error modes or the idempotency key's retry semantics, though the schema handles the latter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter including data_base64, content_type, filename and idempotency_key. The description names data_base64 and repeats format/size limits that the schema also carries, adding little beyond the structured fields. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (upload) and resource (an image), plus the accepted formats and size cap. Against siblings like list_media/delete_media, the action is unambiguous without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains what to do with the result ('use it as ![alt](url) in post markdown or pass as coverImage'), which orients the agent toward the downstream workflow. It does not, however, say when not to upload or how it relates to alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updates
    • Addedget_newsletter
    • Addedset_newsletter
  2. 4 tool updates
    • Changedcreate_post2 fields changed
      • addedInput schema / properties / publishAt
        Added value: +{
        +  "description": "Schedule the post: an ISO 8601 time with a timezone, e.g. \"2026-11-03T09:00:00Z\", in the future and at most 90 days ahead. The post is saved as a draft and goes live by itself at that time (within a minute or so). Omit to publish or save now.",
        +  "format": "date-time",
        +  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / post / properties / publishAt
        Added value: +{
        +  "description": "ISO 8601 time a scheduled draft goes live. Absent when not scheduled.",
        +  "type": "string"
        +}
    • Changedget_post1 field changed
      • addedOutput schema / properties / post / properties / publishAt
        Added value: +{
        +  "description": "ISO 8601 time a scheduled draft goes live. Absent when not scheduled.",
        +  "type": "string"
        +}
    • Changedlist_posts1 field changed
      • addedOutput schema / properties / posts / items / properties / publishAt
        Added value: +{
        +  "description": "ISO 8601 time a scheduled draft goes live. Absent when not scheduled.",
        +  "type": "string"
        +}
    • Changedupdate_post2 fields changed
      • addedInput schema / properties / patch / properties / publishAt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "date-time",
        +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Schedule this draft to go live at an ISO 8601 time with a timezone, at most 90 days ahead. Send null to cancel the schedule (the post stays a draft). Only for drafts: unpublish first with status \"draft\" to reschedule a live post."
        +}
      • addedOutput schema / properties / post / properties / publishAt
        Added value: +{
        +  "description": "ISO 8601 time a scheduled draft goes live. Absent when not scheduled.",
        +  "type": "string"
        +}
  3. 2 tool updates
    • Changedcreate_post1 field changed
      • addedOutput schema / properties / next_post_hint
        Added value: +{
        +  "description": "One line for you, the agent, on a young blog's first posts: offer your human the next post.",
        +  "type": "string"
        +}
    • Changedupdate_post1 field changed
      • addedOutput schema / properties / next_post_hint
        Added value: +{
        +  "description": "One line for you, the agent, on a young blog's first posts: offer your human the next post.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedset_fact1 field changed
      • changedInput schema / properties / value / description
        Previous value: -"The current value, as plain text: 1–120 characters, one line, none of [ ] < > * _ ~ ` | \\ { }. Put units and qualifiers inside it when they change together, e.g. \"500 MB\" or \"v2.4.1\"."New value: +"The current value, as plain text: 1–120 characters, one line, none of [ ] < > * _ ~ ` | \\ { }. Put units and qualifiers inside it when they change together, e.g. \"500 MB\" or \"v2.4.1\". On a blog in more than one language, keep words out of it (\"500 MB\", not \"500 MB per user\"): it shows the same in every language."
  5. 2 tool updates
    • Changedget_blog3 fields changed
      • addedOutput schema / properties / blog / properties / accentColor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Brand color, #rrggbb. null: the theme's color."
        +}
      • addedOutput schema / properties / blog / properties / faviconUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "null: the default icon."
        +}
      • addedOutput schema / properties / blog / properties / logoUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "null: the masthead shows the name."
        +}
    • Changedupdate_blog6 fields changed
      • addedInput schema / properties / patch / properties / accentColor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "pattern": "^#[0-9a-fA-F]{6}$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Brand color as #rrggbb, e.g. the main site's primary color. Used for links, the main-site button and the default favicon. Must be readable on the light page background (3:1); a refusal suggests a darker shade. null restores the theme's color."
        +}
      • addedInput schema / properties / patch / properties / faviconUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Browser-tab icon URL (http/https): a square PNG, SVG or ICO, e.g. the main site's favicon. null restores the default icon (drawn in accentColor when set)."
        +}
      • addedInput schema / properties / patch / properties / logoUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "format": "uri",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Logo image URL (http/https), shown at the top of every page in place of the blog's name (which becomes its alt text). A wide wordmark works best; it is shown 32px tall. Use an uploaded image URL or the main site's logo. null shows the name again."
        +}
      • addedOutput schema / properties / blog / properties / accentColor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Brand color, #rrggbb. null: the theme's color."
        +}
      • addedOutput schema / properties / blog / properties / faviconUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "null: the default icon."
        +}
      • addedOutput schema / properties / blog / properties / logoUrl
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "null: the masthead shows the name."
        +}
  6. 6 tool updates
    • Changedcreate_post1 field changed
      • changedInput schema / properties / body / description
        Previous value: -"Post content as markdown. Raw HTML is stripped. A YouTube URL alone on its own line becomes an embedded player."New value: +"Post content as markdown. Raw HTML is stripped. A YouTube URL alone on its own line becomes an embedded player. {{fact:name}} shows the current value of the blog's live fact `name` (see set_fact)."
    • Addeddelete_fact
    • Addedlist_facts
    • Addedset_fact
    • Changedsignup1 field changed
      • addedInput schema / properties / parentSiteUrl
        Added value: +{
        +  "description": "The main website this blog belongs to (http/https), e.g. \"https://acme.example\". Every page links back to it (\"Main site →\"), which tells readers and search engines the blog and the site are one thing. Set it whenever the blog is for a product, project or business with its own site. Change or clear it later with update_blog.",
        +  "format": "uri",
        +  "type": "string"
        +}
    • Changedupdate_post1 field changed
      • changedInput schema / properties / patch / properties / body / description
        Previous value: -"New markdown body. Replaces the whole body."New value: +"New markdown body. Replaces the whole body. {{fact:name}} shows the current value of the blog's live fact `name`."
  7. 5 tool updates
    • Changedcreate_post1 field changed
      • addedOutput schema / properties / preview_url
        Added value: +{
        +  "description": "Private link to a rendered draft for the human to review: not indexed, not listed anywhere. Present only for drafts, on hosts with previews.",
        +  "type": "string"
        +}
    • Changedget_blog1 field changed
      • addedOutput schema / properties / blog_url
        Added value: +{
        +  "description": "The blog's public URL (its custom domain once one is verified). Posts live at {blog_url}{slug}/.",
        +  "type": "string"
        +}
    • Changedget_post1 field changed
      • addedOutput schema / properties / preview_url
        Added value: +{
        +  "description": "Private link to a rendered draft for the human to review: not indexed, not listed anywhere. Present only for drafts, on hosts with previews.",
        +  "type": "string"
        +}
    • Changedupdate_blog1 field changed
      • addedOutput schema / properties / blog_url
        Added value: +{
        +  "description": "The blog's public URL (its custom domain once one is verified). Posts live at {blog_url}{slug}/.",
        +  "type": "string"
        +}
    • Changedupdate_post1 field changed
      • addedOutput schema / properties / preview_url
        Added value: +{
        +  "description": "Private link to a rendered draft for the human to review: not indexed, not listed anywhere. Present only for drafts, on hosts with previews.",
        +  "type": "string"
        +}
  8. 2 tool updates
    • Changedcreate_post1 field changed
      • changedInput schema / properties / seoTitle / description
        Previous value: -"Title for search results and link previews, up to 200 characters. Defaults to `title`."New value: +"Title for search results and link previews, up to 200 characters, used exactly as written (the blog name is not added). Defaults to `title`, which search results show as \"<title> — <blog name>\"."
    • Changedupdate_post1 field changed
      • changedInput schema / properties / patch / properties / seoTitle / description
        Previous value: -"New title for search results and link previews, up to 200 characters."New value: +"New title for search results and link previews, up to 200 characters, used exactly as written."
  9. 1 tool update
    • Changedget_ai_readership4 fields changed
      • addedOutput schema / properties / tiers / properties / click / properties / names
        Added value: +{
        +  "description": "The AI systems with reads in this tier in the window, most reads first, as the name to say to the human (e.g. \"ChatGPT\"). Who, not how many. Empty when count is 0.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / tiers / properties / live / properties / names
        Added value: +{
        +  "description": "The AI systems with reads in this tier in the window, most reads first, as the name to say to the human (e.g. \"ChatGPT\"). Who, not how many. Empty when count is 0.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / tiers / properties / search / properties / names
        Added value: +{
        +  "description": "The AI systems with reads in this tier in the window, most reads first, as the name to say to the human (e.g. \"ChatGPT\"). Who, not how many. Empty when count is 0.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / tiers / properties / training / properties / names
        Added value: +{
        +  "description": "The AI systems with reads in this tier in the window, most reads first, as the name to say to the human (e.g. \"ChatGPT\"). Who, not how many. Empty when count is 0.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  10. 1 tool update
    • Addedget_ai_readership
  11. 3 tool updates
    • Changedget_blog1 field changed
      • addedOutput schema / properties / blog / properties / title
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Display name shown on the blog. null: the blog shows its name (or id) instead."
        +}
    • Changedsignup1 field changed
      • addedInput schema / properties / title
        Added value: +{
        +  "description": "Display name shown as the blog's heading and in browser tabs, feeds and link previews, e.g. \"Jane's Travel Notes\" or the project's name. 1–80 characters, one line. Omit it and the URL name is shown.",
        +  "maxLength": 80,
        +  "minLength": 1,
        +  "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F\\u2028\\u2029]*$",
        +  "type": "string"
        +}
    • Changedupdate_blog2 fields changed
      • addedInput schema / properties / patch / properties / title
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maxLength": 80,
        +      "minLength": 1,
        +      "pattern": "^[^\\x00-\\x1F\\x7F-\\x9F\\u2028\\u2029]*$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Display name shown as the blog's heading and in browser tabs, feeds and link previews, e.g. the project or person's name. 1–80 characters, one line. null removes it and the URL name is shown again."
        +}
      • addedOutput schema / properties / blog / properties / title
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Display name shown on the blog. null: the blog shows its name (or id) instead."
        +}
  12. 12 tool updates
    • First observedcreate_post
    • First observeddelete_media
    • First observeddelete_post
    • First observedget_blog
    • First observedget_post
    • First observedlist_media
    • First observedlist_posts
    • First observedreport_bug
    • First observedsignup
    • First observedupdate_blog
    • First observedupdate_post
    • First observedupload_media

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    MCP server that gives AI agents full blog management over a Lontar headless blogging API, enabling listing, reading, drafting, publishing, updating, and deleting posts.
    8
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server that connects AI agents to your Paragraph publication, enabling post management, subscriber analytics, and search across posts and publications.
    681 npm
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.