An update on my Blogging System

In January I wrote a post about why I was building my own blogging system instead of using one of the many that already exist. Ownership. Control. Multilingual linking. Allowing people to comment without registering. Then I posted nothing for months.
I thought the problem was the software or other commitments but the real blocker was the workflow. Writing a post meant opening the admin page or an app, finding or creating a header image before I could actually start writing.
So a few weeks ago I stopped adding features to the plugins and built an MCP server instead — a small process that lets Claude talk to the blog API directly and added image generation to it. Header and inline images are saved directly to the tenant's storage on Supabase.

This is a massive time saver. It doesn't mean I'm going to post AI-generated content as-is. It's more like a sounding board.
The server itself is small — thirteen functions, fixed for each tenant (site) so the same server reaches every blog without repeating the setup for each:
list_tenants— which blogs it's configured forlist_posts/get_post— browse and read, draft or publishedcreate_post/update_post— write and revise, markdown in, published or draftdelete_post— permanent, so it always asks firstlist_categories— the categories a site actually has, so nothing gets inventedgenerate_image— a text prompt straight to Gemini and into storage, header or inlineupload_image— a local file, same destinationimport_image_from_url— pull something already made elsewhere into the blog's own storage instead of hot-linking itcheck_post_images— fetch every image a post references and report which ones are still thereopen_post_editor/post_edit_url— open the draft in an external app when to be checked and polished
The MCP server talks to the same APIs (on my own server) that my own admin dashboard uses, so it's just another way to access the same functionality.

In Claude I added a plugin comprised of 4 skills, or sets of instructions Claude follows. Claude lists them alphabetically; this is the order they actually get used in.
/draft-blog-post drafts a post: it reads my prompt, researches anything that needs current facts, and writes in the voice that specific blog has actually used, not a generic one. It always saves as a draft; nothing goes live at that step.
/review-and-publish checks a draft before it goes out — every image, every link, whether the markdown will render the way I think it will — and only flips it to published once I say so, explicitly, every time.
/learn-blog-voice rereads what's already published every so often and rewrites the voice profile the other two draft against, so new posts don't drift from how I actually write as the blog grows.
/blog-setup is for when something breaks — the server's unreachable, a tenant's missing, credentials get rejected — and repairs the connection instead of leaving me to debug it myself.

The MCP server and the plugin help me to turn something I already have such as a note, an old article or a half-written idea — into a post, saved as a draft I can still have to read and edit before it's published.

Comments
No comments yet. Be the first to write one.