Skip to main content
Glama
bestnite

reddit-readonly-mcp

by bestnite

English | 简体中文

reddit-readonly-mcp

An unofficial Model Context Protocol (MCP) server designed to fetch public Reddit content reliably from datacenter and VPS IPs without any Reddit API credentials or user accounts.

By emulating Reddit's official Android application token exchange (based on the technique from redlib), reddit-readonly-mcp acquires anonymous application-only tokens to query oauth.reddit.com directly with high resilience.


✨ Features

  • 🔑 Zero Credentials Required: No Reddit Developer app approval, API secrets, or account credentials required.

  • 🌐 VPS & Datacenter Friendly: Bypasses the IP blocks and 403 errors common to Reddit's web endpoints on cloud IPs.

  • 🛡️ Strictly Read-Only & Privacy-First: Queries public data exclusively; contains zero write paths or credential-handling logic.

  • 🔄 3-Tier Resilient Fallback: Automatic cascade: Mobile Token → Installed Client Token → RSS Fallback.

  • ⚡ Smart Rate-Limit & Token Rollover: Proactively rotates tokens when remaining requests drop to $\le 5$, handles 429 backoff gracefully, and caches responses via an in-memory LRU cache.

  • 🔌 Dual Transports: Ready for both stdio (local MCP clients like Claude Desktop, Cursor, Hermes) and streamable HTTP (remote/container environments).


Related MCP server: Reddit Buddy MCP

🚀 Quick Start

Prerequisites

1. Run it

Published on npm as reddit-readonly-mcp (v0.1.0):

npx -y reddit-readonly-mcp          # stdio, what MCP clients launch

Or install it globally:

npm i -g reddit-readonly-mcp
reddit-readonly-mcp

Or run the latest main from the Gitea repository:

npx --allow-git=all -y "git+https://git.nite07.com/nite/reddit-readonly-mcp.git"

2. Configure Your MCP Client

Standard MCP Client Configuration (stdio)

Add this to your MCP configuration file (e.g. claude_desktop_config.json or Cursor mcp.json):

{
  "mcpServers": {
    "reddit": {
      "command": "npx",
      "args": ["-y", "reddit-readonly-mcp"]
    }
  }
}

Hermes Agent (~/.hermes/config.yaml)

mcp_servers:
  reddit:
    command: npx
    args:
      - "-y"
      - reddit-readonly-mcp

Streamable HTTP Mode

For Docker, MetaMCP, or remote gateway deployments:

npx -y reddit-readonly-mcp --http --port 3000 --host 127.0.0.1
  • Endpoint: http://127.0.0.1:3000/mcp

  • Health check: GET http://127.0.0.1:3000/health

  • Note: The HTTP server binds to 127.0.0.1 by default and enforces Host-header validation to prevent DNS rebinding. It has no built-in authentication; place it behind a secure proxy if exposing externally.

3. From Source (development)

git clone https://git.nite07.com/nite/reddit-readonly-mcp.git
cd reddit-readonly-mcp
npm install && npm run build
node dist/cli.js

The compiled entry point is dist/cli.js.


🛠️ Available Tools

The server provides 12 strictly read-only tools (annotated with readOnlyHint: true). Output fields are sanitized and trimmed (id, title, author, subreddit, score, created timestamp, permalink, truncated selftext/body) instead of returning raw Reddit JSON dumps.

Posts & Feeds

Tool

Description

Key Arguments

browse_subreddit

Browse subreddit feeds sorted by hot, new, top, rising, or controversial. (Works over RSS)

subreddit?, sort, time_filter, limit, after

get_top_posts

Get top posts of a subreddit or the front page over a time window. (Works over RSS)

subreddit?, time_filter (day, week, month, year, all), limit, after

get_reddit_post

Retrieve full details of a single post.

id (base36 ID, t3_ fullname, or permalink URL)

get_trending_subreddits

List currently popular subreddits (/subreddits/popular).

limit, after

Comments & Discussions

Tool

Description

Key Arguments

get_post_comments

Retrieve structured nested comment tree for a post.

post_id, sort (confidence, top, new, etc.), limit, depth

Note on comments: Reddit returns HTTP 403 to anonymous tokens for /api/morechildren. Deep collapsed reply stubs (more) cannot be expanded individually. To see deeper discussions, increase limit or depth in your initial request.

Tool

Description

