Koskamo

JustBlogged MCP

A remote MCP server that allows AI clients to create, edit, organize, and publish blog posts, pages, and collections, as well as manage blog settings, themes, and domains via OAuth authentication.

Endpoint and access

OAuth sign-in: the first time you connect, your client opens the vendor's own authorization prompt in a browser.

JustBlogged MCP logo, by JustBloggedCommunity listingStreamable HTTPOAuth sign-inEndpoint checked 2026-11-07Published by JustBlogged
You need:OAuth sign-inNo pasted API keyFree plan, no card needed
MCP endpoint (Streamable HTTP)
https://justblogged.com/mcp
Vendor documentation

What its tools do

48 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

48 of 48 have a description · 48 of 48 declare behavior hints · 47 of 47 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Create and revise blog posts with titles, slugs, and metadata
  • Manage evergreen pages like About and Contact
  • Organize content using collections and tags
  • Update blog settings, domains, and theme configurations

Source and maintenance

Community listingRegistry 0.1.1

Protocol and capabilities

Server
justblogged-mcp 0.1.1
MCP protocol negotiated in check
2025-11-25
Tools
48 advertised
Resources
1 advertised
Resource templates
Sign-in required
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {},
  "resources": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Use resources for public JustBlogged guidance. Content-management tools require OAuth or a JustBlogged bearer key.

Tools

48 advertised

list_blogs — List blogs
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the authenticated user's accessible blogs so later tool calls can target the right blogId.

list_blogs input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_blogs output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_blogs annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_blog — Get blog
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a single blog by ID, including settings like subdomain, domain, logo, and metadata.

get_blog input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    }
  },
  "additionalProperties": false
}
get_blog output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_blog annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_blog_members — List blog members
Advertised by the server during the last successful anonymous check.
Advertised read-only

List blog members who can be assigned as post authors. Use a member id as authorId in create_post or update_post.

list_blog_members input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    }
  },
  "additionalProperties": false
}
list_blog_members output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_blog_members annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_blog — Create blog
Advertised by the server during the last successful anonymous check.
Open-world

Create a new blog. Subdomain is auto-generated from the name. Requires account-level OAuth or a user-scoped API key.

create_blog input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "logo": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional logo URL."
    },
    "name": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Blog name."
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional blog description."
    }
  },
  "additionalProperties": false
}
create_blog output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
create_blog annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
update_blog — Update blog
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update blog settings including name, subdomain, description, and logo. Requires owner or admin access.

update_blog input schema
{
  "type": "object",
  "required": [
    "blogId",
    "name",
    "subdomain"
  ],
  "properties": {
    "logo": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Updated logo URL."
    },
    "name": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Updated blog name."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    },
    "subdomain": {
      "type": "string",
      "pattern": "^(?!(?:api|admin|www|mail|app|dashboard|login|signup|blog|static|assets)$)(?!.*--)[a-z0-9]([a-z0-9-]*[a-z0-9])?$",
      "maxLength": 40,
      "minLength": 1,
      "description": "Updated blog subdomain."
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Updated blog description."
    }
  },
  "additionalProperties": false
}
update_blog output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_blog annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_blog — Delete blog
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a blog by ID. Only the blog owner can delete. Active subscriptions are cancelled automatically.

delete_blog input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    }
  },
  "additionalProperties": false
}
delete_blog output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_blog annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
get_blog_metadata — Get blog metadata
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get custom metadata for a blog (SEO fields, themeId, etc.). Does not include themeSettings values.

get_blog_metadata input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    }
  },
  "additionalProperties": false
}
get_blog_metadata output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_blog_metadata annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_blog_metadata — Update blog metadata
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Merge custom metadata into a blog. Pass only the keys you want to add or update. Theme changes use the dedicated theme tools.

update_blog_metadata input schema
{
  "type": "object",
  "required": [
    "blogId",
    "metadata"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    },
    "metadata": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "value"
        ],
        "properties": {
          "key": {
            "type": "string",
            "pattern": "^(?!(?:themeId|themeSettings|hasThemeFiles|themeUpdatedAt|customThemeBaseId)$).+$"
          },
          "value": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              },
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "description": "Custom blog metadata entries as key/value objects. Theme changes must use switch_theme or update_theme_settings."
    }
  },
  "additionalProperties": false
}
update_blog_metadata output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_blog_metadata annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
update_blog_domain — Update blog domain
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Configure or remove a blog's custom domain. Use domain only for custom domains (requires CNAME/A DNS). Use domain + domain_slug for subdirectory hosting (requires TXT DNS verification). Pass an empty domain string to remove the domain.

