medium-ops
The medium-ops MCP server provides 22 tools for programmatic management of your Medium account, covering reads, writes, engagement, and a safe LLM-powered reply workflow — no external AI API keys required.
Authentication & Profile
Verify integration token and sid cookie credentials
Get your own profile (id, name, bio, follower/following counts) or any user's public profile by @username
List publications you can publish to as editor or writer
Reading & Discovery
List recent stories by yourself or any user
Get story metadata (title, URL, clap count, response count, publish date) or full content (HTML/Markdown)
Search public Medium stories
Browse home, following, or tag-based reader feeds
View per-post stats (views, reads, fans) over the last N days (requires sid cookie)
Responses & Engagement
List top-level comments on a story; walk nested reply threads
Identify unanswered responses on your posts (reply worklist)
Get total clap count for a story; clap a story 1–50 times (dedup-protected, dry-run by default)
Writing & Publishing
Publish stories as draft, public, or unlisted — optionally to a publication (dry-run by default)
Post top-level comments or nested replies (dry-run by default)
Safe LLM-Powered Reply Workflow
get_unanswered_responses→propose_reply(stages a reply with dedup hash, time-limited token) →confirm_reply(executes and logs; idempotent, single-use)bulk_draft_replies— generate AI drafts for all responses into a local JSON file without postingsend_approved_drafts— post only entries markedaction=approved; rate-throttled and dry-run by default
Audit & Safety
audit_search— query a local JSONL audit log of all write attempts, filterable by kind, target, status, and timededup_status— view the SQLite dedup database to confirm writes landed or diagnose skipped actions
Provides tools for reading and writing to Medium, including managing stories, responses, claps, feed, profiles, and stats, with a reply engine and MCP-native drafting loop.
medium-ops
Standalone Medium CLI + 22-tool MCP server for Cursor MCP, Claude MCP, OpenCode MCP, and any stdio MCP host. 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.
TL;DR — MCP-native (no API key, one command)
uvx medium-ops mcp install cursor # or claude-desktop, claude-code, opencode, 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.
Wrong install?
This project is medium-ops on PyPI — install with uv / uvx, not unrelated npx packages from “Medium MCP” searches. Canonical listing: Glama — 06ketan/medium-ops.
Related MCP server: WhenLabs/When
Works with (MCP)
These rows help discovery (search keywords); confirm each host’s current MCP docs before upgrading.
Open source–oriented hosts
Host | Documentation | Typical wire-up |
OpenCode |
| |
Continue |
| |
Zed | Configure stdio MCP per Zed’s docs | |
Cline | MCP setup per extension / marketplace docs | |
Goose | MCP extensions per Goose docs |
Large commercial stacks
Host | Documentation | Typical wire-up |
Cursor |
| |
Claude (Desktop / Code) |
| |
GitHub Copilot | MCP in VS Code where supported — use | |
ChatGPT | Connector flows — often REST for tools without MCP | |
Google Gemini | Gemini CLI / IDE features per Google docs |
OpenCode (copy-paste)
Auto-install:
uvx medium-ops mcp install opencodeManual (~/.config/opencode/opencode.json):
{
"mcp": {
"medium-ops": {
"type": "local",
"command": ["uvx", "medium-ops", "mcp", "serve"],
"enabled": true
}
}
}Optional version pin: ["uvx", "medium-ops==0.1.2", "mcp", "serve"] (replace with current PyPI release).
Why a hybrid
Medium exposes three usable surfaces and we use all of them:
Public RSS (reads, no auth).
medium.com/feed/@{user}returns the author's ~10 most recent stories withbody_html,pubDate,tags, hero image, anddc:creator. Zero credentials, faster than GraphQL, stable. Used by default forlist_posts/get_post/get_post_content. Inspired by Portfolio_V2's blog page.Dashboard GraphQL (authenticated reads).
medium.com/_/graphql+medium.com/_/api/*with thesidcookie. 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).Official REST (writes).
api.medium.com/v1/*with an Integration Token. SupportscreatePost,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.
Setup (dev / from source)
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 TUIAuth 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 quickstartCommand surface
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.
Auth (3)
Command | What it does |
| Probe both integration token (/me) and sid cookie (GraphQL Viewer). |
| Same but exits non-zero on failure (CI-friendly). |
| Interactive: paste token / sid / uid / username to |
Read — Stories (5)
Command | What it does |
| Latest stories by a user (default: self). |
| Story metadata (title, clap count, response count). |
| Body HTML (or Markdown with |
| Medium-side full-text search. |
`posts publish -t "..." -f body.md [--pub] [--status draft | public |
Read + Write — Responses (3)
Command | What it does |
| Top-level responses table. |
| Full response + reply tree JSON. |
| Post a response or reply. |
Read + Write — Claps (2)
Command | What it does |
| Total claps. |
| Clap 1-50 times. Dedup-protected. |
Read — Discovery + Profile (5)
Command | What it does |
| Reader feed. |
| Your full profile (GraphQL). |
| Any user's public profile. |
| Per-post views / reads / fans (dashboard scrape). |
| Publications you can publish to (integration token). |
Reply engine (3)
Command | What it does |
| Rule-based replies (no LLM). |
| Draft every response to a file. |
| Post only |
Operations + safety (2)
Command | What it does |
| Query the JSONL audit log. |
| Counts in the dedup SQLite DB. |
MCP server (3)
Command | What it does |
| Auto-merge config into your host. |
| stdio MCP server (22 tools). |
| Print the tool registry. |
Other (1)
Command | What it does |
| Print a quickstart checklist. |
Reply modes
Mode | What it does | Safety |
| YAML keyword rules under | dry-run default |
| LLM drafts every response to | offline review, dedup-checked on send |
| Posts only items with | dry-run default; dedup DB prevents dup replies |
MCP | Host LLM drafts, you approve per-item, token-gated | 5-min token TTL, idempotent, no API key |
MCP server
medium-ops mcp install opencode # ~/.config/opencode/opencode.json
medium-ops mcp install cursor # auto-add to ~/.cursor/mcp.json
medium-ops mcp install claude-desktop # auto-add to claude_desktop_config.json
medium-ops mcp install claude-code # uses `claude mcp add`
medium-ops mcp install print # print the snippet only
medium-ops mcp serve # stdio server
medium-ops mcp list-tools # 22 toolsManual config snippet:
{
"mcpServers": {
"medium-ops": {
"command": "medium-ops",
"args": ["mcp", "serve"]
}
}
}If the mcp SDK is not installed, the server falls back to a minimal
stdin/stdout JSON-line dispatcher:
echo '{"tool":"list_posts","args":{"limit":3}}' | medium-ops mcp serveMCP-native draft loop (no API key)
The safety + drafting stack that makes the unattended mode safe:
Tool | What it does |
| Worklist — responses where you haven't replied. |
| Dry-run only. Returns a |
| Posts the staged reply by token. Idempotent via dedup DB. Token TTL 5 min. |
| File-based offline review loop. |
| Read the audit log + dedup counts. |
LLM strategy
Two layers, both free:
MCP-native (default). Host LLM drafts via
propose_reply/confirm_reply. No env vars, no API key. Use this for interactive replies.Subprocess CLI (daemon path). For
reply bulkwhen no human is in the loop. Auto-detectsclaude(Claude Code),cursor-agent, orcodexon PATH. Override withMEDIUM_OPS_LLM_CMD.
There is no paid-API-key path.
Auth setup
Medium has two auth layers that map to different feature surfaces:
Integration Token —
Authorization: Bearer <token>. Used againstapi.medium.com/v1/*. Gets you:publish_post,list_own_publications. Token generation at https://medium.com/me/settings → "Integration tokens". Note: Medium stopped issuing new tokens in 2023. If you never generated one, the write path will 401 and you'll have to use the sid-cookie response path for any writes.sid cookie — from
medium.com(Application → Cookies →sid). Used againstmedium.com/_/graphqlandmedium.com/_/api/*. Gets you: all reads (stories, responses, claps, feed, stats, profile), plusclap_postandpost_response(fragile — undocumented).
medium-ops auth verify
medium-ops auth test
medium-ops auth setup
medium-ops auth har ./medium.har # ingest a Chrome devtools HAR exportRefreshing auth from a HAR
When cookies rotate or Medium changes a GraphQL schema, the fastest fix is:
Open
medium.comin Chrome with devtools → Network panel.Reproduce the failing action (publish a draft, post a response, etc.).
Right-click any request → "Save all as HAR with content".
medium-ops auth har ./medium.har
This:
merges fresh
sid,uid,xsrf,cf_clearancecookies into.env(preserving everything else)writes a redacted snapshot to
.cache/har-snapshot.jsonlisting every Medium GraphQL operation observed plus its request-variable / response-data key shapes — useful for diffing against the queries hard-coded inclient.pyto spot schema drift before users hit it.
Don't have these yet? See docs/AUTH-SETUP.md for a 5-minute browser-DevTools walkthrough. The Medium Integration Token API has been deprecated since 2023 — most users today use cookie-based auth via
MEDIUM_SID.
Env vars (or ~/.cursor/mcp.json → mcpServers.medium-ops.env):
MEDIUM_INTEGRATION_TOKEN=2fb00... # optional, for writes
MEDIUM_SID=1:... # optional, for reads
MEDIUM_UID=... # optional
MEDIUM_USERNAME=yourhandle # optional but recommendedArchitecture
mcp.json | env → auth.py
│
MediumConfig (token? sid? uid? username?)
│
MediumClient (httpx)
┌───────┼──────────┐
▼ ▼ ▼
api.medium.com medium.com/ medium.com/_/
/v1/* (REST) _/graphql api/* (dashboard)
│ │ │
Bearer token sid cookie sid cookie
│
┌──────┬──────┬────────────┬──────┬────────┬──────────┐
▼ ▼ ▼ ▼ ▼ ▼ ▼
posts responses claps profile stats feed reply_engine
│
┌───────────────────┼───────────────┐
▼ ▼ ▼
template ai_bulk MCP propose/confirm
└───────────────────┬───────────────┘
▼
base.post_response
│
┌─────────┼─────────┐
▼ ▼ ▼
dedup audit dry_run
(SQLite) (jsonl)
mcp/server.py ──── 22 tools ─── all share MediumClientEndpoints used
Action | Method + URL |
Auth: integration token |
|
Auth: sid cookie |
|
User profile |
|
List stories |
|
Story metadata |
|
Story body |
|
Story search |
|
Responses |
|
Feed |
|
Publish story |
|
Publish to pub |
|
Own pubs |
|
Clap |
|
Post response |
|
Stats |
|
Related MCPs
slideshot — HTML → slides (PNG / PDF / PPTX); npm
slideshot-mcp.substack-ops — Substack posts, notes, comments + MCP (PyPI
substack-ops).
Tests
uv run pytest -qCoverage: auth loading, client transports + XSSI stripping, dedup DB, audit log search, MCP tool registry + dispatcher, MCP install host-config merging, propose/confirm flow + token expiry, reply-engine template matching + dedup+audit flow, subprocess LLM detection.
Known gaps
Medium stopped issuing new Integration Tokens in 2023. If you never got one,
publish_post/list_own_publicationswill 401. The read + response + clap paths still work via sid. The RSS read path needs no credentials at all.RSS is capped at ~10 posts and lacks clap/response counts and stats. When you need more, pass
--source graphql(requires sid) or set--limit > 10and the client will auto-fall back to GraphQL.GraphQL operation names and schemas change silently. The queries in
client.pymirror what the dashboard uses today — expect breakage every couple of months. Pin this package's version.post_responseuses GraphQLsavePostResponse(deltas: [Delta!]!, inResponseToPostId: ID!). Delta shape is{type: 1, index: N, paragraph: {type: 1, text, markups: []}}(type=1 means insert; paragraph.type=1 is P). Reverse-engineered from error messages.update_draft_contentuses dashboardPOST /p/{id}/deltaswith{baseRev, rev, deltas}. For a brand-new draft,baseRev=-1, rev=0. Subsequent edits should bump both.clap_poststill uses the undocumented/_/api/posts/{id}/clapshape; not yet re-validated against the new GraphQL surface. Dry-run first.Members-only stories return a paywall preview unless the
sidbelongs to a paying member.No "restack" equivalent. Medium doesn't have reshares; the closest is a clap + a response. Use
clap_post+post_responsetogether for that.No notes / short-form. Medium killed short-form in 2018.
Chrome cookie auto-grab (the
auth_chromeflow from substack-ops) is not yet implemented. Paste yoursidinto.envfor now.TUI not yet implemented; the extras pin is there for future work.
License
MIT. See LICENSE.
Available Tools
23 toolsaudit_searchA
Read-only. Query the local audit.jsonl of every write this server has performed or attempted. Filters compose with AND.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| target | No | ||
| status | No | ||
| since | No | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description declares read-only behavior, which is good. However, without annotations, it should also disclose other traits like result format or pagination. It mentions 'limit' implicitly but does not explain full behavior. Score 3 indicates adequate but not rich disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The description is front-loaded with the essential read-only declaration and resource. Every sentence earns its place. Perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, no output schema, and no annotations, the description covers basic purpose and filtering logic but lacks details on parameter formats (e.g., date format for 'since') and output structure. It is minimally complete but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds that filters compose with AND, which is useful. However, it does not elaborate on individual parameter semantics beyond their names and default values. The AND composition is the only added meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool is read-only and queries the audit.jsonl of every write. The verb 'Query' and resource 'audit.jsonl' are explicit. The description distinguishes it from sibling content-operation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly specify when to use this tool versus alternatives. It is implied for auditing writes, but no usage context or exclusions are provided. A 3 reflects the lack of explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| out | No | drafts.json | |
| model | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behaviors: it writes to a local file, uses a local LLM, and outputs JSON with action='pending'. It does not detail error handling or file overwriting, but it is sufficiently transparent for the intended use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise, using a single sentence plus a brief note on output and workflow. Every word serves a purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 parameters, no output schema, no annotations), the description is largely complete. It covers the core function, output format, and next steps. Missing error behavior, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It implicitly covers post_id (via 'every response on a post') and out (via output file default), but does not mention the model parameter. This partial coverage justifies a score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it writes to a local file, generates reply drafts for every response on a post using a local LLM, and specifies the output format. It distinguishes itself from sibling tools like send_approved_drafts by outlining the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is a local operation ('no Medium call'), and it instructs the user to edit the output then run send_approved_drafts. This implicitly defines when to use it, though it does not explicitly list when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clap_postA
WRITE. Clap a story 1-50 times. Uses the undocumented dashboard endpoint — fragile. Dedup-protected per post. Dry-run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| claps | No | ||
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses: mutation (WRITE), fragility (undocumented endpoint), idempotency (dedup-protected), and safety (dry-run default). No contradictions with annotations (none provided).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with 'WRITE'. Every sentence carries essential information: action, range, fragility, dedup protection, default behavior. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema and no annotations, the description covers purpose, usage hints, and key behavioral traits. Could mention return value or error handling, but for a simple clap action, this is adequate. The context is complete enough for an AI agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It adds value by stating '1-50 times' for claps (range) and 'Dry-run by default' for dry_run. Post_id is not explained, but titles and defaults in schema mitigate this. Overall, description provides useful parameter context beyond schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with 'WRITE' indicating action type, then 'Clap a story 1-50 times' clearly specifies verb and resource. The mention of 'undocumented dashboard endpoint — fragile' adds operational context. This distinguishes it from siblings like get_clap_count (read) and publish_post (publish).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description states 'Dedup-protected per post' implying repeated calls are safe, and 'Dry-run by default' indicates actual clapping requires setting dry_run=false. It does not explicitly list when to use vs alternatives, but the context is clear enough for an AI agent to infer usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | ||
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description provides key behavioral traits: idempotent and single-use tokens. However, it omits details like error handling, authentication needs, or return format. It is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief (two sentences) and front-loaded with the primary action. Every sentence adds value without redundancy. It is efficiently structured for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input schema and no output schema, the description covers the core purpose and behavior. However, it lacks details about prerequisites (e.g., how to get a token), what 'force' does, and what the response or side effects are. It meets minimal requirements but leaves gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description mentions 'token' in context but does not explain what it is or where to obtain it. The 'force' parameter is not mentioned at all. With 0% schema description coverage, the description fails to add sufficient meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('EXECUTE the staged write') and lists specific steps (look up token, post to Medium, log, persist dedup row). It distinguishes from sibling tools like propose_reply by indicating this is the final confirmation step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions idempotency and token single-use, which inform usage constraints, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses read-only behavior and purpose. Could be slightly more explicit about lack of side effects, but 'Read-only' suffices.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with key attribute 'Read-only.' No extraneous content; every phrase serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with no output schema, the description fully covers purpose, usage context, and relationship to sibling. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist; schema coverage is 100% vacuously. Description adds value by specifying the sources counted (claps, responses, publishes) beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a read-only tool that counts from a local dedup SQLite DB to prevent duplicate writes. It distinguishes itself from siblings like audit_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: after writes to confirm ledger advanced, or if a write skipped. Mentions alternative audit_search for status='deduped'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Declares read-only nature and maximum claps per clapper. With no annotations, it discloses key behaviors clearly, though missing potential error states or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, highly efficient, with front-loaded 'Read-only' qualifier and no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, behavior, and usage context for a simple tool. Could mention result format or error handling, but overall adequate given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter post_id is not mentioned in the description despite 0% schema coverage. The description adds no explanation beyond the schema field name, leaving the agent to infer its meaning from context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns total claps on a single story, with specifics like max 50 per clapper. It explicitly distinguishes from get_post by noting speed and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete use case (engagement checks before/after posting a response) and compares with get_post for efficiency. Lacks explicit 'when not to use' but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_feedA
Read-only. Reader feed. tab='home' for recommended, 'following', or 'tag-{slug}' (e.g. 'tag-programming').
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | home | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Declares 'Read-only' upfront, but lacks disclosure on pagination, rate limits, or response structure; no annotations provided so description carries full burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise, single sentence with front-loaded key info ('Read-only') and an example, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose and parameter values adequately for a simple feed tool, but omits output format or error handling; no output schema to compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning to the 'tab' parameter by explaining possible values, but does not clarify the 'limit' parameter beyond its default; schema has 0% description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a 'Reader feed' with specific tab options ('home', 'following', 'tag-{slug}'), distinguishing it from sibling tools like get_post or search_posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists valid tab values with an example, but does not provide when to avoid using this tool or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but the description discloses it is read-only and mentions the API source (dashboard GraphQL API). While it could discuss error cases or authentication details, for a simple profile retrieval the disclosure is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. Front-loaded with key info: 'Read-only. Return the authenticated user's profile...'. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description enumerates returned fields. Combined with usage context, it fully covers what the agent needs to know for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100%. The description does not need to add parameter info. Baseline 4 for zero parameters is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the tool returns the authenticated user's profile, listing specific fields (id, username, name, bio, follower/following counts). It distinguishes from the sibling tool get_profile by noting it takes a @handle for other users.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('who am I' context for downstream calls) and when to use the alternative (get_profile for any other user). Provides clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite no annotations, the description declares read-only behavior and provides ID format example. It does not cover errors or auth, but for a simple read tool this is solid. Adds context beyond the bare schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: functional header, data fields, cross-references. Every sentence adds distinct value without repetition. Ideal length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description lists returned fields. It also informs about what is not included (body, comments) and directs to relevant tools. Covers all essential aspects for a single-param retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% coverage, but description adds value by specifying the ID format (12+ char hex) and giving an example. This helps the agent construct correct inputs beyond just the parameter name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (read-only retrieval) and resource (story metadata by post id), lists returned fields, and distinguishes from sibling tools by mentioning get_post_content and list_responses. This makes the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use this tool (for metadata) and when to use alternatives (get_post_content for body, list_responses for comments). Also indicates read-only nature, guiding appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| as_markdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. It declares read-only and mentions a requirement for member sid for members-only stories. However, lacks details on authentication, rate limits, or any side effects. The read-only claim is helpful but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with key info (read-only). No wasted words. Efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so description should elaborate on return format. It says 'story body as HTML' and mentions Markdown conversion, but doesn't specify if it's full document or fragment. With sibling tools like get_post, it's somewhat complete but could clarify more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It explains as_markdown parameter and implies post_id is the target. However, post_id's format or constraints are not described, and both parameters lack full semantic context. Adds some value but not fully compensating.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns story body as HTML and mentions Markdown conversion. It distinguishes itself from siblings like get_post (metadata) and search_posts. However, it could be more explicit about the specific resource being the body content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like get_post or search_posts. The condition about members-only stories needing a member sid is noted but no broader usage context is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Starts with 'Read-only' which is a key safety trait. Indicates it's a public profile, implying no authentication needed. Lacks explicit mention of error cases or rate limits, but given simplicity, the main behavioral traits are well-covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences—first states purpose and return fields, second gives usage guidance. No fluff, highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 param, no output schema), the description covers purpose, return fields, and provides follow-up tool suggestion. It is fully adequate for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only parameter 'username' has no schema description (0% coverage). Description says 'by @username' but does not clarify if the '@' should be included, nor provides any additional constraints or format guidance beyond the schema's type string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it retrieves a public profile by username, listing returned fields (id, name, bio, follower count). It distinguishes from get_own_profile by mentioning 'public profile' and later contrasting with authed user.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using list_posts after this for stories, and recommends get_own_profile for the authenticated user, providing clear when-to-use and when-not-to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| response_id | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description declares read-only but lacks details on pagination, error handling, or rate limits. With no annotations, the description could disclose more behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with 'Read-only.' Every sentence adds value; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite missing parameter semantics, the description provides sufficient workflow context for the tool's low complexity, though behavioral details are lacking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description does not explain the parameters (response_id and limit) beyond referencing response IDs from list_responses. No added meaning over schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves nested replies under a single top-level response and distinguishes from list_responses by indicating the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use list_responses first to get response IDs, then call this tool per response to walk the thread, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statsA
Read-only. Per-post views / reads / fans for the last N days. Requires sid cookie for dashboard access.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states the tool is read-only and requires an sid cookie for dashboard access, adding important behavioral context beyond the missing annotations. It does not detail response behavior or error cases, but it covers the key constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences, front-loading the core purpose and read-only nature. Every part adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one param, no output schema, no annotations), the description covers purpose, parameter, and authentication. However, it lacks clarity on whether stats are for a specific post or the user's entire dashboard, which is important context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'days' has no schema description, but the description clarifies it means 'the last N days', adding meaning. It could mention the default value or acceptable range, but it is sufficient for basic usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves per-post stats (views/reads/fans) for a time range, distinguishing it as a stats tool among siblings. However, it does not specify which post or user context, leaving some ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_post or get_clap_count. The description only notes the requirement for an sid cookie, but no explicit when-to-use or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility. It explicitly states 'Read-only', which is critical for safety. It also discloses the filtering logic (unanswered by authed user). No additional behavioral traits (e.g., pagination) are mentioned, but the core safety and filtering are well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two short sentences. The first sentence is front-loaded with 'Read-only' and states the core purpose. The second provides workflow guidance. No wasted words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 parameters and no output schema, the description covers purpose and workflow but omits parameter details and return format. While the core functionality is clear, the agent lacks information about what the response contains, which could lead to errors in downstream processing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. However, it does not mention the two parameters (post_id, limit) or their semantics. The agent must infer meaning from names alone, which is insufficient for precise usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Return responses on a post where the authed user has NOT yet replied', clearly identifying the verb (return), resource (responses on a post), and specific filtering condition. It distinguishes from siblings like 'list_responses' or 'get_response_replies' by the unique filter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a complete workflow: 'Canonical worklist: read each, draft a reply in your context, then propose_reply -> confirm_reply.' This explicitly tells the agent when and how to use the tool within a sequence, though it does not explicitly exclude alternative uses.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description declares the tool as read-only, which is a key behavioral trait. It also specifies the authentication requirement (Medium integration token). Without annotations, it effectively discloses the essential behaviors, though it lacks details on potential limitations like pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at two sentences, with the most critical information (read-only nature) placed first. Every sentence adds value without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (zero parameters, no output schema), the description is complete. It covers purpose, return format, usage recommendation, and auth requirement, leaving no obvious gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so no parameter documentation is needed. The description adds no parameter-specific info, but the baseline for no parameters is 4. The description compensates by explaining the return value and usage context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists publications where the user can publish as editor/writer, and specifies the return format (id + name pairs). It distinguishes from siblings like list_posts and list_responses, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains that the id can be used with publish_post's publication_id, providing actionable guidance. It does not explicitly mention alternatives, but no other sibling tool lists publications, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsC
Read-only. List recent stories by a user (default: self).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| username | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states 'Read-only' but does not elaborate on traits such as pagination, time window for 'recent', or any constraints. With no annotations provided, the burden falls on the description, which falls short.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—only 7 words—and every word is meaningful. The 'Read-only' prefix is front-loaded for immediate safety signals. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 2 optional parameters, no output schema, and no annotations, the description is too brief. It lacks details on parameter semantics, result format, or behavioral constraints (e.g., rate limits, ordering).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 2 parameters (limit, username) with 0% coverage in the description. The description adds no information about what these parameters control or their effects, forcing the agent to infer from defaults alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list), the resource (recent stories), and scope (by a user, default self). It also adds 'Read-only' to indicate safe operation, distinguishing it from mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
While the description implies usage for listing recent stories of a specific user, it provides no explicit guidance on when to use this tool versus siblings like search_posts or get_feed. No when-not-to-use or alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes itself as 'Read-only', clarifying safety. Mentions it returns top-level responses only, not replies, which is key behavioral context. No annotations provided, so description carries burden well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each serving a purpose: declaring read-only nature, describing the result set, and guiding to alternative tools. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with 2 parameters and no output schema, the description provides enough context: what it does, how results can be used, and alternatives. No major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage for parameters, and the description does not explain post_id or limit beyond the schema field names. No clarification of what post_id refers to or how limit works.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists top-level responses under a story, distinguishes from sibling tools get_response_replies and get_unanswered_responses. Verb 'list' + resource 'responses' with context 'under a story'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use alternatives: prefer get_unanswered_responses for filtered worklist, and explains how to use response ids with get_response_replies for replies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| body | Yes | ||
| parent_response_id | No | ||
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description discloses the mutation nature (WRITE), endpoint fragility, and default dry-run behavior. It lacks details on auth or error states but adequately covers key traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, fragility warning, and usage guidance. Every sentence adds distinct value, front-loaded with the core verb and object.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters (2 required) and no output schema, the description covers purpose, use cases, preferred alternative, and default. It could elaborate on parameter specifics but is fairly complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It clarifies the use of post_id for top-level and parent_response_id for replies, and mentions dry_run default. However, it does not explicitly map each parameter to its role.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb ('Post') and the resource ('top-level response under a story, or a reply under a response'), distinguishing between two use cases. It also contrasts with sibling tools like propose_reply and confirm_reply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance: prefer propose_reply -> confirm_reply for interactive drafting, and notes the dry-run default. It also warns about the fragility of the endpoint, implying when to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | ||
| parent_response_id | No | ||
| body | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description bears full burden. It discloses behavior: it's a write but not final, dedup hash computation, token storage, 5-minute expiration, preview return, and linkage to confirm_reply. Lacks details on error cases or rate limits, but sufficient for basic understanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the key term 'STAGE A WRITE'. Every sentence provides unique information without redundancy. Efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description explains the two-phase flow, token expiration, and the need to call confirm_reply. Could mention how the token is returned or used, but overall sufficiently complete for a complex workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must add meaning. It explains parent_response_id's role (reply under specific response vs top-level). For post_id and body, it adds minimal value beyond the schema's type and required flags; body validation is implied but not detailed. Adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it stages a write (not final), validates, computes dedup hash, stores under token, returns token+preview. Distinguishes from siblings like confirm_reply and post_response by describing the two-phase commit pattern.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'STAGE A WRITE (no Medium call yet)' and 'On approval call confirm_reply', guiding the agent to use this for proposing before finalizing. Tokens expire in 5 minutes. Does not explicitly list alternatives or when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| content_markdown | Yes | ||
| tags | No | ||
| publication_id | No | ||
| publish_status | No | draft | |
| canonical_url | No | ||
| notify_followers | No | ||
| dry_run | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses action type (WRITE), default draft status, dry-run behavior, and use of integration token. No output schema exists, but description hints at publish consequences. Lacks detail on what happens on success or side effects like follower notifications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each valuable. Front-loaded with action and resource. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a complex tool with 8 parameters and no output schema. Missing explanation of return value or authentication requirements beyond 'uses integration token'. No reference to required fields (though in schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, description adds meaning for content_format, publish_status options, and dry_run default. Does not explain tags, publication_id, canonical_url, or notify_followers, leaving half of 8 parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'WRITE. Publish a story.' with specific verb and resource. Specifies content_format as markdown and distinguishes from sibling tools like 'clap_post' or 'post_response' by focusing on publishing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains default status behavior ('nothing goes public by accident') and how to override with 'public' or 'unlisted'. Mentions dry-run default but does not explicitly compare to other publish-related tools or list prerequisites like authentication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_postsC
Read-only. Medium-side search across public stories.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description labels the tool as 'Read-only', which is a positive disclosure. However, with no annotations, it fails to elaborate on other behavioral aspects such as authentication requirements, rate limits, or pagination behavior, relying solely on this single trait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of a single sentence with no redundancy. However, the inclusion of the ambiguous 'Medium-side' undermines clarity, and the structure lacks specifics beyond the read-only note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (two parameters, no output schema, no annotations), the description is insufficient. It does not specify the search scope (e.g., what constitutes 'public stories'), result ordering, or return structure, leaving significant gaps for correct agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input parameters 'query' and 'limit' are left entirely undescribed in both schema and description. The description only mentions 'search' but does not clarify what the query should be or how the limit affects results, offering zero additive value for parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'search across public stories', which clearly identifies the tool's purpose as a search function. However, the term 'Medium-side' is vague and may confuse, and it does not explicitly differentiate from sibling tools like list_posts or get_feed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention any context or conditions for appropriate use, leaving the agent without decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_approved_draftsA
WRITE. Sequentially post every entry in drafts.json where action=='approved'. Honors rate_seconds throttle. Dry-run by default.
| Name | Required | Description | Default |
|---|---|---|---|
| drafts_path | Yes | ||
| dry_run | No | ||
| rate_seconds | No | ||
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool performs a write operation, processes sequentially, respects a rate_seconds throttle, and defaults to dry-run. However, it does not detail side effects (e.g., error handling, impact on drafts.json file) or whether the operation is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no wasted words. The first sentence ('WRITE.') immediately signals the action type, followed by a concise behavioral summary. Every element serves a purpose, making it highly efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and moderate parameter count, the description covers the core behavior well. However, it omits details about the 'force' parameter, potential error scenarios, and the structure of drafts.json. These gaps could hinder an agent's understanding in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the purpose of 'drafts_path' (file containing approved entries), 'rate_seconds' (throttle), and 'dry_run' (default behavior). However, the 'force' parameter is not mentioned, leaving its meaning unclear. Overall, the description adds significant context beyond the schema's names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'WRITE. Sequentially post every entry in drafts.json where action=="approved".' This clearly identifies the action (post), resource (drafts.json entries with 'approved' action), and behavior (sequential, throttle). It distinguishes from sibling tools like 'publish_post' by specifying a specific data source and filtering condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for posting approved drafts with a dry-run default, but it does not explicitly state when to use this tool versus alternatives (e.g., publish_post, post_response). No exclusion criteria or alternative suggestions are provided, leaving the agent to infer context from the tool's specifics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full burden. It declares read-only behavior and credentials verification, but lacks details on side effects or rate limits. Adequate for a simple test tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences: first covers purpose and output, second gives usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters and no output schema, the description fully explains the tool's function and return values. Complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so schema coverage is 100% trivially. The description adds no param info, but none is needed. Baseline 4 for 0 params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is read-only, verifies credentials, and returns user info and publication count. It distinguishes itself from siblings as the only connection test tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises 'Call this first if other tools 401', providing clear context for when to use it. No alternatives needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
23 tool updates
v0.1.2- Changed
audit_search8 fields changed- added
Input schema / properties / kindAdded value: +{ + "default": null, + "title": "Kind", + "type": "string" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / sinceAdded value: +{ + "default": null, + "title": "Since", + "type": "string" +} - added
Input schema / properties / statusAdded value: +{ + "default": null, + "title": "Status", + "type": "string" +} - added
Input schema / properties / targetAdded value: +{ + "default": null, + "title": "Target", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"audit_searchArguments"
- Changed
bulk_draft_replies6 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / modelAdded value: +{ + "default": null, + "title": "Model", + "type": "string" +} - added
Input schema / properties / outAdded value: +{ + "default": "drafts.json", + "title": "Out", + "type": "string" +} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"bulk_draft_repliesArguments"
- Changed
clap_post6 fields changed- added
Input schema / properties / clapsAdded value: +{ + "default": 1, + "title": "Claps", + "type": "integer" +} - added
Input schema / properties / dry_runAdded value: +{ + "default": true, + "title": "Dry Run", + "type": "boolean" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"clap_postArguments"
- Changed
confirm_reply5 fields changed- added
Input schema / properties / forceAdded value: +{ + "default": false, + "title": "Force", + "type": "boolean" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / tokenAdded value: +{ + "title": "Token", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "token" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"confirm_replyArguments"
- Changed
dedup_status3 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"dedup_statusArguments"
- Changed
get_clap_count4 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_clap_countArguments"
- Changed
get_feed5 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 20, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / tabAdded value: +{ + "default": "home", + "title": "Tab", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_feedArguments"
- Changed
get_own_profile3 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_own_profileArguments"
- Changed
get_post4 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_postArguments"
- Changed
get_post_content5 fields changed- added
Input schema / properties / as_markdownAdded value: +{ + "default": false, + "title": "As Markdown", + "type": "boolean" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_post_contentArguments"
- Changed
get_profile4 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / usernameAdded value: +{ + "title": "Username", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "username" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_profileArguments"
- Changed
get_response_replies5 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / response_idAdded value: +{ + "title": "Response Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "response_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_response_repliesArguments"
- Changed
get_stats4 fields changed- added
Input schema / properties / daysAdded value: +{ + "default": 30, + "title": "Days", + "type": "integer" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_statsArguments"
- Changed
get_unanswered_responses5 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"get_unanswered_responsesArguments"
- Changed
list_own_publications3 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"list_own_publicationsArguments"
- Changed
list_posts5 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 20, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / usernameAdded value: +{ + "default": null, + "title": "Username", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"list_postsArguments"
- Changed
list_responses5 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 50, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"list_responsesArguments"
- Changed
post_response7 fields changed- added
Input schema / properties / bodyAdded value: +{ + "title": "Body", + "type": "string" +} - added
Input schema / properties / dry_runAdded value: +{ + "default": true, + "title": "Dry Run", + "type": "boolean" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / parent_response_idAdded value: +{ + "default": null, + "title": "Parent Response Id", + "type": "string" +} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id", + "body" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"post_responseArguments"
- Changed
propose_reply6 fields changed- added
Input schema / properties / bodyAdded value: +{ + "title": "Body", + "type": "string" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / parent_response_idAdded value: +{ + "default": null, + "title": "Parent Response Id", + "type": "string" +} - added
Input schema / properties / post_idAdded value: +{ + "title": "Post Id", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "post_id", + "body" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"propose_replyArguments"
- Changed
publish_post11 fields changed- added
Input schema / properties / canonical_urlAdded value: +{ + "default": null, + "title": "Canonical Url", + "type": "string" +} - added
Input schema / properties / content_markdownAdded value: +{ + "title": "Content Markdown", + "type": "string" +} - added
Input schema / properties / dry_runAdded value: +{ + "default": true, + "title": "Dry Run", + "type": "boolean" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / notify_followersAdded value: +{ + "default": false, + "title": "Notify Followers", + "type": "boolean" +} - added
Input schema / properties / publication_idAdded value: +{ + "default": null, + "title": "Publication Id", + "type": "string" +} - added
Input schema / properties / publish_statusAdded value: +{ + "default": "draft", + "title": "Publish Status", + "type": "string" +} - added
Input schema / properties / tagsAdded value: +{ + "default": null, + "items": { + "type": "string" + }, + "title": "Tags", + "type": "array" +} - added
Input schema / properties / titleAdded value: +{ + "title": "Title", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "title", + "content_markdown" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"publish_postArguments"
- Changed
search_posts5 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / limitAdded value: +{ + "default": 10, + "title": "Limit", + "type": "integer" +} - added
Input schema / properties / queryAdded value: +{ + "title": "Query", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "query" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"search_postsArguments"
- Changed
send_approved_drafts7 fields changed- added
Input schema / properties / drafts_pathAdded value: +{ + "title": "Drafts Path", + "type": "string" +} - added
Input schema / properties / dry_runAdded value: +{ + "default": true, + "title": "Dry Run", + "type": "boolean" +} - added
Input schema / properties / forceAdded value: +{ + "default": false, + "title": "Force", + "type": "boolean" +} - removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - added
Input schema / properties / rate_secondsAdded value: +{ + "default": 30, + "title": "Rate Seconds", + "type": "number" +} - changed
Input schema / requiredPrevious value: -[ - "kwargs" -]New value: +[ + "drafts_path" +] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"send_approved_draftsArguments"
- Changed
test_connection3 fields changed- removed
Input schema / properties / kwargsRemoved value: -{ - "title": "Kwargs" -} - removed
Input schema / requiredRemoved value: -[ - "kwargs" -] - changed
Input schema / titlePrevious value: -"_toolArguments"New value: +"test_connectionArguments"
23 tool updates
v0.1.0- First observed
audit_search - First observed
bulk_draft_replies - First observed
clap_post - First observed
confirm_reply - First observed
dedup_status - First observed
get_clap_count - First observed
get_feed - First observed
get_own_profile - First observed
get_post - First observed
get_post_content - First observed
get_profile - First observed
get_response_replies - First observed
get_stats - First observed
get_unanswered_responses - First observed
list_own_publications - First observed
list_posts - First observed
list_responses - First observed
post_response - First observed
propose_reply - First observed
publish_post - First observed
search_posts - First observed
send_approved_drafts - First observed
test_connection
TDQS
Each tool has a clearly distinct purpose with no overlap. Read-only tools cover specific queries (e.g., get_post vs get_post_content, list_responses vs get_unanswered_responses), and write tools handle distinct actions (publishing, clapping, replying via staging/confirmation). Even similar operations are differentiated by their target or workflow.
Most tools follow a verb_noun pattern (e.g., get_post, publish_post, confirm_reply). The outlier is bulk_draft_replies, which starts with a noun-like word instead of a clear verb. Overall, naming is predictable and readable.
23 tools is on the higher side, but each tool serves a specific need in the Medium domain (reading various data, writing with different operations). The count is justified by the breadth of functionality without being excessive.
The tool set covers most core Medium interactions: reading posts, profiles, responses, search, stats; writing responses, publishing, clapping, drafting replies. Missing operations like editing or deleting posts are minor gaps, but the workflow for replies is thorough.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Deploy full-stack apps (Postgres, Redis, S3, workers, backups) from Claude or curl. 59 MCP tools.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA browser-based solution that enables programmatic interaction with Medium's content ecosystem despite API deprecation, allowing publishing, retrieving, and searching Medium articles through Claude integration.198MIT
- AlicenseAqualityDmaintenanceA unified developer toolkit for AI-assisted workflows. Task timing, doc drift detection, env validation, secret scanning, port conflict resolution, AI context generation, and license auditing — one MCP server, one install.73MIT
- AlicenseAqualityDmaintenanceStandalone Substack CLI + 26-tool MCP server. Your IDE drafts the replies. Zero AI API keys.261MIT
- AlicenseAqualityAmaintenanceAn MCP server for freelancers and agencies that drafts client proposals and business emails — quotes, invoices, follow-ups, scope changes, and more — in your own voice, running locally with no API key or cloud.1002MIT
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