Medium Blog MCP Server
Multi-source research engine that automatically gathers content from arXiv (academic papers) for blog writing.
Supports manual plagiarism checking workflow by allowing users to copy content chunks to Grammarly and record results.
Provides one-click export to Medium-ready markdown format with all assets, including images and citations.
Multi-source research engine that automatically gathers content from Wikipedia for blog writing.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Medium Blog MCP Server create a blog session about generative AI trends"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
š Medium Blog MCP Server
AI-powered blog generation system built with FastMCP. Automates research, content generation, quality checks, and Medium export for technical blog posts.
⨠Features
š Multi-Source Research: Automatically gathers content from Wikipedia, arXiv, web search, and images
š¤ AI Content Generation: Uses Claude API to generate high-quality blog posts
š Image Processing: Downloads and describes images with AI-generated descriptions
š Quality Analysis: Comprehensive readability, citation, and SEO checks
ā Plagiarism Tracking: Hybrid manual/automated plagiarism checking workflow
š¤ Medium Export: One-click export to Medium-ready markdown format
š¾ SQLite Storage: Persistent storage of all drafts and research
Related MCP server: blog-generator-mcp
šļø Architecture
Medium Blog MCP Server
āāā Research Engine (Wikipedia, arXiv, Web, Images)
āāā AI Content Generator (Claude API)
āāā Image Handler (Download + AI Description)
āāā Quality Analyzer (Readability, Citations, SEO)
āāā Medium Exporter (Markdown + Assets)
āāā SQLite Database (Sessions, Drafts, Research)š Prerequisites
Python 3.10+
Anthropic API Key (Get one here)
pip or conda
š Quick Start
1. Clone and Install
# Clone repository
git clone <your-repo-url>
cd medium-blog-mcp
# Activate virtual environment
uv init
uv sync
# Install dependencies
uv add -r requirements.txt
# use these uv commands to test , run mcp servers
Test the server - uv run fastmcp dev main.py
Run the server - uv run fastmcp run main.py
Add the server to claude desktop - uv run fastmcp install
claude-desktop main.py2. Configure Environment
# Copy environment template
cp .env.example .env
# Edit .env and add your DB URL
# DATABASE_URL=YOUR_SQLITE_DB_URL3. Run the Server
python main.pyThe MCP server will start and be available for Claude Desktop or other MCP clients.
š§ Configuration for Claude Desktop
Add to your Claude Desktop claude_desktop_config.json:
{
"mcpServers": {
"medium-blog-generator": {
"command": "[Your/Path/to/uv]",
"args": [
"--directory",
"C:\\medium_mcp",
"run",
"fastmcp",
"run",
"main.py"
],
"env": {},
"transport": "stdio",
"type": null,
"cwd": null,
"timeout": null,
"description": null,
"icon": null,
"authentication": null
}
}
}Config locations:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
š Complete Workflow
Step 1: Create Session
create_blog_session(topic="Latest AI Model Advancements", target_length="medium")Step 2: Research Phase ā USER CHECKPOINT
research_topic(session_id="abc123", depth="comprehensive")
get_research_summary(session_id="abc123") # Review research
approve_research(session_id="abc123") # Approve to continueStep 3: Outline Generation ā USER CHECKPOINT
generate_outline(session_id="abc123", style="technical", num_sections=5)
# Review outline, optionally modify
approve_outline(session_id="abc123")Step 4: Content Generation
generate_full_content(session_id="abc123")
get_full_draft(session_id="abc123") # Review full draftStep 5: Plagiarism Checking ā USER CHECKPOINT (Manual)
prepare_plagiarism_chunks(session_id="abc123")
# Copy chunks to Grammarly/QuillBot/GPTZero manually
record_plagiarism_result(session_id="abc123", chunk_id=1,
plagiarism_score=2.3, ai_detection_score=8.5,
tool_used="Grammarly")Step 6: Quality Analysis ā USER CHECKPOINT
run_quality_analysis(session_id="abc123") # Get detailed QA report
approve_final_draft(session_id="abc123") # Final approvalStep 7: Export to Medium
export_to_medium(session_id="abc123")š ļø Available MCP Tools
Session Management
create_blog_session- Start new blog projectget_session_status- Check progresslist_sessions- List all sessions
Research
research_topic- Multi-source researchget_research_summary- Review findingsadd_custom_source- Add manual sourcesapprove_research- ā Proceed to outline
Outline
generate_outline- AI-generated structuremodify_outline- Make changesapprove_outline- ā Proceed to writing
Content Generation
generate_full_content- Generate blogget_full_draft- Review contentregenerate_section- Improve specific section
Plagiarism Checking
prepare_plagiarism_chunks- Split for checkingrecord_plagiarism_result- ā Record manual checksget_plagiarism_summary- View all results
Quality & Export
run_quality_analysis- Comprehensive QAapprove_final_draft- ā Final approvalexport_to_medium- Generate export files
š Project Structure
medium-blog-mcp/
āāā main.py # FastMCP server (all tools)
āāā database.py # SQLAlchemy models & DB operations
āāā research.py # Multi-source research engine
āāā content_generator.py # Claude API content generation
āāā image_handler.py # Image download & AI descriptions
āāā quality.py # Quality analysis & readability
āāā exporter.py # Medium markdown export
āāā config.py # Configuration management
āāā requirements.txt # Python dependencies
āāā .env.example # Environment variables template
āāā README.md # This file
āāā data/ # Generated data (auto-created)
āāā blog_database.db # SQLite database
āāā sessions/ # Session-specific data
ā āāā {session_id}/
ā āāā images/ # Downloaded images
āāā exports/ # Final exports
ā āāā {session_id}/
ā āāā blog_post.md
ā āāā images/
ā āāā citations.txt
ā āāā metadata.json
ā āāā qa_report.txt
āāā images/ # Image storagešÆ Usage Example
Here's a complete example of generating a blog about AI models:
# 1. Create session
create_blog_session(topic="GPT-4 vs Claude 3: Technical Comparison", target_length="medium")
# Returns: {"session_id": "abc123", ...}
# 2. Research
research_topic(session_id="abc123", depth="comprehensive")
get_research_summary(session_id="abc123")
# Review the 15-20 sources gathered
approve_research(session_id="abc123")
# 3. Generate outline
generate_outline(session_id="abc123", style="technical", num_sections=5)
# Review outline structure
approve_outline(session_id="abc123")
# 4. Generate content
generate_full_content(session_id="abc123")
get_full_draft(session_id="abc123")
# Review the ~2500 word blog with images
# 5. Check plagiarism manually
prepare_plagiarism_chunks(session_id="abc123")
# Copy chunks to Grammarly, check, then:
record_plagiarism_result(session_id="abc123", chunk_id=1,
plagiarism_score=1.8, ai_detection_score=7.2,
tool_used="Grammarly")
# 6. Quality analysis
run_quality_analysis(session_id="abc123")
# Review QA report
approve_final_draft(session_id="abc123")
# 7. Export
export_to_medium(session_id="abc123")
# Get Medium-ready markdown + all assets!Total time: 30-45 minutes for a complete 2500-word blog!
š Quality Checks
The system automatically checks:
Readability
Flesch Reading Ease score
Flesch-Kincaid Grade Level
Average sentence length
Passive voice percentage
Citations
All sources properly cited
Citation format validation
Unused sources identified
Images
All images have descriptions
Alt text present
Proper placement
SEO
Title length (50-70 chars optimal)
Header hierarchy (H1, H2, H3)
Keyword presence
Meta information
Structure
Word count vs target
Section balance
Overall organization
š Database Schema
Tables
sessions - Blog sessions
research_sources - Research data
outlines - Generated outlines
blog_drafts - Blog content versions
images - Downloaded images
plagiarism_checks - Manual check results
quality_checks - QA reports
All data persists across sessions and can be resumed.
š Troubleshooting
Database Issues
# Reset database (WARNING: deletes all data)
rm data/blog_database.db
python main.py # Will recreate databaseImage Download Failures
Check internet connection
Some images may be behind authentication
System will create fallback descriptions
š Development Roadmap
Current Version (v1.0)
ā Multi-source research
ā AI content generation
ā Image processing
ā Quality analysis
ā Medium export
Future Enhancements (v2.0+)
š² Automated plagiarism APIs
š² Multiple format exports (HTML, PDF)
š² Note-taking app integrations (Obsidian, Notion)
š² Multi-blog management
š² SEO optimization suggestions
š² Social media snippet generation
š License
MIT License - feel free to use and modify for your needs.
š¤ Contributing
Contributions welcome! Please:
Fork the repository
Create a feature branch
Make your changes
Submit a pull request
š¬ Support
For issues or questions:
Open an issue on GitHub
Check the documentation
Review example workflows
š Credits
Built with:
FastMCP - MCP server framework
Anthropic Claude - AI content generation
SQLAlchemy - Database ORM
Various open-source research APIs
Happy blogging! š
Available Tools
23 toolsadd_custom_sourceAdd Custom SourceC
Add additional source manually
Inputs: url (required), session_id (required), source_type. Returns: object
approve_final_draftApprove Final DraftB
ā USER FINAL APPROVAL - Mark blog as ready for export
Inputs: session_id (required). Returns: object
approve_outlineApprove OutlineA
ā USER APPROVES outline to proceed with content generation
Inputs: session_id (required). Returns: object
approve_researchApprove ResearchC
ā USER APPROVES research to proceed to outline generation
Inputs: session_id (required), feedback. Returns: object
create_blog_sessionCreate Blog SessionC
Start a new blog writing session
Inputs: topic (required), target_length. Returns: object
export_to_mediumExport To MediumC
Export blog to Medium-ready markdown format
Creates:
Medium-formatted markdown file
Images folder with all images
Citations/References section
Metadata JSON
QA Report
Inputs: session_id (required). Returns: object
generate_full_contentGenerate Full ContentA
Generate complete blog post - Claude Desktop will write the blog based on outline
This tool provides the outline and research context. Claude (you) should:
Review the approved outline and research
Write the complete blog post in markdown
Call save_draft() with the generated content
Inputs: session_id (required). Returns: object
generate_outlineGenerate OutlineB
Generate blog outline - Claude Desktop will create the outline based on research
This tool provides the research context and instructions. Claude (you) should:
Review the research sources and images
Create a comprehensive outline in JSON format
Call save_outline() with the generated outline
Inputs: session_id (required), style, num_sections. Returns: object
get_export_filesGet Export FilesC
Retrieve all export files for download
Inputs: session_id (required). Returns: object
get_full_draftGet Full DraftA
Retrieve the complete generated blog post
Inputs: session_id (required). Returns: object
get_plagiarism_summaryGet Plagiarism SummaryC
Summary of all plagiarism checks performed
Inputs: session_id (required). Returns: object
get_research_summaryGet Research SummaryB
ā USER CHECKPOINT: Review all research before proceeding
Returns detailed summary of all sources, images, themes, and credibility scores
Inputs: session_id (required). Returns: object
get_session_statusGet Session StatusC
Check current progress of a blog session
Inputs: session_id (required). Returns: object
list_sessionsList SessionsC
List all blog sessions
Inputs: status_filter. Returns: object
modify_outlineModify OutlineB
Modify outline sections, titles, or structure
Inputs: session_id (required), modifications (required). Returns: object
prepare_plagiarism_chunksPrepare Plagiarism ChunksB
Split content into <10k character chunks for external plagiarism tools
Inputs: session_id (required). Returns: object
record_plagiarism_resultRecord Plagiarism ResultC
ā USER records results from external plagiarism check
Inputs: chunk_id (required), tool_used (required), session_id (required), plagiarism_score (required), +2 more. Returns: object
regenerate_sectionRegenerate SectionC
Regenerate specific section with user feedback
Inputs: feedback (required), session_id (required), section_name (required). Returns: object
request_more_researchRequest More ResearchA
Request additional focused research
Inputs: session_id (required), specific_queries (required). Returns: object
research_topicResearch TopicB
Research topic from multiple sources + fetch relevant images
Sources:
Wikipedia API
arXiv API (for AI/ML papers)
DuckDuckGo web search
Image search for charts/benchmarks/diagrams
Inputs: session_id (required), depth, specific_queries. Returns: object
run_quality_analysisRun Quality AnalysisB
Run automatic quality checks on final draft
Checks:
Readability scores (Flesch-Kincaid)
Citation tracking
Image placement validation
Structure analysis
SEO basics
Inputs: session_id (required). Returns: object
save_draftSave DraftB
Save the generated blog draft to database
Inputs: content (required), session_id (required). Returns: object
save_outlineSave OutlineC
Save the generated outline to database
Inputs: session_id (required), outline_data (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 23 tools
Most tools map to distinct workflow stages (research, outline, draft, plagiarism, QA, export), but a few could be confused: generate_outline/generate_full_content are agent instructions that overlap conceptually with save_outline/save_draft, and the multiple get_*_summary tools require reading descriptions to distinguish.
Every tool follows a consistent verb_noun snake_case pattern (create_*, get_*, list_*, approve_*, save_*, export_*). The verbs are predictable and the workflow stage is clear from the name.
At 23 tools, the surface feels heavy and falls in the borderline 16-25 range, though the multi-stage workflow gives most tools a purpose. Several session and file getters could potentially be consolidated.
The end-to-end pipeline is covered (research ā outline ā draft ā plagiarism ā QA ā export), but there are notable gaps: sessions can be created/listed but not updated/deleted, saved outlines cannot be retrieved directly, and the server exports markdown rather than publishing to Medium.
Maintenance
Related MCP Connectors
A blog CMS that AI agents write into over MCP: Markdown drafts, versions, media, human approval.
Publish and run a blog on your own domain from any AI agent, with hosting and technical SEO.
Run your company blog for SEO and AI search from your AI assistant.
Write blog articles with AI and publish them to WordPress, Shopify and 30+ platforms.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn AI blog automation server that uses a 'Creative DNA' system to generate personalized content based on a user's favorite authors and themes. It manages the entire workflow from trend collection and SEO optimization to automated publishing on Google Blogger.24-
- AlicenseAqualityDmaintenanceAn MCP server that automatically generates technical blog posts using AI (Gemini and Claude), supporting various input types, styles, and collaborative workflow.10MIT
- FlicenseNot gradedqualityBmaintenanceEnables automated content creation pipeline: topic research, article writing, image sourcing, and GitHub PR submission for blogs.1,013-
- AlicenseAqualityBmaintenanceEnables AI tools to research, write, and publish finished blog posts to Ghost and WordPress in the user's voice, supporting multiple author personas and destinations through natural language.142MIT