update_blog_domain input schema
{
  "type": "object",
  "required": [
    "blogId",
    "domain"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID."
    },
    "domain": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[a-zA-Z0-9-]+(\\.[a-zA-Z]{2,})+$",
          "maxLength": 100,
          "minLength": 1
        },
        {
          "type": "string",
          "const": ""
        }
      ],
      "description": "Custom domain (e.g. blog.example.com) or root domain for subdirectory mode. Pass empty string to remove."
    },
    "domain_slug": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[a-zA-Z0-9-_]*$",
          "maxLength": 50
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional subdirectory slug for subdirectory hosting (e.g. example.com + blog)."
    }
  },
  "additionalProperties": false
}
update_blog_domain output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_blog_domain annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_available_themes — List available themes
Advertised by the server during the last successful anonymous check.
Advertised read-only

List built-in themes available for a blog and show which theme is currently active.

list_available_themes input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
list_available_themes output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_available_themes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_theme_settings — Get theme settings
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get theme settings schema and current values for a blog's active theme.

get_theme_settings input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
get_theme_settings output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_theme_settings annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_theme_settings — Update theme settings
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update one or more theme setting values for a blog. Unspecified values are preserved. Use get_theme_settings first to discover valid keys.

update_theme_settings input schema
{
  "type": "object",
  "required": [
    "blogId",
    "values"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "values": {
      "type": "string",
      "minLength": 2,
      "description": "JSON object containing theme setting names and values from get_theme_settings."
    }
  },
  "additionalProperties": false
}
update_theme_settings output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_theme_settings annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
switch_theme — Switch theme
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Switch a blog to a different built-in theme or to custom if theme files exist.

switch_theme input schema
{
  "type": "object",
  "required": [
    "blogId",
    "theme_id"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "theme_id": {
      "enum": [
        "just",
        "obsidian",
        "linen",
        "tribune",
        "beacon",
        "aside",
        "changes",
        "custom"
      ],
      "type": "string",
      "description": "Theme ID. Use custom for blogs with edited theme files."
    }
  },
  "additionalProperties": false
}
switch_theme output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
switch_theme annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_theme_files — List theme files
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the theme file tree for a blog (layouts, templates, assets, etc.).

list_theme_files input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
list_theme_files output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_theme_files annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_theme_file — Get theme file
Advertised by the server during the last successful anonymous check.
Advertised read-only

Read a theme file by path (e.g. layouts/theme.liquid). Falls back to the active built-in theme when no custom copy exists.

get_theme_file input schema
{
  "type": "object",
  "required": [
    "blogId",
    "file_path"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "file_path": {
      "type": "string",
      "pattern": "^.+\\.(liquid|css|js|html|json|xml|txt)$",
      "minLength": 1,
      "description": "Text theme file path ending in .liquid, .css, .js, .html, .json, .xml, or .txt."
    }
  },
  "additionalProperties": false
}
get_theme_file output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_theme_file annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_theme_file — Update theme file
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Create or update a theme file. Requires a Pro subscription. Copies the built-in theme first if no custom files exist yet.

update_theme_file input schema
{
  "type": "object",
  "required": [
    "blogId",
    "file_path",
    "content"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "content": {
      "type": "string",
      "description": "Full file content."
    },
    "file_path": {
      "type": "string",
      "pattern": "^.+\\.(liquid|css|js|html|json|xml|txt)$",
      "minLength": 1,
      "description": "Text theme file path ending in .liquid, .css, .js, .html, .json, .xml, or .txt."
    }
  },
  "additionalProperties": false
}
update_theme_file output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_theme_file annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_theme_file — Delete theme file
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a custom theme file from a blog. Requires a Pro subscription. Cannot delete built-in-only files.

delete_theme_file input schema
{
  "type": "object",
  "required": [
    "blogId",
    "file_path"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "file_path": {
      "type": "string",
      "minLength": 1,
      "description": "Theme file path relative to the theme root."
    }
  },
  "additionalProperties": false
}
delete_theme_file output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_theme_file annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
upload_image — Upload image
Advertised by the server during the last successful anonymous check.
Open-world

