All notable changes to mcp-medium-reader will be documented in this file.
The format follows Keep a Changelog and this project adheres to Semantic Versioning.
- ZMediumToMarkdown 4.0.0 compatibility. The gem's new first-run Terms-of-Use gate refuses to run on a non-TTY stream, which is exactly what the MCP stdio transport gives it.
spawnGemOncenow setsZMTM_TOS_ACCEPTED=1in the child process's environment so the gate's documented non-interactive escape hatch fires automatically. On gem versions < 4.0.0 the env var is silently ignored (forward-compatible). README adds a "Terms of Use note" section explaining that installing this server constitutes acceptance of the gem's Terms on the operator's behalf — read TERMS.md before installing if that's surprising.
1.0.0 - 2026-05-07
First public release.
- Dropped all bulk-by-username MCP tools.
list_user_posts,read_user_posts, anddownload_user_postsare gone — the only article tools exposed via MCP areread_medium_postanddownload_medium_post. The username helpers (normalizeUsername,UserNotFoundError, paywall counters, bulk fallback notice) were pruned along with them. If you need several posts from a user, ask them for the individual URLs and call the per-URL tools. - Dropped Cloudflare Worker proxy support entirely. The
set_credentialsMCP tool, themcp-medium-reader setupsubcommand, themedium_host/miro_medium_hostaccounts, the credentials JSON file backend, and theMCP_MEDIUM_READER_DISABLE_SET_CREDENTIALSenv var are all gone. mcp-medium-reader now stores no Medium-side state of its own. - Recovery flow simplified. When Cloudflare blocks repeatedly the response now recommends running
ZMediumToMarkdown --auth(orZMediumToMarkdown -p <url>directly) in a Terminal instead of suggesting a Worker proxy deploy. A real Terminal lets the gem re-drive Chrome interactively to clear Cloudflare; MCP cannot. initno longer prompts for proxy URLs. It now does dependency check + Ruby runtime bind + MCP client install — no interactive credential entry.doctorno longer reports Worker proxy URLs.validate_setupno longer reports Worker proxy URLs.
- mcp-medium-reader does not manage Medium login cookies. The gem (ZMediumToMarkdown ≥ 3.5.2) keeps
sid/uid/cf_clearance/_cfuvidin its own AES-256-GCM encrypted cache at~/.zmediumtomarkdown(mode 0600). MCP injects no cookie env vars, no cookie CLI flags, and runs--non-interactiveso the gem never attempts its own Chrome auto-login under the MCP transport. To populate the cache, run the gem standalone once:ZMediumToMarkdown --auth. - Required gem version bumped to 3.5.2 (was 3.1.0). Picks up the
--authflag (3.3.0), single-Worker proxy dispatch +MEDIUM_HOST_SECRET(3.5.0), the OG-image fix (3.3.3), and the GraphQL nil-vs-false skip-existing fix (3.4.0). MCP doesn't surface any of the proxy plumbing — it's the gem's concern — but the version pin protects users from the older skip bug. - Tightened MCP
urlschemas.read_medium_postanddownload_medium_postnow usez.string().url()(wasmin(1)), matchingvalidate_setup'stest_url. Defense-in-depth against an LLM passing a flag-shaped string into the-pargv slot; the gem's--non-interactivealready neutralises the obvious paths. - Cross-platform.
cross-spawnfor Windows.batshims; runtime.json POSIX-atomic-write vs Windows direct-write; install.ts has per-OS Claude Desktop config paths.
setup.sh— one-shot bootstrap: detects platform (macOS / Linux / Windows-Git-Bash), probes Ruby (>= 3.2) and Node.js (>= 18) with platform-aware install hints (offersbrew installautomatically on macOS), runsgem install ZMediumToMarkdownandnpm install -g mcp-medium-reader(or upgrades), runsmcp-medium-reader initanddoctor, then walks the user throughZMediumToMarkdown --authso the gem cookie cache is populated in the same session. Flags:--no-init,--no-gem,--no-npm,--no-auth,--yes,--help. Falls through gracefully when stdin isn't a TTY (curl-pipe-bash) by deferringinit(and--auth) to a manual run.mcp-medium-reader init— one-shot guided setup: dependency check + Ruby runtime bind + MCP client install.mcp-medium-reader install [--clients=...]— adds the server registration to four MCP clients by default (Claude Desktop, Claude Code, OpenAI Codex, Gemini CLI). Preserves existing keys; reports added / updated / unchanged / error per target.mcp-medium-reader doctorreports the gem cookie cache status (path + size + mode, or "not present").- Reader tool:
read_medium_post. - Download tool:
download_medium_post(plain non-Jekyll layout, defaultsoutput_dirtoprocess.cwd(), accepts~/...). validate_setuptool — inspects dependencies and (withtest_url) runs an optional live test.- LLM-directed recovery flows in tool responses: paywall recovery script that points users at
ZMediumToMarkdown --auth; Cloudflare escalation (first block this session: refresh gem cookie cache via--auth; repeat blocks: drop MCP and run the gem CLI directly).