The Problem: Two Codebases, One Job
We had a content problem. Not a lack-of-ideas problem — a plumbing problem.
Our CRM (XCMagicCRM) had a full content pipeline: AI brainstorming, drafting, SEO metadata generation, newsletter adaptation, and Squarespace publishing. 1,228 lines of service code, 800+ lines of models, Celery tasks for scheduled publishing. It worked well — for one specific brand, on one specific platform.
Meanwhile, our EchoForgeX blog ran on a completely separate system: a Claude Code skill that generated posts and published via a WordPress REST API script. Different voice configuration, different publishing pipeline, different everything.
Same fundamental job — generate content and publish it — implemented twice, with zero code sharing.
The Extraction: Making It Generic
The AI Workforce initiative gave us the push to fix this properly. Instead of maintaining two content systems, we’d extract the best parts of both into a standalone, configurable content agent.
What We Took From Each
From XCMagicCRM, we extracted the intelligence layer:
- AI-powered brainstorming with structured output parsing
- Content drafting with research integration (notes, links, key points)
- Iterative improvement with targeted instructions
- SEO metadata generation with validation
- Blog-to-newsletter adaptation
- The full idea pipeline concept (idea → research → ready → draft → published)
From our /blog skill, we took the publishing pragmatism:
- WordPress REST API integration (the actual production-tested publishing code)
- Editorial voice guidelines that prevent AI slop
- The markdown-draft-as-source-of-truth pattern
- JSON payload generation for WordPress
The Hard Part: Making Brand Voice Configurable
The XCMagicCRM content service had brand voice and category context hardcoded as Python constants. “You write for Skyout Paragliding” was baked into every prompt. The EchoForgeX blog skill had its own hardcoded voice in a different format.
Our solution was a three-layer configuration system:
- Built-in defaults — generic professional voice that works out of the box
- Preset profiles — tech-blog, SaaS marketing, agency, e-commerce — each with tuned voice, categories, and settings
- Customer overrides — your specific brand voice, audience, style guide, and category definitions in a YAML file
Each layer deep-merges into the previous. You can start from a preset and override just the parts that matter. Environment variables (${WP_PASSWORD}) keep credentials out of config files.
Multi-Platform Publishing: The Architecture
The original codebases each published to exactly one platform. We needed a system that could publish the same post to WordPress, Dev.to, and a local markdown archive simultaneously.
We built an abstract Publisher interface with a registry pattern:
@register_publisher('wordpress')
class WordPressPublisher(Publisher):
def publish(self, title, body, excerpt, category, ...):
# WordPress REST API v2
...
@register_publisher('devto')
class DevToPublisher(Publisher):
def publish(self, title, body, excerpt, category, ...):
# Dev.to Forem API with canonical URL support
...
@register_publisher('markdown')
class MarkdownPublisher(Publisher):
def publish(self, title, body, excerpt, category, ...):
# Local files with YAML frontmatter
...
A factory function instantiates publishers from config, so adding a new platform is: write a class, decorate it, import it. No wiring changes needed.
Dev.to Integration: Canonical URLs for SEO
Cross-posting to Dev.to creates a duplicate content problem. Our Dev.to publisher automatically sets the canonical_url to point back to your primary blog, so search engines know which version to index. If your WordPress post is at blog.acme.com/my-post, the Dev.to version links back to it.
The MCP Server: 13 Tools for Content Creation
Everything is exposed via a Model Context Protocol (MCP) server. This means any MCP-compatible client — Claude Code, custom agents, or future integrations — can access the full content pipeline:
- Idea pipeline: brainstorm_topics, list_ideas, update_idea
- Content creation: draft_content, improve_content, generate_excerpt
- SEO: generate_seo (meta description + keywords with validation)
- Newsletter: adapt_for_newsletter
- Publishing: publish, unpublish, list_published, list_publishers
- Analytics: content_stats
A typical workflow looks like this:
- Brainstorm 5 topics for “AI automation trends”
- Pick the best idea, add research notes
- Draft the full post (AI uses your brand voice + research)
- Improve: “add more code examples in section 2”
- Generate SEO metadata and excerpt
- Publish to WordPress + Dev.to + local archive in one call
What used to take 4-8 hours now takes 30 minutes of review and refinement.
What We Learned
1. Brand Voice Is the Moat
Generic AI content is a commodity. The difference between “AI slop” and “our blog” is the voice configuration. We spent more time on the voice prompt engineering than on the publishing code. A good brand voice config — with audience, tone, style guide, and category context — makes AI output that your team would actually approve.
2. Extraction > Rewrite
We could have started from scratch. Instead, we extracted working code from two production systems. The XCMagicCRM content service had been refined over months of real usage. The WordPress publisher had survived Cloudflare edge cases and weird API behaviors. Starting from battle-tested code saved us from rediscovering every edge case.
3. Multi-Platform Publishing Is Table Stakes
Every content team we talked to publishes in at least two places. The technical implementation isn’t hard — it’s the abstraction that matters. Our publisher interface makes “add Medium support” a single-file PR, not an architectural change.
4. MCP Makes AI Tools Composable
By exposing the content pipeline as MCP tools, we get composability for free. The content generator can work with our Mail Triage Agent to turn FAQ emails into blog posts. It can feed the Campaign Designer for email sequences. Each agent is a building block, not a monolith.
Try It
The AI Content Writer is available now as part of the EchoForgeX AI Workforce. Phase 1 runs as an MCP server in your Claude Code environment — zero hosting cost, your data stays local.
Pricing starts at $79/month for the Starter tier (2 publishers, 200 AI ops/month), or it’s included in the Marketing Pod ($249/month) and Full Workforce ($549/month) bundles.
At EchoForgeX, we build AI-powered tools and help businesses integrate AI into their workflows. Get in touch to learn how we can help your team work smarter with AI.