Upload an image to a blog. Use the returned path as the image value when creating or updating a post, page, or blog.

upload_image input schema
{
  "type": "object",
  "required": [
    "blogId",
    "filename",
    "mimeType",
    "data"
  ],
  "properties": {
    "data": {
      "type": "string",
      "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
      "maxLength": 11184812,
      "minLength": 1,
      "description": "Base64-encoded image bytes without a data URL prefix. Maximum decoded size: 8 MB."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "filename": {
      "type": "string",
      "maxLength": 255,
      "minLength": 1,
      "description": "Original image filename, including its extension."
    },
    "mimeType": {
      "enum": [
        "image/png",
        "image/jpeg",
        "image/webp",
        "image/gif",
        "image/svg+xml"
      ],
      "type": "string",
      "description": "Image MIME type. SVG is supported only for logo uploads."
    },
    "uploadType": {
      "enum": [
        "post",
        "page",
        "blog",
        "logo"
      ],
      "type": "string",
      "default": "post",
      "description": "Where the image will be used. Default: post."
    }
  },
  "additionalProperties": false
}
upload_image output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
upload_image annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
list_posts — List posts
Advertised by the server during the last successful anonymous check.
Advertised read-only

List blog posts with pagination, filtering, and sorting by status, collection, tag, author, or date.

list_posts input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "default": 1,
      "minimum": 1,
      "description": "Page number. Default: 1."
    },
    "limit": {
      "type": "integer",
      "default": 30,
      "maximum": 100,
      "minimum": 1,
      "description": "Page size. Default: 30, maximum: 100."
    },
    "order": {
      "enum": [
        "asc",
        "desc"
      ],
      "type": "string",
      "default": "desc",
      "description": "Sort direction. Default: desc."
    },
    "tagId": {
      "type": "string",
      "minLength": 1,
      "description": "Filter by tag ID."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "status": {
      "enum": [
        "draft",
        "published",
        "scheduled",
        "all"
      ],
      "type": "string",
      "description": "Filter by post status."
    },
    "userId": {
      "type": "string",
      "minLength": 1,
      "description": "Filter by author user ID."
    },
    "orderBy": {
      "enum": [
        "createdAt",
        "updatedAt",
        "title",
        "publishedAt"
      ],
      "type": "string",
      "default": "createdAt",
      "description": "Sort field. Default: createdAt."
    },
    "collectionId": {
      "type": "string",
      "minLength": 1,
      "description": "Filter by collection ID."
    }
  },
  "additionalProperties": false
}
list_posts output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_posts annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_post — Get post
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a single blog post by ID.

get_post input schema
{
  "type": "object",
  "required": [
    "blogId",
    "postId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "postId": {
      "type": "string",
      "minLength": 1,
      "description": "Post ID."
    }
  },
  "additionalProperties": false
}
get_post output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_post annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_post — Create post
Advertised by the server during the last successful anonymous check.
Open-world

Create a new blog post with title, HTML content, author, collection, tags, metadata, slug, image, and publishing options. status=published makes the post live. collection_id is optional; omit it to use the empty-slug default Posts collection. If that default does not exist, provide collection_id (call list_collections or create_collection).

create_post input schema
{
  "type": "object",
  "required": [
    "blogId",
    "title",
    "content"
  ],
  "properties": {
    "slug": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 100
        },
        {
          "type": "null"
        }
      ],
      "description": "Post slug. Auto-generated from title when omitted."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 50,
        "minLength": 1
      },
      "default": [],
      "maxItems": 10,
      "description": "Tag names. Maximum 10 tags."
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional featured image path or URL. Use upload_image for local files."
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Post title."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "status": {
      "enum": [
        "draft",
        "published"
      ],
      "type": "string",
      "default": "draft",
      "description": "Publishing status. Default: draft."
    },
    "content": {
      "type": "string",
      "maxLength": 1000000,
      "minLength": 1,
      "description": "Post HTML content."
    },
    "authorId": {
      "type": "string",
      "minLength": 1,
      "description": "Optional author user ID from list_blog_members. Assigning another member requires owner or admin access."
    },
    "metadata": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "value"
        ],
        "properties": {
          "key": {
            "type": "string",
            "maxLength": 50,
            "minLength": 1
          },
          "value": {
            "type": "string",
            "maxLength": 500,
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "description": "Custom metadata entries as key/value objects. Maximum 20 entries; description should be 200 characters or fewer."
    },
    "published_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional publish datetime in ISO 8601 format."
    },
    "collection_id": {
      "type": "string",
      "minLength": 1,
      "description": "Optional collection ID. When omitted, the collection with an empty slug is used. If none exists, use list_collections to choose a collection_id, or create_collection to create one first."
    }
  },
  "additionalProperties": false
}
create_post output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
create_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
update_post — Update post
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update any editable field on an existing blog post, including its author.

