Medium CLI + 23-tool MCP server. Your IDE drafts replies. No API keys.
Config is the same across clients — only the file and path differ.
{
"mcpServers": {
"io-github-06ketan-medium-ops": {
"command": "<see-readme>",
"args": []
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Medium CLI + 23-tool MCP server. Your IDE drafts replies. No API keys.
No automated test available for this server. Check the GitHub README for setup instructions.
Five weighted categories — click any category to see the underlying evidence.
No known CVEs.
No package registry to scan.
This server is missing a description. Tools and install config are also missing.If you've used it, help the community.
Add informationBe the first to review
Have you used this server?
Share your experience — it helps other developers decide.
Sign in to write a review.
Others in other
Persistent memory using a knowledge graph
Privacy-first. MCP is the protocol for tool access. We're the virtualization layer for context.
Make HTTP requests and fetch web content
Read, write, and manage files on the local filesystem
MCP Security Weekly
Get CVE alerts and security updates for io.github.06ketan/medium-ops and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
Standalone Medium CLI + 22-tool MCP server. Your IDE drafts the replies. Zero AI API keys.
Stories, responses, claps, feed, profiles, stats, reply engine, MCP server. One Python install, one binary, MIT licensed. Sibling of substack-ops.
uvx medium-ops mcp install cursor # or claude-desktop, claude-code, print
# Restart your host. Then in chat:
# "list unanswered responses on post abc123def456"
# "draft a warm reply to response r1"
# "post that draft"
Your host's LLM (Cursor's, Claude's) does the drafting via the
propose_reply / confirm_reply tools. No ANTHROPIC_API_KEY /
OPENAI_API_KEY needed.
Medium exposes three usable surfaces and we use all of them:
medium.com/feed/@{user} returns the
author's ~10 most recent stories with body_html, pubDate, tags,
hero image, and dc:creator. Zero credentials, faster than GraphQL,
stable. Used by default for list_posts / get_post / get_post_content.
Inspired by Portfolio_V2's blog page.medium.com/_/graphql +
medium.com/_/api/* with the sid cookie. Used as a fallback when
you ask for more than ~10 posts, when the post isn't in the RSS window,
or for things RSS can't give you (responses, claps, feed, stats, search).api.medium.com/v1/* with an
Integration Token. Supports createPost, createPostInPublication,
getUser, getPublications. That's it.Force a specific transport with --source rss|graphql|auto on posts list,
posts show, and posts content. The dashboard + GraphQL endpoints are
undocumented and Medium can change them at any time. See
Known gaps.
git clone https://github.com/06ketan/medium-ops && cd medium-ops
uv sync
uv sync --extra mcp # mcp SDK for the MCP server (recommended)
uv sync --extra tui # textual for the TUI
Auth is read from ~/.cursor/mcp.json's mcpServers.medium-ops.env (or
medium-api / medium). Override with env or .env.
uv run medium-ops auth verify
uv run medium-ops quickstart
Every write defaults to --dry-run. Flip with --no-dry-run. All writes
land in .cache/audit.jsonl and are dedup-checked against
.cache/actions.db.
| Command | What it does |
|---|---|
auth verify | Probe both integration token (/me) and sid cookie (GraphQL Viewer). |
auth test | Same but exits non-zero on failure (CI-friendly). |
auth setup | Interactive: paste token / sid / uid / username to .env. |
| Command | What it does |
|---|---|
posts list [--user] [--limit] | Latest stories by a user (default: self). |
posts show <id_or_url> | Story metadata (title, clap count, response count). |
posts content <id> [--md] | Body HTML (or Markdown with --md). |
posts search <query> [--limit] | Medium-side full-text search. |
| `posts publish -t "..." -f body.md [--pub] [--status draft | public |
| Command | What it does |
|---|---|
responses list <post_id> [--limit] | Top-level responses table. |
responses tree <post_id> [--out file.json] | Full response + |