Key Arguments

search_reddit

Search Reddit posts, subreddits, or users. Supports Reddit search operators (author:, flair:, quotes).

query (or q), subreddit?, sort, time_filter, type (link, sr, user), limit, after

Community & Users

Tool

Description

Key Arguments

get_subreddit_info

Fetch subreddit metadata, description, subscriber count, and settings.

subreddit

get_subreddit_rules

Fetch community rules and submission guidelines.

subreddit

get_user_info

Fetch a user's public profile, karma, and creation date.

username

get_user_posts

List public posts submitted by a user.

username, sort, time_filter, limit, after

get_user_comments

List public comments authored by a user.

username, sort, time_filter, limit, after

Diagnostics

Tool

Description

Key Arguments

doctor

Inspect active auth backend, degradation status, token expiration, remaining rate-limits, and cache statistics.

None


⚙️ Architecture & Fallback Cascade

reddit-readonly-mcp utilizes a multi-tiered failover pipeline to maintain high availability:

[Request]
   │
   ▼
1. Mobile OAuth Token ──── (5 consecutive failures) ───► 2. Installed Client Grant
   │ (Default: auth/v2/oauth/access-token/loid)                 │
   │                                                            ▼ (5 consecutive failures)
   └─────────────────────────────────────────────────────► 3. Public RSS Fallback
                                                                (browse_subreddit & get_top_posts)
  1. Mobile Token (mobile): Emulates Reddit's Android application handshake with random real device characteristics, acquiring a 24-hour bearer token.

  2. Installed Client Token (installed): Automatically activates if the mobile token endpoint experiences 5 consecutive failures.

  3. RSS Fallback (rss): Emergency read-only mode for feeds (browse_subreddit and get_top_posts) if OAuth endpoints are unreachable.

  4. Auto-Recovery: The server checks primary backends every 30 minutes and automatically restores higher-tier access once available.

Token & Rate-Limit Management

  • Proactive Token Refresh: Automatically renews the OAuth token 2 minutes prior to expiration.

  • Quota Rollover: Monitors x-ratelimit-remaining; rolls over to a clean token window when remaining requests drop to $\le 5$.

  • Backoff & Retries: Handles HTTP 429 by triggering token rollover followed by exponential retry respecting Retry-After.

  • In-Memory Cache: Bounded LRU cache reduces redundant upstream calls.


🔧 Environment Variables

All configuration is optional. No credential variables (client secret, password, etc.) exist or are accepted.

Variable

Default

Description

REDDIT_AUTH_MODE

auto

Backend mode: auto (cascade enabled), mobile, installed, or rss.

REDDIT_MOBILE_CLIENT_ID

ohXpoqrZYub1kg

Android client ID override point if upstream revokes the default constant.

REDDIT_CACHE

on

In-memory read cache (on / off).

REDDIT_CACHE_MAX_MB

50

Maximum memory limit for LRU cache in megabytes.

REDDIT_MAX_RETRIES

3

Maximum retry attempts upon encountering HTTP 429 rate limits.

REDDIT_TIMEOUT_MS

20000

HTTP request timeout in milliseconds.

REDDIT_LOG_LEVEL

info

Logging verbosity to stderr: debug, info, warn, error, silent.


📋 Scope & Design Boundaries

  • Read-Only by Design: Write actions (submitting posts, comments, voting, private messages) are intentionally excluded. They require user-specific OAuth scopes and accounts, which are out of scope.

  • Public Data Only: Private subreddits, banned users, and authenticated user endpoints (e.g. saved items, inbox) are not accessible.

  • No Expansion of Deep Comment Stubs: Reddit's /api/morechildren endpoint returns 403 for anonymous tokens. Adjust limit and depth in get_post_comments instead.


🧪 Development & Testing

# Build TypeScript to dist/
npm run build

# Type check
npm run typecheck

# Unit tests (mocked, offline)
npm test

# Protocol wire verification (stdio & HTTP check)
npm run wire

# Live integration test against real Reddit endpoints
npm run smoke

📄 License

MIT. Device metadata in src/auth/android-app-versions.ts is sourced from redlib (MIT).

Available Tools

12 tools
browse_subredditBrowse SubredditA
Read-only

