{
  "name": "io.github.BlogFactoryHQ/ghost-publisher-mcp",
  "description": "A community MCP for Ghost, the publishing platform behind a large share of independent newsletters and blogs. Twenty-four tools cover drafting, image upload, scheduling and publication — and every one that changes the site requires an explicit confirmation argument. `preview_changes` returns a before-snapshot plus a site-bound hash, and `apply_change_set` refuses to run without that exact hash. It is the strictest write model in this category.",
  "status": "active",
  "version": "latest",
  "_meta": {
    "com.top-mcps/lastVerified": "2026-09-17",
    "com.top-mcps/score": {
      "value": 59,
      "rubricVersion": "2026-09",
      "lastComputed": "2026-10-15T10:09:13.508Z",
      "methodology": "https://top-mcps.com/about/methodology"
    },
    "com.top-mcps/stats": {
      "fetchedAt": "2026-10-15T10:09:13.507Z",
      "githubStars": 0,
      "lastCommitAt": "2026-08-25T18:17:54Z",
      "npmWeeklyDownloads": 140,
      "githubFetchedAt": "2026-10-15T10:09:13.507Z",
      "npmFetchedAt": "2026-10-15T10:09:13.507Z",
      "githubRepo": "BlogFactoryHQ/ghost-publisher-mcp",
      "npmPackage": "ghost-publisher-mcp"
    }
  },
  "repository": {
    "url": "https://github.com/BlogFactoryHQ/ghost-publisher-mcp",
    "source": "github"
  },
  "homepage": "https://ghost.org/docs/admin-api/",
  "author": {
    "name": "Community (BlogFactoryHQ)"
  },
  "packages": [
    {
      "registryType": "npm",
      "registryBaseUrl": "https://registry.npmjs.org",
      "identifier": "ghost-publisher-mcp@latest",
      "version": "latest",
      "transport": {
        "type": "stdio"
      },
      "environmentVariables": [
        {
          "name": "GHOST_URL",
          "description": "GHOST_URL — required credential for Ghost.",
          "isRequired": true,
          "isSecret": true
        },
        {
          "name": "GHOST_ADMIN_API_KEY",
          "description": "GHOST_ADMIN_API_KEY — required credential for Ghost.",
          "isRequired": true,
          "isSecret": true
        },
        {
          "name": "GHOST_UPLOAD_ROOTS",
          "description": "GHOST_UPLOAD_ROOTS — required credential for Ghost.",
          "isRequired": true,
          "isSecret": true
        }
      ]
    }
  ],
  "capabilities": {
    "tools": [
      {
        "name": "check_connection",
        "description": "Verify Ghost authentication and report configured features without exposing secrets.",
        "sideEffect": "network"
      },
      {
        "name": "list_posts",
        "description": "List post records with IDs and updated_at values.",
        "sideEffect": "read"
      },
      {
        "name": "get_post",
        "description": "Read one post by ID or slug, including HTML, Lexical content and SEO metadata.",
        "sideEffect": "read"
      },
      {
        "name": "audit_content",
        "description": "Inspect up to 25 posts or pages for missing alt text, metadata, link and card problems.",
        "sideEffect": "read"
      },
      {
        "name": "check_site_health",
        "description": "Check published targets, canonicals and share prerequisites.",
        "sideEffect": "network"
      },
      {
        "name": "preview_changes",
        "description": "Return before-snapshots, field impact and a site-bound preview hash. Writes nothing.",
        "sideEffect": "read"
      },
      {
        "name": "apply_change_set",
        "description": "Apply a previewed batch. Requires the exact preview hash and approval scopes.",
        "sideEffect": "write"
      },
      {
        "name": "create_drafts",
        "description": "Create 1-10 posts as drafts from Markdown or native Ghost blocks.",
        "sideEffect": "write"
      },
      {
        "name": "upload_image",
        "description": "Upload a local image from inside GHOST_UPLOAD_ROOTS. Rejects remote URLs, SVG and symlink escapes.",
        "sideEffect": "write"
      },
      {
        "name": "plan_schedule",
        "description": "Convert a draft list and local start time into UTC timestamps with an HMAC-bound plan. Never writes.",
        "sideEffect": "read"
      },
      {
        "name": "schedule_posts",
        "description": "Schedule drafts for future publication. Requires the plan hash and user_confirmed=true.",
        "sideEffect": "write"
      },
      {
        "name": "publish_posts",
        "description": "Publish a version-checked batch after user_confirmed=true. Runs the deploy hook once.",
        "sideEffect": "write"
      },
      {
        "name": "trigger_deploy",
        "description": "POST once to the configured deploy hook. The URL cannot be supplied by the caller.",
        "sideEffect": "network"
      },
      {
        "name": "check_live_posts",
        "description": "Fetch the public URLs and verify status, title and rendered SEO metadata.",
        "sideEffect": "network"
      }
    ],
    "toolsListedCount": 14,
    "toolsReportedTotal": 24,
    "security": {
      "scope": "read-write",
      "sandbox": "No sandbox, but the preview-hash and user_confirmed gates mean no write happens without an explicit, change-set-specific approval.",
      "gotchas": [
        "A Ghost Admin API key is site-wide. The server's own gates are what constrain the agent, not the credential.",
        "The deploy-hook URL is configured server-side and cannot be passed by the caller — deliberate, and it means an agent cannot redirect the hook.",
        "Image uploads only work from paths inside `GHOST_UPLOAD_ROOTS`. An agent trying to attach an image it fetched from the web will fail, by design."
      ]
    }
  },
  "_links": {
    "html": "https://top-mcps.com/mcp/ghost",
    "markdown": "https://top-mcps.com/mcp/ghost.md",
    "methodology": "https://top-mcps.com/about/methodology"
  }
}
