Skip to main content
Glama

medium-ops

PyPI version PyPI downloads Python 3.12+ License: MIT MCP compatible MCP Registry Anthropic DXT Glama MCP server MCP Badge

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

OpenCode MCP servers

uvx medium-ops mcp install opencode

Continue

Continue

uvx medium-ops mcp install print — paste the snippet into Continue’s MCP settings

Zed

Zed

Configure stdio MCP per Zed’s docs

Cline

Cline

MCP setup per extension / marketplace docs

Goose

Goose

MCP extensions per Goose docs

Large commercial stacks

Host

Documentation

Typical wire-up

Cursor

Cursor MCP

uvx medium-ops mcp install cursor

Claude (Desktop / Code)

Claude Desktop, Claude Code

mcp install claude-desktop / claude-code

GitHub Copilot

Copilot

MCP in VS Code where supported — use print + host docs

ChatGPT

OpenAI

Connector flows — often REST for tools without MCP

Google Gemini

Gemini

Gemini CLI / IDE features per Google docs

OpenCode (copy-paste)

Auto-install:

uvx medium-ops mcp install opencode

Manual (~/.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:

  1. Public RSS (reads, no auth). medium.com/feed/@{user} returns the author's ~10 most recent stories with body_html, pubDate, tags, hero image, and dc:creator. Zero credentials, faster than GraphQL, stable. Used by default for list_posts / get_post / get_post_content. Inspired by Portfolio_V2's blog page.

  2. Dashboard GraphQL (authenticated reads). medium.com/_/graphql + medium.com/_/api/* with the sid cookie. Used as a fallback when you ask for more than ~10 posts, when the post isn't in the RSS window, or for things RSS can't give you (responses, claps, feed, stats, search).

  3. Official REST (writes). api.medium.com/v1/* with an Integration Token. Supports createPost, createPostInPublication, getUser, getPublications. That's it.

Force a specific transport with --source rss|graphql|auto on posts list, posts show, and posts content. The dashboard + GraphQL endpoints are undocumented and Medium can change them at any time. See Known gaps.

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 TUI

Auth is read from ~/.cursor/mcp.json's mcpServers.medium-ops.env (or medium-api / medium). Override with env or .env.

uv run medium-ops auth verify
uv run medium-ops quickstart

Command 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

auth verify

Probe both integration token (/me) and sid cookie (GraphQL Viewer).

auth test

Same but exits non-zero on failure (CI-friendly).

auth setup

Interactive: paste token / sid / uid / username to .env.

Read — Stories (5)

Command

What it does

posts list [--user] [--limit]

Latest stories by a user (default: self).

posts show <id_or_url>

Story metadata (title, clap count, response count).

posts content <id> [--md]

Body HTML (or Markdown with --md).

posts search <query> [--limit]

Medium-side full-text search.

`posts publish -t "..." -f body.md [--pub] [--status draft

public

Read + Write — Responses (3)

Command

What it does

responses list <post_id> [--limit]

Top-level responses table.

responses tree <post_id> [--out file.json]

Full response + reply tree JSON.

responses add <post_id> "body" [--parent <r_id>] [--no-dry-run]

Post a response or reply.

Read + Write — Claps (2)

Command

What it does

claps count <post_id>

Total claps.

claps give <post_id> [--claps N] [--no-dry-run]

Clap 1-50 times. Dedup-protected.

Read — Discovery + Profile (5)

Command

What it does

feed list [--tab home|following|tag-{slug}] [--limit]

Reader feed.

profile me

Your full profile (GraphQL).

profile get <username>

Any user's public profile.

profile stats [--days N]

Per-post views / reads / fans (dashboard scrape).

profile publications

Publications you can publish to (integration token).

Reply engine (3)

Command

What it does

reply template <post_id> --template thanks

Rule-based replies (no LLM).

reply bulk <post_id> --out drafts.json

Draft every response to a file.

reply bulk-send drafts.json [--no-dry-run]

Post only action=approved rows. Dedup-checked.

Operations + safety (2)

Command

What it does

audit search [--kind] [--target] [--status] [--since 7d]

Query the JSONL audit log.

audit dedup-status

Counts in the dedup SQLite DB.

MCP server (3)

Command

What it does

mcp install <cursor|claude-desktop|claude-code|opencode|print> [--dry-run]

Auto-merge config into your host.

mcp serve

stdio MCP server (22 tools).

mcp list-tools

Print the tool registry.

Other (1)

Command

What it does

quickstart

Print a quickstart checklist.

Reply modes

Mode

What it does

Safety

template

YAML keyword rules under src/medium_ops/templates/*.yaml

dry-run default

bulk

LLM drafts every response to drafts.json. Edit, set action: "approved"

offline review, dedup-checked on send

bulk-send

Posts only items with action: "approved"

dry-run default; dedup DB prevents dup replies

MCP propose_replyconfirm_reply

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 tools

Manual 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 serve

MCP-native draft loop (no API key)

The safety + drafting stack that makes the unattended mode safe:

Tool

What it does

get_unanswered_responses

Worklist — responses where you haven't replied.

propose_reply

Dry-run only. Returns a token + payload preview.

confirm_reply

Posts the staged reply by token. Idempotent via dedup DB. Token TTL 5 min.

bulk_draft_replies / send_approved_drafts

File-based offline review loop.

audit_search / dedup_status

Read the audit log + dedup counts.

LLM strategy

Two layers, both free:

  1. MCP-native (default). Host LLM drafts via propose_reply / confirm_reply. No env vars, no API key. Use this for interactive replies.

  2. Subprocess CLI (daemon path). For reply bulk when no human is in the loop. Auto-detects claude (Claude Code), cursor-agent, or codex on PATH. Override with MEDIUM_OPS_LLM_CMD.

There is no paid-API-key path.

Auth setup

Medium has two auth layers that map to different feature surfaces:

  1. Integration TokenAuthorization: Bearer <token>. Used against api.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.

  2. sid cookie — from medium.com (Application → Cookies → sid). Used against medium.com/_/graphql and medium.com/_/api/*. Gets you: all reads (stories, responses, claps, feed, stats, profile), plus clap_post and post_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 export

Refreshing auth from a HAR

When cookies rotate or Medium changes a GraphQL schema, the fastest fix is:

  1. Open medium.com in Chrome with devtools → Network panel.

  2. Reproduce the failing action (publish a draft, post a response, etc.).

  3. Right-click any request → "Save all as HAR with content".

  4. medium-ops auth har ./medium.har

This:

  • merges fresh sid, uid, xsrf, cf_clearance cookies into .env (preserving everything else)

  • writes a redacted snapshot to .cache/har-snapshot.json listing every Medium GraphQL operation observed plus its request-variable / response-data key shapes — useful for diffing against the queries hard-coded in client.py to 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.jsonmcpServers.medium-ops.env):

MEDIUM_INTEGRATION_TOKEN=2fb00...     # optional, for writes
MEDIUM_SID=1:...                      # optional, for reads
MEDIUM_UID=...                        # optional
MEDIUM_USERNAME=yourhandle            # optional but recommended

Architecture

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 MediumClient

Endpoints used

Action

Method + URL

Auth: integration token

GET https://api.medium.com/v1/me

Auth: sid cookie

POST https://medium.com/_/graphql (Viewer)

User profile

POST /_/graphql (UserProfileQuery)

List stories

POST /_/graphql (UserStreamOverview)

Story metadata

POST /_/graphql (PostViewer)

Story body

POST /_/graphql (PostContent)

Story search

POST /_/graphql (SearchPosts)

Responses

POST /_/graphql (PostResponses)

Feed

POST /_/graphql (HomeFeed / FollowingFeed / TagFeed)

Publish story

POST https://api.medium.com/v1/users/{id}/posts

Publish to pub

POST https://api.medium.com/v1/publications/{pub_id}/posts

Own pubs

GET https://api.medium.com/v1/users/{id}/publications

Clap

POST https://medium.com/_/api/posts/{id}/clap (undocumented)

Post response

POST https://medium.com/_/api/posts (undocumented)

Stats

GET https://medium.com/@{username}/stats?count=... (undocumented)

Tests

uv run pytest -q

Coverage: 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_publications will 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 > 10 and the client will auto-fall back to GraphQL.

  • GraphQL operation names and schemas change silently. The queries in client.py mirror what the dashboard uses today — expect breakage every couple of months. Pin this package's version.

  • post_response uses GraphQL savePostResponse(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_content uses dashboard POST /p/{id}/deltas with {baseRev, rev, deltas}. For a brand-new draft, baseRev=-1, rev=0. Subsequent edits should bump both.

  • clap_post still uses the undocumented /_/api/posts/{id}/clap shape; not yet re-validated against the new GraphQL surface. Dry-run first.

  • Members-only stories return a paywall preview unless the sid belongs to a paying member.

  • No "restack" equivalent. Medium doesn't have reshares; the closest is a clap + a response. Use clap_post + post_response together for that.

  • No notes / short-form. Medium killed short-form in 2018.

  • Chrome cookie auto-grab (the auth_chrome flow from substack-ops) is not yet implemented. Paste your sid into .env for now.

  • TUI not yet implemented; the extras pin is there for future work.

License

MIT. See LICENSE.

Available Tools

23 tools
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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
outNodrafts.json
modelNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
clapsNo
dry_runNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYes
forceNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
tabNohome
limitNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
as_markdownNo

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_idYes
limitNo

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
limitNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
usernameNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
limitNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
bodyYes
parent_response_idNo
dry_runNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYes
parent_response_idNo
bodyYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
content_markdownYes
tagsNo
publication_idNo
publish_statusNodraft
canonical_urlNo
notify_followersNo
dry_runNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
limitNo

TDQS

C2.2/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose3/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
drafts_pathYes
dry_runNo
rate_secondsNo
forceNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 23 tool updatesv0.1.2
    • Changedaudit_search8 fields changed
      • addedInput schema / properties / kind
        Added value: +{
        +  "default": null,
        +  "title": "Kind",
        +  "type": "string"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / since
        Added value: +{
        +  "default": null,
        +  "title": "Since",
        +  "type": "string"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "default": null,
        +  "title": "Status",
        +  "type": "string"
        +}
      • addedInput schema / properties / target
        Added value: +{
        +  "default": null,
        +  "title": "Target",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"audit_searchArguments"
    • Changedbulk_draft_replies6 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / model
        Added value: +{
        +  "default": null,
        +  "title": "Model",
        +  "type": "string"
        +}
      • addedInput schema / properties / out
        Added value: +{
        +  "default": "drafts.json",
        +  "title": "Out",
        +  "type": "string"
        +}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"bulk_draft_repliesArguments"
    • Changedclap_post6 fields changed
      • addedInput schema / properties / claps
        Added value: +{
        +  "default": 1,
        +  "title": "Claps",
        +  "type": "integer"
        +}
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": true,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"clap_postArguments"
    • Changedconfirm_reply5 fields changed
      • addedInput schema / properties / force
        Added value: +{
        +  "default": false,
        +  "title": "Force",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / token
        Added value: +{
        +  "title": "Token",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "token"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"confirm_replyArguments"
    • Changeddedup_status3 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"dedup_statusArguments"
    • Changedget_clap_count4 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_clap_countArguments"
    • Changedget_feed5 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / tab
        Added value: +{
        +  "default": "home",
        +  "title": "Tab",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_feedArguments"
    • Changedget_own_profile3 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_own_profileArguments"
    • Changedget_post4 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_postArguments"
    • Changedget_post_content5 fields changed
      • addedInput schema / properties / as_markdown
        Added value: +{
        +  "default": false,
        +  "title": "As Markdown",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_post_contentArguments"
    • Changedget_profile4 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / username
        Added value: +{
        +  "title": "Username",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "username"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_profileArguments"
    • Changedget_response_replies5 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / response_id
        Added value: +{
        +  "title": "Response Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "response_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_response_repliesArguments"
    • Changedget_stats4 fields changed
      • addedInput schema / properties / days
        Added value: +{
        +  "default": 30,
        +  "title": "Days",
        +  "type": "integer"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_statsArguments"
    • Changedget_unanswered_responses5 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"get_unanswered_responsesArguments"
    • Changedlist_own_publications3 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"list_own_publicationsArguments"
    • Changedlist_posts5 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / username
        Added value: +{
        +  "default": null,
        +  "title": "Username",
        +  "type": "string"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"list_postsArguments"
    • Changedlist_responses5 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"list_responsesArguments"
    • Changedpost_response7 fields changed
      • addedInput schema / properties / body
        Added value: +{
        +  "title": "Body",
        +  "type": "string"
        +}
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": true,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / parent_response_id
        Added value: +{
        +  "default": null,
        +  "title": "Parent Response Id",
        +  "type": "string"
        +}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id",
        +  "body"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"post_responseArguments"
    • Changedpropose_reply6 fields changed
      • addedInput schema / properties / body
        Added value: +{
        +  "title": "Body",
        +  "type": "string"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / parent_response_id
        Added value: +{
        +  "default": null,
        +  "title": "Parent Response Id",
        +  "type": "string"
        +}
      • addedInput schema / properties / post_id
        Added value: +{
        +  "title": "Post Id",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "post_id",
        +  "body"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"propose_replyArguments"
    • Changedpublish_post11 fields changed
      • addedInput schema / properties / canonical_url
        Added value: +{
        +  "default": null,
        +  "title": "Canonical Url",
        +  "type": "string"
        +}
      • addedInput schema / properties / content_markdown
        Added value: +{
        +  "title": "Content Markdown",
        +  "type": "string"
        +}
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": true,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / notify_followers
        Added value: +{
        +  "default": false,
        +  "title": "Notify Followers",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / publication_id
        Added value: +{
        +  "default": null,
        +  "title": "Publication Id",
        +  "type": "string"
        +}
      • addedInput schema / properties / publish_status
        Added value: +{
        +  "default": "draft",
        +  "title": "Publish Status",
        +  "type": "string"
        +}
      • addedInput schema / properties / tags
        Added value: +{
        +  "default": null,
        +  "items": {
        +    "type": "string"
        +  },
        +  "title": "Tags",
        +  "type": "array"
        +}
      • addedInput schema / properties / title
        Added value: +{
        +  "title": "Title",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "title",
        +  "content_markdown"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"publish_postArguments"
    • Changedsearch_posts5 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 10,
        +  "title": "Limit",
        +  "type": "integer"
        +}
      • addedInput schema / properties / query
        Added value: +{
        +  "title": "Query",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "query"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"search_postsArguments"
    • Changedsend_approved_drafts7 fields changed
      • addedInput schema / properties / drafts_path
        Added value: +{
        +  "title": "Drafts Path",
        +  "type": "string"
        +}
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": true,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / force
        Added value: +{
        +  "default": false,
        +  "title": "Force",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • addedInput schema / properties / rate_seconds
        Added value: +{
        +  "default": 30,
        +  "title": "Rate Seconds",
        +  "type": "number"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "kwargs"
        -]New value: +[
        +  "drafts_path"
        +]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"send_approved_draftsArguments"
    • Changedtest_connection3 fields changed
      • removedInput schema / properties / kwargs
        Removed value: -{
        -  "title": "Kwargs"
        -}
      • removedInput schema / required
        Removed value: -[
        -  "kwargs"
        -]
      • changedInput schema / title
        Previous value: -"_toolArguments"New value: +"test_connectionArguments"
  2. 23 tool updatesv0.1.0
    • First observedaudit_search
    • First observedbulk_draft_replies
    • First observedclap_post
    • First observedconfirm_reply
    • First observeddedup_status
    • First observedget_clap_count
    • First observedget_feed
    • First observedget_own_profile
    • First observedget_post
    • First observedget_post_content
    • First observedget_profile
    • First observedget_response_replies
    • First observedget_stats
    • First observedget_unanswered_responses
    • First observedlist_own_publications
    • First observedlist_posts
    • First observedlist_responses
    • First observedpost_response
    • First observedpropose_reply
    • First observedpublish_post
    • First observedsearch_posts
    • First observedsend_approved_drafts
    • First observedtest_connection

TDQS

A3.6/5.0
Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/06ketan/medium-ops'

If you have feedback or need assistance with the MCP directory API, please join our Discord server