Skip to main content
Glama

redditapis-mcp

npm version npm downloads license

Official Model Context Protocol server for redditapis.com, the Reddit API as native tools for Claude, Cursor, Windsurf, and any MCP client. It turns Reddit reads (search, subreddit listings, comment trees, user profiles, community metadata) into typed tools your agent can call directly, plus (since 0.2.0) managing your own redditapis.com monitors and webhooks, and (since 0.4.0) sending the team product feedback the agent drafted and you reviewed.

Ask your agent to search Reddit for a topic, read a community's top posts of the week, pull a user's comment history, surface the redditors talking about a product, or read a subreddit's rules before you engage, and it calls the API for you. It can also set up a monitor that watches a subreddit for new posts matching a filter and delivers them to a webhook, then check what it's actually delivered. Every tool maps to a REST endpoint at https://api.redditapis.com; the server holds no state and forwards your API key on each call.

Quick start

No install needed. Run with npx. You need one thing: an API key from redditapis.com. Reads work with just that key, so there is no account login or session step to set up. Monitor/webhook management additionally requires an active monitoring plan (monitoring has no free tier).

Related MCP server: reddit-search

Setup

Claude Desktop

Edit claude_desktop_config.json (Settings > Developer > Edit Config):

{
  "mcpServers": {
    "reddit": {
      "command": "npx",
      "args": ["-y", "redditapis-mcp@latest"],
      "env": { "REDDITAPIS_KEY": "YOUR_API_KEY" }
    }
  }
}

Restart Claude Desktop. The reddit_* tools appear in the tool picker.

Claude Code

claude mcp add reddit --env REDDITAPIS_KEY=YOUR_API_KEY -- npx -y redditapis-mcp@latest

Cursor

~/.cursor/mcp.json (or Settings > MCP > Add New Server):

{
  "mcpServers": {
    "reddit": {
      "command": "npx",
      "args": ["-y", "redditapis-mcp@latest"],
      "env": { "REDDITAPIS_KEY": "YOUR_API_KEY" }
    }
  }
}

Windsurf

~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "reddit": {
      "command": "npx",
      "args": ["-y", "redditapis-mcp@latest"],
      "env": { "REDDITAPIS_KEY": "YOUR_API_KEY" }
    }
  }
}

VS Code (Copilot / agent mode)

.vscode/mcp.json in your workspace, or the user-level MCP settings:

{
  "servers": {
    "reddit": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "redditapis-mcp@latest"],
      "env": { "REDDITAPIS_KEY": "YOUR_API_KEY" }
    }
  }
}

Configuration

Env var

Required

Default

Purpose

REDDITAPIS_KEY

Yes

(none)

API key from redditapis.com. REDDIT_APIS_KEY is accepted as an alias.

REDDITAPIS_BASE_URL

No

https://api.redditapis.com

Override the API host.

REDDITAPIS_TIMEOUT_MS

No

30000

Per-request timeout in milliseconds.

REDDITAPIS_FEEDBACK_DIR

No

~/.redditapis

Where reddit_feedback_send keeps its local draft queue (feedback-queue.json).

Authentication is a Bearer token: the server sends Authorization: Bearer <REDDITAPIS_KEY> on every request.

Tools

34 tools: 22 reads, 10 monitor/webhook management tools, and 2 feedback tools. Reddit writes (posting, commenting, voting, DMs) remain a separate authenticated surface and are intentionally out of scope here -- monitor/webhook tools configure your OWN redditapis.com account (an alerting subscription), never Reddit itself, and the feedback tools send a report to the redditapis.com team, never to Reddit. Every read works with just your API key; the 6 monitor/webhook writes additionally need an active monitoring plan (see Monitoring below). The feedback tools are free and need only your key.

A few conventions across the catalog:

  • Subreddit names go in without the r/ prefix, and usernames without the u/ prefix. reddit_subreddit_posts takes its community as subreddit; the /sub/{name}/... tools take it as name.

  • Listing and search tools return an after cursor. Pass it back as after to fetch the next page, exactly as it was returned. limit accepts 1 to 100 (the API clamps out-of-range values).

  • When after comes back null there is no next page to ask for. That does not always mean you have every item: Reddit often stops serving a busy listing long before it runs out. The final response also carries listing_status, which reads complete, truncated or unknown. Only complete means nothing is missing. Treat the other two as a partial answer and widen across sorts, timeframes or search terms rather than paging deeper.

  • t (hour, day, week, month, year, all) sets the time window; on subreddit listings it applies to the top and controversial sorts, and on search it bounds the whole result set.

Search and discovery

Tool

Endpoint

What it does

reddit_search

GET /api/reddit/search

Search posts across all of Reddit or within one subreddit (subreddit).

reddit_search_comments

GET /api/reddit/search/comments

Search by comment text; returns the parent posts, since Reddit's comment search does not hand back the matching comment itself.

reddit_deep_comment_search

GET /api/reddit/search/comments/deep

Genuine comment search: returns the actual matching comment bodies (score, author, comment-deep permalink, parent post). limit sets how many parent posts to expand; group_by="author" switches to research mode (the distinct people talking about your query). Premium call.

reddit_search_media

GET /api/reddit/search/media

Search posts filtered to media, narrowed by kind (image, video, gif, all).

reddit_search_communities

GET /api/reddit/search/communities

Find subreddits by name or topic (title, subscribers, description, NSFW flag).

reddit_search_users

GET /api/reddit/search/users

Find redditors by name or keyword (username, karma, account age).

Subreddits

Tool

Endpoint

What it does

reddit_subreddit_posts

GET /api/reddit/posts

List a subreddit's posts by sort (new, hot, top, rising, controversial, best).

reddit_feedback_list

GET /feedback

List the reports this account has sent, newest first, with their status. The way back to a report whose id was not kept. Free.

reddit_verify_comments

POST /api/reddit/comments/verify

Check whether up to 100 specific comments still exist and are publicly visible. A read despite the POST; tells 'deleted by author' from 'removed by a mod' from 'still there'.

reddit_home_feed

GET /api/reddit/feed

Read YOUR OWN Reddit home feed. Needs your reddit_session and loid from POST /api/reddit/login (a REST call, not an MCP tool); they travel as headers, never in the URL.

reddit_subreddit_top

GET /api/reddit/sub/{name}/top

Top posts of a subreddit for a time window (t).

reddit_subreddit_comments

GET /api/reddit/sub/{name}/comments

