Skip to main content
Glama

redditapis-mcp

npm version npm downloads license

redditapis-mcp is the official MCP server for RedditAPIs, built for developers and AI agents that need live Reddit data in Claude, Cursor, Windsurf, VS Code or any MCP client, with no Reddit developer app. Your agent can search posts and comments, read subreddit feeds and rules, expand comment trees, look up users and communities, and set up monitors that send new matching posts to your webhook. Reads cost $0.0015 per call (or a monthly read plan from $19 for 30,000 reads), every account gets 1,000 free reads a month, and new accounts get $0.50 of free credit with no card. Connect your Reddit account once to comment, post, vote and DM as you. Every tool maps to one endpoint at api.redditapis.com.

Install: npx -y redditapis-mcp@latest with REDDITAPIS_KEY from https://www.redditapis.com

Hosted, sign in instead of pasting a key (Claude Code): claude mcp add --transport http reddit https://api.redditapis.com/mcp (carries every tool except the 6 that take your own Reddit cookies: reddit_connect and the five account readers)

Website: https://www.redditapis.com/mcp

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: Subwatch MCP

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

61 tools and 3 playbook resources: 33 Reddit reads, 10 Reddit account tools (connect, status, disconnect, comment, submit, vote, DM, and schedule, list or cancel a post or comment for later), 11 monitor/webhook management tools, reddit_set_watch (one call that stands up a whole watch), reddit_explain (where the rows you are holding came from), 3 feedback tools, and 2 account tools (reddit_account_me, which is also where the credit balance lives, and reddit_account_payments, the top-up history). Reddit writes (commenting, posting, voting, DMs) act as YOUR Reddit account and only after you connect it with reddit_connect; each is marked as a write so your client asks before it runs. 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). include_bodies=true fills self-post bodies the search page left null, on up to 25 posts.

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, gallery, all; gif is kept and means all). Most multi-photo posts are galleries.

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). include_details: true fills link_karma, comment_karma and created on up to the first 10 users.

reddit_ads_search

GET /api/reddit/ads/search

Search the Reddit ads library: promoted posts with advertiser, title, landing page, call to action, media, every subreddit each ad appeared in, first and last seen dates and sightings. Filter by q, advertiser, domain, subreddit, campaign_id, since and until. Reddit's own house ads are excluded. Newest first; page with cursor (the previous response's after). Returns ads, count, after and has_more. Billed at the read rate, the same as reddit_search.

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). A signed-out rising read is served as hot and says so in sort_served.

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_flairs

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

A subreddit's post flair templates (id, text, editable, colours, mod_only), so a post can carry the flair_id the community requires. Reddit lists flairs only to signed-in accounts, so it reads as your connected Reddit session; with none connected it answers 503 SESSION_REQUIRED and is not charged.

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. format: "normalized" returns flat comments instead of Reddit's raw tree.

reddit_post_duplicates

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

Every other post that shares this post's link, across subreddits (Reddit's "other discussions").

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. include_details: true fills created on up to the first 10.

reddit_subreddits_new

GET /api/reddit/subreddits/new

Browse the newest subreddits, most recently created first. include_details: true fills created on up to the first 10.

reddit_subreddits_default

GET /api/reddit/subreddits/default

Browse Reddit's default front-page set of subreddits. include_details: true fills created on up to the first 10.

Monitoring: manage your own monitors and webhooks

Monitors watch named subreddits or all of Reddit, for posts or comments (kind). Every account holds a free entitlement of one all-of-Reddit post watch at a 60s cadence; naming a subreddit, matching comments, a faster cadence and any further watch need a paid plan. Registering a webhook does not need a paid plan, because the free watch delivers to one exactly like a paid watch does. Reading your own list, health and deliveries never needs a plan.

reddit_monitor_list returns a slots object that states this account's capabilities outright: used, total, tier, is_free, cadence_s (the tier's cadence floor), sitewide_slots, distinct_subreddits_used, distinct_subreddits_total, comments_allowed, scoped_allowed and sitewide_allowed. reddit_set_watch reads those flags before it builds anything.

