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) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| 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
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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