Stream the newest comments across an entire subreddit (not one post's thread).

reddit_subreddit_about

GET /api/reddit/sub/{name}/about

A subreddit's public metadata: title, description, subscriber and active-user counts, type, NSFW flag.

reddit_subreddit_rules

GET /api/reddit/sub/{name}/rules

A subreddit's posting rules plus Reddit's site-wide rules.

reddit_subreddit_moderators

GET /api/reddit/sub/{name}/moderators

A subreddit's moderator team, each with permissions, flair, and when they joined.

reddit_subreddit_wiki

GET /api/reddit/sub/{name}/wiki/{page}

A subreddit's wiki page by name and page (markdown + HTML, revision metadata).

Posts and comments

Tool

Endpoint

What it does

reddit_post_visibility

GET /api/reddit/post/{id}/visibility

Is a post still publicly visible, or did it quietly stop being so? Fetches the post and one page of its author's listing and compares. Returns live, not_visible or undecidable with a reason, and never claims to know WHY. Two upstream calls, $0.004.

reddit_post

GET /api/reddit/post/{id}

A single post by its base-36 id (no t3_ prefix): title, author, score, text, permalink, subreddit, url.

reddit_post_comments

GET /api/reddit/comments

A post plus its full threaded comment tree, fetched by permalink.

reddit_by_id

GET /api/reddit/by_id/{fullnames}

Bulk-hydrate up to 100 posts in one call from a comma-separated list of t3_ fullnames.

Users

Tool

Endpoint

What it does

reddit_user_profile

GET /api/reddit/user/{name}

A user's public profile: karma, account age, verified/employee flags, avatar.

reddit_user_comments

GET /api/reddit/user/{name}/comments

A user's recent comments (body, score, subreddit, parent link, timestamp).

reddit_user_submitted

GET /api/reddit/user/{name}/submitted

A user's submitted posts (the sibling of reddit_user_comments).

reddit_user_achievements

GET /api/reddit/user/{name}/achievements

A user's public achievements (the trophies on their profile): name, description, granted timestamp, icons. An account with none returns an empty list.

Community browse (no keyword)

Tool

Endpoint

What it does

reddit_subreddits_popular

GET /api/reddit/subreddits/popular

Browse the most-subscribed, trending subreddits right now.

reddit_subreddits_new

GET /api/reddit/subreddits/new

Browse the newest subreddits, most recently created first.

reddit_subreddits_default

GET /api/reddit/subreddits/default

Browse Reddit's default front-page set of subreddits.

Monitoring: manage your own monitors and webhooks

v1 monitors are subreddit-scoped, posts-only (no all-of-Reddit keyword watch, no comment monitoring yet). Creating or updating a monitor or webhook needs an active plan; reading your own list/health/deliveries never does.

Tool

Endpoint

What it does

reddit_monitor_add

POST /api/reddit/monitor/add

Create a monitor: subreddits to watch plus an optional filter (keyword, author, domain, include/exclude terms, min score, NSFW). Forward-looking only from creation (or from baseline_item_id).

reddit_monitor_list

GET /api/reddit/monitor/list

List every monitor on your account, plus slots ({used, total, tier}).

reddit_monitor_update

POST /api/reddit/monitor/update

Pause/resume (active), re-cadence, or replace a monitor's filter. Passing any filter field REPLACES the whole filter -- resupply everything you want kept.

reddit_monitor_remove

POST /api/reddit/monitor/remove

Permanently delete a monitor. Cannot be undone.

reddit_monitor_health

GET /api/reddit/monitor/health

Per-monitor delivered/failed/suppressed counts (last 24h), suppressed_breakdown splitting those suppressions into ceiling and stale reasons, and whether the delivery ceiling specifically has been hit.

reddit_monitor_deliveries

GET /api/reddit/monitor/deliveries

The actual posts delivered (or attempted), newest first, with real content -- not just counts. Omit id to aggregate across every monitor you own.

reddit_monitor_webhook_create

POST /api/reddit/monitor/webhook/create

Register a delivery target (webhook/slack/discord). Returns a signing secret shown ONCE.

reddit_monitor_webhook_list

GET /api/reddit/monitor/webhook/list

List your webhooks. Never returns the secret.

reddit_monitor_webhook_test

POST /api/reddit/monitor/webhook/test

Send a one-off test delivery to confirm a webhook is wired up correctly.

reddit_monitor_webhook_delete

POST /api/reddit/monitor/webhook/delete

Permanently delete a webhook. Does not cascade-pause monitors still pointing at it.

Feedback: tell the team what broke, after you review the draft

Modelled on Claude Code's own feedback tool. When a call fails in a way that is not your key, credits or a rate limit, when you ask for something no tool covers, or when a result is plainly wrong, the model can draft a report into a local queue (~/.redditapis/feedback-queue.json, at most 10 drafts, override the directory with REDDITAPIS_FEEDBACK_DIR). Nothing is sent until you ask to review the queue and name the drafts to send. Each report carries the last failing call's endpoint, status and request id, your client name and this package's version, so the team can act on it without a follow-up. Use reddit_feedback_get with the returned server id to see whether it was triaged, shipped or declined. Both tools are free.

Tool

Endpoint

What it does

reddit_feedback_send

POST /feedback

action: "draft" (default) queues a report locally and sends nothing; "list" shows the queue; "send" posts only the drafts you name; "discard" drops them.

reddit_account_me

GET /account/me

How much credit this key has left, before spending any. Free, never metered.

reddit_feedback_get

GET /feedback/{id}

Read a sent report's status (new, triaged, shipped, declined) and the team's response.

Usage examples

Research a topic across Reddit

"What are people saying about the Rust borrow checker this month?"

The agent calls reddit_search with:

q: "borrow checker"
sort: "relevance"
t: "month"
sort_type: "score"

Read a community's top posts of the week

"Show me the top posts in r/programming this week."

The agent calls reddit_subreddit_top with:

name: "programming"
t: "week"

To page further, pass the after cursor from the response back on the next call: { name: "programming", t: "week", after: "<after from response>" }.

Find who is talking about a product

"Which redditors are recommending mechanical keyboards, and what do they say?"

The agent calls reddit_deep_comment_search with:

q: "mechanical keyboard"
group_by: "author"
sort: "relevance"

Research mode returns the distinct people who mentioned the query, ranked by how many of their comments matched, each with their top comment and the subreddits they matched in.

Vet a subreddit, then read a thread

"Find a discussion about API rate limiting in r/webdev, check the sub's rules, and read the full thread."

The agent calls reddit_search scoped to the community:

q: "rate limiting"
subreddit: "webdev"
sort: "relevance"
t: "year"

Then reddit_subreddit_rules with { name: "webdev" }, and finally reddit_post_comments with the permalink from a search result, for example { permalink: "/r/webdev/comments/abc123/some_title/" }, to pull the post and its comment tree.

Set up brand monitoring and check what came in

"Watch r/SaaS and r/startups for mentions of my product, send matches to my Slack, and show me what's come in so far."

The agent calls reddit_monitor_webhook_create with:

url: "https://hooks.slack.com/services/..."
kind: "slack"

Then reddit_monitor_add with:

subreddit: ["SaaS", "startups"]
q: "my product name"

Later, reddit_monitor_deliveries with { id: "<monitor id from the add response>" } returns the actual matching posts sent so far, or reddit_monitor_health for just the counts.

No session needed for reads; monitor/webhook writes need an active plan

Reads need nothing but your API key -- no account linking, login, or cookie step. Reddit write actions (posting, commenting, voting, sending DMs) are handled by a separate authenticated surface outside this package and remain deliberately not exposed here, so an agent using this server can never post, vote, or DM as you on Reddit. Monitor/webhook management tools are a different kind of write: they configure your OWN redditapis.com account (an alerting subscription) and require an active monitoring plan for anything that creates or changes state (reddit_monitor_add/update/remove, reddit_monitor_webhook_create/test/delete); reading your own list, health, or delivery history never does.

Troubleshooting

HTTP 401 (invalid or missing API key) Check that REDDITAPIS_KEY is set correctly in your MCP client config and matches the key from redditapis.com.

HTTP 402 (insufficient credits) Top up your account at redditapis.com. For a monitor/webhook write specifically, a 402 body of subscription_required means there is no active monitoring plan (monitoring has no free tier); monitor_slots_exhausted means the plan's monitor slot limit is already in use -- reddit_monitor_list's slots field shows used vs total.

HTTP 403 (access forbidden) The subreddit or user may be private, banned, or quarantined, or your plan may not include this endpoint.

HTTP 404 (not found) The subreddit, post id, user, or permalink may be wrong or the content may have been deleted or removed.

HTTP 429 (rate limited) Wait a few seconds and retry, or reduce request frequency. For bulk work, space out calls and raise REDDITAPIS_TIMEOUT_MS.

Request failed: timed out after 30000ms The default timeout is 30 seconds. For large reddit_deep_comment_search or paginated fetches, set REDDITAPIS_TIMEOUT_MS higher (for example 60000).

Tools do not appear in Claude / Cursor Ensure npx is on your PATH and Node.js 18+ is installed (node --version). Check your MCP client logs for startup errors.

Development

npm install
npm run check   # syntax-check both source files
npm test        # unit-test the tool catalog + query/path builders (no network)
npm start       # run the stdio server (needs REDDITAPIS_KEY)
  • Site and API keys: redditapis.com

  • REST API base URL (call it directly, without MCP): https://api.redditapis.com

FAQ

Do I need a Reddit developer account? No. Get an API key at redditapis.com; there is no application or approval step.

Can it post, comment, or vote? No. All 22 Reddit-facing tools read Reddit; posting, commenting, voting, and DMs are a separate authenticated surface and are not exposed here. The other 10 tools manage your OWN redditapis.com monitors/webhooks, which is a write, but never a write to Reddit itself.

Which clients are supported? Claude Desktop, Claude Code, Cursor, Windsurf, and VS Code (Copilot agent mode), or any Model Context Protocol client.

Does it store my key or data? No. The server holds no state and forwards your API key on each call.

License

MIT

Available Tools

43 tools
reddit_account_meA
Read-only

How much credit this API key has left, before spending any. Returns the account's remaining credit balance and usage totals. FREE: this call is not metered and never costs a credit, so call it whenever you are about to run something expensive rather than guessing. Use it to decide whether a planned batch fits in the remaining balance, and to tell the user how much is left if a call returns 402. A 402 from any other tool means the balance is exhausted; its response carries a top-up URL to give the user.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say readOnly/non-destructive; the description adds the non-obvious fact that this call is unmetered and never consumes a credit, plus the 402 error semantics and the presence of a top-up URL in error responses. That is behavior an agent cannot get from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the cost caveat, and most sentences earn their place by covering the 402 workflow. Slight redundancy between 'not metered' and 'never costs a credit' costs it a point.

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 names both return values (balance, usage totals) and supplies the error-handling context for 402. Nothing an agent needs to invoke or interpret this call is missing.

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?

Zero parameters, so there is nothing to mis-specify and the baseline is 4. The description correctly implies a no-argument call without adding noise about nonexistent inputs.

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?

States a specific resource and outcome: returns the account's remaining credit balance and usage totals. Clearly distinguishable from every sibling, which are Reddit data-fetching tools, not account/billing introspection.

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?

Explicit when-to-use guidance: call it before running something expensive, use it to check whether a planned batch fits the balance, and call it after a 402 to report remaining credit. It even explains what a 402 from another tool implies, which is the alternative signal an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_by_idA
Read-only

Bulk-fetch posts by their t3_ fullnames in ONE call (up to 100), instead of a request per post. Pass a comma-separated list of fullnames you already have from a search or listing to hydrate them. Returns posts with title, author, score, comment count, and permalink, the same post shape as the listing endpoints. The result is NOT always one-to-one with your request, so read meta: listing_status is complete only when every fullname came back, truncated is the boolean to branch on, and missing_fullnames names exactly which ids did not. Example: fullnames='t3_abc123,t3_def456'.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullnamesYesComma-separated post fullnames, each a t3_ prefix followed by the base-36 id (e.g. 't3_abc123,t3_def456'). Up to 100. Required (path parameter).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld annotations, the description discloses a non-obvious behavioral trait: the result is not always one-to-one with the request, and it explains the meta fields (listing_status, truncated, missing_fullnames) and which one to branch on. This is exactly the kind of partial-failure detail an agent cannot get from annotations.

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?

Front-loads the core behavior (bulk fetch in one call), then the usage cue, then the return shape and meta-branching, ending with a concrete example. Every sentence carries distinct information with no padding.

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 still names the returned fields (title, author, score, comment count, permalink) and the meta envelope, and it flags the caveat that responses may be partial. Nothing an agent needs to call and interpret this correctly is missing.

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 100% and the single parameter already documents the t3_ format and the 100 cap, so the schema carries the load. The description's inline example is mildly reinforcing but adds no syntax or constraint beyond what the schema provides.

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?

States a specific verb+resource (bulk-fetch posts) with a clear scope constraint (by t3_ fullnames, up to 100) and explicitly contrasts it with a per-post request pattern. It is distinguishable from siblings like reddit_post or reddit_subreddit_posts because it is keyed on ids, not listings.

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?

Tells the agent to pass fullnames 'you already have from a search or listing to hydrate them', which gives clear context for when this tool applies. It implies the batching alternative to per-post calls but does not name a specific sibling (e.g. reddit_post) as the single-id fallback, so it stops short of explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_feedback_getA
Read-only

Check the status of a feedback report this account sent earlier (the server id returned by reddit_feedback_send action "send"): status new, triaged, shipped or declined, the team's response text if any, and updated_at, which moves only when the team acts on it. Free per call. 404 if the id is not on this account.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe server id of a sent report, as returned by reddit_feedback_send action "send" (a UUID). Not a local draft id.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and non-destructive, but the description goes well beyond them: it enumerates the possible status values (new, triaged, shipped, declined), discloses the response text field, explains that updated_at only moves when the team acts, states the call is free, and documents the 404 condition when the id is not on this account.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and tightly packed with useful detail, but the single long parenthetical-laden sentence is dense. Nothing is wasted, though the structure could be easier to scan.

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 carries the burden of explaining return values, and it does so by naming the status values, response text, and updated_at semantics, plus the error case. Nothing an agent needs to call it correctly is missing.

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 100% and the single id parameter is fully described in the schema, including the 'not a local draft id' caveat. The description restates the same sourcing information, so it adds little beyond what the schema already provides; baseline 3 applies.

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?

States a specific verb (check the status) and a specific resource (a feedback report this account sent earlier), and identifies the source of the id via reddit_feedback_send. An agent can distinguish it from reddit_feedback_send and reddit_feedback_list without opening any schema.

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?

Clear context for when it applies: after sending a report, using the server id returned by the 'send' action. It does not explicitly name reddit_feedback_list as the alternative for enumerating reports, so there is no resolved when-to-use-vs-alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_feedback_listA
Read-only

List the feedback reports this account has sent, newest first, with each one's current status. Use it to RECOVER A LOST ID: the server id is returned only once, when a report is sent, so this is the way back to a report whose id was not kept. Also the way to answer "did that report actually land" and "has the team looked at it yet". Optionally filter by status or type, and page with the cursor from a previous response. Free per call, never metered. Returns {feedback: [...], count, limit, next_cursor}; page by passing next_cursor back as cursor until it is null; an account that has filed nothing gets an empty list and a 200, not an error. Note this lists SENT reports on the server, which is different from reddit_feedback_send action="list", which shows unsent local drafts on this machine.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOptional. Show only reports of this kind. Omit for all of them.
limitNoOptional. How many to return, 1 to 100 (default 25). Newest first.
cursorNoOptional. The next_cursor from a previous response, to fetch the page after it. Keyset paging on (created_at, id), so a report filed while you page cannot make a row repeat or be skipped. A cursor this endpoint did not issue is a 400, never an empty page.
statusNoOptional. Show only reports in this state. Omit for all of them.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/destructive/openWorld annotations: states cost ('free per call, never metered'), the exact return shape, keyset paging semantics and why it is repeat/skip-safe, that a foreign cursor yields 400 (never an empty page), and that an empty account yields an empty list with 200, not an error.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key value proposition (recovering a lost id) is front-loaded and most sentences carry distinct payload, but the description is long and the return/paging mechanics could be tightened without loss.

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?

No output schema exists, yet the description supplies the return shape and paging contract in prose, plus the sibling-differentiation an agent needs. Nothing essential to a correct call is missing.

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 100% and the schema descriptions are unusually rich, so the description's 'filter by status or type, page with the cursor' adds little beyond what the schema already documents. Baseline 3 is correct when the schema does the heavy lifting.

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?

States a specific verb and resource (list this account's SENT feedback reports, newest first, with status), and explicitly distinguishes itself from the sibling reddit_feedback_send action="list" (unsent local drafts). An agent can route without opening the schema.

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?

Gives concrete when-to-use triggers (recover a lost id that was returned only once, answer 'did that report land', 'has the team looked'), states when to filter/paginate, and names the alternative tool plus the condition that selects it. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_feedback_sendA

Report a product problem or gap in redditapis.com to its team from inside this session, the way Claude Code's own feedback tool works: a report is DRAFTED to a local queue first (action "draft", the default) and SENT only after the user reviews it. Drafting sends nothing, needs no confirmation, and should not be announced mid-task. WHEN TO DRAFT, only at high-signal moments: a redditapis tool call failed with an error that was not a missing key (401), credits (402) or a rate limit (429), and the user had to work around it; the user asked for something no redditapis tool covers; a documented field came back empty or wrong; the user was clearly frustrated with a result. One draft per distinct issue, never twice for the same one. FORMAT for details, four labelled bullets in this order: 'What happened:' observed vs expected, exact error text if short. 'What the user said:' quoted verbatim, or 'user did not comment'. 'Repro:' the minimal call that reproduces it. 'Evidence:' tool name, endpoint, HTTP status, request id (the last failing call is attached automatically where you leave a gap). Facts only: no guessing, no API keys or secrets, no personal names. REVIEW: when the user asks to see or send feedback, call action "list", then action "send" with ONLY the draft ids the user named in their own message, or action "discard". Sending posts each draft to POST /feedback (free, not metered) and returns a server id that reddit_feedback_get can check later.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoFor action "send" or "discard": the draft ids to act on, exactly as shown by action "list" and named by the user.
areaNoOptional. The endpoint or feature the report is about, e.g. "posts/comments" or "monitoring". At most 80 characters.
typeNoRequired for a draft. "bug": a tool or endpoint misbehaved. "idea": a change that would have made the task easier. "missing_capability": the user needed something no tool provides.
titleNoRequired for a draft. One specific line, at most 120 characters, naming the tool or endpoint and the defect, e.g. "reddit_post_comments returns 502 when the post is deleted".
actionNoWhat to do. "draft" (default) queues a new report locally and sends nothing. "list" shows the pending drafts with their ids. "send" posts the drafts named in ids to redditapis.com; use it only for ids the user named. "discard" drops the drafts named in ids.
detailsNoRequired for a draft. At most 8000 characters, four labelled bullets in order: What happened, What the user said (verbatim), Repro, Evidence.
evidenceNoOptional identifiers only, never payloads: {tool, endpoint, status, request_id}. Whatever you leave out is filled from the last failing call in this session; mcp_version and client are always attached.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give readOnlyHint=false, destructiveHint=false, openWorldHint=true; the description adds substantial context beyond that: drafting is local and 'sends nothing, needs no confirmation', sending posts to POST /feedback, is free/not metered, and returns a server id checkable via reddit_feedback_get. It also discloses the auto-attach of the last failing call and auto-filled evidence fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the core draft-then-send concept and organized into clear WHEN/FORMAT/REVIEW blocks, so it scans well. It runs long and some content (the four-bullet detail format) is duplicated from the schema, costing the top score.

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 7-parameter, multi-action, nested-object tool with no output schema, the description covers the full lifecycle: when to draft, the report format, how review/send/discard work, and what sending returns. Nothing an agent needs to invoke it correctly appears to be missing.

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 coverage is 100%, so the schema already documents every parameter and the enum values; the baseline would be 3. The description nonetheless adds meaning: the four labelled bullets for 'details', the fact that only user-named ids may be sent, and the auto-fill behaviour for omitted evidence fields. It reinforces rather than merely repeats 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 states a specific verb and resource ('Report a product problem or gap in redditapis.com to its team') and distinguishes itself from its siblings (reddit_feedback_list, reddit_feedback_get) by centering the draft/send workflow. An agent can tell what this tool is for without opening the schema.

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?

The 'WHEN TO DRAFT' block gives explicit trigger conditions (failed call that is not 401/402/429, uncovered request, wrong/empty field, user frustration), an explicit exclusion list, and a cadence rule ('one draft per distinct issue, never twice'). The REVIEW block names the alternatives (list/send/discard) and the condition that selects each.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_home_feedA
Read-only

Read YOUR OWN Reddit home feed, the front page your subscriptions produce. Every other read tool here is served from a shared pool of accounts, so it cannot answer 'what is on my feed' -- this one sends your session instead. REQUIRES your own Reddit session: call POST /api/reddit/login on the REST API first (not an MCP tool) and pass the reddit_session and loid cookies it returns. Without them this returns 400, deliberately, because Reddit's logged-out front page is a different feed belonging to nobody rather than a thinner version of yours. Same post shape and after cursor as reddit_subreddit_posts. For a PUBLIC community feed use reddit_subreddit_posts instead. Example: sort='best' limit=25.

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
loidYesYour Reddit `loid` cookie, from the same login response. Required, and must be sent together with reddit_session.
sortNoFeed sort. 'best' (default) is Reddit's own logged-in home sort. 'top'/'controversial' also take `t`.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.
proxyNoOptional proxy this read egresses through, so the request reaches Reddit from the IP this account normally acts from. http://user:pass@host:port or host:port. Pinned across retries.
token_v2NoYour Reddit `token_v2` cookie, from the same login response. Optional.
reddit_sessionYesYour Reddit `reddit_session` cookie, from POST /api/reddit/login on the REST API (not an MCP tool). Sent as a header, never in the URL. Required.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this read-only and open-world, but the description adds substantial behavioral context beyond them: the session/cookie auth requirement, why unauthenticated calls 400 rather than degrade, cursor instability across retries from truncated listings, and the listing_status semantics (complete/truncated/unknown) with a rule against reporting partial data as final.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the tool's purpose and its uniqueness before prerequisites and caveats. It is on the long side, but nearly every sentence carries non-obvious operational information, so little is wasted.

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?

No output schema exists, yet the description covers return shape parity with reddit_subreddit_posts, pagination behavior, listing completeness reporting, and the auth prerequisite. Nothing an agent needs to invoke or interpret it correctly is missing.

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 coverage is 100%, so the baseline is 3; the description still earns credit by warning that the opaque `after` cursor must be passed back exactly (hand-written fullnames lose paging depth) and providing a concrete invocation example (sort='best' limit=25).

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?

Specific verb+resource (read your own Reddit home feed) with immediate scope clarification ('the front page your subscriptions produce'). It explicitly distinguishes itself from sibling read tools that use a shared account pool, so an agent can tell it apart without opening the schema.

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?

States the exact precondition (POST /api/reddit/login on the REST API first, passing reddit_session and loid) and the failure mode if skipped (400, deliberately). It also names the alternative for public community feeds, reddit_subreddit_posts, removing all inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_addA

Create a new Reddit monitor: watch one or more subreddits, or ALL of Reddit, for new posts (or comments, via kind) matching a filter, and get every match delivered to a webhook you've registered with reddit_monitor_webhook_create. Omit subreddit and set q for a sitewide keyword monitor covering every subreddit at once (posts only). By default matches go to EVERY active webhook on your account; pass webhook_ids to route this monitor's matches to only specific webhook(s). Every redditapis.com account holds a free entitlement of ONE all-of-Reddit post watch at a 60s cadence (up to 10,000 deliveries a day), so no subscription is needed to create that monitor. Naming a subreddit, matching comments, a faster cadence and any additional watch require a paid plan. Needs at least one monitor slot free (see reddit_monitor_list's slots). Forward-looking only from the moment of creation, or from baseline_item_id if given -- it never backfills posts that already existed. Returns the created monitor (with its id) on success, or subscription_required (402) if the account holds no recognised entitlement at all, subreddit_scope_requires_paid_plan (402) if a free account named a subreddit, monitor_slots_exhausted (402) if the plan's slot limit is reached, sitewide_slots_exhausted (402) if the plan's separate sitewide cap is reached, distinct_subreddit_limit_reached (402) if the account already watches as many DIFFERENT subreddits as the plan covers (the limit counts distinct subreddits across all your monitors, not monitors, and the same subreddit in two monitors counts once; see reddit_monitor_list's slots.distinct_subreddits_total), sitewide_comment_monitoring_not_available (501) if a sitewide monitor asks for comments, subreddit_reserved (400) if subreddit names 'all', subreddit_not_found (400) if a named subreddit does not exist, or webhook_not_found (400) if a webhook_ids entry is not yours.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text keyword or phrase to match. Matched against the fields in `search_in` (default title+body+url). Omit to match every new post in the watched subreddits.
kindNoWhat to watch in the named subreddits: 'post' (default when omitted), 'comment', or 'both'. Comment monitoring requires a Growth, Pro or Scale plan -- on a lower tier this returns `comment_monitoring_requires_higher_tier` (402). Comments run roughly 7x the volume of posts, so expect proportionally more deliveries and check reddit_monitor_health's delivery ceiling before enabling it on a busy subreddit.
nsfwNoSet false to EXCLUDE NSFW/over-18 posts. Omitted or true both mean NSFW is allowed through -- there is no exclude-by-default; you must explicitly pass false to filter it out. POSTS ONLY: nsfw=false is REJECTED with a field-level 400 when kind is 'comment' or 'both', because Reddit flags NSFW on a post and never on an individual comment, so there is no field to filter a comment on. Run a kind='post' monitor to keep NSFW filtering, and cut unwanted comment text with exclude_terms.
groupNoOptional label to bundle multiple matches into one delivery instead of one webhook call per match. Omit for one delivery per matching item.
authorNoOnly match posts by this Reddit username (without u/).
domainNoOutbound link domains to watch for (e.g. ['example.com']). Matches the post's link URL, any URL inside a self-post/comment body, and a crosspost's original link, including one that only appeared in the original post's body. Exact-or-subdomain match only: 'example.com' matches 'blog.example.com' but never 'notexample.com'. Does NOT resolve shortened links (bit.ly, t.co).
cadence_sNoRequested poll interval in seconds. May only be SLOWER than the plan tier's floor, never faster -- a too-low value is silently clamped up to the tier's minimum. Omit to use the tier's default.
min_scoreNoOnly match posts with at least this many upvotes.
search_inNoWhich fields keyword/term matching is scoped to. Default ['title', 'body', 'url']. Narrow to avoid false positives, e.g. a term that only appears in a URL slug matching a post that never mentions it in prose. All four resolve on comments as well as posts: on a comment, 'title' matches the title of the THREAD the comment sits under (a comment has no title of its own), which also applies through the default scope and can deliver every comment under a busy matching thread. Scope to ['body'] if you only want comments that say the term themselves.
subredditNoSubreddits to watch, without the r/ prefix (e.g. ['SaaS', 'startups']). 1 to 50. OMIT this entirely (and set `q`) to watch ALL of Reddit for a keyword -- a monitor must be anchored by either a subreddit list or a keyword, never neither. Do NOT pass ['all']: r/all is Reddit's site-wide listing rather than a subreddit, so it is refused with 400 subreddit_reserved. Sitewide monitors are capped per plan tier (see reddit_monitor_list's `slots`) and cover POSTS only.
include_allNoEVERY one of these terms must appear (AND match) for the post to qualify, on top of any `q`.
include_anyNoAt least ONE of these terms must appear (OR match) for the post to qualify, on top of any `q`.
webhook_idsNoRestrict delivery to specific webhook(s) instead of every active webhook on the account. Pass id(s) from reddit_monitor_webhook_create/reddit_monitor_webhook_list. Omit (or pass an empty array) for the default: deliver to every active webhook you've registered. Every id must be a webhook you own -- returns `webhook_not_found` (400) otherwise.
exclude_termsNoPosts containing any of these terms are suppressed even if they otherwise match. Use to cut noise (e.g. exclude 'giveaway' from a brand-mention monitor).
min_relevanceNoAI relevance floor, 0-100. 0 (the default) is off. Above 0, every match is scored by a language model against this monitor's own keywords and anything below the floor is NOT delivered -- it is recorded in your delivery history with status 'suppressed' and reason 'low_relevance', carrying its score and a one-line explanation, so you can always read what was filtered and why. Nothing is silently discarded. Rough calibration: 80-100 squarely on topic, 50-79 related but peripheral, 20-49 tangential, 0-19 the keyword is used in an unrelated sense. The comparison is inclusive, so a score equal to the floor is delivered. If scoring is unavailable the match is delivered UNSCORED rather than withheld. Requires a Growth, Pro or Scale plan -- on a lower tier this returns `ai_relevance_requires_higher_tier` (402). REJECTED with a field-level 400 on a monitor that has no q, include_any or include_all, because there would be no topic to score an item against and the floor could only ever admit everything.
baseline_item_idNoA Reddit post fullname (e.g. 't3_abc123') to use as the starting point instead of 'now' -- matching starts strictly after this item. Omit to start from the moment of creation.
exclude_subredditsNoSubreddits to SUPPRESS, without the r/ prefix (e.g. ['politics', 'AskReddit']). SITEWIDE MONITORS ONLY: pass this only when you have OMITTED `subreddit` and anchored the monitor with `q`. Passing it together with `subreddit` is rejected with a field-level 400 -- a monitor that names its subreddits should drop the unwanted name from that list instead. Up to 50, matched exactly like `subreddit` so 'r/Politics', '/r/politics' and 'politics' are one entry. This is the noise control for an all-of-Reddit keyword watch: it filters DELIVERY only, so it never changes what is polled, never frees quota, and never affects matching in any other subreddit. Independent of exclude_terms -- an item is dropped if either fires.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare create semantics (readOnlyHint=false, openWorldHint=true, destructiveHint=false), so the description carries the load and does so richly: forward-looking only with no backfill, baseline_item_id as the start point, slot/entitlement accounting, and a full catalog of failure codes with HTTP statuses (402/501/400). It also states the success return value includes the monitor `id`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The size is broadly justified by 17 parameters and complex entitlement rules, and the core purpose is front-loaded. However, the dense run-on error-code chain and repeated plan/sitewide caveats make it a wall of text that could be broken into a structured list.

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?

No output schema exists, so the description must cover returns — and it does by naming the created monitor with its `id` plus the full error surface. Combined with the annotations and the exhaustive schema, an agent has everything needed to invoke this 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 coverage is 100%, so the baseline is 3 and the schema already documents all 17 parameters in depth. The description adds cross-parameter meaning beyond the schema — the q/subreddit anchoring rule, the webhook_ids default-vs-restrict behavior, and slot counting semantics — though much of the per-parameter detail is duplicated in schema descriptions.

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?

States a specific verb and resource ('Create a new Reddit monitor') plus the watched surface (subreddits or all of Reddit) and match kinds (posts/comments via `kind`). It explicitly routes the agent to sibling tools (reddit_monitor_webhook_create, reddit_monitor_list), so it is distinguishable without opening another schema.

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?

Gives explicit conditions: omit `subreddit` and set `q` for a sitewide keyword monitor, pass `webhook_ids` to target specific webhooks, omit it for the all-webhooks default. It also spells out when a plan is required, when the free entitlement suffices, and requires a free monitor slot before calling. Alternatives and prerequisites are fully named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_deliveriesA
Read-only

Delivery history: the actual Reddit posts a monitor's webhook has received (or attempted), newest first, including the real post content (title, subreddit, permalink, author). Answers 'what did I actually get sent', not just 'how many' (see reddit_monitor_health for counts). Every delivered item also carries payload.items[].enrichment: a relevance.score (0-1, how much of THIS monitor's own keyword criteria the item matched -- not a model's confidence), a sentiment (polarity -1 to 1 plus a positive/negative/mixed/neutral label), and an intent.tag (question, recommendation_request, complaint, promotion, praise, or discussion). All three are deterministic keyword/lexicon/rule heuristics computed at no extra cost -- each carries its own method field and NONE of them is a machine-learning or LLM call, so do not describe a score here as ML-derived. Omit id to aggregate history across every monitor you own.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoNarrow to one monitor's history. Omit to aggregate across every monitor you own.
limitNoMax rows to return, 1 to 200. Default 50.
beforeNoISO 8601 timestamp cursor for pagination -- pass the `created_at` of the oldest row from the previous page to fetch older deliveries.
statusNoFilter to one delivery status. 'dead' = retries exhausted, gave up. 'suppressed' = matched but deliberately not sent, and `payload.suppressed.reason` says which of the two reasons applied: 'delivery_ceiling' (the monitor's daily cap) or 'stale_item' (the item was already older than the freshness window when we first saw it, so it was withheld rather than delivered as if it were new). A 'stale_item' row is NOT a fault and was NOT rejected by any plan limit, and retrying cannot recover it; `payload.suppressed` carries the age and the threshold. Omit for all statuses.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the read-only/open-world safety profile, and the description adds substantial behavior beyond that: the semantics of 'dead' vs 'suppressed' (with both suppressed reasons and the note that stale_item is not a fault and cannot be recovered by retry), the deterministic non-ML nature of the enrichment fields, and the pagination contract. This is real disclosure the annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core definition and keeps every sentence informational, but the enrichment paragraph is dense and slightly redundant ('not a model's confidence' and 'NONE of them is a machine-learning or LLM call' restate the same point). Efficient for the amount of information conveyed, though not maximally tight.

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?

There is no output schema, so the description carries the full burden of describing return values, and it does so by documenting the payload.items[].enrichment shape (relevance.score, sentiment.polarity/label, intent.tag) alongside pagination and status semantics. Nothing an agent needs to call and interpret this correctly is missing.

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 coverage is 100%, so the baseline is 3, but the description adds meaning on top: it re-emphasizes the id-omission aggregation rule and expands thestatus semantics (retrying cannot recover a stale_item, no plan limit was involved) beyond what the schema states. The enrichment detail is output-oriented rather than parameter-oriented, so it does not push this higher.

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?

States a specific resource and scope ('the actual Reddit posts a monitor's webhook has received (or attempted), newest first') and explicitly distinguishes its output from 'how many', naming reddit_monitor_health as the counts-oriented sibling. An agent can route between the two without reading any schema.

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?

Gives explicit when-to-use framing ('what did I actually get sent' vs. counts) and names the alternative tool by name, plus states the aggregation behavior when id is omitted. The conditions that select this tool over its sibling are spelled out rather than inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_healthA
Read-only

Per-monitor health: whether it's active, its poll cadence, when it last matched something, and delivery counts for the last 24h (delivered_24h, failed_24h, suppressed_24h) plus whether its delivery ceiling has been hit (ceiling_reached) and what that ceiling is (daily_delivery_ceiling). suppressed_24h COUNTS TWO DIFFERENT THINGS AND suppressed_breakdown SPLITS THEM: ceiling (the monitor's daily cap was reached) and stale (the item was already older than the freshness window when we first saw it, so it was withheld rather than delivered as if it were new). A stale withhold is the usual reason a monitor's delivered count sits far below its matched count with no error anywhere, and it is the freshness gate working as intended -- nothing failed, the endpoint is fine, no limit on the plan rejected them, and retrying cannot recover the items. Do NOT read suppressed_24h > 0 as 'this monitor is over its limit': ceiling_reached is the field that answers that, and a stale withhold deliberately does not set it. When suppressed_breakdown.resolved is false the counts do not add up to the total and unresolved_reason says why, so do not report a split off them; ceiling_reached stays conservative in that case rather than being cleared. THOSE COUNTS ONLY COVER POSTS WE FETCHED. A post we never fetched was never matched and leaves no row behind, so it is absent from all three counters rather than counted in any of them -- zeros there mean 'no matches recorded', never 'nothing was missed'. coverage_24h is the separate field that speaks to fetching, and its status is the one to read first: complete (every poll reached the point where the previous poll finished), degraded (at least one poll was truncated and posts were lost unrecoverably -- see gaps[], posts_in_window_at_least and the estimated posts_missed_estimate), partial (nothing found, but not every kind of loss was checked -- see unobserved_events), or unknown (the check could not be run at all -- see reason). Do NOT report a monitor as healthy on unknown or partial, and do not treat a null count as zero: both mean the question went unanswered. coverage_24h is fed by the poll log and covers BOTH ways a poll loses posts unrecoverably (listing_exhausted, where Reddit stopped serving older posts, and poll_overflow, where the feed outran one poll's page budget); observed_events names what was actually checked, and a status of complete is only ever awarded when both were. WHAT complete DOES AND DOES NOT ESTABLISH: it means every poll that RAN got back to where the previous poll finished, AND that every feed was actually polled. The second half is stream_liveness, the field to read FIRST. coverage_24h is computed from the poll log, and a feed that is never polled writes nothing to that log, so it records no truncated poll and the coverage read comes back clean -- identical to a healthy monitor. stream_liveness reads a different source (the polling registry plus the per-feed last-successful-poll stamp), neither of which a poll that never ran can produce. Its status is live (every feed checked within three times its own interval), degraded (at least one is not: see streams[] for never_polled, stalled or unregistered per feed), or unknown (could not be established, including streams_awaiting_first_poll on a monitor created moments ago, which clears itself). coverage_24h can never read complete while this is anything but live. Do NOT report a monitor as healthy unless stream_liveness.status is live, and do not read a zero delivery count on a never_polled feed as a quiet subreddit: nothing was checked, so nothing could match. gaps[] IS A SAMPLE, NOT THE WHOLE LIST: it carries the most recent gaps only, gaps_returned says how many are in it, gaps_truncated says whether more exist, and gap_events_24h is always the true total. Count gaps from gap_events_24h and never from the length of gaps[]. FINALLY, cadence ANSWERS 'AM I BEING CHECKED AS OFTEN AS I PAY TO BE', which none of the fields above can. Cadence is a priced feature, so this is the field that says whether the monitor is being served the interval its plan sells. promised_cadence_s is the floor the account's CURRENT plan includes and requested_cadence_s is what this monitor is actually set to; meets_entitlement false means the monitor is set slower than the plan allows, which happens because a plan upgrade does NOT re-cadence monitors that already exist -- the fix is to set cadence_s on the monitor, and a deliberately slower cadence is also a legitimate choice. last_checked_s_ago, freshness_ratio and within_margin describe the slowest feed feeding this monitor, named in slowest_stream. READ freshness_reading BEFORE QUOTING ANY OF THEM: it is ONE INSTANTANEOUS SAMPLE, not an average and not a sustained verdict, so a single reading past the margin is not by itself proof of under-service. Every one of these is TRI-STATE and null NEVER means fine: a null within_margin or meets_entitlement means the question could not be answered, and unknown_reason says why. Do not report a monitor as on-cadence on a null.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe monitor's id, from reddit_monitor_add's response or reddit_monitor_list.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds deep operational context beyond that: stale withhold behavior, what complete does and does not establish, tri-state null semantics, and the fact that a never-polled feed writes nothing to the poll log. It stops short of describing output shape or pagination, but the behavioral disclosures are unusually rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is a dense wall of capitalized warnings and nested caveats that repeatedly restate the same exclusion (three separate 'do not report healthy on unknown/partial/live' variants). The field taxonomy is useful but the prose is roughly 5-10x the necessary length for a single-parameter read tool, and front-loading is sacrificed to exhaustiveness.

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 read-only health-check tool with one parameter and no output schema, the description carries the full burden of interpreting the returned fields, and it does so completely: every status enum is defined (complete/degraded/partial/unknown, live/degraded/unknown), every counter's meaning is explained, and the tri-state null semantics are explicitly stated.

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?

