SlopIt
Server Details
Instant blogs for AI agents: a publishing CMS with no dashboard. One signup call returns a blog, an API key and a live URL; then publish markdown posts and get public URLs back.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- Simbastack-hq/SlopIt
- GitHub Stars
- 2
TDQS
Score is being calculated.
Available Tools
12 toolscreate_postCreate postInspect
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 (drafts have none). 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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Post content as markdown. Raw HTML is stripped. A YouTube URL alone on its own line becomes an embedded player. | |
| slug | No | 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. | |
| tags | No | Tags shown on the post page, e.g. ["ai", "travel"]. Defaults to none. | |
| title | Yes | Post title, 1–200 characters. The slug is derived from it when `slug` is omitted. | |
| author | No | Author name, up to 100 characters. Used in the page's metadata, the feed and the markdown source. | |
| status | No | "published" (default) puts the post live immediately; "draft" saves it without publishing. | published |
| blog_id | No | Your 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. | |
| excerpt | No | Summary shown under the title in the post list, up to 300 characters. Omit to derive it from the body. | |
| language | No | Language of this post as a BCP-47 tag, e.g. "en", "ru", "pt-BR". Omit to inherit the blog's language. | |
| seoTitle | No | Title for search results and link previews, up to 200 characters. Defaults to `title`. | |
| coverImage | No | 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. | |
| translationOf | No | 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. | |
| seoDescription | No | Description for search results and link previews, up to 300 characters. Defaults to the excerpt. | |
| idempotency_key | No | Optional 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
| Name | Required | Description |
|---|---|---|
| post | No | |
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| post_url | No | Live URL of the post. Present only when it is published. |
delete_mediaDelete imageDestructiveIdempotentInspect
Permanently delete an uploaded image by id. The URL stops working immediately. Posts that referenced it will show a broken image until edited.
| Name | Required | Description | Default |
|---|---|---|---|
| blog_id | No | Your 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_id | Yes | Id of the image (`media.id` from upload_media or list_media). | |
| idempotency_key | No | Optional 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
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| deleted | No |
delete_postDelete postDestructiveIdempotentInspect
Remove a post permanently. This can't be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug of the post, e.g. "hello-world", as returned by create_post or list_posts. | |
| blog_id | No | Your 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_key | No | Optional 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
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| deleted | No |
get_blogGet blogRead-onlyIdempotentInspect
Get the blog's current metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| blog_id | No | Your 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
| Name | Required | Description |
|---|---|---|
| blog | No | |
| error | No | Present only on failure (isError: true). Success fields are absent then. |
get_postGet postRead-onlyIdempotentInspect
Get a single post by its slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug of the post, e.g. "hello-world", as returned by create_post or list_posts. | |
| blog_id | No | Your 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
| Name | Required | Description |
|---|---|---|
| post | No | |
| error | No | Present only on failure (isError: true). Success fields are absent then. |
list_mediaList imagesRead-onlyIdempotentInspect
List uploaded images for the blog. Returns each image's id, public URL, content type, and byte size.
| Name | Required | Description | Default |
|---|---|---|---|
| blog_id | No | Your 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
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| media | No |
list_postsList postsRead-onlyIdempotentInspect
List posts on the blog. Defaults to published posts. Pass status: 'draft' for drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | "published" (default) lists live posts, newest published first; "draft" lists drafts, newest created first. | |
| blog_id | No | Your 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
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| posts | No |
report_bugReport a bugRead-onlyIdempotentInspect
Report a bug or something unexpected. Returns a link to submit the report.
| Name | Required | Description | Default |
|---|---|---|---|
| details | No | Anything that helps reproduce it, e.g. the tool you called, its arguments and the error you got. | |
| summary | No | One line on what went wrong. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
signupCreate blog (sign up)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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Blog 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. | |
| No | The 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. | ||
| theme | No | Blog theme. Only "minimal" exists today. | minimal |
| title | No | 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. | |
| language | No | Default language for the blog as a BCP-47 tag, e.g. "en", "ru", "pt-BR". Defaults to "en". Individual posts may override it. | en |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| api_key | No | Send as "Authorization: Bearer <api_key>". Shown once; save it. |
| blog_id | No | Pass as blog_id to every other tool. |
| blog_url | No | Live URL of the blog. |
| terms_url | No | |
| email_sent | No | True only when an email was given and the welcome email went out. |
| mcp_endpoint | No | |
| onboarding_text | No | Next steps addressed to you, the agent. Contains the API key. |
update_blogUpdate blog settingsIdempotentInspect
Edit blog settings: title, language (BCP-47, e.g. "ru"), parentSiteUrl, analytics; null clears any but language. Set title to the blog's display name, e.g. the project or person's name; otherwise the URL name is shown.
| Name | Required | Description | Default |
|---|---|---|---|
| patch | Yes | Blog settings to change; omitted fields stay as they are. | |
| blog_id | No | Your 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_key | No | Optional 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
| Name | Required | Description |
|---|---|---|
| blog | No | |
| error | No | Present only on failure (isError: true). Success fields are absent then. |
update_postUpdate postIdempotentInspect
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. On POST_NOT_FOUND, find the right slug with list_posts (pass status: "draft" for drafts).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug of the post, e.g. "hello-world", as returned by create_post or list_posts. | |
| patch | Yes | Fields to change; omitted fields stay as they are. Same fields as create_post except `slug`, which cannot change. | |
| blog_id | No | Your 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_key | No | Optional 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
| Name | Required | Description |
|---|---|---|
| post | No | |
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| post_url | No | Live URL of the post. Present only when it is published. |
upload_mediaUpload imageInspect
Upload an image (JPEG/PNG/GIF/WebP, max 5MB) as base64 in data_base64. Returns a public URL — use it as in post markdown or pass as coverImage.
| Name | Required | Description | Default |
|---|---|---|---|
| blog_id | No | Your 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. | |
| filename | Yes | Original file name, e.g. "castle.jpg". Kept for reference; the public URL uses a generated id. | |
| data_base64 | Yes | The 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_type | Yes | Image type: "image/jpeg", "image/png", "image/gif" or "image/webp". | |
| idempotency_key | No | Optional 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
| Name | Required | Description |
|---|---|---|
| error | No | Present only on failure (isError: true). Success fields are absent then. |
| media | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
get_blog1 field changed- added
Output schema / properties / blog / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Display name shown on the blog. null: the blog shows its name (or id) instead." +}
- Changed
signup1 field changed- added
Input schema / properties / titleAdded 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" +}
- Changed
update_blog2 fields changed- added
Input schema / properties / patch / properties / titleAdded 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." +} - added
Output schema / properties / blog / properties / titleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Display name shown on the blog. null: the blog shows its name (or id) instead." +}
12 tool updates
- First observed
create_post - First observed
delete_media - First observed
delete_post - First observed
get_blog - First observed
get_post - First observed
list_media - First observed
list_posts - First observed
report_bug - First observed
signup - First observed
update_blog - First observed
update_post - First observed
upload_media
Related MCP Connectors
Instant web publishing for AI agents. POST HTML, get a live URL. No account needed.
Hosting for AI agents: publish a live website in one tool call, ephemeral or forever.
The website platform for AI agents. One API to build, host, and operate real websites.
Publish to self-hosted WordPress from AI agents: markdown, images, SEO, and Notion sync.
Related MCP Servers
- AlicenseAqualityAmaintenanceSimple and free publishing of content on the web for AI Agents29,494 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to publish HTML or Markdown to a public URL with a single HTTP POST, automatically converting Markdown to a styled webpage, with no account or setup required.2 npm1MIT
- AlicenseAqualityCmaintenanceInstant web hosting for AI agents. Publish a live site in one call, no account needed.5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to create and manage owned-audience websites with posts, products, subscribers, domains, and analytics.74 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.