medium-ops
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MEDIUM_SID | No | Medium 'sid' cookie from medium.com | |
| MEDIUM_UID | No | Medium 'uid' cookie | |
| MEDIUM_XSRF | No | Medium 'xsrf' cookie (required for dashboard writes) | |
| MEDIUM_USERNAME | No | Your Medium handle (without the @) | |
| MEDIUM_OPS_LLM_CMD | No | Override LLM command for bulk mode | |
| MEDIUM_INTEGRATION_TOKEN | No | Legacy Medium Integration Token (api.medium.com/v1) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| test_connectionA | Read-only. Verify both credentials (integration token + sid cookie) and return the authed user id, username, and publication count. Call this first if other tools 401. |
| get_own_profileA | Read-only. Return the authenticated user's profile from the dashboard GraphQL API: id, username, name, bio, follower/following counts. Use this when you need 'who am I' context for downstream calls. For any other user pass the @handle to get_profile instead. |
| get_profileA | Read-only. Public profile for any Medium user by @username (id, name, bio, follower count). Use list_posts after this to fetch their stories. For the authed user prefer get_own_profile. |
| list_postsC | Read-only. List recent stories by a user (default: self). |
| get_postA | Read-only. Story metadata by Medium post id (12+ char hex, e.g. 'a1b2c3d4e5f6'): title, url, claps, response count, publication, publishedAt. For the article body use get_post_content. For the comment thread use list_responses. |
| get_post_contentB | Read-only. Return the story body as HTML. Set as_markdown=true to convert to Markdown. Members-only stories need a member sid. |
| search_postsC | Read-only. Medium-side search across public stories. |
| list_responsesA | Read-only. Top-level responses under a story (Medium's word for comments). Each response has its own id you can pass to get_response_replies for the reply thread. For the filtered 'still need a reply' worklist prefer get_unanswered_responses. |
| get_response_repliesA | Read-only. Nested replies under a single top-level response. Use list_responses first to get response ids, then call this per response to walk the thread. |
| get_feedA | Read-only. Reader feed. tab='home' for recommended, 'following', or 'tag-{slug}' (e.g. 'tag-programming'). |
| get_statsA | Read-only. Per-post views / reads / fans for the last N days. Requires sid cookie for dashboard access. |
| get_clap_countA | Read-only. Total claps (sum across all clappers, max 50 each) on a single story. Use this for engagement checks before/after posting a response. Faster than get_post when you only need the number. |
| list_own_publicationsA | Read-only. Publications the authed user can publish to as editor or writer. Returns id + name pairs; use the id with publish_post's publication_id to publish into a publication. Requires the Medium integration token (MEDIUM_INTEGRATION_TOKEN). |
| publish_postA | WRITE. Publish a story. content_format is markdown. Defaults to publish_status='draft' so nothing goes public by accident; set to 'public' or 'unlisted' to flip it. Uses the integration token and api.medium.com/v1/*. Dry-run by default. |
| clap_postA | WRITE. Clap a story 1-50 times. Uses the undocumented dashboard endpoint — fragile. Dedup-protected per post. Dry-run by default. |
| post_responseA | WRITE. Post a top-level response under a story, or a reply under a response. Uses the undocumented dashboard endpoint — fragile. For interactive drafting prefer propose_reply -> confirm_reply. Dry-run by default. |
| bulk_draft_repliesA | WRITE TO LOCAL FILE (no Medium call). Generate reply drafts for every response on a post using the daemon-path LLM. Output is JSON with action='pending'; edit to 'approved', then run send_approved_drafts. |
| send_approved_draftsA | WRITE. Sequentially post every entry in drafts.json where action=='approved'. Honors rate_seconds throttle. Dry-run by default. |
| audit_searchA | Read-only. Query the local audit.jsonl of every write this server has performed or attempted. Filters compose with AND. |
| dedup_statusA | Read-only. Counts from the local dedup SQLite DB (claps, responses, publishes) used to prevent the same write running twice. Call this after writes to confirm the ledger advanced, or if a write inexplicably skipped (status='deduped' in audit_search). |
| get_unanswered_responsesA | Read-only. Return responses on a post where the authed user has NOT yet replied. Canonical worklist: read each, draft a reply in your context, then propose_reply -> confirm_reply. |
| propose_replyA | STAGE A WRITE (no Medium call yet). Validate a reply, compute its dedup hash, store it under a token, return token + preview. On approval call confirm_reply. Tokens expire in 5 minutes. Set parent_response_id to reply under a specific response; omit for a top-level response on the post. |
| confirm_replyA | EXECUTE the staged write. Look up the token, post to Medium, log to audit.jsonl, persist dedup row. Idempotent. Tokens are single-use. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/06ketan/medium-ops'
If you have feedback or need assistance with the MCP directory API, please join our Discord server