Only one parameter (id), schema coverage is 100%, and the schema already points at reddit_monitor_add and reddit_monitor_list as sources. The description adds no parameter-level detail, so baseline sits at 4 for a single-parameter tool with fully documented 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?

Opens with a specific verb+resource and a precise scope: per-monitor health covering active state, cadence, last match, and 24h delivery counts. The taxonomy of returned fields (coverage_24h, stream_liveness, cadence, gaps) is laid out exhausively, which distinguishes it sharply from reddit_monitor_list and reddit_monitor_deliveries without opening those schemas.

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?

Gives explicit when/when-not guidance throughout: do not report healthy on unknown/partial status, do not report healthy unless stream_liveness.status is live, read stream_liveness first, read freshness_reading before quoting. It also explains the diagnostic hierarchy (stream_liveness before coverage_24h) and names the fix path (set cadence_s).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_listA
Read-only

List every monitor on the caller's account, with each one's filter, active state, and cadence, plus a slots object ({used, total, tier}) showing how many monitor slots are purchased vs in use. Reading your own list never requires an active plan (a lapsed subscription shows an empty or paused list, not an error). webhook_ids NULL DOES NOT MEAN THE MONITOR HAS NO DESTINATION: null is the default and means matches go to EVERY active webhook on the account, which is the normal healthy state. A non-empty array narrows delivery to just those webhook ids. Never report a monitor as having no delivery target on the strength of a null here -- to see where a monitor's matches actually went, read reddit_monitor_deliveries, whose rows carry the resolved webhook_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe read, and the description adds substantial non-derivable behavior: a lapsed subscription yields an empty/paused list rather than an error, and the null semantics of webhook_ids (default = deliver to every active webhook) are spelled out with an explicit warning not to misread it as 'no destination'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded and every sentence carries information, but the capitalized warning about webhook_ids is longer and more emphatic than strictly needed, and the return-shape detail arrives before the alternative-tool pointer.

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 carries the full burden of describing the return payload (per-monitor filter/active state/cadence plus the {used, total, tier} slots object) and it does so, alongside the caveat an agent would otherwise get wrong about null delivery targets.

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?