Tool

Endpoint

What it does

reddit_set_watch

POST /api/reddit/monitor/add (+ webhook create/update/test)

One call instead of three: compiles a plain-words description into a monitor filter, reads this account's plan capabilities, creates the monitor, then registers, points and test-fires the deliver_to webhook. Quoted phrases are taken out of the sentence first, then it is cut into clauses, so each part reads only its own words: subreddits as r/Name or a pasted reddit.com/r/Name link, quoted phrases as keyword terms, except/without/ignoring as exclusions, at least N upvotes as a score floor, comments / posts and comments as the match kind. It never returns a filter it cannot fully account for (see below). Returns understood and compiled_filter so you can check it, and notes names anything it dropped, rewrote or read as a whole phrase.

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. Each row carries attempts and retries.

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; a Slack or Discord URL comes back masked (url_masked: true).

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_redrive

POST /api/reddit/monitor/webhook/redrive

Re-send a webhook's dead-lettered deliveries once the endpoint is fixed (dry_run lists them first). Free.

reddit_monitor_webhook_delete

POST /api/reddit/monitor/webhook/delete

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

reddit_set_watch refuses rather than guesses

Every character of your description has to be claimed by exactly one thing: a subreddit, a quoted phrase, a keyword, an exclusion, a score clause, a delivery clause, or a word that carries no filter content. Anything left over means the compiler did not understand the whole sentence, and it returns no filter at all rather than a monitor built from the half it did understand.

outcome

when

what you get

a filter

every word is accounted for

the monitor, plus understood, compiled_filter and notes

partial_understanding

some words could not be placed, or two parts of the filter counted the same words twice

the exact unplaced words, what was understood, and nothing created

contradictory_filter

the same phrase is both watched for and excluded, so the monitor could never deliver

both halves named, and nothing created

no_anchor

neither a subreddit nor a keyword

a refusal, before any request is sent

This matters because a wrong watch is invisible: you get a monitor id, a green test delivery, and then either silence forever or a firehose. A refusal that names the words it could not place is recoverable in seconds; a monitor whose keyword is also its exclusion is not noticed for a week. If a description is refused, quote the exact phrase to watch for, write subreddits as r/Name, or build the filter directly with reddit_monitor_add.

Playbooks: three recipes, served as MCP resources

Three reusable recipes ship as MCP resources rather than tools, because the protocol makes resources application-driven: a host shows them in a picker or a search box and reads one only when it is asked for by URI. Nothing is prefetched and nothing is injected.

URI

What it covers

playbook://competitor-mention-watch

Standing up continuous coverage of competitor names and routing every match to a channel, including how to cut the false positives a brand name that is also an ordinary word produces, and how to tell a quiet monitor from a broken one.

playbook://subreddit-audit

Profiling one community before posting in it: size against real comment rate, the rules as written and as enforced, the moderator team, what endures versus what is working this month, and whether posts survive.

playbook://pain-point-mining

Finding problems in the words people actually use, from comment bodies rather than post titles, ranking them by distinct authors rather than hits, and turning a one-off sweep into a standing feed.

Each is a short markdown document built only from calls this package already exposes, so a recipe cannot point at something unbuilt. A test checks every tool each playbook names against the live catalog.

The bodies are documentation and name the calls they are recipes for, which is the point of them. That is a deliberate difference from tool descriptions, which a client fetches at connect time and nobody chose: those state product facts only and a gate enforces it. A resource is read only when something asks for its URI, so it is a document you opened, not an injection. The bodies are still checked for hidden or encoded text, for any link off our own hosts, and for adversarial steering (overriding your instructions, concealment, exfiltration, or spending your credits in a loop), each with a planted-defect control.

// resources/list, then
{ "method": "resources/read", "params": { "uri": "playbook://subreddit-audit" } }