Browse a subreddit feed sorted by hot/new/top/rising/controversial. Read-only, anonymous. Returns {"data": [...], "after": cursor|null}. Also works in RSS fallback mode for hot/new/top/rising (max ~25 posts, no score/comment counts, no pagination).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoFeed ordering: hot (default), new, top, rising or controversial. top/controversial honour time_filter.hot
afterNoPagination cursor: the 'after' value returned by a previous call. Omit for the first page.
limitNoHow many items to return, 1-100 (default 10).
subredditNoSubreddit name without the r/ prefix (e.g. 'LocalLLaMA'). Omit for Reddit's default anonymous front page.
time_filterNoTime window: hour, day, week, month, year or all.week

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, and the description usefully adds the return envelope and, critically, the RSS fallback degradation (max ~25 posts, no score/comment counts, no pagination) — non-obvious behavior an agent would otherwise miss. It omits auth/rate-limit details, keeping it below 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 tightly-packed sentences, front-loaded with the core action then the safety profile and return shape, then the fallback caveat. Every clause carries information the agent needs.

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 supplies the return shape and pagination cursor semantics, and covers the degraded fallback path. It could say more about pagination termination or empty results, but it is sufficient to call the 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%, so sort, after, limit, subreddit and time_filter are all already documented in the schema. The description repeats the sort enum without adding syntax, defaults, or interaction detail beyond what structured fields provide, so 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 (browse) and resource (subreddit feed) with the supported sort modes enumerated, so an agent immediately knows the scope. It stops short of naming which sibling to prefer (search_reddit, get_top_posts, get_trending_subreddits), so differentiation is left to inference.

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 implied by 'Read-only, anonymous' and the option set, but there is no explicit when-to-use-vs-alternative guidance against the many sibling subreddit/post tools. An agent can guess it is the general feed reader, but nothing states when to reach for search_reddit or get_top_posts instead.

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

doctorDoctor (diagnostics)A
Read-only

Diagnostics, no arguments: which read backend is live (mobile / installed / rss), whether it has degraded, token expiry, Reddit rate-limit remaining/reset, and cache/request stats. Call this first when other tools fail.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by listing the diagnostic signals returned and confirming no arguments are required.

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 'Diagnostics, no arguments' and then lists the checks in one efficient sentence. The usage cue is a short, well-placed second sentence with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations beyond safety, the description carries the burden of explaining what is returned. It covers the diagnostic categories well, though it does not specify the exact response structure or field names.

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 tool has zero parameters, so the baseline is 4. The description reinforces this by stating 'no arguments,' which matches the empty schema and leaves no ambiguity.

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 diagnostic purpose, explicitly says it takes no arguments, and enumerates the exact signals it reports (backend, degradation, token expiry, rate limit, cache stats). This clearly distinguishes it from the sibling read/content tools.

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 trigger: 'Call this first when other tools fail.' This tells the agent when to use it, but it does not name when not to call it or point to an alternative for non-diagnostic needs.

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

get_post_commentsGet Post CommentsA
Read-only

The comment tree of a post. Returns {"post": {...}, "data": [comments with nested "replies"], "more": [stubs], "after": null}. Collapsed branches are listed in "more" (parent_id, count, children ids) and counted on the parent comment as "more_replies". These "more" stubs CANNOT be expanded by this server: Reddit answers /api/morechildren with HTTP 403 for anonymous tokens, so do not expect a follow-up call to retrieve them. To see more of a thread, call get_post_comments again with a larger limit/depth or a different sort. Read-only, anonymous.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoComment ordering: confidence/best (default), top, new, controversial, old, qa.confidence
depthNoMaximum reply nesting depth to return, 1-10 (default 5). Deeper replies become 'more' stubs.
limitNoMaximum number of comments Reddit should return, 1-500 (default 100).
post_idYesPost id: base36 id ('1abc23'), fullname ('t3_1abc23'), or a full reddit.com permalink URL.
subredditNoOptional. Subreddit name without the r/ prefix (e.g. 'LocalLLaMA'). 'r/LocalLLaMA' is also accepted.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint by disclosing that 'more' stubs cannot be expanded (Reddit returns HTTP 403 for anonymous tokens), that no follow-up call will recover them, and that access is read-only/anonymous. This is exactly the kind of operational caveat annotations cannot express.

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 return shape, then the critical 403 limitation, then the recovery action. The embedded return-shape snippet is dense but earns its place given there is no output schema. Minor density cost from the JSON-ish notation.

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 compensates fully by describing the response envelope (post/data/more/after), the meaning of 'more' and 'more_replies', the auth model, and the 403 dead end. An agent has everything needed to call it and interpret the result.

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, but the description adds real meaning: it ties limit/depth/sort to observable outcomes ('Deeper replies become more stubs', 'larger limit/depth or a different sort' to see more of a thread). That causal link between parameters and result shape is not in 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?