Zero parameters, so there is no parameter semantics to clarify — baseline 4 applies. The description instead spends its budget on the shape and meaning of returned fields, which is appropriate for a no-arg call.

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?

States a specific verb and resource ('List every monitor on the caller's account') and enumerates the returned fields (filter, active state, cadence, slots), which distinguishes it from siblings like reddit_monitor_health and reddit_monitor_deliveries without opening any schema.

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 the access condition (reading your own list never requires an active plan), which removes a real gate for the agent, and routes the agent to reddit_monitor_deliveries when it needs resolved delivery targets. It lacks an explicit when-not-to-use statement, but the context provided is concrete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_removeA
Destructive

Delete a monitor. There is no undo endpoint -- it stops matching immediately, its slot is freed for a new monitor, and it disappears from reddit_monitor_list. Its past deliveries are NOT erased: they remain queryable via reddit_monitor_deliveries (both scoped by monitor_id and in the aggregate, no-id view) forever. Returns 404 monitor_not_found if the id does not exist or is not yours.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe monitor's id, from reddit_monitor_add's response or reddit_monitor_list.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint/readOnlyHint annotations by disclosing that there is no undo, that matching stops immediately, that the slot is freed for reuse, that the monitor disappears from reddit_monitor_list, that past deliveries are NOT erased and remain queryable forever, and the 404 monitor_not_found error condition. This is exactly the kind of side-effect and downstream-state detail a destructive tool needs.

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?

Front-loaded with the single-sentence action ('Delete a monitor'), followed by consequence sentences that each carry distinct information (undo, slot, list visibility, data retention, error case). No filler or repetition.

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 one-parameter destructive mutation with no output schema, the description covers reversibility, immediate effects, downstream data retention, cross-tool visibility, and the error path. Nothing an agent needs to invoke it correctly or predict its side effects is missing.

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 100%, so the id parameter is already documented (source: add response or list). The description adds value by specifying the failure semantics of the id ('404 monitor_not_found if the id does not exist or is not yours'), clarifying ownership scoping that the schema does not convey.

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?

States a specific verb ('Delete a monitor') with a clearly named resource and immediately distinguishes its effect from siblings by calling out reddit_monitor_list (slot disappears) and reddit_monitor_deliveries (past data persists). An agent can tell this apart from reddit_monitor_update or reddit_monitor_add without opening any schema.

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 richly describes the consequences of deleting but never states when to choose this over an alternative such as reddit_monitor_update (e.g. to pause rather than remove). Usage is implied by the delete semantics and the 'no undo' framing, so it lands at minimum-viable-plus rather than explicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_updateA

Update an existing monitor: pause/resume it (active), change its poll interval (cadence_s), switch between posts and comments (kind), replace its filter entirely, or re-target which webhook(s) it delivers to (webhook_ids). IMPORTANT: if you pass ANY filter field (subreddit, q, kind, domain, etc.), it REPLACES the whole filter, it does not merge with the existing one -- resupply every field you want kept, including subreddit AND kind (omitting kind reverts that monitor to posts-only). Same rule for webhook_ids: passing it REPLACES the monitor's targeting outright (an empty array clears back to 'every active webhook'); omitting it entirely leaves the monitor's existing targeting untouched. Omit all filter/webhook_ids fields to change only active/cadence_s. Returns 404 monitor_not_found if the id does not exist or is not yours, or 400 webhook_not_found if a webhook_ids entry is not yours.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text keyword or phrase to match. Matched against the fields in `search_in` (default title+body+url). Omit to match every new post in the watched subreddits.
idYesThe monitor's id, from reddit_monitor_add's response or reddit_monitor_list.
kindNoWhat to watch in the named subreddits: 'post' (default when omitted), 'comment', or 'both'. Comment monitoring requires a Growth, Pro or Scale plan -- on a lower tier this returns `comment_monitoring_requires_higher_tier` (402). Comments run roughly 7x the volume of posts, so expect proportionally more deliveries and check reddit_monitor_health's delivery ceiling before enabling it on a busy subreddit.
nsfwNoSet false to EXCLUDE NSFW/over-18 posts. Omitted or true both mean NSFW is allowed through -- there is no exclude-by-default; you must explicitly pass false to filter it out. POSTS ONLY: nsfw=false is REJECTED with a field-level 400 when kind is 'comment' or 'both', because Reddit flags NSFW on a post and never on an individual comment, so there is no field to filter a comment on. Run a kind='post' monitor to keep NSFW filtering, and cut unwanted comment text with exclude_terms.
groupNoOptional label to bundle multiple matches into one delivery instead of one webhook call per match. Omit for one delivery per matching item.
activeNoSet false to pause the monitor (stops matching/delivering), true to resume it.
authorNoOnly match posts by this Reddit username (without u/).
domainNoOutbound link domains to watch for (e.g. ['example.com']). Matches the post's link URL, any URL inside a self-post/comment body, and a crosspost's original link, including one that only appeared in the original post's body. Exact-or-subdomain match only: 'example.com' matches 'blog.example.com' but never 'notexample.com'. Does NOT resolve shortened links (bit.ly, t.co).
cadence_sNoNew poll interval in seconds, same tier-floor clamping as reddit_monitor_add.
min_scoreNoOnly match posts with at least this many upvotes.
search_inNoWhich fields keyword/term matching is scoped to. Default ['title', 'body', 'url']. Narrow to avoid false positives, e.g. a term that only appears in a URL slug matching a post that never mentions it in prose. All four resolve on comments as well as posts: on a comment, 'title' matches the title of the THREAD the comment sits under (a comment has no title of its own), which also applies through the default scope and can deliver every comment under a busy matching thread. Scope to ['body'] if you only want comments that say the term themselves.
subredditNoSubreddits to watch, without the r/ prefix (e.g. ['SaaS', 'startups']). 1 to 50. OMIT this entirely (and set `q`) to watch ALL of Reddit for a keyword -- a monitor must be anchored by either a subreddit list or a keyword, never neither. Do NOT pass ['all']: r/all is Reddit's site-wide listing rather than a subreddit, so it is refused with 400 subreddit_reserved. Sitewide monitors are capped per plan tier (see reddit_monitor_list's `slots`) and cover POSTS only. On an update, omitting this while passing another filter field makes the monitor SITEWIDE (the filter is replaced wholesale, not merged), so resupply it if you meant to keep the monitor scoped.
include_allNoEVERY one of these terms must appear (AND match) for the post to qualify, on top of any `q`.
include_anyNoAt least ONE of these terms must appear (OR match) for the post to qualify, on top of any `q`.
webhook_idsNoRestrict delivery to specific webhook(s) instead of every active webhook on the account. Pass id(s) from reddit_monitor_webhook_create/reddit_monitor_webhook_list. Omit (or pass an empty array) for the default: deliver to every active webhook you've registered. Every id must be a webhook you own -- returns `webhook_not_found` (400) otherwise.
exclude_termsNoPosts containing any of these terms are suppressed even if they otherwise match. Use to cut noise (e.g. exclude 'giveaway' from a brand-mention monitor).
min_relevanceNoAI relevance floor, 0-100. 0 (the default) is off. Above 0, every match is scored by a language model against this monitor's own keywords and anything below the floor is NOT delivered -- it is recorded in your delivery history with status 'suppressed' and reason 'low_relevance', carrying its score and a one-line explanation, so you can always read what was filtered and why. Nothing is silently discarded. Rough calibration: 80-100 squarely on topic, 50-79 related but peripheral, 20-49 tangential, 0-19 the keyword is used in an unrelated sense. The comparison is inclusive, so a score equal to the floor is delivered. If scoring is unavailable the match is delivered UNSCORED rather than withheld. Requires a Growth, Pro or Scale plan -- on a lower tier this returns `ai_relevance_requires_higher_tier` (402). REJECTED with a field-level 400 on a monitor that has no q, include_any or include_all, because there would be no topic to score an item against and the floor could only ever admit everything.
exclude_subredditsNoSubreddits to SUPPRESS, without the r/ prefix (e.g. ['politics', 'AskReddit']). SITEWIDE MONITORS ONLY: pass this only when you have OMITTED `subreddit` and anchored the monitor with `q`. Passing it together with `subreddit` is rejected with a field-level 400 -- a monitor that names its subreddits should drop the unwanted name from that list instead. Up to 50, matched exactly like `subreddit` so 'r/Politics', '/r/politics' and 'politics' are one entry. This is the noise control for an all-of-Reddit keyword watch: it filters DELIVERY only, so it never changes what is polled, never frees quota, and never affects matching in any other subreddit. Independent of exclude_terms -- an item is dropped if either fires.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, destructiveHint=false and openWorldHint=true; the description goes well beyond them by disclosing the replace-not-merge semantics (whole filter and webhook_ids replaced wholesale), what an empty array does (clears to 'every active webhook'), and the exact failure modes (404 monitor_not_found, 400 webhook_not_found). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The mutation list is front-loaded, then the critical replace-semantics caveat, then error codes. Dense but every sentence carries distinct information; only slight redundancy in restating the replace rule for both filters and webhook_ids.

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 18 parameters, no output schema and no nested objects, the description supplies exactly what's missing: replacement semantics, defaults on omission, and the two error codes. Nothing an agent needs to invoke this update correctly is absent.

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 coverage is 100%, so the per-field docs already carry the baseline. The description still adds update-specific meaning the schema alone doesn't foreground: that any filter field replaces the whole filter, that subreddit AND kind must be resupplied, and that omitting webhook_ids leaves targeting untouched. This is genuine added value over the field docs.

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?

