Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "report_bug"
Report a bug or send feedbackReportTell SlopIt's founder about a bug, something unexpected, a missing feature, orsomethingpricingunexpected.thatReturnsdoesn'tafit.linkNotokeysubmitneeded.theReturnsreport.a report id.
⟨4 unchanged words⟩ {"details":{"description":"Anything that helpsreproduce it, e.g.: the tool you called, its arguments and the error yougot.got, or the feature you need."},"summary":{"description":"One line on what wentwrong.wrong, or what you or your human want.","type":"string"}},"type":"object"}
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":{},"properties":{"error":{"additionalProperties":{},"description":"Present only on failure (isError: true). Success fields are absent then."false,"properties":{"codemessage":{"description":"Error code, e.g. \"POST_NOT_FOUND\".","type":"string"},"details":{"additionalProperties":{},"description":"Extra context. Keys depend on the code.","propertyNamesreceived":{"type":"string"},"type":"objectboolean"},"messagereport_id":{"description":"What went wrong and what to do next.","type":"stringnumber"}},"required":["codereceived","messagereport_id","detailsmessage"],"type":"object"}},"type":"object"}
{"destructiveHint":false,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":truefalse,"title":"Report a bug or send feedback"}
Changed the definition of "signup"
⟨60 unchanged words⟩ 2,}$","type":"string"},"invite":{"description":"An invite code the human was given. Pass it exactly as written; a code the host does not recognise fails with INVITE_INVALID before anything is created.","maxLength":64,"minLength":1,"type":"string"},"language":{"default":"en","description": ⟨144 unchanged words⟩ ","format":"uri","type":"string"},"post":{"description":"The first post, published in the same call: the same fields as create_post (`title` and markdown `body` required). Saves a second call. If the blog is created but the post fails, the response still carries the key and blog, plus `post_error`.","properties":{"author":{"description":"Author name, up to 100 characters. Used in the page's metadata, the feed and the markdown source.","maxLength":100,"type":"string"},"body":{"description":"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).","minLength":1,"type":"string"},"coverImage":{"description":"Cover 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.","format":"uri","type":"string"},"excerpt":{"description":"Summary shown under the title in the post list, up to 300 characters. Omit to derive it from the body.","maxLength":300,"type":"string"},"language":{"description":"Language of this post as a BCP-47 tag, e.g. \"en\", \"ru\", \"pt-BR\". Omit to inherit the blog's language.","maxLength":35,"type":"string"},"publishAt":{"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"},"seoDescription":{"description":"Description for search results and link previews, up to 300 characters. Defaults to the excerpt.","maxLength":300,"type":"string"},"seoTitle":{"description":"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>\".","maxLength":200,"type":"string"},"slug":{"description":"URL 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.","maxLength":100,"minLength":2,"pattern":"^[a-z0-9][a-z0-9-]*[a-z0-9]$","type":"string"},"status":{"default":"published","description":"\"published\" (default) puts the post live immediately; \"draft\" saves it without publishing.","enum":["draft","published"],"type":"string"},"tags":{"default":[],"description":"Tags shown on the post page, e.g. [\"ai\", \"travel\"]. Defaults to none.","items":{"type":"string"},"type":"array"},"title":{"description":"Post title, 1–200 characters. The slug is derived from it when `slug` is omitted.","maxLength":200,"minLength":1,"type":"string"},"translationOf":{"description":"Slug 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.","maxLength":100,"minLength":1,"type":"string"}},"required":["title","body"],"type":"object
Added "get_newsletter" and "set_newsletter" (16 tools before, 18 now)
Get newsletter — 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` matter…
Turn newsletter on or off — 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 …
Changed the definition of "create_post", "get_post", "list_posts" and 1 more
⟨236 unchanged words⟩ "maxLength":35,"type":"string"},"publishAt":{"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"},"seoDescription":{"description":"Description for search results ⟨233 unchanged words⟩
⟨61 unchanged words⟩ ,"details"],"type":"object"},"next_post_hint":{"description":"One line for you, the agent, on a young blog's first posts: offer your human the next post.","type":"string"},"post":{"additionalProperties":{},"properties":{
Changed the definition of "set_fact"
⟨330 unchanged words⟩ 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.","type":"string"}},"required": ⟨4 unchanged words⟩
Certificate changed, valid to 2027-01-20
Changed the definition of "get_blog" and "update_blog"
⟨6 unchanged words⟩ ":{"additionalProperties":{},"properties":{"accentColor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand color, #rrggbb. null: the theme's color."},"analytics":{"additionalProperties":{},"description":" ⟨41 unchanged words⟩ "ISO 8601.","type":"string"},"faviconUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"null: the default icon."},"id":{"type":"string"},"language" ⟨3 unchanged words⟩ default BCP-47 language tag.","type":"string"},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"null: the masthead shows the name."},"name":{"anyOf":[{"type ⟨132 unchanged words⟩
Added "delete_fact", "list_facts" and "set_fact"; changed the definition of "create_post", "signup" and "update_post" (13 tools before, 16 now)
⟨82 unchanged words⟩ on its own line becomes an embedded player. {{fact:name}} shows the current value of the blog's live fact `name` (see set_fact).","minLength":1,"type":"string"} ⟨370 unchanged words⟩
⟨146 unchanged words⟩ [a-z0-9]$","type":"string"},"parentSiteUrl":{"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"},"
Changed the definition of "create_post", "get_blog", "get_post" and 2 more
⟨67 unchanged words⟩ Afterwards, always give the user the returned`post_url``post_url`.(draftsAhavedraft 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 ⟨45 unchanged words⟩
⟨251 unchanged words⟩ results and link previews, up to 200characters.
Certificate recorded, valid to 2026-11-21
Authorization not required
Changed the definition of "get_ai_readership"
⟨200 unchanged words⟩ not AI reads. Free blogs get the weekly`tiers`.`tiers`, each with the `names` of the AI systems in it. Pro adds `posts` (per post), `systems` ⟨58 unchanged words⟩
⟨447 unchanged words⟩ the window.","type":"number"},"names":{"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"},"previous":{"description":"Reads in the equal ⟨43 unchanged words⟩ the window.","type":"number"},"names":{"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"},"
Unknown → Live
First tool surface recorded: 13 tools (server version 0.1.0)
https://slopit.io/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 15 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨113 unchanged words⟩ ,"details"],"type":"object"},"invite":{"additionalProperties":{},"description":"Present when an invite code was given; `note` says what it unlocked.","properties":{"applied":{"type":"boolean"},"note":{"type":"string"}},"required":["applied"],"type":"object"},"mcp_endpoint":{"type":"string"},"onboarding_text" ⟨4 unchanged words⟩ to you, the agent. Contains the API key.","type":"string"},"post":{"additionalProperties":{},"description":"The first post, when `post` was given and it was created.","properties":{"author":{"type":"string"},"blogId":{"type":"string"},"body":{"description":"Markdown body.","type":"string"},"coverImage":{"type":"string"},"createdAt":{"description":"ISO 8601.","type":"string"},"excerpt":{"type":"string"},"id":{"type":"string"},"language":{"description":"The post's own BCP-47 language tag. Absent: it uses the blog's language.","type":"string"},"publishAt":{"description":"ISO 8601 time a scheduled draft goes live. Absent when not scheduled.","type":"string"},"publishedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO 8601 publish time. null for drafts."},"seoDescription":{"type":"string"},"seoTitle":{"type":"string"},"slug":{"description":"The post's page is {blog_url}{slug}/.","type":"string"},"status":{"enum":["draft","published"],"type":"string"},"tags":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"translationGroup":{"description":"Shared by every translation of the same post.","type":"string"},"updatedAt":{"description":"ISO 8601.","type":"string"}},"required":["id","blogId","slug","title","body","tags","status","publishedAt","createdAt","updatedAt"],"type":"object"},"post_error":{"additionalProperties":{},"description":"Why the first post failed. The blog and key were still created: retry with create_post.","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"},"post_url":{"description":"The first post's live URL. Give it to the human.","type":"string"},"preview_url":{"description":"Private preview link when the first post was saved as a draft.","type":"string"},"terms_url":{ ⟨4 unchanged words⟩
⟨106 unchanged words⟩ blog's language.","type":"string"},"publishAt":{"description":"ISO 8601 time a scheduled draft goes live. Absent when not scheduled.","type":"string"},"publishedAt":{"anyOf":[{"type":"string ⟨103 unchanged words⟩
⟨107 unchanged words⟩ blog's language.","type":"string"},"publishAt":{"description":"ISO 8601 time a scheduled draft goes live. Absent when not scheduled.","type":"string"},"publishedAt":{"anyOf":[{"type":"string ⟨77 unchanged words⟩
⟨223 unchanged words⟩ override and inherit the blog's language."},"publishAt":{"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."},"seoDescription":{"description":"New description for search ⟨148 unchanged words⟩
⟨61 unchanged words⟩ ,"details"],"type":"object"},"next_post_hint":{"description":"One line for you, the agent, on a young blog's first posts: offer your human the next post.","type":"string"},"post":{"additionalProperties":{},"properties":{ ⟨33 unchanged words⟩ language tag. Absent: it uses the blog's language.","type":"string"},"publishAt":{"description":"ISO 8601 time a scheduled draft goes live. Absent when not scheduled.","type":"string"},"publishedAt":{ ⟨121 unchanged words⟩
⟨102 unchanged words⟩ stay as they are.","properties":{"accentColor":{"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."},"analytics":{"anyOf":[{"additionalProperties":false, ⟨100 unchanged words⟩ whole analytics config; null removes it."},"faviconUrl":{"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)."},"language":{"description":"Default language for the ⟨12 unchanged words⟩ ".","maxLength":35,"type":"string"},"logoUrl":{"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."},"parentSiteUrl":{"anyOf":[{"format ⟨76 unchanged words⟩
⟨6 unchanged words⟩ ":{"additionalProperties":{},"properties":{"accentColor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Brand color, #rrggbb. null: the theme's color."},"analytics":{"additionalProperties":{},"description":" ⟨41 unchanged words⟩ "ISO 8601.","type":"string"},"faviconUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"null: the default icon."},"id":{"type":"string"},"language" ⟨3 unchanged words⟩ default BCP-47 language tag.","type":"string"},"logoUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"null: the masthead shows the name."},"name":{"anyOf":[{"type ⟨132 unchanged words⟩
⟨130 unchanged words⟩ ":"New markdown body. Replaces the whole body. {{fact:name}} shows the current value of the blog's live fact `name`.","minLength":1,"type":"string"} ⟨230 unchanged words⟩
Delete live fact — 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.
List live facts — 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.
Set live fact — 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 …
⟨197 unchanged words⟩ it is published.","type":"string"},"preview_url":{"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"}},"type":"object"}
Get the blog's currentmetadata.metadata and its public URL, `blog_url`. A post's page is {blog_url}{slug}/; use it to link posts to each other.
⟨118 unchanged words⟩ ,"language"],"type":"object"},"blog_url":{"description":"The blog's public URL (its custom domain once one is verified). Posts live at {blog_url}{slug}/.","type":"string"},"error":{"additionalProperties":{},"description":" ⟨58 unchanged words⟩
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.⟨183 unchanged words⟩ createdAt","updatedAt"],"type":"object"},"preview_url":{"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"}},"type":"object"}
⟨118 unchanged words⟩ ,"language"],"type":"object"},"blog_url":{"description":"The blog's public URL (its custom domain once one is verified). Posts live at {blog_url}{slug}/.","type":"string"},"error":{"additionalProperties":{},"description":" ⟨58 unchanged words⟩
⟨65 unchanged words⟩ user the returned `post_url` when the post ispublished.published, or the `preview_url` of a draft. On POST_NOT_FOUND, find the right slug with ⟨8 unchanged words⟩
⟨241 unchanged words⟩ results and link previews, up to 200characters.characters, used exactly as written.","maxLength":200,"type":"string"} ⟨114 unchanged words⟩
⟨197 unchanged words⟩ it is published.","type":"string"},"preview_url":{"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"}},"type":"object"}