update_post input schema
{
  "type": "object",
  "required": [
    "blogId",
    "postId"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Updated post slug."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 50,
        "minLength": 1
      },
      "maxItems": 10,
      "description": "Updated tag names."
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Updated featured image path or URL. Use upload_image for local files."
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Updated post title."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "postId": {
      "type": "string",
      "minLength": 1,
      "description": "Post ID."
    },
    "status": {
      "enum": [
        "draft",
        "published"
      ],
      "type": "string",
      "description": "Updated publishing status."
    },
    "content": {
      "type": "string",
      "maxLength": 1000000,
      "minLength": 1,
      "description": "Updated HTML content."
    },
    "authorId": {
      "type": "string",
      "minLength": 1,
      "description": "Updated author user ID from list_blog_members. Reassignment requires owner or admin access."
    },
    "metadata": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "value"
        ],
        "properties": {
          "key": {
            "type": "string",
            "maxLength": 50,
            "minLength": 1
          },
          "value": {
            "type": "string",
            "maxLength": 500,
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "description": "Custom metadata entries as key/value objects. Maximum 20 entries; description should be 200 characters or fewer."
    },
    "published_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "description": "Updated publish datetime in ISO 8601 format."
    },
    "collection_id": {
      "type": "string",
      "minLength": 1,
      "description": "Updated collection ID."
    }
  },
  "additionalProperties": false
}
update_post output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_post — Delete post
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a blog post by ID.

delete_post input schema
{
  "type": "object",
  "required": [
    "blogId",
    "postId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "postId": {
      "type": "string",
      "minLength": 1,
      "description": "Post ID."
    }
  },
  "additionalProperties": false
}
delete_post output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_pages — List pages
Advertised by the server during the last successful anonymous check.
Advertised read-only

List static pages with pagination, filtering, and sorting.

list_pages input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "default": 1,
      "minimum": 1,
      "description": "Page number. Default: 1."
    },
    "limit": {
      "type": "integer",
      "default": 30,
      "maximum": 100,
      "minimum": 1,
      "description": "Page size. Default: 30, maximum: 100."
    },
    "order": {
      "enum": [
        "asc",
        "desc"
      ],
      "type": "string",
      "default": "desc",
      "description": "Sort direction. Default: desc."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "status": {
      "enum": [
        "draft",
        "published"
      ],
      "type": "string",
      "description": "Filter by page status."
    },
    "orderBy": {
      "enum": [
        "createdAt",
        "updatedAt",
        "title"
      ],
      "type": "string",
      "default": "updatedAt",
      "description": "Sort field. Default: updatedAt."
    }
  },
  "additionalProperties": false
}
list_pages output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_pages annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_page — Get page
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a single static page by ID.

get_page input schema
{
  "type": "object",
  "required": [
    "blogId",
    "pageId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "pageId": {
      "type": "string",
      "minLength": 1,
      "description": "Page ID."
    }
  },
  "additionalProperties": false
}
get_page output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_page annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_page — Create page
Advertised by the server during the last successful anonymous check.
Open-world

Create a new static page with title, HTML body, metadata, slug, image, and status. status=published makes the page live.

create_page input schema
{
  "type": "object",
  "required": [
    "blogId",
    "title",
    "body"
  ],
  "properties": {
    "body": {
      "type": "string",
      "maxLength": 1000000,
      "minLength": 1,
      "description": "Page HTML body."
    },
    "slug": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 100
        },
        {
          "type": "null"
        }
      ],
      "description": "Page slug. Auto-generated from title when omitted."
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Optional featured image path or URL. Use upload_image for local files."
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Page title."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "status": {
      "enum": [
        "draft",
        "published"
      ],
      "type": "string",
      "default": "draft",
      "description": "Publishing status. Default: draft."
    },
    "metadata": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "value"
        ],
        "properties": {
          "key": {
            "type": "string",
            "maxLength": 50,
            "minLength": 1
          },
          "value": {
            "type": "string",
            "maxLength": 500,
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "description": "Custom metadata entries as key/value objects. Maximum 20 entries; description should be 200 characters or fewer."
    }
  },
  "additionalProperties": false
}
create_page output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
create_page annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
update_page — Update page
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update any editable field on an existing static page.