Opens with a precise resource statement, 'The comment tree of a post,' which is unmistakably distinct from siblings like get_reddit_post (the post itself) and get_user_comments (a user's comment history). An agent can select this 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?

Explicitly tells the agent what to do when it wants deeper coverage: 'call get_post_comments again with a larger limit/depth or a different sort.' It lacks when-not-to-use guidance or direct naming of competing siblings, but the re-invocation rule is clear and actionable.

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

get_reddit_postGet Reddit PostA
Read-only

Fetch a single Reddit post by id: title, author, subreddit, score, comment count, created time, permalink, link URL and body text (truncated if very long). Read-only, anonymous. Use get_post_comments for the discussion.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYesPost id: base36 id ('1abc23'), fullname ('t3_1abc23'), or a full reddit.com permalink URL.
subredditNoOptional. Subreddit name without the r/ prefix (e.g. 'LocalLLaMA'). 'r/LocalLLaMA' is also accepted.

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 openWorldHint=true, so the bar is lower, yet the description adds value: it clarifies the call needs no authentication ('anonymous') and discloses that body text is 'truncated if very long' — a real behavioral trait not present in the schema or annotations. It does not discuss error behavior for missing/deleted posts.

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

Conciseness5/5

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

Two sentences, zero waste. The identity of the tool and its returned fields come first, and the disambiguation pointer is placed last where it belongs.

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 compensates by enumerating the returned fields and flagging body truncation, so the agent knows what to expect. Parameter detail is fully carried by the schema. Nothing needed to invoke this read-only tool 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%: both post_id (base36, fullname, or permalink) and the optional subreddit parameter are fully documented, including accepted prefixes. The description only reinforces 'by id' and adds nothing about parameter formats, 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 ('Fetch a single Reddit post by id') and enumerates the returned fields (title, author, subreddit, score, comment count, created time, permalink, link URL, body). It explicitly differentiates itself from get_post_comments, so an agent can pick it 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?

It gives explicit routing guidance to a sibling: 'Use get_post_comments for the discussion.' That is a clear when-to-use-this-instead signal. It stops short of covering other plausible alternatives (search_reddit, get_top_posts) or exclusions such as multi-post retrieval, so it is not full 5-level guidance.

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

get_subreddit_infoGet Subreddit InfoB
Read-only

Subreddit metadata: title, public description, subscribers, active users, creation time, NSFW flag, submission type. Read-only, anonymous.

ParametersJSON Schema
NameRequiredDescriptionDefault
subreddit_nameYesSubreddit name without the r/ prefix (e.g. 'AskReddit').

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so 'Read-only' largely restates structured data. However, 'anonymous' adds genuine context (no authentication required), and the field list hints at the response shape. What is missing is failure behavior for nonexistent, private, or banned subreddits, which is meaningful for an open-world read tool.

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

Conciseness5/5

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

A single compact sentence with zero filler; the field list is front-loaded and immediately useful. Nothing could be removed without losing information.

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, listing the returned fields is exactly the right compensation and makes the return value predictable. The only gap is error/edge-case behavior (missing or private subreddit), which for a simple anonymous read tool is a minor omission.

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 documents the 'no r/ prefix' convention with an example, so the schema carries the load. The description adds nothing about the parameter, which is acceptable here but earns only the baseline.

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 enumerates exactly what the tool returns (title, public description, subscribers, active users, creation time, NSFW flag, submission type) which is a concrete, specific resource statement. It is a noun phrase rather than a verb+resource, and it does not explicitly distinguish itself from nearby siblings such as get_subreddit_rules or browse_subreddit, so it stops short of a 5.

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?

There is no statement of when to use this tool versus the alternatives. With siblings like get_subreddit_rules, browse_subreddit, and get_trending_subreddits in the set, the agent gets no routing guidance; the name alone carries the selection burden.

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

get_subreddit_rulesGet Subreddit RulesB
Read-only

The posting rules of a subreddit (short name, description, which content kinds they apply to). Read-only, anonymous.

ParametersJSON Schema
NameRequiredDescriptionDefault
subreddit_nameYesSubreddit name without the r/ prefix (e.g. 'AskReddit').

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so restating 'read-only' adds nothing. 'Anonymous' does add a small piece of behavioral context — no authentication/credentials required — which is not covered by the annotations. Beyond that it says nothing about failure modes (e.g. nonexistent or private subreddit) or response behavior, so with the annotation bar already met this is a modest addition.

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?

Extremely tight: one clause stating the resource and its returned fields, then a two-word qualifier. Nothing is padded, and the resource scope is front-loaded. The trailing 'Read-only, anonymous' fragment is slightly clipped but still parses cleanly.

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 present, the description steps in to sketch the returned content, which is exactly the right compensation. For a single-parameter read tool with annotation coverage, nothing essential is missing; only the routing question versus sibling tools remains open.

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 is fully documented in the schema (name without the r/ prefix, with an example), so the schema carries the burden. The description adds no parameter-level detail, which is fine but yields the baseline 3.

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 names a specific resource (a subreddit's posting rules) and even sketches the shape of the result: short name, description, and applicable content kinds. That makes the tool's output distinguishable from generic subreddit metadata. It does not, however, differentiate itself from close siblings like get_subreddit_info or browse_subreddit, so it stops short of a 5.

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?

There is no explicit when-to-use statement and no mention of the alternative tools (e.g. get_subreddit_info) that an agent might confuse this with. Usage is only inferable from the name and one-line purpose. 'Read-only, anonymous' describes the call's nature, not the conditions under which it should be selected.

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

get_top_postsGet Top PostsA
Read-only

Top posts of a subreddit (or the anonymous front page) over a time window (default week). Read-only, anonymous. Returns {"data": [...], "after": cursor|null}. Also works in RSS fallback mode (max ~25 posts, no score/comment counts, no pagination).

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoPagination cursor: the 'after' value returned by a previous call. Omit for the first page.
limitNoHow many items to return, 1-100 (default 10).
subredditNoSubreddit name without the r/ prefix (e.g. 'LocalLLaMA'). Omit for Reddit's default anonymous front page.
time_filterNoTime window: hour, day, week, month, year or all.week

TDQS

A4/5.0
Behavior5/5

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

Goes well past the annotations (readOnlyHint/openWorldHint) by disclosing that access is anonymous (no auth needed), the exact return shape {'data': [...], 'after': cursor|null}, and a degraded fallback mode with concrete limits (~25 posts, no score/comment counts, no pagination). This is precisely the kind of behavior an agent cannot derive from structured fields, especially with 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 dense sentences: purpose and scope first, then the auth/read posture, then return shape and fallback caveats. Nothing is redundant and the inline JSON return literal replaces a missing output schema economically.

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 4-param, enumeration-heavy tool with no output schema, the description supplies the return contract and fallback limitations, which is most of what an agent needs. It does not cover failure/rate-limit behavior or ordering guarantees, so it stops short of fully 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?

Schema description coverage is 100%, including cursor semantics, limit range and the time_filter enum, so the schema already carries parameter meaning. The description only restates the time-window default and does not add format or interaction detail beyond it, making 3 the correct baseline.

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+resource ('Top posts of a subreddit'), plus scope ('or the anonymous front page') and a default time window. It is clearly not the same as get_trending_subreddits or get_post_comments, but it never names or contrasts with a sibling such as browse_subreddit, so differentiation is inferred rather than stated.

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 context is implied by the description ('top posts ... over a time window (default week)') and the RSS fallback note flags an operational mode, but there is no explicit when-to-use vs. when-not-to-use guidance and no alternative tool is named. An agent must infer that browse_subreddit covers non-'top' listings.

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

get_user_commentsGet User CommentsA
Read-only

Comments written by a user, with the title of the post each one belongs to. Read-only, anonymous. Returns {"data": [...], "after": cursor|null}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoOrdering: new (default), hot, top or controversial. top/controversial honour time_filter.new
afterNoPagination cursor: the 'after' value returned by a previous call. Omit for the first page.
limitNoHow many items to return, 1-100 (default 10).
usernameYesReddit username without the u/ prefix (e.g. 'spez').
time_filterNoTime window: hour, day, week, month, year or all.all

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the 'Read-only' claim is redundant, but 'anonymous' adds genuine context about authentication needs. More importantly, the description discloses the return envelope and pagination contract ({"data": [...], "after": cursor|null}), which no annotation or output schema provides.

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

Conciseness5/5

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

Two short sentences, front-loaded with the resource and scope, then the safety and return-shape facts. Every clause carries information and nothing is padded.

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 compensates by describing the response envelope and cursor pagination. The only gap is that it never contrasts itself with the close siblings get_post_comments or get_user_posts, which an agent selecting among 11 tools would benefit from.

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 sort, after, limit, username and time_filter are already fully documented in the schema, including enum meanings and defaults. The description adds no parameter-level detail beyond that, so the 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?

The description names a specific verb and resource ('comments written by a user') and adds the scoping detail that each comment carries its post title, which is enough to separate it from get_post_comments. It stops short of explicitly naming that sibling, so the differentiation is implied rather than stated.

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 implied by the phrasing 'written by a user', which tells the agent this is a user-scoped listing rather than a post-scoped or search-based one. However, no alternative tool is named and no condition (e.g., when to prefer get_post_comments or get_user_posts) is given.

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

get_user_infoGet User InfoA
Read-only

Public profile of a Reddit user: karma, account creation time, employee/mod/verified flags, profile description. Read-only, anonymous; private account data is never available.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesReddit username without the u/ prefix (e.g. 'spez').

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and openWorldHint=true, so 'Read-only' largely repeats the safety profile. However, 'anonymous' (no auth needed) and 'private account data is never available' add genuine behavioral context the annotations do not carry, telling the agent the call is safe and non-privileged.

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?

Two short sentences, front-loaded with the payload contents and followed by scope constraints; there is little waste. The 'Read-only' clause is mildly redundant with readOnlyHint, which keeps it from a perfect score.

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 does the right thing by enumerating what the profile returns. It is nearly complete for a simple read tool; it doesn't mention behavior for nonexistent, suspended, or deleted accounts, which is the main remaining gap.

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?

There is a single parameter and schema description coverage is 100% — the schema already specifies the username format and the 'no u/ prefix' rule. The description adds nothing about parameter syntax or validation, so the baseline 3 applies given the schema does the work.

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 names a specific resource (Reddit user profile) and enumerates the returned fields — karma, account age, employee/mod/verified flags, profile description. This distinguishes it implicitly from siblings like get_user_posts and get_user_comments. It stops short of explicitly routing against those siblings, so it is clear but not fully differentiated.

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 implied rather than stated: an agent can infer this is the tool for a user's profile, but no when-to-use, prerequisites, or named alternatives (e.g. get_user_posts for a user's submissions) appear. The clause 'private account data is never available' sets a useful scope boundary, which lifts it above bare absence of guidance.

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

get_user_postsGet User PostsA
Read-only

Posts submitted by a user. Read-only, anonymous. Returns {"data": [...], "after": cursor|null}.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoOrdering: new (default), hot, top or controversial. top/controversial honour time_filter.new
afterNoPagination cursor: the 'after' value returned by a previous call. Omit for the first page.
limitNoHow many items to return, 1-100 (default 10).
usernameYesReddit username without the u/ prefix (e.g. 'spez').
time_filterNoTime window: hour, day, week, month, year or all.all

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so 'Read-only' is partly redundant, but 'anonymous' adds genuinely new context (no auth needed) and the description discloses the return envelope and pagination shape — valuable since there is no output schema. Minor gap: no note on rate limits or ordering defaults.

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 terse sentences with zero padding; the core purpose leads and the behavioral and return-shape facts follow. 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?

With no output schema, the description compensates by stating the return shape ({data, after}), and annotations cover the safety profile while 'anonymous' covers auth. Only marginal omissions remain (ordering semantics, defaults), so it is nearly complete for this tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters (username, sort, limit, after, time_filter) are already documented in the schema. The description's mention of an 'after' cursor lightly reinforces pagination but adds no syntax or default details beyond structured data — baseline 3.

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+resource: 'Posts submitted by a user,' which an agent can distinguish from the comments-oriented sibling get_user_comments. It does not, however, explicitly name that sibling or clarify boundaries against get_user_info/get_post_comments, so differentiation is implicit rather than stated.

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?

There is no when-to-use guidance, no prerequisites, and no alternatives named. The agent must infer that get_user_comments is the counterpart for comments and that this tool requires a username; nothing in the text routes between siblings.

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

search_redditSearch RedditA
Read-only

Search Reddit posts (or subreddits/users via 'type'), optionally restricted to one subreddit. Read-only, anonymous. Returns {"data": [...], "after": cursor|null}.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoAlias of 'query' (Reddit's own parameter name). Provide either 'query' or 'q'.
sortNoSort: relevance (default), hot, top, new or comments.relevance
typeNoWhat to search for: link = posts (default), sr = subreddits, user = users.link
afterNoPagination cursor: the 'after' value returned by a previous call. Omit for the first page.
limitNoHow many items to return, 1-100 (default 10).
queryNoSearch terms; Reddit operators work ("exact phrase", author:name, self:yes, flair:x). Must be non-empty.
subredditNoRestrict results to this subreddit (without r/). Omit to search all of Reddit.
time_filterNoTime window: hour, day, week, month, year or all.all

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description still adds real value by stating access is anonymous and by documenting the return shape ({data, after cursor}) and cursor-based pagination, which matters since no output schema exists. It omits rate-limit or auth-token context, 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?

Two compact sentences with zero waste: purpose and scope first, then the read-only/anonymous property and return shape. Front-loaded and appropriately sized for an 8-parameter search tool.

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 8 params at full schema coverage and no output schema, the description supplies the missing return-shape and pagination context. The one gap is that it never says a query (or its 'q' alias) is effectively required for a meaningful search despite zero required params in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (q/query alias, sort, type, after, limit, subreddit, time_filter) is already documented inline. The description adds only the 'type' and subreddit framing already present in the schema, so the 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 and resource ("Search Reddit posts") and immediately extends scope to subreddits/users via the 'type' parameter, plus an optional subreddit restriction. An agent can distinguish it from browse_subreddit or get_top_posts by the search semantics, though no sibling is named explicitly.

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 context is implied ('optionally restricted to one subreddit') but there is no explicit when-to-use/when-not guidance and no routing to alternatives like browse_subreddit for listing, or get_top_posts for rankings. An agent must infer selection from the 'type' enum alone.

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. 12 tool updatesv0.1.0
    • First observedbrowse_subreddit
    • First observeddoctor
    • First observedget_post_comments
    • First observedget_reddit_post
    • First observedget_subreddit_info
    • First observedget_subreddit_rules
    • First observedget_top_posts
    • First observedget_trending_subreddits
    • First observedget_user_comments
    • First observedget_user_info
    • First observedget_user_posts
    • First observedsearch_reddit

TDQS

A3.8/5.0

Scored across 12 tools

Disambiguation4/5

Most tools target clearly different resources (posts, comments, subreddits, users), so an agent can usually select without confusion. However, get_top_posts and browse_subreddit both return subreddit post feeds, and get_subreddit_info and get_subreddit_rules both return subreddit metadata, creating minor overlap.

Naming Consistency4/5

All names use snake_case with predictable verb prefixes like get_, browse_, and search_, making the pattern easy to follow. The lone exception is 'doctor', which lacks a verb_noun structure, though its diagnostic purpose is clear.

Tool Count5/5

With 12 tools, the surface is well-scoped for a read-only Reddit client; each tool maps to a distinct read operation and none feels redundant or gratuitous. The count sits comfortably in the ideal 3–15 range.

Completeness4/5

The server covers core read-only workflows: browsing and searching posts, fetching comments, viewing subreddit metadata and rules, and inspecting user profiles, posts, and comments, plus diagnostics. Minor gaps like wiki pages or post awards exist, but they are outside the core scope and the comment-expansion limitation is explicitly documented.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides AI assistants with read-only access to Reddit's API for browsing subreddits, reading posts and comments, searching Reddit, and retrieving user/subreddit information. Enables safe exploration of Reddit content without posting capabilities through natural language interactions.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Enables AI assistants to browse Reddit, search posts, analyze user activity, and fetch comments without requiring API keys. Features smart caching, clean data responses, and optional authentication for higher rate limits.
    5
    1,436 npm
    845
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides AI assistants with access to Reddit data for searching, browsing subreddits, and retrieving post details or user activity without requiring API keys. It enables tools to fetch content, nested comment trees, and public user feeds directly through the Model Context Protocol.
    2
    6
    303 PyPI
    158
    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