Your Reddit account: connect once, then comment, post, vote, DM and schedule

reddit_connect stores your Reddit session on our side, encrypted (AES-256-GCM, the key held only by the API), against this API key's account, after checking it with Reddit. Every write after that sends no cookies, so they never sit in your agent's tool calls or transcript. Each write acts publicly as you, so it is marked as a write and your client asks before it runs. Connecting, status and disconnecting are free.

Tool

Endpoint

What it does

reddit_connect

POST /api/reddit/session

Store your Reddit session once (reddit_session and loid cookies; add csrf_token for votes and DMs). A logged-out session is refused. Free.

reddit_session_status

GET /api/reddit/session

Whether a session is connected, its username, and when it was last used. Never returns the cookies. Free.

reddit_disconnect

POST /api/reddit/session/delete

Delete the stored session. Free.

reddit_comment

POST /api/reddit/comment

Comment on a post as you.

reddit_submit

POST /api/reddit/submit

Submit a text or link post to a subreddit as you.

reddit_vote

POST /api/reddit/vote

Upvote, downvote or clear a vote on a post or comment as you.

reddit_dm

POST /api/reddit/dm

Send a private chat message as you.

reddit_scheduled_create

POST /api/reddit/schedule

Schedule a post or a comment for later (run_at 60 seconds to 30 days ahead). It runs as your connected session at that time. Free to schedule; billed at the write rate only when the run succeeds.

reddit_scheduled_list

GET /api/reddit/schedule

Your scheduled posts and comments, newest first, with each one's status, result or error, and whether it was billed. Free.

reddit_scheduled_cancel

POST /api/reddit/schedule/cancel

Cancel a scheduled post or comment that has not run yet. A cancelled action never runs and is not charged. Free.

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_explain

none (in-process)

Provenance for the rows already fetched in this session: per completed call, the tool, the endpoint, when the response arrived, how old that copy now is, the upstream request id and the response size. The read path holds no response cache, so the age is the age of your copy, not of a stored row.

reddit_account_me

GET /account/me

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

reddit_account_payments

GET /account/payments

Every top-up on this key: amount, credits added, status and date, newest first. 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 (commenting, posting, voting, sending DMs) need one extra step: reddit_connect stores your Reddit session on our side, encrypted, so later calls carry no cookies. Until you connect, no tool can post, vote or DM as you, and reddit_disconnect deletes the stored session at any time. 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.