update_page input schema
{
  "type": "object",
  "required": [
    "blogId",
    "pageId"
  ],
  "properties": {
    "body": {
      "type": "string",
      "maxLength": 1000000,
      "minLength": 1,
      "description": "Updated HTML body."
    },
    "slug": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "Updated page slug."
    },
    "image": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 500
        },
        {
          "type": "null"
        }
      ],
      "description": "Updated featured image path or URL. Use upload_image for local files."
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Updated page title."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "pageId": {
      "type": "string",
      "minLength": 1,
      "description": "Page ID."
    },
    "status": {
      "enum": [
        "draft",
        "published"
      ],
      "type": "string",
      "description": "Updated publishing status."
    },
    "metadata": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "value"
        ],
        "properties": {
          "key": {
            "type": "string",
            "maxLength": 50,
            "minLength": 1
          },
          "value": {
            "type": "string",
            "maxLength": 500,
            "minLength": 1
          }
        },
        "additionalProperties": false
      },
      "maxItems": 20,
      "description": "Custom metadata entries as key/value objects. Maximum 20 entries; description should be 200 characters or fewer."
    }
  },
  "additionalProperties": false
}
update_page output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_page annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_page — Delete page
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a static page by ID.

delete_page input schema
{
  "type": "object",
  "required": [
    "blogId",
    "pageId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "pageId": {
      "type": "string",
      "minLength": 1,
      "description": "Page ID."
    }
  },
  "additionalProperties": false
}
delete_page output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_page annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_redirects — List redirects
Advertised by the server during the last successful anonymous check.
Advertised read-only

List redirects for a blog with search, status, type, and pagination filters. Requires manageBlog permission on the target blog. Blog-scoped API keys are supported.

list_redirects input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "default": 1,
      "minimum": 1,
      "description": "Page number, starting at 1."
    },
    "type": {
      "enum": [
        "all",
        "301",
        "302"
      ],
      "type": "string",
      "default": "all",
      "description": "Filter by HTTP status code."
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 100,
      "minimum": 1,
      "description": "Redirects per page, from 1 to 100."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "search": {
      "type": "string",
      "default": "",
      "maxLength": 200,
      "description": "Search source paths and destinations."
    },
    "status": {
      "enum": [
        "all",
        "active",
        "inactive"
      ],
      "type": "string",
      "default": "all",
      "description": "Filter by active state."
    }
  },
  "additionalProperties": false
}
list_redirects output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_redirects annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_redirect — Get redirect
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a single redirect by ID. Requires manageBlog permission on the target blog. Blog-scoped API keys are supported.

get_redirect input schema
{
  "type": "object",
  "required": [
    "blogId",
    "redirectId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "redirectId": {
      "type": "string",
      "minLength": 1,
      "description": "Redirect ID."
    }
  },
  "additionalProperties": false
}
get_redirect output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_redirect annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_redirect — Create redirect
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Create a redirect for a blog. Requires manageBlog permission on the target blog. Blog-scoped API keys are supported.

create_redirect input schema
{
  "type": "object",
  "required": [
    "blogId",
    "source_path",
    "destination"
  ],
  "properties": {
    "active": {
      "type": "boolean",
      "default": true,
      "description": "Whether this redirect should be applied."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "destination": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "Destination site path or absolute HTTP(S) URL."
    },
    "source_path": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "Incoming site path to redirect, starting with a single /. Query strings and fragments are not allowed."
    },
    "status_code": {
      "anyOf": [
        {
          "type": "number",
          "const": 301
        },
        {
          "type": "number",
          "const": 302
        }
      ],
      "default": 301,
      "description": "HTTP redirect status code. Use 301 for permanent redirects and 302 for temporary redirects."
    }
  },
  "additionalProperties": false
}
create_redirect output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
create_redirect annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
update_redirect — Update redirect
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update a redirect source, destination, status code, or active state. Requires manageBlog permission on the target blog. Blog-scoped API keys are supported.

