Key Takeaways

  • A Claude content calendar assistant handles topic ideation, brief generation, first-draft writing, and SEO optimisation in a single integrated workflow
  • The system works best as a human-in-the-loop accelerator, not a fully automated publishing pipeline โ€” humans make editorial decisions, Claude executes them
  • Prompt caching on your brand voice and content strategy guidelines reduces API costs by 60โ€“80% on high-volume content operations
  • CMS integration via MCP (WordPress, HubSpot, Contentful) turns standalone scripts into a seamless editorial workflow
  • Structured outputs (JSON) are essential for calendar management โ€” never parse free-text for scheduling decisions

What You Are Building

A Claude content calendar assistant is not a chatbot you ask to "write me a blog post." It is a structured system with four distinct capabilities: a topic planning engine that generates and prioritises content ideas based on your keyword strategy and competitive gaps; a brief generator that turns approved topics into detailed content briefs; a writing assistant that produces structured drafts aligned to your brand voice; and an SEO optimiser that refines drafts for target keywords and readability.

These four capabilities can be deployed independently or as an integrated pipeline. Most teams start with topic planning and brief generation โ€” the highest leverage activities โ€” before extending into AI-assisted drafting. Our Claude API integration service has deployed this system for B2B marketing teams, content agencies, and publisher groups. If you want a configured deployment rather than building from code, book a call with our architects.

This tutorial uses the Claude API directly. Teams already using Claude Cowork can deploy a simpler version of this workflow using Cowork's built-in connectors โ€” see our Claude Cowork for marketing teams guide for the no-code approach.

System Design: Human-in-the-Loop Content Operations

The most important architectural decision in a Claude content calendar assistant is where humans stay in the loop. Fully automated pipelines โ€” Claude generates, Claude publishes โ€” produce content that is technically correct but editorially undifferentiated. The teams getting the best results use Claude to dramatically accelerate human editorial work, not to replace it.

Stage Who Does It Claude's Role Human Touchpoint
Topic Ideation Claude Generates 20+ topic ideas per week based on keyword gaps, competitor analysis, and content calendar Editor approves or rejects topics (5 min)
Brief Creation Claude Builds full content brief: angle, H1/H2s, target keyword, word count, CTA, internal links Editor reviews and adjusts brief (10 min)
First Draft Claude Writes complete draft aligned to brief and brand voice guidelines Writer edits for voice, accuracy, differentiation (30 min)
SEO Optimisation Claude Checks keyword density, meta description, internal link suggestions, readability Writer implements recommended changes (15 min)
Publication Claude Formats and publishes to CMS via MCP connector Editor does final check before scheduling (5 min)

Building the Topic Planning Engine

Topic planning is the highest-leverage application of Claude in a content workflow. Instead of brainstorming in a spreadsheet, you describe your content strategy โ€” audience, competitive positioning, keyword priorities, what you have already published โ€” and Claude generates prioritised ideas with rationale.

The key is providing rich context. Claude's topic suggestions are only as good as the strategic context you feed it. Before building your prompt, collect: your target keyword clusters, your top 5 competitor blogs, your existing content inventory (titles and URLs), and your audience personas. This becomes part of your system prompt, and with prompt caching, you only pay for this context once per cache window.

Python ยท Topic Planning Engine
import anthropic
import json
from datetime import datetime

client = anthropic.Anthropic()

CONTENT_STRATEGY_CONTEXT = """
COMPANY: B2B SaaS โ€” project management platform for engineering teams
TARGET AUDIENCE: VP Engineering, CTO, Engineering Managers at companies with 50-500 engineers
CONTENT GOAL: Organic traffic + demo pipeline for enterprise tier

KEYWORD CLUSTERS TO TARGET:
- Engineering team productivity
- Software development best practices
- Engineering metrics and KPIs
- Agile at scale / SAFe alternatives
- Dev tooling and integration

EXISTING CONTENT (do not suggest duplicates):
- "How to measure developer productivity without surveillance" (published Jan 2026)
- "Engineering OKRs: What actually works" (published Feb 2026)
- "Why sprint velocity is a vanity metric" (published Mar 2026)

COMPETITOR CONTENT GAPS (topics they haven't covered well):
- AI-assisted engineering planning
- Cross-team dependency management
- Incident post-mortem processes
"""