HTTP 408 or HTTP 503 with upstream_timeout The read did not finish in time and was not billed (a 503 means the API's own read budget ran out). The server already retried once after retry_after (or the Retry-After header), when that retry can still finish inside REDDITAPIS_TIMEOUT_MS; call the tool again shortly. A 503 upstream_unavailable on a read gets the same one retry.

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 app? No. One RedditAPIs key covers every read, with no Reddit developer app to register.

What does it cost? $0.0015 per read pay as you go, or a monthly read plan from $19 for 30,000 reads; every account gets 1,000 free reads a month, plus $0.50 of free credit at signup and no card. Monitors need a monitoring plan, which has no free tier.

Can it post, comment or vote? Yes, after you connect your Reddit account once with reddit_connect (your session is stored encrypted on our side and never travels in later calls). reddit_comment, reddit_submit, reddit_vote and reddit_dm then act as that account, and each is marked as a write so your client asks before it runs. reddit_disconnect deletes the stored session. Of the other tools, the 11 monitor/webhook tools manage your OWN redditapis.com monitors and webhooks (a write, but never a write to Reddit itself), reddit_set_watch sets up a whole watch in one call, reddit_explain says where the rows you hold came from, the 3 feedback tools send or read a report to the redditapis.com team, and reddit_account_me and reddit_account_payments read your own balance, plan and top-up history.

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
Inspect

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.

Inputs: no named parameters.

reddit_by_idA
Read-only
Inspect

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

Inputs: fullnames (required).

reddit_feedback_getA
Read-only
Inspect

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.

Inputs: id (required).

reddit_feedback_listA
Read-only
Inspect

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.

Inputs: type, limit, cursor, status.

reddit_feedback_sendAInspect

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.

Inputs: ids, area, type, title, +3 more.

reddit_home_feedA
Read-only
Inspect

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.

Inputs: loid (required), reddit_session (required), t, sort, +4 more.

reddit_monitor_addAInspect

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.

Inputs: q, kind, nsfw, group, +13 more.

reddit_monitor_deliveriesA
Read-only
Inspect

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.

Inputs: id, limit, before, status.

reddit_monitor_healthA
Read-only
Inspect

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.

Inputs: id (required).

reddit_monitor_listA
Read-only
Inspect

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.

Inputs: no named parameters.

reddit_monitor_removeA
Destructive
Inspect

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.

Inputs: id (required).

reddit_monitor_updateAInspect

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.

Inputs: id (required), q, kind, nsfw, +14 more.

reddit_monitor_webhook_createAInspect

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.

Inputs: url (required), kind.

reddit_monitor_webhook_deleteA
Destructive
Inspect

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.

Inputs: id (required).

reddit_monitor_webhook_listA
Read-only
Inspect

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

Inputs: no named parameters.

reddit_monitor_webhook_testAInspect

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

Inputs: id (required).

reddit_postA
Read-only
Inspect

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

Inputs: id (required).

reddit_post_commentsA
Read-only
Inspect

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.

Inputs: permalink (required).

reddit_post_visibilityA
Read-only
Inspect

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.

Inputs: id (required).

reddit_search_commentsA
Read-only
Inspect

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

Inputs: q (required), t, nsfw, sort, +2 more.

reddit_search_communitiesA
Read-only
Inspect

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

Inputs: q (required), nsfw, after, limit.

reddit_search_mediaA
Read-only
Inspect

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

Inputs: q (required), t, kind, nsfw, +3 more.

reddit_search_usersA
Read-only
Inspect

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

Inputs: q (required), nsfw, after, limit.

reddit_subreddit_aboutA
Read-only
Inspect

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

Inputs: name (required).

reddit_subreddit_commentsA
Read-only
Inspect

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

Inputs: name (required), after, limit.

reddit_subreddit_moderatorsA
Read-only
Inspect

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

Inputs: name (required).

reddit_subreddit_postsA
Read-only
Inspect

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

Inputs: subreddit (required), t, sort, after, +1 more.

reddit_subreddit_rulesA
Read-only
Inspect

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

Inputs: name (required).

reddit_subreddits_defaultA
Read-only
Inspect

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.

Inputs: after, limit.

reddit_subreddits_newA
Read-only
Inspect

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.

Inputs: after, limit.

reddit_subreddit_topA
Read-only
Inspect

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

Inputs: name (required), t, after, limit.

reddit_subreddit_wikiA
Read-only
Inspect

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

Inputs: name (required), page (required).

reddit_user_commentsA
Read-only
Inspect

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

Inputs: name (required), sort, after, limit.

reddit_user_gildedA
Read-only
Inspect

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

Inputs: loid (required), name (required), reddit_session (required), t, +4 more.

reddit_user_hiddenA
Read-only
Inspect

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

Inputs: loid (required), name (required), reddit_session (required), t, +4 more.

reddit_user_profileA
Read-only
Inspect

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

Inputs: name (required).

reddit_user_savedA
Read-only
Inspect

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

Inputs: loid (required), name (required), reddit_session (required), t, +4 more.

reddit_user_submittedA
Read-only
Inspect

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

Inputs: name (required), t, sort, after, +1 more.

reddit_user_upvotedA
Read-only
Inspect

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

Inputs: loid (required), name (required), reddit_session (required), t, +4 more.

reddit_verify_commentsA
Read-only
Inspect

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

Inputs: ids (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    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 recent community 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
      F
      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