medium-writer-mcp
Provides tools for reading and preparing Medium articles: fetches latest stories by author, publication, or tag via public RSS (with full text for author feeds), checks Markdown drafts against what Medium supports and auto-fixes tables/deep headings/checklists with warnings, word count and reading time, exports paste-ready HTML, and on macOS copies the formatted article to the clipboard and opens a new Medium story in the browser for final paste. A legacy path with an old integration token can also create posts, upload images, and list the profile and publications.
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-writer-mcp open docs/post.md in Medium so I can paste and publish it"
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-writer-mcp
An MCP server that lets Claude read Medium and get your articles Medium-ready. Works in Claude Code (terminal or the VS Code extension), the Claude desktop app, and any other MCP client.
How it works (no token needed)
Research: ask Claude what's being written under a tag or by an author.
Draft:
/mcp__medium__draft_from_code <topic>writes an article from code in your project.Prepare:
prepare_articlefixes what Medium can't display (tables, deep headings, checklists) and warns about the rest.Open in Medium (macOS):
open_in_mediumcopies the article to your clipboard as formatted text and opens medium.com/new-story in Safari, where you're already signed in. Click the title line, press Cmd+V, review, and publish. Medium keeps headings, bold, links, lists, quotes, images and code blocks. Add tags and subtitle in Medium's publish dialog.Not on macOS?
export_articlewrites<post>.medium.htmlinstead: open it, click in the article, Cmd+A, Cmd+C, and paste into Medium.
There's no Medium login in this server, on purpose. Medium no longer gives new apps API access, and its site blocks automated browsers, so the server hands the article to your normal browser and you do the final paste.
Related MCP server: Medium MCP Server
Tools
Tool | What it does |
| Latest stories by an author, with full text (public RSS) |
| Latest stories in a publication |
| Latest stories under a tag (Medium only includes an excerpt here) |
| Checks Markdown against what Medium supports, fixes what it can, returns warnings, word count and reading time |
| Runs |
| macOS: runs |
Plus one prompt, draft_from_code, which shows up as a slash command in Claude Code.
Limits to know
RSS feeds only return the ~10 newest stories. There's no full archive or stats.
Medium has no public way to post without an API token, and stopped issuing tokens in January 2025, hence the copy-paste step.
Install
Add it to Claude Code for all your projects (needs uv):
claude mcp add --scope user medium -- uvx medium-writer-mcpStart a new Claude Code session and type /mcp to confirm medium is connected.
It works the same in the VS Code extension and the terminal.
For the Claude desktop app or another MCP client, add this to its config:
{
"mcpServers": {
"medium": { "command": "uvx", "args": ["medium-writer-mcp"] }
}
}Without uv: pip install medium-writer-mcp and use medium-writer-mcp as the command.
Choosing the browser
open_in_medium uses Safari unless told otherwise. Pass browser per call, or set
a default with an environment variable (any app name from /Applications, or default
for your system browser):
claude mcp add --scope user medium -e MEDIUM_BROWSER="Google Chrome" -- uvx medium-writer-mcpTry it
"What has @username published on Medium lately?"
"What's being written under the fastapi tag this week? Summarize the angles."
"/mcp__medium__draft_from_code the caching layer in src/cache"
"Run prepare_article on docs/post.md and fix the warnings."
"Open docs/post.md in Medium."
Development
git clone https://github.com/MuhammadAsher/medium-mcp.git
cd medium-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest # 43 tests, all offlineTo run your local copy in Claude Code, point the command at .venv/bin/medium-mcp.
Releasing: bump __version__ in src/medium_mcp/__init__.py, add a CHANGELOG entry,
then push a matching tag (git tag v0.2.1 && git push --tags). GitHub Actions tests,
builds and publishes to PyPI.
Project layout
src/medium_mcp/
server.py MCP tools, prompt, entry point
feeds.py RSS fetch/parse, HTML -> Markdown (stdlib only)
formatter.py Medium compatibility checks and rewrites
export.py Markdown -> paste-ready HTML
handoff.py macOS clipboard + open browser (osascript, open)
_http.py HTTPS using the OS trust store
medium_api.py Legacy REST client (token only)
tests/ Offline tests with a fixture feedDependencies: the mcp SDK (v2) and truststore (so HTTPS works with python.org
builds on macOS). HTTP, XML and Markdown use the standard library.
Legacy: direct publishing with an old token
Only if you have an integration token created before January 2025. Setting one adds
get_medium_profile, list_my_publications, upload_image and create_post
(defaults to draft; Medium's API can't edit or delete posts afterwards).
"medium": {
"command": "uvx",
"args": ["medium-writer-mcp"],
"env": { "MEDIUM_INTEGRATION_TOKEN": "your-token" }
}Don't commit a .mcp.json that contains your token. Put it in
~/.claude.json via claude mcp add --scope user ... -e MEDIUM_INTEGRATION_TOKEN=...
instead.
Available Tools
6 toolsexport_articleA
Write the article as an HTML page to copy-paste into Medium's editor (no token needed).
Runs prepare_article first, then converts to HTML. The user opens the file in a browser, selects all, copies, and pastes into medium.com/new-story; Medium keeps headings, bold, links, lists, quotes, images and code blocks. Tell the user the output path and pass on the warnings.
Inputs: tags, title, markdown, subtitle, +3 more.
get_publication_storiesARead-onlyIdempotent
Get the most recent stories from a Medium publication.
Inputs: publication (required), limit, include_content.
get_tag_storiesARead-onlyIdempotent
Get the latest stories Medium lists under a tag. Useful for spotting what's being written about a topic.
Inputs: tag (required), limit, include_content.
get_user_storiesARead-onlyIdempotent
Get the most recent stories by a Medium author (newest first).
Inputs: username (required), limit, include_content.
open_in_mediumA
Copy the article to the clipboard as formatted text and open a new Medium story (macOS).
No login or browser automation: it opens medium.com/new-story in the user's normal browser, where they're already signed in, and they press Cmd+V. Replaces whatever is on the clipboard. Show the user the warnings, and the tags/subtitle to enter in Medium's publish dialog. Nothing is published.
Inputs: tags, title, browser, markdown, +3 more.
prepare_articleARead-onlyIdempotent
Check Markdown against what Medium supports and return a cleaned version.
Converts tables to aligned text, demotes extra/deep headings, turns checklists into emoji, and reports anything it can't fix (nested lists, footnotes, raw HTML, missing alt text, title length, tags). Also returns word count and reading time.
Inputs: markdown (required), tags, title, subtitle, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
The three story-fetching tools are clearly differentiated by source (author, publication, tag), and the article pipeline tools have distinct roles. There is some overlap between export_article and open_in_medium since both prepare content for pasting into Medium, but their descriptions make the file-vs-clipboard distinction clear.
All six tools follow a consistent snake_case verb_noun pattern: get_user_stories, get_publication_stories, get_tag_stories, prepare_article, export_article, open_in_medium. The convention is predictable throughout.
Six tools is well-scoped for a Medium writing and publishing workflow. Each tool maps to a distinct step: research, validation, export, and clipboard delivery.
The surface covers the core workflow from story discovery to article preparation and delivery into Medium's editor. Direct publishing is intentionally excluded, and minor gaps like retrieving a single story's full content are not essential for the stated purpose.
Maintenance
Related MCP Connectors
Screenshot any URL, HTML or Markdown in a real browser, and read web pages as Markdown.
Create, edit and publish micropage.sh landing pages and blog posts from markup.
Read public X posts and full X Articles as clean Markdown. Free, no X API key.
Draft, schedule, and analyze content for Substack, Medium, LinkedIn, X, Bluesky, and Threads.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to publish posts to Medium with support for drafts, tags, canonical URLs, and follower notifications. Supports various publishing statuses and SEO optimization features.4 npm2MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to read and analyze Medium blog posts, including member-only content with login support, and search articles by author or keyword.117 npmMIT
- FlicenseAqualityDmaintenanceEnables reading Medium articles via a local MCP server using a persistent Edge profile. Supports searching and fetching articles as Markdown after manual Google login.4-
- AlicenseNot gradedqualityBmaintenanceEnables querying Medium content through the unofficial medium2 RapidAPI, including user, article, publication, tag, and search operations, with a strict monthly budget guard and full-text content opt-in controls.BSD 3-Clause