update_redirect input schema
{
  "type": "object",
  "required": [
    "blogId",
    "redirectId"
  ],
  "properties": {
    "active": {
      "type": "boolean",
      "description": "Whether this redirect should be applied."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "redirectId": {
      "type": "string",
      "minLength": 1,
      "description": "Redirect ID."
    },
    "destination": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "Updated destination site path or absolute HTTP(S) URL."
    },
    "source_path": {
      "type": "string",
      "maxLength": 2048,
      "minLength": 1,
      "description": "Updated incoming site path, starting with a single /."
    },
    "status_code": {
      "anyOf": [
        {
          "type": "number",
          "const": 301
        },
        {
          "type": "number",
          "const": 302
        }
      ],
      "description": "Updated HTTP redirect status code."
    }
  },
  "additionalProperties": false
}
update_redirect output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_redirect annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_redirect — Delete redirect
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a redirect by ID. Requires manageBlog permission on the target blog. Blog-scoped API keys are supported.

delete_redirect input schema
{
  "type": "object",
  "required": [
    "blogId",
    "redirectId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "redirectId": {
      "type": "string",
      "minLength": 1,
      "description": "Redirect ID."
    }
  },
  "additionalProperties": false
}
delete_redirect output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_redirect annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
create_tag — Create tag
Advertised by the server during the last successful anonymous check.
Open-world

Create a new blog tag by name. Requires permission to manage taxonomy.

create_tag input schema
{
  "type": "object",
  "required": [
    "blogId",
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 50,
      "minLength": 1,
      "description": "New tag name. Allowed characters: letters, numbers, spaces, hyphens, underscores, periods."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
create_tag output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
create_tag annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
list_tags — List tags
Advertised by the server during the last successful anonymous check.
Advertised read-only

List blog tags with optional case-insensitive search filtering.

list_tags input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "search": {
      "type": "string",
      "description": "Optional tag name search filter."
    }
  },
  "additionalProperties": false
}
list_tags output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_tags annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_tag — Update tag
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Rename a blog tag.