def generate_topic_ideas(
    week_start: str,
    num_ideas: int = 20,
    content_types: list = None
) -> dict:
    """Generate prioritised content topic ideas for the week."""

    if content_types is None:
        content_types = ["long-form blog", "tutorial", "comparison", "opinion"]

    response = client.messages.create(
        model="claude-sonnet-4-6",
        max_tokens=3000,
        system=f"""You are a B2B content strategist. Generate content topic ideas
based on the company's content strategy context.
Always return valid JSON matching this structure:
{{
  "week": "YYYY-MM-DD",
  "topics": [
    {{
      "title": "SEO-optimised article title",
      "type": "content type",
      "primary_keyword": "target keyword",
      "search_volume_estimate": "low/medium/high",
      "difficulty": "low/medium/high",
      "angle": "unique angle or hook",
      "rationale": "why this topic, why now",
      "priority": 1-5
    }}
  ]
}}
{CONTENT_STRATEGY_CONTEXT}""",
        messages=[{
            "role": "user",
            "content": f"""Generate {num_ideas} content topic ideas for the week of {week_start}.

Content types to include: {', '.join(content_types)}

Prioritise topics that:
1. Target high-value keywords with manageable competition
2. Address our identified competitor gaps
3. Connect to demo conversion (not just traffic)
4. Build on our existing content (internal link opportunities)

Return JSON only."""
        }]
    )

    try:
        return json.loads(response.content[0].text)
    except json.JSONDecodeError:
        # Handle markdown-wrapped JSON
        text = response.content[0].text
        start = text.find('{')
        end = text.rfind('}') + 1
        return json.loads(text[start:end])

# Generate ideas for next week
ideas = generate_topic_ideas(
    week_start="2026-04-06",
    num_ideas=20
)

print(f"Generated {len(ideas['topics'])} topic ideas")
for i, topic in enumerate(ideas['topics'][:5], 1):
    print(f"{i}. [{topic['priority']}/5] {topic['title']}")
    print(f"   Keyword: {topic['primary_keyword']} | {topic['search_volume_estimate']} volume")

Generating Content Briefs

A content brief is the contract between the planning process and the writing process. It specifies the target keyword, the intended angle, the H2 structure, the word count, the internal links to include, the primary CTA, and the target audience. A good brief takes 2 hours to write manually. Claude generates an equivalent brief in 30 seconds.

The brief generation prompt should include your SEO guidelines, your internal link inventory, and any mandatory elements (CTAs to specific pages, product mentions, compliance disclaimers). These become part of the cached system prompt if you are running high-volume content operations. For the implementation details on prompt caching for high-volume applications, see our dedicated guide.

Python ยท Content Brief Generator def generate_content_brief(topic: dict) -> dict: """Generate a detailed content brief from an approved topic.""" internal_link_inventory = [ {"title": "How to measure developer productivity", "url": "/blog/developer-productivity"}, {"title": "Engineering OKRs guide", "url": "/blog/engineering-okrs"}, {"title": "Product demo page", "url": "/demo"}, {"title": "Enterprise pricing", "url": "/pricing/enterprise"}, {"title": "Integration docs", "url": "/integrations"} ] response = client.messages.create( model="claude-sonnet-4-6", max_tokens=3000, system="""You are a senior content strategist. Generate comprehensive content briefs for B2B SaaS blog content. Return valid JSON only. Brief structure: title, meta_description (155 chars), h1, target_keyword, secondary_keywords, word_count_target, audience, angle, h2_structure (list), key_points (list), internal_links (list with text and url), primary_cta, tone_notes, competitor_differentiation""", messages=[{ "role": "user", "content": f"""Generate a complete content brief for this approved topic: TOPIC: {topic['title']} PRIMARY KEYWORD: {topic['primary_keyword']} ANGLE: {topic['angle']} RATIONALE: {topic['rationale']} CONTENT TYPE: {topic['type']} INTERNAL LINK OPTIONS (select 3-5 most relevant): {json.dumps(internal_link_inventory, indent=2)} Requirements: - Target word count: 1,500-2,500 words - Include 3-5 internal links with descriptive anchor text - Primary CTA should drive demo bookings - H2 structure should follow the target keyword's search intent - Include a competitor differentiation section Return the complete brief as JSON.""" }] ) try: return json.loads(response.content[0].text) except json.JSONDecodeError: text = response.content[0].text start = text.find('{') end = text.rfind('}') + 1 return json.loads(text[start:end])