Opens with a specific verb+resource ('Update an existing monitor') and then enumerates every mutation axis (active, cadence_s, kind, filter, webhook_ids) with the field name that controls each. An agent can distinguish this from reddit_monitor_add/create and reddit_monitor_remove purely from the first sentence.

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 tells the agent when to pass filter fields versus not ('Omit all filter/webhook_ids fields to change only active/cadence_s') and warns that omitting `kind` reverts to posts-only. It does not explicitly route to a sibling for the create/delete cases, but the update-only conditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_webhook_createA

Register a delivery target for monitors to send matches to. Requires an active monitoring plan (a webhook with no plan could never receive anything). Returns the webhook with its signing secret SHOWN ONCE -- store it immediately, it is never returned again by reddit_monitor_webhook_list. HTTPS only; the URL is re-validated (including a fresh DNS check) at every delivery, not just at creation.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesHTTPS URL to deliver matches to. Must be publicly reachable HTTPS, no embedded credentials, no loopback/private/link-local address.
kindNoPayload shape to send. PREFER OMITTING THIS: for a hooks.slack.com or discord.com/api/webhooks URL the kind is inferred from the host, and the response reports what it inferred in `kind_inferred_from`. 'slack'/'discord' format as native incoming-webhook messages; 'webhook' sends redditapis' generic signed JSON envelope and is the fallback only for a host we do not recognise; 'email' is not yet a real delivery transport. Passing 'webhook' for a Slack or Discord URL does NOT force the generic envelope (that combination can never deliver -- Slack answers 400 invalid_payload); the host wins and `kind_corrected_from` says so. Passing one SPECIFIC kind for a different platform's host (e.g. 'discord' with a hooks.slack.com URL) is refused with `webhook_kind_mismatch` (400) rather than stored.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds crucial behavior: the signing secret is shown once and never again, the URL is re-validated with a fresh DNS check at every delivery, and an active plan is required. No contradiction.

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, each carrying distinct information: purpose, prerequisite, secret handling, and validation. Front-loaded with the core action and 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?

No output schema, so the description correctly explains the critical return value (the one-time secret) and the operational constraints (plan required, HTTPS only, re-validation). Together with the rich schema, an agent has everything needed to call it safely.

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 coverage is 100% and both parameters are well described in the schema. The description adds one URL-related behavior—HTTPS only and re-validation at every delivery—which meaningfully supplements the schema's creation-time constraints.

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?

States a specific verb ('Register') and resource ('delivery target for monitors'), and distinguishes from sibling reddit_monitor_webhook_list by noting the secret is never returned there. An agent can identify it as the webhook-creation tool without opening the schema.

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?

Adds a clear prerequisite—an active monitoring plan—and explains why (a webhook with no plan could never receive anything). It doesn't name alternative tools like webhook_test or delete, but the context for when this tool applies is explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_webhook_deleteA
Destructive

Permanently delete a webhook. Any monitor still pointing at it will fail to deliver until repointed at a different webhook -- this does NOT cascade-delete or pause the monitors using it. Cannot be undone. Returns 404 webhook_not_found if the id does not exist or is not yours.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe webhook's id, from reddit_monitor_webhook_create's response or reddit_monitor_webhook_list.

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite destructiveHint=true already covering the safety profile, the description adds substantial context: the deletion is permanent and irreversible, it does NOT cascade to monitors (which will fail to deliver until repointed), and it returns 404 webhook_not_found for nonexistent or foreign ids. This is exactly the non-obvious behavior an agent needs.

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 tight sentences, front-loaded with the action, then the side-effect warning, then the error condition. Every sentence carries unique information with no redundancy.

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 single-parameter destructive tool with no output schema, the description covers the mutation's permanence, its non-cascading effect on dependent monitors, and the failure mode. Nothing essential for correct invocation is missing.

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 coverage is 100% and the schema already documents the id's origin, so baseline is 3; the description adds value by disclosing the 404-not-found condition when the id does not exist or is not owned by the caller, which is meaningful semantic detail about the id parameter.

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 opens with a specific verb+resource ("Permanently delete a webhook"), making the operation unmistakable. It does not explicitly contrast with the close siblings reddit_monitor_webhook_create/list/test, so it falls just short of full sibling differentiation.

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?

It explains the operational consequences of deleting but gives no when-to-use guidance, no prerequisites, and no explicit routing to alternatives such as repointing a monitor or using the webhook test/list tools. The agent must infer usage from context alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_webhook_listA
Read-only