update_tag input schema
{
  "type": "object",
  "required": [
    "blogId",
    "tagId",
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 50,
      "minLength": 1,
      "description": "New tag name. Allowed characters: letters, numbers, spaces, hyphens, underscores, periods."
    },
    "tagId": {
      "type": "string",
      "minLength": 1,
      "description": "Tag ID."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
update_tag output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_tag annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_tag — Delete tag
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a blog tag by ID.

delete_tag input schema
{
  "type": "object",
  "required": [
    "blogId",
    "tagId"
  ],
  "properties": {
    "tagId": {
      "type": "string",
      "minLength": 1,
      "description": "Tag ID."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
delete_tag output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_tag annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_collections — List collections
Advertised by the server during the last successful anonymous check.
Advertised read-only

List all collections for a blog.

list_collections input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    }
  },
  "additionalProperties": false
}
list_collections output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_collections annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_collection — Get collection
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get a single collection by ID, including its post count.

get_collection input schema
{
  "type": "object",
  "required": [
    "blogId",
    "collectionId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "collectionId": {
      "type": "string",
      "minLength": 1,
      "description": "Collection ID."
    }
  },
  "additionalProperties": false
}
get_collection output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_collection annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_collection — Create collection
Advertised by the server during the last successful anonymous check.
Open-world

Create a new collection with name, slug, and optional description.

create_collection input schema
{
  "type": "object",
  "required": [
    "blogId",
    "name",
    "slug"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 32,
      "minLength": 1,
      "description": "Collection name."
    },
    "slug": {
      "type": "string",
      "pattern": "^\\s*(?:$|(?=[a-zA-Z0-9_-]{1,32}\\s*$)(?!(?:[aA][dD][mM][iI][nN]|[lL][oO][gG][iI][nN]|[sS][iI][gG][nN][uU][pP]|[aA][pP][iI]|[aA][sS][sS][eE][tT][sS]|[rR][oO][bB][oO][tT][sS]\\.[tT][xX][tT]|[sS][iI][tT][eE][mM][aA][pP]\\.[xX][mM][lL]|[sS][iI][tT][eE][mM][aA][pP]-[iI][nN][dD][eE][xX]\\.[xX][mM][lL]|[fF][eE][eE][dD]|[rR][sS][sS]|[tT][aA][gG][sS]|[tT][aA][gG]|[cC][oO][lL][lL][eE][cC][tT][iI][oO][nN][sS]|[cC][oO][lL][lL][eE][cC][tT][iI][oO][nN]|[pP][aA][gG][eE][sS]|[pP][aA][gG][eE]|[sS][iI][tT][eE][mM][aA][pP]|[sS][iI][tT][eE][mM][aA][pP][sS]|[sS][eE][aA][rR][cC][hH]|[dD][aA][sS][hH][bB][oO][aA][rR][dD]|[sS][eE][tT][tT][iI][nN][gG][sS]|[pP][rR][oO][fF][iI][lL][eE]|[aA][uU][tT][hH][oO][rR][sS])\\s*$)(?!.*--)[a-zA-Z0-9](?:[a-zA-Z0-9_-]*[a-zA-Z0-9])?)\\s*$",
      "description": "Collection slug."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "description": {
      "type": "string",
      "maxLength": 256,
      "description": "Optional collection description."
    }
  },
  "additionalProperties": false
}
create_collection output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
create_collection annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
update_collection — Update collection
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Update an existing collection's name, slug, or description.

update_collection input schema
{
  "type": "object",
  "required": [
    "blogId",
    "collectionId"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 32,
      "minLength": 1,
      "description": "Updated collection name."
    },
    "slug": {
      "type": "string",
      "pattern": "^\\s*(?:$|(?=[a-zA-Z0-9_-]{1,32}\\s*$)(?!(?:[aA][dD][mM][iI][nN]|[lL][oO][gG][iI][nN]|[sS][iI][gG][nN][uU][pP]|[aA][pP][iI]|[aA][sS][sS][eE][tT][sS]|[rR][oO][bB][oO][tT][sS]\\.[tT][xX][tT]|[sS][iI][tT][eE][mM][aA][pP]\\.[xX][mM][lL]|[sS][iI][tT][eE][mM][aA][pP]-[iI][nN][dD][eE][xX]\\.[xX][mM][lL]|[fF][eE][eE][dD]|[rR][sS][sS]|[tT][aA][gG][sS]|[tT][aA][gG]|[cC][oO][lL][lL][eE][cC][tT][iI][oO][nN][sS]|[cC][oO][lL][lL][eE][cC][tT][iI][oO][nN]|[pP][aA][gG][eE][sS]|[pP][aA][gG][eE]|[sS][iI][tT][eE][mM][aA][pP]|[sS][iI][tT][eE][mM][aA][pP][sS]|[sS][eE][aA][rR][cC][hH]|[dD][aA][sS][hH][bB][oO][aA][rR][dD]|[sS][eE][tT][tT][iI][nN][gG][sS]|[pP][rR][oO][fF][iI][lL][eE]|[aA][uU][tT][hH][oO][rR][sS])\\s*$)(?!.*--)[a-zA-Z0-9](?:[a-zA-Z0-9_-]*[a-zA-Z0-9])?)\\s*$",
      "description": "Updated collection slug."
    },
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "description": {
      "type": "string",
      "maxLength": 256,
      "description": "Updated collection description."
    },
    "collectionId": {
      "type": "string",
      "minLength": 1,
      "description": "Collection ID."
    }
  },
  "additionalProperties": false
}
update_collection output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
update_collection annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
delete_collection — Delete collection
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Delete a collection by ID and optionally reassign its posts to another collection.

delete_collection input schema
{
  "type": "object",
  "required": [
    "blogId",
    "collectionId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "reassign_to": {
      "type": "string",
      "minLength": 1,
      "description": "Optional collection ID that should receive the deleted collection's posts."
    },
    "collectionId": {
      "type": "string",
      "minLength": 1,
      "description": "Collection ID."
    }
  },
  "additionalProperties": false
}
delete_collection output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
delete_collection annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
list_content_revisions — List content revisions
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the saved revision history for a post or page. Returns revision metadata without full snapshots.

list_content_revisions input schema
{
  "type": "object",
  "required": [
    "blogId",
    "contentType",
    "contentId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "contentId": {
      "type": "string",
      "minLength": 1,
      "description": "Post or page ID."
    },
    "contentType": {
      "enum": [
        "post",
        "page"
      ],
      "type": "string",
      "description": "Content type."
    }
  },
  "additionalProperties": false
}
list_content_revisions output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_content_revisions annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_content_revision — Get content revision
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get one saved post or page revision, including its complete content snapshot.

