DEV Community

Daniel Ainoko
Daniel Ainoko

Posted on

I Built an MCP That Publishes Your Blog to Every Platform With One Sentence to Claude

Notion MCP Challenge Submission 🧠

This is a submission for the Notion MCP Challenge


What I Built

Every developer I know has the same problem. They write a solid post, spend 20 minutes formatting it for Dev.to, copy-paste to Hashnode, re-upload the images that broke because Notion's CDN URLs expire, then give up on Medium entirely. The writing was the easy part. The publishing killed the momentum.

BlogCast MCP fixes that.

It's an open-source MCP server + dashboard that turns Notion into a publishing hub. Write once — in Notion or in the built-in rich text editor — then tell Claude to publish it everywhere.

"Publish my TypeScript post to Dev.to and Hashnode"
Enter fullscreen mode Exit fullscreen mode

That's it. One sentence. Done.

What it actually does:

  • Publishes to Dev.to, Hashnode, and Medium simultaneously
  • Handles Notion's expiring image URLs automatically (downloads → caches → re-uploads to each platform's CDN)
  • Adapts content per platform — Medium gets clean HTML, Dev.to/Hashnode get optimized Markdown
  • Syncs analytics back into Notion (views, reactions, comments — all in one place)
  • Schedules posts via Claude: "Schedule my React post for tomorrow at 9am UTC"
  • AI pre-publish checks — catches missing excerpts, vague titles, broken formatting before you hit send
  • Auto-configures Claude Desktop — no JSON editing required

The whole thing runs locally. No third-party servers, no SaaS fees, no data leaving your machine. Your API keys are stored encrypted on your device.


Video Demo


Show us the code

GitHub: github.com/TheCodeDaniel/blogcast_mcp

Built as a proper monorepo — three packages that work together:

Package What it does
mcp/ MCP server — the Claude integration layer
server/ Express backend — publishing, image caching, AI, scheduling
client/ React dashboard — write, publish, manage everything visually

Stack: TypeScript, Node.js, Express, React, Vite, TipTap editor, Anthropic SDK, Notion API.


How I Used Notion MCP

Notion sits at the center of this whole thing — not as a passive database, but as the living CMS.

The MCP server talks to Notion directly via @notionhq/client. When Claude calls publish_post, the server reads the Notion page blocks, converts them to Markdown using notion-to-md, handles all the images, pushes to each platform, then writes the results back into Notion — a linked Analytics database that tracks views, reactions, and comments per platform.

The Notion integration does five specific things:

  1. Posts database — every draft, scheduled post, and published article lives here. Status, tags, platforms, canonical URL — all tracked as Notion properties.

  2. Analytics database — a relational table linked to Posts. Every publish result is logged: URL, status (Success/Failed), and synced stats from each platform's API.

  3. Auto-migration — on first run, BlogCast patches both databases automatically. New user? You don't set up a single column manually. Just share your databases with the integration and BlogCast does the rest.

  4. Two-way sync — sync_analytics pulls the latest numbers from Dev.to and Hashnode back into Notion. Your post performance dashboard lives where you already work.

  5. Scheduling — set Scheduled At in Notion (or via Claude: "schedule this for Friday 9am"), and the backend polls every N minutes to auto-publish when the time comes.

The MCP layer is what makes Claude feel like a natural publishing assistant rather than a chatbot bolted onto a dashboard. You're not filling out forms — you're just talking.

"Show me what's in Review" → list_drafts
"Preview my latest draft" → preview_post
"Publish the TypeScript one to all platforms" → publish_post
"What's the view count on my last post?" → sync_analytics + get_publish_status

Everything that used to take 30 minutes of copy-paste and re-uploading now takes one message.

Top comments (0)