The Writing Assistant: From Brief to Draft

Draft generation is where brand voice becomes critical. Without explicit brand voice guidelines in the system prompt, Claude defaults to generic B2B writing โ€” professional but indistinguishable. Your brand voice prompt should describe your tone (formal/casual, technical/accessible), your forbidden phrases, your typical content structure, examples of content you consider "on-brand," and examples of content that misses the mark.

For teams with a defined brand voice document, that entire document becomes part of the cached system prompt. The investment in documenting your voice pays back in every AI-generated draft that lands closer to publishable without heavy editing.

Python ยท Brand-Voice-Aligned Draft Generator BRAND_VOICE_GUIDELINES = """ TONE: Direct, confident, slightly irreverent. We speak to senior engineers as peers, not customers. We challenge conventional wisdom when we have data. VOICE PATTERNS WE USE: - Start with a counterintuitive claim or uncomfortable truth - Back claims with specific data or concrete examples - Use "you" and "your team" โ€” never "organisations" or "companies" - Short sentences for emphasis. Longer sentences for explanation and nuance. - We name bad practices directly ("velocity tracking is a trap") rather than being diplomatic FORBIDDEN PHRASES: - "In today's fast-paced environment" - "Leverage" (use "use") - "Empower your team" (use "give your team") - "Holistic approach" - "Best-in-class" CONTENT STRUCTURE WE USE: - Hook in first 2 sentences (challenge an assumption or state the cost of the status quo) - Position early (what we believe and why) - Practical guidance (concrete, specific, numbered or bulleted) - Internal links woven naturally into content, not forced at end - CTA in context, not just at the end """ def generate_draft(brief: dict) -> str: """Generate a first draft aligned to the content brief and brand voice.""" response = client.messages.create( model="claude-opus-4-6", max_tokens=5000, system=f"""You are a senior B2B content writer for an engineering productivity platform. Write in our exact brand voice. Produce complete, publish-near-ready drafts. {BRAND_VOICE_GUIDELINES}""", messages=[{ "role": "user", "content": f"""Write a complete first draft based on this content brief: {json.dumps(brief, indent=2)} Requirements: - Hit the target word count ({brief.get('word_count_target', '1800-2200 words')}) - Use the exact H1 and H2 structure from the brief - Weave in all specified internal links naturally - Include the primary CTA in context (not just at the end) - End with a standalone conclusion that works as a TL;DR for scanners Write the complete article now.""" }] ) return response.content[0].text

Model Selection for Content Workflows

  • Topic ideation and brief generation: Claude Sonnet 4.6 โ€” fast, cost-effective, sufficient quality
  • First draft writing: Claude Opus 4.6 โ€” highest quality prose, worth the cost on pieces that will drive significant traffic
  • SEO review and meta descriptions: Claude Haiku 4.5 โ€” simple pattern-matching task, use the cheapest model
  • High-volume content operations (100+ pieces/month): Enable prompt caching on system prompts to reduce costs 60-80%

SEO Optimisation Pass

The SEO optimisation stage runs after the human editor has reviewed and revised the draft. It checks keyword usage, generates a meta description, suggests internal links that were missed, checks readability, and flags any on-page SEO issues. This is a fast, mechanical task โ€” ideal for Claude Haiku to minimise cost.