List every webhook registered on the caller's account. Never returns the signing secret (shown once, at creation, by reddit_monitor_webhook_create).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description still adds genuinely useful behavioral context beyond the annotations: the secret is never returned and is only shown once at creation, which prevents an agent from hunting for it or expecting it in the response.

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 with no filler; the primary behavior (list all webhooks for the caller) is front-loaded and the caveat about the secret follows immediately. Every clause earns its place.

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 zero-parameter, read-only listing tool with no output schema, the description covers what an agent must know before calling: scope (caller's account) and the one surprising field behavior (no secret returned). Return-shape details like pagination or webhook object fields are unaddressed, which is a minor gap for a simple list operation.

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 there is nothing to disambiguate and the baseline is 4. No parameter-level information is needed or missing.

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 uses a specific verb ('List') plus resource ('every webhook registered on the caller's account'), so it is immediately clear what the tool returns. It names reddit_monitor_webhook_create only to explain where the signing secret comes from, not to route the agent between list/create/delete/test siblings, so sibling differentiation is implied rather than explicit.

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?

Usage is only implied: an agent can infer 'call this to see existing webhooks,' but there is no statement of when to prefer this over reddit_monitor_webhook_test or reddit_monitor_deliveries, and no prerequisites or conditions are given. It notes the secret is available at creation time, which is useful context but not routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_monitor_webhook_testA

Send a one-off test delivery to a registered webhook (rate-limited to 10/min) so you can confirm it's wired up correctly before waiting for a real match. Uses the webhook's kind to format the test payload the same way a real delivery would. On failure the response carries reason and status plus TWO fields that say what to actually do: hint, our sentence naming the fix (most often that the target's kind does not match its host, which no test can succeed through), and detail, a bounded, sanitised copy of what the destination itself replied. Report hint to the user rather than the bare reason -- http_error with a 400 names no field, no value and no remedy. Returns 404 webhook_not_found if the id does not exist or is not yours, or webhook_url_rejected if the URL fails re-validation (e.g. now resolves to a private address).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe webhook's id, from reddit_monitor_webhook_create's response or reddit_monitor_webhook_list.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the safety profile (readOnly=false, destructive=false, openWorld=true); the description adds the rate limit (10/min), the payload-formatting behavior driven by the webhook's kind, the rich failure shape (`reason`, `status`, `hint`, `detail`), and two specific error outcomes (404 webhook_not_found, webhook_url_rejected). It even explains why `hint` should be surfaced over `reason`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by payload behavior and then failure semantics in a logical order. It is dense and long, but nearly every sentence carries actionable information, so little is wasted.

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 takes on the burden of documenting return values and does so thoroughly: success formatting plus the full failure contract (reason/status/hint/detail and named error codes). An agent has everything needed to call and interpret this tool.

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 100% and the schema already documents the `id` parameter including where it comes from (create or list), so the description adds essentially no extra meaning beyond what the schema provides. Baseline 3 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 first clause states a specific verb and resource ('Send a one-off test delivery to a registered webhook') and its purpose ('confirm it's wired up correctly'), which cleanly separates it from siblings like reddit_monitor_webhook_create and reddit_monitor_webhook_delete.

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 gives clear context for use: run it before waiting for a real match to verify wiring. It doesn't explicitly name an alternative or a when-not condition, but the pre-flight framing makes the intended usage unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_postA
Read-only

Fetch a single Reddit post by its id. Returns the full post object (title, author, score, text, permalink, subreddit, url). Use when you already have a post id and want its details. Example: id='abc123' (the base-36 id, no t3_ prefix).

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe post's base-36 id (e.g. 'abc123'), without the 't3_' fullname prefix. Required (path parameter).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds behavioral context about return fields and the exact id format (base-36, no 't3_' prefix), which goes beyond the annotations and helps the agent know what to expect.

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 three sentences, front-loaded with the core purpose, then return details, then usage example. Every sentence earns its place with no redundancy or fluff.

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 single-read tool with one parameter and no output schema, the description is fully complete. It explains what the tool returns, when to use it, and the exact id format, making it self-sufficient for an agent.

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 schema covers 100% of the parameter details (base-36 id, no prefix, required). The description repeats this information and adds an example, but does not meaningfully extend beyond what the schema already provides. Baseline 3 is appropriate since the schema does the heavy lifting.

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 specific verb 'fetch' and resource 'a single Reddit post by its id', and lists the returned fields. It distinguishes itself from siblings by specifying 'single post' and noting the id input, which separates it from subreddit listings and searches.

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 explicitly says 'Use when you already have a post id and want its details', providing clear context for when to use this tool. It does not mention when not to use it or alternative tools, but the usage condition is specific and actionable enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_post_commentsA
Read-only

Fetch a single post and its comment tree by permalink. Returns the post plus threaded comments (author, body, score, replies) and an after cursor. Use after finding a post via search/listing to read the full discussion. Pass the post's permalink from a prior result.

ParametersJSON Schema
NameRequiredDescriptionDefault
permalinkYesThe post permalink path from a prior post result, e.g. '/r/programming/comments/abc123/some_title/'. Required.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, establishing the safety profile. The description augments this by disclosing the return format (post plus threaded comments with author, body, score, replies) and pagination via an 'after' cursor. It does not discuss rate limits or auth, but the provided context goes beyond annotation basics.

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 the core purpose, followed by return details and usage context. No filler or redundancy; every sentence earns its place.

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 single-parameter read-only tool with no output schema, the description covers what it returns, the pagination cursor, and the proper triggering context. It is self-sufficient for an agent to select and invoke it 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 coverage is 100% since 'permalink' has a clear description with an example. The description additionally tells the agent to 'Pass the post's permalink from a prior result,' which adds provenance guidance beyond the schema's static definition.

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 ('Fetch a single post and its comment tree by permalink') with specific resource and scope. It distinguishes itself from sibling tools like 'reddit_post' or 'reddit_search_comments' by specifying it returns the full comment tree, not just the post or search results.

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 for when to use the tool: 'Use after finding a post via search/listing to read the full discussion.' It implies a workflow but does not explicitly state when not to use it or mention alternative tools, so it falls short of the full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_post_visibilityA
Read-only

Is a post still publicly visible, or did it quietly stop being so? A removed Reddit post still returns when you fetch it by id, so asking the post does not answer this. This fetches the post and then one page of its author's submitted listing and compares them. Returns a verdict of live, not_visible or undecidable, a plain-language reason, and a confident flag. It deliberately never says WHY a post is not visible: a moderator removal, an admin removal, a spam filter and an author who has hidden their history are indistinguishable from outside. undecidable is a real answer, not a failure. Two upstream calls, billed as one $0.004 dual read.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesReddit post id, base36, with or without the t3_ prefix

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and destructiveHint=false, so safety is covered. The description goes well beyond them: it discloses the two-call mechanism (post fetch + one page of author submitted listing), names the returned fields (verdict, reason, confident flag), defines the verdict enum, warns it deliberately never reports the cause of invisibility, and states the billing ($0.004 dual read). It does not discuss rate limits or failure/timeout behavior, which keeps it from a 5.

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?

Front-loads the motivating question, then the methodology, then the return shape and caveats. Six dense sentences, no filler, every sentence earns its place.

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 read-only one-param tool with no output schema, the description carries the return-value burden it would otherwise lack: it names each returned field and explains the undecidable verdict and the deliberate omission of a cause. Nothing an agent needs to interpret results or decide to call it is missing.

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?

Only one parameter and schema coverage is 100%, so the schema already documents the base36 id and t3_ prefix handling. The description adds no id-format detail, but with a single fully-documented parameter the baseline is 4; the lack of extra param context is not a meaningful gap here.

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?

States a specific, unusual purpose (determine post visibility by cross-checking the post against the author's submitted listing) and immediately distinguishes itself from the sibling reddit_by_id by explaining why fetching the post alone does not answer the question. An agent can tell exactly what this tool is for without opening the schema.

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 frames the question it answers and why the obvious alternative (fetch by id) is insufficient, plus states what the result values mean and that undecidable is a legitimate outcome. The only mild gap is not naming which sibling to use for the two underlying reads, but the routing logic is otherwise complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_search_commentsA
Read-only

Search Reddit by COMMENT text. Reddit's comment search matches your keyword against comment bodies but returns the PARENT POSTS, not the individual comments, so each result is a post whose discussion mentions your query, carrying that post's title, selftext, score, and comment count. Use it to surface threads where a topic comes up in the replies that plain post-title search would miss. Reddit does not expose which specific comment matched or its text, so this returns posts, not comment bodies. For the actual comment bodies, use reddit_deep_comment_search. Example: q='best mechanical keyboard' sort='top'.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`).
tNoTime window that bounds which posts the search returns, e.g. 'week' = only posts from the past week. Unlike a subreddit listing, search applies this to the 'relevance' and 'top' sorts too. When omitted, Reddit defaults to 'all', so a broad 'relevance' query surfaces old high-upvote posts that only loosely match. Pass 'week' or 'month' to keep results recent and on-topic.
nsfwNoSet 'true' to include over-18 / NSFW results. Omit or 'false' to exclude them (default).
sortNoSort order for search. 'relevance' = best match (default), 'top' = highest score in the `t` window, 'new' = most recent, 'hot' = trending, 'comments' = most-discussed.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover safety (readOnly, non-destructive, openWorld); the description adds the crucial behavioral fact that Reddit does not expose which comment matched or its text, so the payload is posts rather than comment bodies. That is non-obvious return-shape behavior an agent would otherwise get wrong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the surprising behavior first, then usage, then routing, then example. Slightly redundant in restating the posts-not-comments point twice ('returns the PARENT POSTS' and 'this returns posts, not comment bodies'), but each block still earns its place.

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 must convey the return shape, and it does (post title, selftext, score, comment count). Combined with the routing to reddit_deep_comment_search, an agent has everything needed to call and interpret this tool correctly.

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 100%, including detailed semantics for t, sort, after, and limit, so the schema carries the parameter burden. The description only adds a usage example (q='best mechanical keyboard' sort='top'), which is marginal beyond the schema. Baseline 3 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?

States a specific verb+resource (search Reddit by comment text) and immediately disambiguates the counterintuitive semantics: results are parent posts, not comments. It names both related siblings (reddit_search via 'plain post-title search', reddit_deep_comment_search) so an agent can distinguish it without opening other schemas.

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?

Gives an explicit use case ('surface threads where a topic comes up in the replies that plain post-title search would miss') and an explicit alternative for the adjacent need ('For the actual comment bodies, use reddit_deep_comment_search'). This is exactly the when/when-not/alternative structure.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_search_communitiesA
Read-only

Search for subreddits (communities) by name or topic. Returns matching subreddits with title, subscriber count, description, and NSFW flag. Use to discover where a topic is discussed before listing or searching its posts. Example: q='machine learning'.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`).
nsfwNoSet 'true' to include over-18 / NSFW results. Omit or 'false' to exclude them (default).
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered. The description adds the return payload shape (title, subscriber count, description, NSFW flag), but says nothing about rate limits, auth requirements, or the truncation/pagination caveats that the schema's `after` param carries.

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, front-loaded with purpose, then return shape, then usage, then a one-line example. No sentence is redundant and nothing is buried.

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?

With no output schema, the description usefully enumerates the returned fields, and the safety profile is covered by annotations while pagination/truncation behavior lives in the schema. It does not mention the `limit`/paging model at all, which is the one detail an agent might want summarized in prose.

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 100%, so all four parameters are already documented in detail, including the enum for `nsfw` and the extensive `after` cursor semantics. The description only adds an illustrative q value, so the baseline of 3 applies.

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?

States a specific verb and resource ('Search for subreddits (communities) by name or topic') and disambiguates it from post-oriented siblings by naming the returned fields and positioning it as a discovery step before listing or searching posts. The example query makes the operation concrete.

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?

Gives clear situational guidance ('Use to discover where a topic is discussed before listing or searching its posts') that tells the agent when this tool is the right entry point versus post search. It stops short of naming explicit alternatives or stating when NOT to use it, so it is clear context rather than full routing logic.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_search_mediaA
Read-only

Search Reddit posts filtered to media (images, video, gifs). Returns media posts with the media URL/type, author, score, and the post url. Use kind to narrow to a media type. Example: q='aurora borealis' kind='image'.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`).
tNoTime window that bounds which posts the search returns, e.g. 'week' = only posts from the past week. Unlike a subreddit listing, search applies this to the 'relevance' and 'top' sorts too. When omitted, Reddit defaults to 'all', so a broad 'relevance' query surfaces old high-upvote posts that only loosely match. Pass 'week' or 'month' to keep results recent and on-topic.
kindNoMedia type filter. 'image', 'video', 'gif', or 'all' (default). Filters the raw Reddit results to that media kind.
nsfwNoSet 'true' to include over-18 / NSFW results. Omit or 'false' to exclude them (default).
sortNoSort order for search. 'relevance' = best match (default), 'top' = highest score in the `t` window, 'new' = most recent, 'hot' = trending, 'comments' = most-discussed.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, openWorld, and non-destructive, so safety is covered. The description adds the return shape (media URL/type, author, score, post url), useful since there is no output schema, but says nothing about auth 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose, followed by a param hint and an example. Efficient with no filler, though the example could be slightly more representative.

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?

With no output schema, the description helpfully enumerates the returned fields, and schema coverage handles all input nuance. Given annotations cover safety, the description is complete enough, missing only cross-tool routing guidance.

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 100%, so all seven parameters, including the rich `after` and `t` guidance, are already documented in the schema. The description only restates `kind` usage, adding no meaning beyond structured data. Baseline 3 applies.

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?

States a specific verb (search) plus resource (Reddit posts) and scope (filtered to media), so an agent can distinguish it from a generic `reddit_search`. It doesn't explicitly name the sibling it is not, but the media-only scope is clear enough.

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?

Gives a concrete invocation example (q='aurora borealis' kind='image') and hints to use `kind` to narrow, which implies when to use it. However, it never states when to prefer this over `reddit_search` or `reddit_subreddit_posts`, leaving that routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_search_usersA
Read-only

Search for Reddit users (redditors) by name or keyword. Returns matching accounts with username, karma, and account age. Use to find a person's handle before fetching their profile or comments. Example: q='spez'.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesSearch query text. Supports Reddit search syntax (e.g. `subreddit:webdev`, `author:spez`, `"exact phrase"`, `title:...`).
nsfwNoSet 'true' to include over-18 / NSFW results. Omit or 'false' to exclude them (default).
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered. The description adds the return shape (username, karma, account age), which is useful given there is no output schema, but it says nothing about pagination, rate limits or result completeness — behavior that only lives in the `after` schema text, not the description.

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, zero padding, and the core purpose plus return shape are front-loaded ahead of the usage hint and example.

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 read-only search endpoint with full annotation coverage and a fully documented schema, the description supplies purpose, return fields and usage context. Only the pagination/truncation caveats expected of a search tool are absent from the description (they live in the schema instead).

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 100%, so the schema already documents q, nsfw, after and limit in depth (including Reddit search syntax and cursor semantics). The description only adds a trivial example (q='spez') and 'by name or keyword', so the baseline 3 applies.

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?

States a specific verb and resource ('Search for Reddit users by name or keyword') and names the returned fields, which cleanly separates it from generic siblings like reddit_search, reddit_search_comments and reddit_search_communities. An agent can tell what this returns without opening the schema.

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?

Gives concrete when-to-use guidance ('find a person's handle before fetching their profile or comments'), implicitly routing to reddit_user_profile / reddit_user_comments. It does not explicitly name those alternatives or state when NOT to use it, so it falls just short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddit_aboutA
Read-only

Fetch a subreddit's public metadata by name (Reddit's /r//about data). Returns the subreddit's title, public description, subscriber count, active-user count, creation timestamp, type, and NSFW flag. Use it to size or vet a community before listing or searching its posts. Example: name='python'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSubreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and non-destructive. The description adds context by specifying it returns public metadata and lists the fields, which goes beyond the annotations. It does not contradict them.

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 three sentences, front-loaded with the action, and each sentence contributes value: purpose, return fields, and usage guidance. No redundancy or fluff.

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 read-only metadata tool with one well-documented parameter, the description fully covers purpose, usage, and return values. The lack of an output schema is compensated by listing the returned fields.

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 100%, so the parameter is fully described in the schema (e.g., 'WITHOUT the r/ prefix'). The description adds an example ('name='python'') that reinforces this, but provides no new semantic information.

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 states a specific verb and resource: 'Fetch a subreddit's public metadata by name.' It clearly distinguishes this from sibling tools that deal with posts, comments, or searches, and it enumerates the exact fields returned.

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 gives explicit usage context: 'Use it to size or vet a community before listing or searching its posts.' This indicates when to use the tool, though it does not explicitly name alternative tools or state 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.

reddit_subreddit_commentsA
Read-only

Stream the NEWEST comments across an entire subreddit (Reddit's /r//comments feed), not one post's thread. Returns comments with body, author, score, subreddit, the parent post link, and timestamp, plus an after cursor. Poll it to catch new comments in a community as they are posted. Example: name='python'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSubreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter).
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint, destructiveHint=false), but the description adds real behavioral value: it enumerates returned fields and flags the streaming/polling model with an `after` cursor, which the annotations do not convey. Some nuance (truncation semantics) lives in the schema rather than here, keeping it short of a 5.

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 tight sentences, front-loaded with the core purpose and scope before the return details and the example. No filler and nothing redundant.

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?

With no output schema, the description correctly enumerates the returned fields (body, author, score, subreddit, parent link, timestamp, cursor) and the polling model, so an agent knows what it gets back. The main omitted detail is rate-limit/pagination-truncation guidance, which is instead delegated to the schema's `after` description.

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 100%, so both `name` and `after` are already documented in depth in the schema itself. The description only adds an example value ('name=python') and mentions the `after` cursor, so it does not meaningfully exceed the schema baseline.

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?

States a specific verb ('Stream'), resource ('NEWEST comments'), and scope ('across an entire subreddit'), then explicitly distinguishes itself from the sibling case ('not one post's thread'). It also names the underlying feed (/r/<name>/comments), so an agent can route correctly without opening the schema.

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?

Gives clear usage context ('Poll it to catch new comments in a community as they are posted') and excludes the single-post case, which implicitly routes to reddit_post_comments. It stops short of naming alternative sibling tools or stating when a different tool (e.g. reddit_search_comments) is preferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddit_moderatorsA
Read-only

Fetch a subreddit's moderator team by name (Reddit's /r//about/moderators data). Returns a moderators list, each with name, id, mod_permissions, flair_text, and added (when they joined the mod team). Use it to see who moderates a community. Example: name='python'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSubreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context by naming the underlying endpoint (/about/moderators) and detailing the return fields (name, id, mod_permissions, etc.), including the meaning of 'added'.

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 compact: two sentences and an example. It front-loads the main purpose and each sentence adds value — endpoint, return structure, usage, and example. 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 read-only tool with one parameter, the description covers the purpose, usage context, return format, and parameter example. The schema and annotations fill in the remaining safety and parameter details, making it complete.

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 already fully describes the 'name' parameter (required, no r/ prefix, path parameter). The description's example 'name='python'' reinforces the format but does not add new semantic information 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 ('Fetch a subreddit's moderator team') and the specific resource (subreddit by name). It explicitly distinguishes this tool from siblings like reddit_subreddit_about or reddit_subreddit_rules by focusing on moderator team data.

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 clear use case: 'Use it to see who moderates a community.' However, it does not explicitly mention alternatives or when not to use it, which would have made the guidance more complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddit_postsA
Read-only

List posts from a subreddit by sort order. Use this to read a community's feed: newest, hot/trending, top-of-week, rising, etc. Returns post title, author, score, comment count, and permalink, plus an after cursor for paging. When after comes back null the response carries listing_status: complete means no older posts and is only claimed when the whole run came back in under one page, truncated means Reddit's cap cut you off, and unknown means we cannot tell, so do NOT report unknown as the end of the data. A busy feed that Reddit simply stops serving reports unknown, not complete, so treat unknown as an incomplete answer and widen across sorts, timeframes or search rather than paging deeper. Example: subreddit='programming' sort='top' t='week'.

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
sortNoSort order for a subreddit listing. 'hot' = trending now, 'new' = most recent (default), 'top' = highest score in the `t` window, 'rising' = gaining fast, 'controversial' = polarizing, 'best' = Reddit's blended rank.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.
subredditYesSubreddit name WITHOUT the r/ prefix (e.g. 'programming', 'AskReddit'). Required.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover readOnly/openWorld, but the description adds substantial non-obvious behavior: the `listing_status` semantics (complete/truncated/unknown) with explicit instructions not to report unknown as end-of-data, and pagination cursor behavior. This is exactly the kind of context annotations can't provide.

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?

Front-loaded with the core purpose, then structured into purpose, return-value/status explanation, usage guidance, and an example. Zero filler despite covering a lot of ground.

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 tool with no output schema and complex pagination/status semantics, the description is complete: it explains the return fields, the status meanings, and the correct action on incomplete data. An agent has everything needed to call it 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 coverage is already 100%, so the schema documents all params. The description adds an example (subreddit='programming' sort='top' t='week') and reiterates the cursor's opaque nature, giving slightly more than the schema alone—marginal but useful reinforcement.

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?

States a specific verb (list) and resource (posts in a subreddit) and scopes it via sort order. It's clearly distinct from siblings like reddit_subreddit_top, reddit_subreddit_comments, and reddit_search, and even provides an example call.

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?

Gives clear usage context: read a community's feed with various sorts, and explicit guidance to 'widen across sorts, timeframes or search' when data is incomplete, which routes to alternative strategies. It doesn't name specific sibling tools as alternatives, but the condition to switch is spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddit_rulesA
Read-only

Fetch a subreddit's posting rules by name (Reddit's /r//about/rules data). Returns a rules list, each with name, description, what it applies to (posts, comments, or all), violation reason, priority, and creation date, plus a site_rules list of Reddit's site-wide rules. Use it to check a community's rules before posting or commenting. Example: name='python'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSubreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description aligns with these. It adds valuable context about the return structure (rules and site_rules lists) and the data source (/r/<name>/about/rules), going beyond the annotations.

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 plus an example, front-loaded with the main purpose. Every sentence contributes: purpose, return details, use case, and example. No redundancy or 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?

With no output schema, the description thoroughly explains return values (rules list with specific fields and site_rules list). It also includes usage context and an example, making the tool fully understood for a simple read-only fetch.

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 coverage is 100% with a clear description for the 'name' parameter. The tool description reinforces the format (WITHOUT r/ prefix) and provides an example (name='python'), adding practical clarity 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 'Fetch a subreddit's posting rules by name' with a specific verb and resource. It distinguishes from sibling tools like reddit_subreddit_about and reddit_subreddit_moderators by focusing on posting rules, not general info or moderators.

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 clear use context: 'Use it to check a community's rules before posting or commenting.' It doesn't mention when not to use or alternative tools, but the primary use case is explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddits_defaultA
Read-only

Browse Reddit's default front-page set of subreddits, no keyword needed. Returns a subreddits list (each with name, title, subscriber count, description, type, and NSFW flag) plus an after cursor for paging. This BROWSES the default communities; use reddit_search_communities instead to SEARCH communities by keyword.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the return shape (subreddits list with name, title, subscriber count, description, type, NSFW flag) and the presence of an `after` paging cursor — details not present in any structured field, since there is no output 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 tight sentences, front-loaded with the browse scope, then return shape, then the disambiguating alternative. No filler and no repetition of the schema's pagination essay.

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 carries the return-value burden and does so by enumerating the returned fields and the paging cursor. Combined with annotations covering safety and a schema that exhaustively documents both parameters, an agent has everything needed to call this correctly.

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 100% and the `after` field's schema text is unusually rich (cursor opacity, truncation semantics, listing_status handling), so the schema does the heavy lifting. The description only restates that an `after` cursor exists for paging, adding no syntax or format detail beyond the schema — the baseline 3 for fully documented parameters.

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?

States a specific verb (Browse) and resource (Reddit's default front-page set of subreddits) with a clear scope qualifier ('default front-page set, no keyword needed'). It also names the sibling it is not — reddit_search_communities — so an agent can route between them without opening either schema.

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 gives the selection rule against reddit_search_communities ('use reddit_search_communities instead to SEARCH communities by keyword'). It does not, however, distinguish this tool from the closely related reddit_subreddits_popular and reddit_subreddits_new siblings, which an agent could easily confuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddits_newA
Read-only

Browse the newest subreddits, the communities most recently created, no keyword needed. Returns a subreddits list (each with name, title, subscriber count, description, type, and NSFW flag) plus an after cursor for paging. This BROWSES communities by recency; use reddit_search_communities instead to SEARCH communities by keyword.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true and destructiveHint=false, so safety is covered. The description adds value beyond that by enumerating the returned `subreddits` fields (name, title, subscriber count, description, type, NSFW flag) and the `after` paging cursor, giving the agent useful output-shape context.

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, each earning its place: purpose/scope front-loaded, then return contents, then the search-vs-browse distinction. No redundancy or filler.

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 correctly carries the return-value burden by naming the fields and the paging cursor. Combined with the rich schema and annotations, an agent has everything needed to select and invoke the tool.

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 100% and both parameters are documented in depth there (the cursor semantics and the 1-100 limit clamp). The description adds nothing parameter-specific beyond what the schema already provides, so the baseline 3 applies.

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?

States a specific verb and resource ('Browse the newest subreddits, the communities most recently created') and contrasts itself against the keyword-search sibling by name. An agent can distinguish it from search and browse-by-recency alternatives without opening the schema.

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 'no keyword needed' and routes to reddit_search_communities for keyword search, giving a clear when-to-use condition and alternative. It does not address the closely related browsing siblings (reddit_subreddits_popular, reddit_subreddits_default), so the routing guidance is good but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddit_topA
Read-only

Get the TOP posts of a subreddit for a time window. Shorthand for the highest-scoring posts of a community. Returns posts with score, author, comments, and permalink plus an after cursor. Example: name='science' t='month'.

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
nameYesSubreddit name WITHOUT the r/ prefix (e.g. 'science'). Required (path parameter).
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe read-only, open-world profile, so the bar is lower. The description adds valuable return-shape information (score, author, comments, permalink) and notes the `after` cursor, which is useful since no output schema exists. It does not itself carry the pagination/truncation caveats, but those are thoroughly covered in the schema's `after` description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the operation and scope, followed by the return shape and a concrete example. The second sentence is mildly redundant with the first but does sharpen what 'TOP' means; overall there is very little waste.

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 low-complexity filtered-listing tool with full schema coverage and annotations, the description covers purpose, scope, return fields, and an example. The only gap is sibling differentiation against reddit_subreddit_posts, which an agent would have to resolve from names alone.

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 100%, so baseline is 3: name, t, after, and limit are all documented in the schema with formats, ranges, and cursor semantics. The description's inline example (name='science', t='month') reinforces the calling convention but adds no semantics beyond what the schema already states.

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?

Names a specific verb (get) and resource (top posts of a subreddit) and defines the scope as the highest-scoring posts in a time window, which is meaningfully different from a generic listing. It stops short of naming the sibling it competes with (reddit_subreddit_posts), so an agent must infer the sort-based distinction from the 'TOP' wording alone.

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?

'Shorthand for the highest-scoring posts of a community' implies the use case, and the t parameter context makes the time-window intent clear. However, there is no explicit when-to-use or when-not-to-use guidance versus reddit_subreddit_posts, reddit_home_feed, or reddit_subreddit_comments, so the routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_subreddit_wikiA
Read-only

Fetch a subreddit's wiki page by name and page (Reddit's /r//wiki/ data). Returns a single object with content_md and content_html, a may_revise flag, and the last revision (revision_id, revision_date, revised_by, reason). Use it to read a community's wiki, such as its rules or FAQ. The page may be multi-segment, for example index, rules, or config/sidebar. Example: name='python', page='index'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSubreddit name WITHOUT the r/ prefix (e.g. 'python'). Required (path parameter).
pageYesWiki page name (e.g. 'index'). Required (path parameter). May be multi-segment like 'config/sidebar'.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds value by detailing the return object (content_md, content_html, may_revise, revision fields) and noting multi-segment pages, which goes beyond the schema and annotations.

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 four sentences, front-loaded with the primary action, and each sentence adds distinct information (function, return format, usage guidance, example). No wasted words or redundancy with the schema.

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 read-only tool with no output schema, the description thoroughly covers return values, usage context, and an example. It is complete enough for an agent to select and invoke correctly without additional documentation.

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 100%, so the baseline is 3. The description enhances this by providing a concrete example (name='python', page='index') and reiterating the multi-segment possibility, adding practical usage context beyond the schema definitions.

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 fetches a subreddit's wiki page by name and page, using the specific verb 'Fetch' and identifying the resource as a wiki page. It distinguishes from siblings like reddit_subreddit_rules by covering general wiki content (rules, FAQ, config/sidebar) and provides a concrete example.

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 explicitly states 'Use it to read a community's wiki, such as its rules or FAQ', giving clear context for when to use. It does not name alternatives or provide exclusions (e.g., for rules specifically), but the purpose is well-scoped and the example clarifies usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_user_commentsA
Read-only

List a Reddit user's recent comments. Returns comments with body, score, subreddit, parent link, and timestamp plus an after cursor. Use to understand what a redditor talks about or to gather their opinions. Example: name='spez' sort='top'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesReddit username WITHOUT the u/ prefix (e.g. 'spez'). Required (path parameter).
sortNoSort order for a user's comments. 'new' = most recent (default), 'hot', 'top' (in the `t` window), 'controversial'.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds return fields and an after cursor, but it does not disclose pagination termination caveats or listing_status behavior beyond what the schema's after parameter already says.

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 short and front-loaded: it states the operation, return fields, usage context, and a compact example. Every sentence contributes useful information without repetition.

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 read-only listing tool with full parameter descriptions and annotations, the description is largely complete: it covers purpose, usage, return basics, and pagination cursor presence. It omits the critical listing_status caveat, but that detail is captured in the schema's after parameter description.

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 100%, so all four parameters are already fully documented, including the important after cursor semantics. The description adds only a small example using name and sort, so the baseline 3 is appropriate.

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 states a specific verb and resource: "List a Reddit user's recent comments." This clearly distinguishes it from broader search tools and from user-post listings by resource scope, but it does not explicitly name sibling alternatives such as reddit_user_submitted or reddit_search_comments.

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 gives clear usage context: "Use to understand what a redditor talks about or to gather their opinions." This tells the agent when the tool is useful, but it does not include exclusions or explicitly compare against alternative comment-search tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_user_gildedA
Read-only

List the posts and comments a Reddit account has received an award (gold) on. PRIVATE data -- Reddit only serves it to the account that owns it, so you must be logged in as name (see the reddit_session/loid args) or this returns 403. Mixed listing: each item is a post or a comment, tagged kind. Requires calling POST /api/reddit/login on the REST API first to get session cookies (not an MCP tool). Example: name='spez' (must match the logged-in account).

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
loidYesReddit account loid cookie, from the same POST /api/reddit/login response. Required.
nameYesReddit username WITHOUT the u/ prefix. Must be the SAME account the supplied cookies belong to, or Reddit returns 403. Required (path parameter).
sortNoSort order for a user's comments. 'new' = most recent (default), 'hot', 'top' (in the `t` window), 'controversial'.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.
csrf_tokenNoReddit CSRF cookie, from the same login response. Not required for a read (CSRF only guards state-changing calls) but harmless to pass if you have it.
reddit_sessionYesReddit account session cookie. Obtain it by calling POST /api/reddit/login on the REST API first (not an MCP tool) and reusing the `reddit_session` cookie it returns. Required.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld/no-destructive; the description adds substantial behavior beyond them: private owner-only data, the 403 failure mode, the out-of-band POST /api/reddit/login prerequisite for session cookies, and the mixed post/comment listing tagged by `kind`. These are exactly the traits an agent needs and cannot get from annotations.

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?

Purpose is front-loaded in the first sentence, followed by the critical privacy/auth caveat, then supplementary detail. Every sentence earns its place with no filler.

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?

There is no output schema, but the description explains the return shape (mixed post/comment items tagged `kind`) and fully covers the auth prerequisite and failure mode. For an 8-parameter private-data tool, the agent has everything needed to call it correctly.

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 100%, so the schema already documents all eight parameters including enums, pagination cursor and limits. The description reinforces the auth-related params (reddit_session/loid, name matching the account) and gives an example, but adds little beyond the schema, so baseline 3 applies.

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?

States a specific verb ('List') and resource ('posts and comments a Reddit account has received an award/gold on'), which cleanly distinguishes it from sibling content-list tools like reddit_user_saved, reddit_user_upvoted and reddit_user_submitted. An agent can identify the tool without opening the schema.

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?

Gives a strong precondition: the data is PRIVATE and you must be logged in as `name` or it returns 403, with the concrete example name='spez' that must match the logged-in account. It doesn't frame when-not-to-use or name an alternative, but the owner-only constraint effectively scopes usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_user_hiddenA
Read-only

List the posts and comments a Reddit account has HIDDEN. PRIVATE data -- Reddit only serves it to the account that owns it, so you must be logged in as name (see the reddit_session/loid args) or this returns 403. Mixed listing: each item is a post or a comment, tagged kind. Requires calling POST /api/reddit/login on the REST API first to get session cookies (not an MCP tool). Example: name='spez' (must match the logged-in account).

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
loidYesReddit account loid cookie, from the same POST /api/reddit/login response. Required.
nameYesReddit username WITHOUT the u/ prefix. Must be the SAME account the supplied cookies belong to, or Reddit returns 403. Required (path parameter).
sortNoSort order for a user's comments. 'new' = most recent (default), 'hot', 'top' (in the `t` window), 'controversial'.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.
csrf_tokenNoReddit CSRF cookie, from the same login response. Not required for a read (CSRF only guards state-changing calls) but harmless to pass if you have it.
reddit_sessionYesReddit account session cookie. Obtain it by calling POST /api/reddit/login on the REST API first (not an MCP tool) and reusing the `reddit_session` cookie it returns. Required.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare it a safe, open-world read; the description adds the critical behavioral fact that the data is private and owner-scoped, that a wrong account yields 403, that the listing is heterogeneous (each item tagged `kind`), and that session cookies must come from an out-of-band REST login. That is substantial context beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation and its privacy constraint, then prerequisites and the example. Efficient overall, though the login-cookie instruction is restated from the schema descriptions, so a sentence is partly redundant.

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 supplies what's needed: the mixed post/comment return shape and its `kind` tag, the authentication prerequisite, and the 403 failure mode. Combined with the schema's pagination guidance, an agent has everything required to call this correctly.

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 100% and each parameter is richly documented (including the `after` cursor and `listing_status` semantics), so the schema does the heavy lifting. The description only echoes that cookies come from login and that `name` must match the logged-in account, adding little beyond the schema; baseline 3 applies.

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?

States a specific verb ('List'), resource ('posts and comments'), and precise scope ('a Reddit account has HIDDEN'), which cleanly separates it from siblings like reddit_user_saved and reddit_user_upvoted. An agent can distinguish it without opening the schema.

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?

Gives explicit preconditions: must be logged in as `name` or the call returns 403, and requires a prior POST /api/reddit/login on the REST API (which is not an MCP tool). It does not explicitly name alternative tools to use when the data isn't hidden, but the context for correct invocation is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_user_profileA
Read-only

Fetch a Reddit user's public profile by username. Returns account info: username, id, karma (post + comment), account age, verified/employee flags, and avatar. Use to vet or summarize a redditor. Example: name='spez'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesReddit username WITHOUT the u/ prefix (e.g. 'spez'). Required (path parameter).

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by detailing the return contents (username, id, karma, account age, flags, avatar) and providing an example, which goes beyond the annotations.

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 plus an example, front-loaded with the verb and resource, and contains no filler. Every sentence earns its place.

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, read-only tool with one parameter and no output schema, the description provides a complete picture: what it does, what it returns, and an example. It appropriately scopes itself against numerous sibling tools, making it self-contained.

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 provides 100% coverage with a clear description of the 'name' parameter including the 'u/' prefix constraint and path parameter status. The description only adds a redundant example ('spez'), so it does not significantly enhance parameter understanding 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 a specific verb and resource: 'Fetch a Reddit user's public profile by username.' It distinguishes itself from sibling tools by focusing on profile metadata (karma, account age, flags) rather than posts or comments, and provides an explicit use case: 'vet or summarize a redditor.'

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 gives a clear use case ('Use to vet or summarize a redditor'), implying when this tool is appropriate. It does not explicitly name alternatives like reddit_user_comments or reddit_user_submitted, but the distinction between 'profile' and 'activity' is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_user_savedA
Read-only

List the posts and comments a Reddit account has SAVED. PRIVATE data -- Reddit only serves it to the account that owns it, so you must be logged in as name (see the reddit_session/loid args) or this returns 403. Mixed listing: each item is a post or a comment, tagged kind. Requires calling POST /api/reddit/login on the REST API first to get session cookies (not an MCP tool). Example: name='spez' (must match the logged-in account).

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
loidYesReddit account loid cookie, from the same POST /api/reddit/login response. Required.
nameYesReddit username WITHOUT the u/ prefix. Must be the SAME account the supplied cookies belong to, or Reddit returns 403. Required (path parameter).
sortNoSort order for a user's comments. 'new' = most recent (default), 'hot', 'top' (in the `t` window), 'controversial'.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.
csrf_tokenNoReddit CSRF cookie, from the same login response. Not required for a read (CSRF only guards state-changing calls) but harmless to pass if you have it.
reddit_sessionYesReddit account session cookie. Obtain it by calling POST /api/reddit/login on the REST API first (not an MCP tool) and reusing the `reddit_session` cookie it returns. Required.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly/openWorld/non-destructive; the description goes well beyond by disclosing the private-data nature, the 403 auth failure mode, the required out-of-band REST login, the mixed post/comment listing tagged by `kind`, and — most valuably — the `listing_status` complete/truncated/unknown semantics and the warning not to present partial data as final.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the critical privacy/auth constraint are front-loaded, and the pagination caveat is tight and actionable. It is on the long side, with some auth detail that duplicates the schema, but each sentence carries operational weight.

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 an 8-param read with no output schema, the description covers the essentials: auth prerequisites, 403 behavior, mixed result typing via `kind`, and truncation status. It stops short of describing item payload fields, but the privacy and pagination guidance make it operationally sufficient.

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 100%, so the schema already documents every parameter including auth cookies, sort, t, limit, and after. The description largely restates this (name must match the logged-in account, session/loid required) and adds only a minor example, so the baseline 3 applies.

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?

States a precise verb and resource ('List the posts and comments a Reddit account has SAVED'), and the emphasized SAVED scope cleanly separates it from sibling tools like reddit_user_upvoted, reddit_user_hidden, and reddit_user_submitted without needing to name them. An agent immediately knows which listing this retrieves.

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?

Gives real usage context: it must be the owning account, requires POST /api/reddit/login first, and returns 403 otherwise. It also guides pagination usage and how to react to truncated results. It does not explicitly name an alternative sibling tool or state when-not-to-use, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_user_submittedA
Read-only

List a Reddit user's submitted POSTS (their post history, the sibling of reddit_user_comments). Returns posts with title, author, score, comment count, and permalink, plus an after cursor. Use to see what a redditor posts, not just what they comment on. Example: name='spez' sort='top'.

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
nameYesReddit username WITHOUT the u/ prefix (e.g. 'spez'). Required (path parameter).
sortNoSort order for a user's comments. 'new' = most recent (default), 'hot', 'top' (in the `t` window), 'controversial'.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, openWorld, non-destructive), so the description is free to add functional detail: it enumerates returned fields (title, author, score, comment count, permalink) and mentions the `after` cursor, which matters because there is no output schema. It doesn't restate the truncation caveat beyond pointing at the cursor, but the schema's `after` description already carries that.

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, front-loaded with the verb and resource, then the sibling distinction, then an example. No filler and nothing buried.

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?

With no output schema, the description usefully names the returned fields and the pagination cursor, which is exactly what an agent needs to interpret responses. It could go slightly further on how the `listing_status` field affects downstream reporting, but that detail lives in the schema param.

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 100%, so `t`, `name`, `sort`, `after` and `limit` are all documented in the schema itself. The description only adds a single example (`name='spez' sort='top'`), which is a baseline-level supplement rather than new semantic content.

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?

States a precise verb+resource (list a user's submitted POSTS) and explicitly positions itself against the sibling reddit_user_comments as 'the sibling of reddit_user_comments'. An agent can distinguish the two without opening either schema.

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?

'Use to see what a redditor posts, not just what they comment on' gives a clear selection condition versus the comment-listing sibling, reinforced by a concrete example call. It stops short of naming other alternatives (e.g. reddit_search, reddit_subreddit_posts) or 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.

reddit_user_upvotedA
Read-only

List the posts and comments a Reddit account has UPVOTED. PRIVATE data -- Reddit only serves it to the account that owns it, so you must be logged in as name (see the reddit_session/loid args) or this returns 403. Mixed listing: each item is a post or a comment, tagged kind. Requires calling POST /api/reddit/login on the REST API first to get session cookies (not an MCP tool). Example: name='spez' (must match the logged-in account).

ParametersJSON Schema
NameRequiredDescriptionDefault
tNoTime window, only applied when sort is 'top' or 'controversial'. E.g. 'week' = top of the past week. Ignored for other sorts.
loidYesReddit account loid cookie, from the same POST /api/reddit/login response. Required.
nameYesReddit username WITHOUT the u/ prefix. Must be the SAME account the supplied cookies belong to, or Reddit returns 403. Required (path parameter).
sortNoSort order for a user's comments. 'new' = most recent (default), 'hot', 'top' (in the `t` window), 'controversial'.
afterNoOpaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms.
limitNoMax items to return (1 to 100). The API clamps out-of-range values; endpoint default applies if omitted.
csrf_tokenNoReddit CSRF cookie, from the same login response. Not required for a read (CSRF only guards state-changing calls) but harmless to pass if you have it.
reddit_sessionYesReddit account session cookie. Obtain it by calling POST /api/reddit/login on the REST API first (not an MCP tool) and reusing the `reddit_session` cookie it returns. Required.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/destructive/openWorld, and the description still adds substantial behavior: 403 if the cookies don't belong to `name`, the mixed post/comment listing tagged by `kind`, the out-of-band login step required before calling, and the `listing_status` truncation semantics with an explicit warning not to report truncated data as complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the one-line purpose, then adds only the caveats an agent needs (auth, mixed kinds, pagination). It is dense but each sentence carries operational weight; the auth/pagination guidance is slightly compressed into a single long paragraph rather than clearly separated.

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 read-only, open-world tool with no output schema, the description covers the riskiest unknowns: who may call it, how to authenticate, what the item kinds are, and how to interpret end-of-pagination via listing_status. Nothing essential to calling it correctly is missing.

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 coverage is already 100%, so the baseline is 3, but the description ties the parameters together into an auth story (reddit_session/loid must come from the same login as `name`, csrf only needed for writes) and reinforces why mismatched `name` yields 403. It adds framing value beyond the per-field schema text without re-documenting enums.

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?

States a specific verb and resource ('List the posts and comments a Reddit account has UPVOTED'), and the upvoted scope cleanly separates it from siblings like reddit_user_saved, reddit_user_hidden, and reddit_user_submitted. An agent can route to it without opening any other schema.

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?

Gives a clear precondition ('you must be logged in as `name`') and points at the required session args, plus a worked example (name='spez'). It does not explicitly compare against the other user-listing siblings, so the alternative-selection guidance is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reddit_verify_commentsA
Read-only

Check whether specific Reddit comments still EXIST and are publicly visible, in one batch of up to 100 ids. A READ despite being a POST (ids travel in the body because a hundred of them do not fit in a URL); it costs the same as any other read and changes nothing on Reddit. Use it to tell 'deleted by the author' from 'removed by a moderator' from 'still there', which a normal comment fetch cannot distinguish, and to re-check a list of comments you posted or collected earlier. Accepts bare ids and t1_-prefixed fullnames interchangeably. Returns one row per id, in the order you sent them, each with a status. Example: ids=['n5abcde','t1_n5fghij'].

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesComment ids to check, 1 to 100 per call. Bare id ('n5abcde') or fullname ('t1_n5abcde'), mixed freely. Reddit's own batch lookup caps at 100; split larger lists across calls. Required.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds genuinely non-obvious context beyond the annotations: the endpoint is a POST even though it is a read (ids in the body because 100 do not fit in a URL), and it is cost-equivalent to a read with no state change on Reddit. This resolves the apparent conflict an agent would see between the HTTP method and the readOnlyHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the batch limit, and every sentence carries information. The parenthetical about ids in the body and the 'costs the same as any other read' clause partly restate the readOnly/non-destructive annotation, making it slightly longer than needed.

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?

No output schema exists, so the description supplies the return shape: one row per id, in submission order, each with a status. Combined with the batch limit, format flexibility, and the read-nature clarification, an agent has everything needed to call it correctly.

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 100%, so the schema already documents the id format, the 1–100 bounds, and bare-vs-t1_ fullname mixing. The description restates the bare/fullname interchangeability and adds a concrete example, but adds no semantics the schema lacks; baseline 3 applies.

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?

States a specific verb and resource with precise scope: existence/visibility checking for a batch of comment ids up to 100. It is immediately distinguishable from reddit_search_comments, reddit_by_id, and reddit_post_visibility because it operates on known ids and returns status rather than content.

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?

Gives concrete when-to-use framing: distinguishing 'deleted by author' from 'removed by moderator' from 'still there', and re-checking previously posted or collected comments. It contrasts against 'a normal comment fetch' implicitly but never names the sibling tool (e.g. reddit_search_comments or reddit_by_id) an agent should prefer for content retrieval.

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.

  1. 35 tool updatesv0.5.3
    • Addedreddit_account_me
    • Changedreddit_deep_comment_search1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Addedreddit_feedback_get
    • Addedreddit_feedback_list
    • Addedreddit_feedback_send
    • Addedreddit_home_feed
    • Addedreddit_monitor_add
    • Addedreddit_monitor_deliveries
    • Addedreddit_monitor_health
    • Addedreddit_monitor_list
    • Addedreddit_monitor_remove
    • Addedreddit_monitor_update
    • Addedreddit_monitor_webhook_create
    • Addedreddit_monitor_webhook_delete
    • Addedreddit_monitor_webhook_list
    • Addedreddit_monitor_webhook_test
    • Addedreddit_post_visibility
    • Changedreddit_search1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_search_comments1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_search_communities1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_search_media1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_search_users1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_subreddit_comments1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_subreddit_posts1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_subreddit_top1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_subreddits_default1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_subreddits_new1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_subreddits_popular1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Changedreddit_user_comments1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Addedreddit_user_gilded
    • Addedreddit_user_hidden
    • Addedreddit_user_saved
    • Changedreddit_user_submitted1 field changed
      • changedInput schema / properties / after / description
        Previous value: -"Opaque Reddit pagination cursor from the previous response's `after` field (a fullname like `t3_abc123`). Omit on the first call; pass it to fetch the next page."New value: +"Opaque pagination cursor. Pass back the previous response's `after` value EXACTLY as it was returned; the format is not stable and a hand-written Reddit fullname loses the paging depth the cursor carries. Omit on the first call. When `after` comes back null there is no next page to request, and that does NOT reliably mean you have every item: Reddit often stops serving a busy listing long before it runs out. Read `listing_status` on that final response instead. It is `complete`, `truncated` or `unknown`, and ONLY `complete` means nothing is missing. Never report `truncated` or `unknown` to a user as the end of the data; say the answer is partial and widen across sorts, timeframes or search terms."
    • Addedreddit_user_upvoted
    • Addedreddit_verify_comments
  2. 22 tool updatesv0.1.12
    • First observedreddit_by_id
    • First observedreddit_deep_comment_search
    • First observedreddit_post
    • First observedreddit_post_comments
    • First observedreddit_search
    • First observedreddit_search_comments
    • First observedreddit_search_communities
    • First observedreddit_search_media
    • First observedreddit_search_users
    • First observedreddit_subreddit_about
    • First observedreddit_subreddit_comments
    • First observedreddit_subreddit_moderators
    • First observedreddit_subreddit_posts
    • First observedreddit_subreddit_rules
    • First observedreddit_subreddit_top
    • First observedreddit_subreddit_wiki
    • First observedreddit_subreddits_default
    • First observedreddit_subreddits_new
    • First observedreddit_subreddits_popular
    • First observedreddit_user_comments
    • First observedreddit_user_profile
    • First observedreddit_user_submitted

TDQS

A4/5.0

Scored across 43 tools

Disambiguation4/5

Most tools target a distinct resource+action, and descriptions explicitly disambiguate tricky pairs like reddit_search_comments (returns parent posts) vs reddit_deep_comment_search (returns actual comments), and reddit_search_communities vs the reddit_subreddits_* browsers. A few overlaps remain, notably reddit_subreddit_top (a shorthand for reddit_subreddit_posts sort='top') and reddit_post vs reddit_by_id, but these are clearly documented.

Naming Consistency5/5

Uniform snake_case with a consistent reddit_ prefix and predictable domain_action naming (reddit_subreddit_about, reddit_user_comments, reddit_monitor_add, reddit_feedback_get). Minor noun-first outliers like reddit_by_id, reddit_home_feed and reddit_account_me still follow the same convention and remain readable.

Tool Count3/5

43 tools is heavy for any single server and sits well above the 3-15 sweet spot, with several near-redundant pairs (subreddits_popular/new/default could be one parameterised tool; subreddit_posts vs subreddit_top). The breadth of the domain (search, subreddits, users, posts, monitoring, feedback) justifies a large surface, but consolidation is clearly possible.

Completeness4/5

Coverage is strong: full search/listing/read surface plus complete monitor lifecycle (add/update/remove/health/deliveries) with webhook create/list/test/delete, and a full feedback CRUD. Only minor gaps exist, such as no direct single-comment fetch by id (only batch verify) and no write-to-Reddit operations, which may be out of scope.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to search, read, and analyze Reddit content, including posts, comments, subreddits, and user profiles using natural language commands. It provides atomic tools for interacting with the Reddit API to retrieve trending topics and community metadata.
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables searching Reddit posts, fetching subreddit content, and retrieving post comments without requiring an API key. It uses public JSON endpoints to provide seamless access to Reddit data for LLM-based applications.
    2 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only Reddit research server that exposes search, subreddit top posts, post details, and comment retrieval as typed tools with polite rate-limiting and citation lineage.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables reading public Reddit posts and comments on demand, with tools to search, get recent posts, post details, top comments, and server status. Runs on Cloudflare Workers for use with Claude and Open WebUI.
    MIT