medium-mcp-server
v1.0.0
Published
LLM-optimized MCP server for fetching and processing Medium articles
Downloads
12
Maintainers
Readme
Medium Local MCP Server
A local Model Context Protocol (MCP) server specifically optimized for LLMs to fetch and process Medium.com articles. This server handles authentication, rate limiting, and provides structured, LLM-friendly output.
Features
- LLM-Optimized Content Extraction: Structured output with metadata, sections, code blocks, and knowledge extraction
- Subscription Authentication: Respects your Medium subscription to access subscriber-only content
- Rate Limiting: Built-in rate limiting to avoid 403 errors and respect Medium's limits
- Local Processing: All processing happens locally for privacy
- Code Preservation: Maintains code blocks with language detection and context
- Workflow Extraction: Identifies and extracts step-by-step guides and tutorials
- Knowledge Graph Generation: Extracts concepts, technologies, and relationships
- Research-Grade Citations: Handles academic and technical references
Prerequisites
- Node.js 18+
- npm
- Chrome/Chromium browser (for authentication)
- Medium subscription (for accessing subscriber content)
Installation
Via Universal MCP Setup Script
The easiest way to install is using the universal MCP setup script:
./universal-mcp-setup.sh
# Select option 35) Medium LocalManual Installation
- Install dependencies:
npm install- Build the TypeScript:
npm run build- Add to Claude MCP settings:
claude mcp add-json "medium-local" '{
"type": "stdio",
"command": "node",
"args": ["./dist/index.js"],
"env": {
"MEDIUM_COOKIE_PATH": "~/.medium-mcp/cookies.json",
"RATE_LIMIT_MS": "3000",
"HEADLESS": "true"
}
}' -s userAuthentication
First-time Setup
- Login to Medium:
medium-auth loginThis will open a browser window where you can log into Medium. The browser will close automatically after successful login.
- Check authentication status:
medium-auth status- Refresh session (if needed):
medium-auth refresh- Logout:
medium-auth logoutAvailable MCP Tools
fetch_article_structured
Fetch and process a Medium article with comprehensive LLM optimization.
Parameters:
url(required): Medium article URLextractCode(optional): Extract code blocks with contextextractWorkflows(optional): Extract step-by-step workflowsextractConcepts(optional): Extract technical conceptsgenerateSummary(optional): Generate AI summaryincludeComments(optional): Include valuable comments
Output Structure:
{
"metadata": {
"title": "Article Title",
"author": "Author Name",
"publishDate": "2025-01-12",
"readingTime": 8,
"tags": ["react", "javascript"],
"claps": 1500,
"url": "https://medium.com/..."
},
"content": {
"markdown": "Full article in Markdown",
"structured": {
"sections": [...],
"codeBlocks": [...],
"keyPoints": [...],
"links": [...],
"images": [...]
},
"summary": "AI-generated summary",
"tldr": ["Key point 1", "Key point 2", ...]
},
"knowledge": {
"concepts": [...],
"technologies": [...],
"workflows": [...],
"solutions": [...],
"definitions": [...]
},
"research": {
"citations": [...],
"relatedArticles": [...],
"updates": [...],
"comparisons": [...]
}
}research_topic
Research a topic on Medium with advanced filtering.
Parameters:
query(required): Search queryminClaps(optional): Minimum claps filtertags(optional): Filter by tagsauthors(optional): Filter by authorspublications(optional): Filter by publicationslimit(optional): Maximum results (default: 10)extractionDepth(optional): "shallow" or "deep" (default: "shallow")
fetch_series
Fetch all articles in a Medium series.
Parameters:
seriesUrl(required): Medium series URLorderBy(optional): "chronological" or "relevance" (default: "chronological")
extract_user_highlights
Extract your saved highlights from Medium articles.
get_reading_list
Get your Medium reading list.
Configuration
Environment variables:
MEDIUM_COOKIE_PATH: Path to store authentication cookies (default:~/.medium-mcp/cookies.json)RATE_LIMIT_MS: Rate limiting delay in milliseconds (default: 3000)HEADLESS: Run browser in headless mode (default: true)LOG_LEVEL: Logging level (default: info)
Usage Examples
Fetch a Technical Article
// In Claude, use the fetch_article_structured tool
{
"url": "https://medium.com/@author/react-performance-optimization-guide",
"extractCode": true,
"extractWorkflows": true,
"extractConcepts": true,
"generateSummary": true
}Research AI/ML Topics
// Research recent AI articles
{
"query": "machine learning optimization",
"minClaps": 100,
"tags": ["artificial-intelligence", "machine-learning"],
"limit": 5,
"extractionDepth": "deep"
}Get a Complete Tutorial Series
// Fetch entire tutorial series
{
"seriesUrl": "https://medium.com/@author/react-mastery-series",
"orderBy": "chronological"
}Privacy & Security
- All processing happens locally on your machine
- No data is sent to external APIs (except Medium.com)
- Authentication cookies are stored locally and encrypted
- Rate limiting respects Medium's terms of service
Troubleshooting
Authentication Issues
# Check if authenticated
medium-auth status
# Refresh session
medium-auth refresh
# Re-login if needed
medium-auth logout
medium-auth loginRate Limiting
The server automatically handles rate limiting. If you encounter 403 errors:
- Increase
RATE_LIMIT_MSenvironment variable - The server will automatically back off and retry
Build Issues
# Clean and rebuild
rm -rf dist node_modules
npm install
npm run buildDevelopment
Project Structure
src/
├── index.ts # Main MCP server
├── auth/
│ └── manager.ts # Authentication management
├── fetcher/
│ ├── playwright.ts # Browser automation
│ └── rateLimit.ts # Rate limiting
├── parser/
│ └── processor.ts # Content processing
├── types/
│ └── index.ts # TypeScript definitions
└── utils/
└── logger.ts # Logging utilitiesRunning in Development
npm run devTesting
npm testContributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
License
MIT License
