Skip to content

Polyblog Multilingual Blog

by polyblog.io · remote · no sign-in to list tools · v0.1.1 · published by io.polyblog

Write, translate and publish blog articles, plan topic ideas and check each blog's languages.

Deletes · 8Changes · 1

19 tools: 8 can delete or cancel things, 1 change things and 10 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http polyblog https://mcp.polyblog.io/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "open_polyblog" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "open_polyblog" says "open": a word for a change.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

19 tools

Deletes or cancels 8Claude Code: deny
  • create_articleUse this when someone gives you a finished blog post, or a translation of one, to save in their blog.No findings

    Why it is in this group

    • The name "create_article" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone gives you a finished blog post, or a translation of one, to save in their blog. Returns the new post's id, title, slug, language and published state; it stays a draft unless published is true. A translation is saved with the original's id as originalArticleId and its own locale. Not for writing a post with AI.

    Annotations the server declares

    • title: Save a blog post
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • create_blogUse this when someone asks to start a new blog in Polyblog with a given name and languages.No findings

    Why it is in this group

    • The name "create_blog" says "create": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks to start a new blog in Polyblog with a given name and languages. Returns the new blog's id, name, domain and languages; the name becomes the public <name>.polyblog.io subdomain, so a name already taken fails. Not for adding a post to an existing blog.

    Annotations the server declares

    • title: Create a new blog
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • delete_articleUse this when someone asks to permanently delete a blog post in every language.No findings

    Why it is in this group

    • The name "delete_article" says "delete": a word for removing or ending something.
    • The description says "permanently delete".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks to permanently delete a blog post in every language. Given the original post's id, that post and all its translations are deleted and their pages go offline; given a translation's own id, nothing is deleted although the result still says deleted. Returns the id. Not for unpublishing.

    Annotations the server declares

    • title: Delete a blog post
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: true
  • generate_articleUse this when someone asks you to write a new blog post on a topic or saved topic idea.No findings

    Why it is in this group

    • The name "generate_article" says "generate": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks you to write a new blog post on a topic or saved topic idea. Returns the draft's id, URL, title, word count and internal links (text only; published only with autoPublish). It uses paid AI and can take about a minute, and a call that times out can still save the draft. Not for saving your own text.

    Annotations the server declares

    • title: Draft a blog post with AI
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • refresh_topic_ideasUse this when someone asks for new blog topic ideas from Reddit or RSS feeds.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks for new blog topic ideas from Reddit or RSS feeds. Returns counts and up to 5 of the saved ideas; it fetches the sources, scores candidates with paid AI and saves those that pass. Not for ideas already saved.

    Annotations the server declares

    • title: Find new topic ideas
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
  • set_topic_idea_statusUse this when someone asks to mark a topic idea as used, dismiss it, or bring it back as new.No findings

    Why it is in this group

    • The name "set_topic_idea_status" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks to mark a topic idea as used, dismiss it, or bring it back as new. Returns the idea with its new status and, when given, the article it produced; nothing else about the idea changes. Not for editing an idea's title or angle.

    Annotations the server declares

    • title: Mark a topic idea used or dismissed
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • set_topic_sourcesUse this when someone asks to choose which subreddits or RSS feeds their blog's topic research reads.No findings

    Why it is in this group

    • The name "set_topic_sources" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks to choose which subreddits or RSS feeds their blog's topic research reads. Returns the saved sources; each list passed replaces the old one, and clear removes them all. Not for fetching ideas now.

    Annotations the server declares

    • title: Set topic research sources
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • update_articleUse this when someone asks to change a blog post's title, text, summary, slug, author or categories, or to publish or unpublish it.No findings

    Why it is in this group

    • The name "update_article" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Use this when someone asks to change a blog post's title, text, summary, slug, author or categories, or to publish or unpublish it. Returns the updated post; only the fields passed change, and each edit notifies the blog's webhooks. Not for adding a translation.

    Annotations the server declares

    • title: Edit a blog post
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: true
Changes things 1Claude Code: ask
  • open_polyblogUse this when someone wants to open their PolyBlog library and browse blogs and articles in an interactive workspace.1 finding

    Why it is in this group

    • The name "open_polyblog" says "open": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "open_polyblog" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "open_polyblog" says "open": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Use this when someone wants to open their PolyBlog library and browse blogs and articles in an interactive workspace. Starts with up to 25 blogs; the view supports pagination and reading articles. Not for creating or publishing content.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 10Claude Code: allow
  • get_articleUse this when someone wants to read, check or quote one blog post.No findings

    Why it is in this group

    • The name "get_article" says "get": a word for reading.
    Description, as the server wrote it
    Use this when someone wants to read, check or quote one blog post. Returns its title, summary, language, slug, blog, author, published state, dates and up to 8,000 characters of content, looked up by id or by slug plus language. Not for a visual preview card.

    Annotations the server declares

    • title: Read a blog post
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_blogUse this when someone asks about one blog's setup, such as its domain, default language or languages.No findings

    Why it is in this group

    • The name "get_blog" says "get": a word for reading.
    Description, as the server wrote it
    Use this when someone asks about one blog's setup, such as its domain, default language or languages. Returns the blog's id, name, custom domain, default locale, locales, cover image URL and dates, by id or name. Not for a visual overview with recent posts.

    Annotations the server declares

    • title: Get blog details
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_blog_localization_summaryUse this when someone asks how well their blog is translated, or which languages are missing posts.No findings

    Why it is in this group

    • The name "get_blog_localization_summary" says "get": a word for reading.
    Description, as the server wrote it
    Use this when someone asks how well their blog is translated, or which languages are missing posts. Returns per-language counts of posts, published posts and drafts with a coverage percentage, from the 100 most recently edited posts. Not for one post's translations.

    Annotations the server declares

    • title: Check blog translation coverage
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • get_sitemap_urlsUse this when someone asks what pages their blog's sitemap lists, or which pages are available to link to.No findings

    Why it is in this group

    • The name "get_sitemap_urls" says "get": a word for reading.
    Description, as the server wrote it
    Use this when someone asks what pages their blog's sitemap lists, or which pages are available to link to. Returns the sitemap's URL count and the first 25 URLs with language and last-modified date, read live from the blog's custom domain. Not for the posts stored in Polyblog.

    Annotations the server declares

    • title: Check a blog's sitemap
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • list_article_translationsUse this when someone asks which languages a blog post exists in, or which translations are still missing.No findings

    Why it is in this group

    • The name "list_article_translations" says "list": a word for reading.
    Description, as the server wrote it
    Use this when someone asks which languages a blog post exists in, or which translations are still missing. Returns each language version sharing the original article id, up to 100, with title, slug, published state and how it was translated; with blogId it also lists the blog's missing languages. Not for a whole blog's coverage.

    Annotations the server declares

    • title: List a post's translations
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_blogsUse this when someone asks which blogs they have in Polyblog, or a blog's id is needed.No findings

    Why it is in this group

    • The name "list_blogs" says "list": a word for reading.
    Description, as the server wrote it
    Use this when someone asks which blogs they have in Polyblog, or a blog's id is needed. Returns each blog's id, name and custom domain, 25 per page by default with a cursor. Not for a blog's posts.

    Annotations the server declares

    • title: List your blogs
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • list_topic_ideasUse this when someone asks what they could write about next from topic ideas already saved.No findings

    Why it is in this group

    • The name "list_topic_ideas" says "list": a word for reading.
    Description, as the server wrote it
    Use this when someone asks what they could write about next from topic ideas already saved. Returns each idea's id, score out of 10, title, status and source, filtered by status or minimum score, 25 per page by default. Not for fetching new ideas.

    Annotations the server declares

    • title: List saved topic ideas
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • search_articlesUse this when someone asks to see their blog posts, drafts or published articles, optionally for one blog, language or slug.No findings

    Why it is in this group

    • The name "search_articles" says "search": a word for reading.
    Description, as the server wrote it
    Use this when someone asks to see their blog posts, drafts or published articles, optionally for one blog, language or slug. Returns id, title, language, slug and published state, most recently edited first, 25 per page by default with a cursor. It filters by those fields and does not search the text. Not for reading a post.

    Annotations the server declares

    • title: Find blog posts
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • show_article_previewUse this when someone wants to see how one blog post looks, with its status and details.No findings

    Why it is in this group

    • The name "show_article_preview" says "show": a word for reading.
    Description, as the server wrote it
    Use this when someone wants to see how one blog post looks, with its status and details. Returns a preview card with the post's title, language, published state, metadata and up to 6,000 characters of content. Not for finding posts.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Preview a blog post
  • show_blog_overviewUse this when someone wants a quick overview of one of their blogs.No findings

    Why it is in this group

    • The name "show_blog_overview" says "show": a word for reading.
    Description, as the server wrote it
    Use this when someone wants a quick overview of one of their blogs. Returns an overview card with the blog's domain, languages and up to 10 most recently edited posts. Not for translation coverage.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Show blog overview

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.1.1. Values in angle brackets are yours to fill in.

claude mcp add --transport http polyblog https://mcp.polyblog.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__polyblog__search_articles",
      "mcp__polyblog__get_article",
      "mcp__polyblog__list_article_translations",
      "mcp__polyblog__list_blogs",
      "mcp__polyblog__get_blog",
      "mcp__polyblog__get_blog_localization_summary",
      "mcp__polyblog__get_sitemap_urls",
      "mcp__polyblog__list_topic_ideas",
      "mcp__polyblog__show_blog_overview",
      "mcp__polyblog__show_article_preview"
    ],
    "ask": [
      "mcp__polyblog__open_polyblog"
    ],
    "deny": [
      "mcp__polyblog__create_article",
      "mcp__polyblog__update_article",
      "mcp__polyblog__delete_article",
      "mcp__polyblog__generate_article",
      "mcp__polyblog__create_blog",
      "mcp__polyblog__refresh_topic_ideas",
      "mcp__polyblog__set_topic_idea_status",
      "mcp__polyblog__set_topic_sources"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as polyblog. Review it before you use it.