Python ยท SEO Optimisation Checker def run_seo_check(article_text: str, brief: dict) -> dict: """Run SEO optimisation check on the edited draft.""" response = client.messages.create( model="claude-haiku-4-5-20251001", max_tokens=2000, system="""You are an SEO specialist. Analyse articles and return structured SEO feedback. Return JSON only with this structure: { "meta_description": "155-character meta description", "title_tag": "optimised page title (60 chars max)", "keyword_density": {"primary": 0.0, "assessment": ""}, "readability": {"score": "", "issues": []}, "missing_internal_links": [], "missing_secondary_keywords": [], "seo_issues": [], "h2_keyword_alignment": {"score": "", "notes": ""}, "overall_seo_score": 0 }""", messages=[{ "role": "user", "content": f"""Analyse this article for SEO: TARGET KEYWORD: {brief.get('target_keyword', '')} SECONDARY KEYWORDS: {brief.get('secondary_keywords', [])} TARGET INTERNAL LINKS: {brief.get('internal_links', [])} ARTICLE: {article_text[:4000]} Return SEO analysis as JSON.""" }] ) try: return json.loads(response.content[0].text) except json.JSONDecodeError: text = response.content[0].text start = text.find('{') end = text.rfind('}') + 1 return json.loads(text[start:end])

CMS Integration via MCP

Publishing manually โ€” copy-pasting from a document into your CMS โ€” is the step that turns a 10-minute final review into a 45-minute formatting exercise. MCP server integration eliminates this. Claude reads the finished article from your document management system, applies your CMS's formatting requirements, and publishes as a draft for final editorial review.

Our MCP server development service builds custom connectors for WordPress, HubSpot CMS, Contentful, Webflow, and Ghost. The connector handles format conversion (Markdown to HTML or your CMS's native format), featured image association, category and tag assignment, and internal link validation before publishing. See the MCP enterprise guide for the full architecture pattern.

Assembling the Full Content Pipeline

Weekly Topic Generation

Claude generates 20 prioritised topic ideas every Monday. Editor reviews and approves 3โ€“5 for the week in a 10-minute session.

Brief Generation

For each approved topic, Claude generates a complete content brief in 30 seconds. Editor reviews and adjusts the H2 structure and angle.

First Draft

Writer triggers draft generation from the approved brief. Claude Opus produces a 2,000-word first draft in 45 seconds. Writer edits for 30 minutes.

SEO Review

Automated SEO check runs on the edited draft. Claude Haiku surfaces keyword gaps, missing internal links, and meta description suggestions in 10 seconds.

CMS Publishing

Approved article publishes to CMS as a draft via MCP connector. Editor does final check in the CMS and schedules publication.

What Teams Actually Experience

Based on deployments across B2B SaaS, professional services, and publisher groups, here is what teams report after 60 days operating the full Claude content calendar assistant pipeline.

  • Content planning time: Reduced from 6 hours/week to 45 minutes โ€” topic generation, brief writing, and scheduling all handled by Claude
  • Draft-to-publish time: Down from 3โ€“5 days to 1โ€“2 days โ€” the draft is good enough to edit, not rebuild
  • Output volume: Most teams increase from 2โ€“3 pieces/week to 5โ€“8 pieces/week without adding headcount
  • SEO performance: Keyword targeting improves because briefs enforce targeting discipline that ad-hoc writing misses
  • API cost: ยฃ0.40โ€“ยฃ1.20 per complete article (topic to CMS draft) at Opus 4.6 rates with prompt caching

For the full picture on prompt caching implementation to reduce these costs, see our prompt caching for enterprise applications guide. For teams considering whether to use Claude Cowork's built-in approach versus building a custom API pipeline, our Cowork for marketing teams guide covers both approaches side-by-side.

If you want to deploy this system for your marketing team and get to production in 4โ€“6 weeks, our Claude API integration service includes the full pipeline with CMS integration and brand voice configuration. Book a free strategy call to scope your requirements.

Ready to Automate Your Content Operations?

Our Claude Certified Architects deploy content calendar systems with CMS integration in 4โ€“6 weeks. Book a free strategy call to scope your pipeline.

Book a Free Strategy Call โ†’
โœ๏ธ

ClaudeImplementation Team

Claude Certified Architects specialising in enterprise AI deployment. We have shipped Claude integrations across marketing, legal, financial services, and engineering teams โ€” and we publish everything we learn.

Related Articles