get_content_revision input schema
{
  "type": "object",
  "required": [
    "blogId",
    "contentType",
    "contentId",
    "revisionId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "contentId": {
      "type": "string",
      "minLength": 1,
      "description": "Post or page ID."
    },
    "revisionId": {
      "type": "string",
      "minLength": 1,
      "description": "Revision ID from list_content_revisions."
    },
    "contentType": {
      "enum": [
        "post",
        "page"
      ],
      "type": "string",
      "description": "Content type."
    }
  },
  "additionalProperties": false
}
get_content_revision output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_content_revision annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_content_reviews — List content reviews
Advertised by the server during the last successful anonymous check.
Advertised read-only

List content review requests for a blog, filtered by status.

list_content_reviews input schema
{
  "type": "object",
  "required": [
    "blogId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "status": {
      "enum": [
        "pending",
        "approved",
        "changes_requested",
        "superseded"
      ],
      "type": "string",
      "default": "pending",
      "description": "Review status. Default: pending."
    }
  },
  "additionalProperties": false
}
list_content_reviews output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
list_content_reviews annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_latest_content_review — Get latest content review
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the latest review associated with the newest saved revision of a post or page.

get_latest_content_review input schema
{
  "type": "object",
  "required": [
    "blogId",
    "contentType",
    "contentId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "contentId": {
      "type": "string",
      "minLength": 1,
      "description": "Post or page ID."
    },
    "contentType": {
      "enum": [
        "post",
        "page"
      ],
      "type": "string",
      "description": "Content type."
    }
  },
  "additionalProperties": false
}
get_latest_content_review output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
get_latest_content_review annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_content_review — Submit content review
Advertised by the server during the last successful anonymous check.
Open-world

Submit the latest saved revision of a draft post or page for review.

submit_content_review input schema
{
  "type": "object",
  "required": [
    "blogId",
    "contentType",
    "contentId"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "comment": {
      "type": "string",
      "maxLength": 2000,
      "description": "Optional review comment. Maximum 2,000 characters."
    },
    "contentId": {
      "type": "string",
      "minLength": 1,
      "description": "Post or page ID."
    },
    "contentType": {
      "enum": [
        "post",
        "page"
      ],
      "type": "string",
      "description": "Content type."
    }
  },
  "additionalProperties": false
}
submit_content_review output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
submit_content_review annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
decide_content_review — Decide content review
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

Approve a pending content review or request changes. Approving a staged update to published content applies that revision.

decide_content_review input schema
{
  "type": "object",
  "required": [
    "blogId",
    "reviewId",
    "decision"
  ],
  "properties": {
    "blogId": {
      "type": "string",
      "minLength": 1,
      "description": "Blog ID. Use list_blogs to discover available blog IDs."
    },
    "comment": {
      "type": "string",
      "maxLength": 2000,
      "description": "Review comment. Required when requesting changes; maximum 2,000 characters."
    },
    "decision": {
      "enum": [
        "approved",
        "changes_requested"
      ],
      "type": "string",
      "description": "Review decision."
    },
    "reviewId": {
      "type": "string",
      "minLength": 1,
      "description": "Review ID from list_content_reviews."
    }
  },
  "additionalProperties": false
}
decide_content_review output schema
{
  "type": "object",
  "required": [
    "result"
  ],
  "properties": {
    "result": {}
  },
  "additionalProperties": false
}
decide_content_review annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

JustBlogged agent guide — JustBlogged agent guide

Advertised by the server during the last successful anonymous check.

Product scope, when-to-use guidance, developer references, and safe MCP usage.

JustBlogged agent guide URI
https://justblogged.com/llms.txt

MIME type: text/markdown

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1106 ms
95th percentile latency
1106 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1106 ms · metadata changed · refuses unauthenticated resources/templates/list (HTTP 401)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http justblogged-mcp https://justblogged.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add justblogged-mcp --url https://justblogged.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable justblogged-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "justblogged-mcp": {
      "url": "https://justblogged.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "justblogged-mcp": {
      "type": "streamableHttp",
      "url": "https://justblogged.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start justblogged-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "justblogged-mcp": {
      "type": "http",
      "url": "https://justblogged.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http justblogged-mcp https://justblogged.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://justblogged.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "justblogged-mcp": {
      "serverUrl": "https://justblogged.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like JustBlogged MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.