reddit-mcp
This is a 12-tool MCP server for Reddit that reads public content and can also act as your authenticated account to post, comment, vote, and message.
Read your own account: fetch your profile (
reddit_get_me).Read other users: public profile details and recent posts/comments (
reddit_get_user,reddit_get_user_activity).Browse subreddits: list hot/new/top/rising posts (
reddit_get_subreddit_posts).Read posts: get a submission plus its comment tree, with sort options (
reddit_get_post).Search: across Reddit or within a subreddit, with sort/time/limit filters (
reddit_search).Read your inbox: messages, replies, and mentions (
reddit_get_inbox).Post publicly: create a link or self post in a subreddit (
reddit_submit_post).Comment/reply: respond to a post or comment as your account (
reddit_submit_comment).Vote: upvote, downvote, or clear a vote on a post/comment (
reddit_vote).Message: send a private message to a user (
reddit_send_message).Manage inbox: mark items as read (
reddit_mark_read).
Write tools act immediately with no confirmation step and carry real public consequences under your account; read tools are annotated read-only for auto-approval.
Provides tools for interacting with Reddit, enabling posting, commenting, voting, and sending private messages as the authenticated user.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@reddit-mcp show me hot posts in r/programming"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
reddit-mcp
An MCP server over the Reddit API, backed by a self-owned OAuth2 app. It can act as the account — post, comment, vote, and send private messages — so it is worth being deliberate about what you ask it to do.
12 tools. Runs locally over stdio.
Tools
Read
Tool | Purpose |
| The authenticated account's own profile |
| Another user's public profile |
| A user's recent posts and comments |
| Listing for a subreddit (hot/new/top/rising) |
| A single post plus its comment tree |
| Search across Reddit or within one subreddit |
| Private messages and inbox replies |
Write — these have real, public consequences
Tool | Purpose |
| Create a new post in a subreddit |
| Reply to a post or comment |
| Up/down/clear vote on a post or comment |
| Send a private message to a user |
| Mark inbox items read |
The write tools post under your real account, publicly and attributably. Reddit's
spam and vote-manipulation rules apply to API traffic exactly as they do to
browser traffic, and account bans follow the account, not the app. Every tool
declares MCP annotations (readOnlyHint and friends), so a client can
auto-approve the reads and prompt for the writes.
The exact schemas the model sees are in mcp-surface.json.
Related MCP server: reddit-mcp
Design notes
Reddit says "200 OK" when it means no
Posting, commenting and messaging use api_type=json, and Reddit reports their
failures — a subreddit that doesn't exist, a rate limit, a locked thread — as
HTTP 200 with the reasons tucked into json.errors. Passed straight through,
that body let the model tell you a post was live when nothing had been posted.
Those responses are now turned into errors that name Reddit's reasons.
The same quiet-200 behaviour makes ids dangerous. Reddit addresses things by
fullname — a type prefix plus a base36 id (t1_ comment, t3_ post, t4_
message) — and its write endpoints accept a wrong-typed fullname and do nothing.
Every id is normalised and type-checked before the request: a comment id passed
where a post is required is an error, and a bare id is only accepted where its
type is unambiguous.
Path segments are validated, not just encoded
Subreddit names, usernames and post ids are interpolated into the request path,
and URL resolution collapses .. — so a subreddit of ../api/v1/me used to
resolve to oauth.reddit.com/api/v1/me/hot, with the account's bearer token
attached. encodeURIComponent doesn't help: it leaves .. alone. Each segment
is now checked against what Reddit actually allows. The tool arguments are model
output, and a model that has just read a page can be steered by it, so this is
input validation in the ordinary web-server sense.
Token refresh is single-flight
Clients call tools in parallel. When several calls find the access token expired at once, they share one refresh rather than each starting their own, so a burst of tool calls costs one request to Reddit's token endpoint. A refresh that Reddit answers with an error, even one sent as HTTP 200, is retried on the next call rather than cached.
Auth
OAuth2 with a refresh token, stored in credentials/token.json (gitignored).
Reddit does not rotate refresh tokens, so the stored one stays valid
indefinitely — access tokens are refreshed automatically ~60s before expiry.
npm run authorize # one-time browser consent, writes credentials/token.json
npm run check-auth # verify the stored token still worksThe consent flow checks an OAuth state and its callback listener binds to
loopback only.
Setup
Requires Node 20+.
Create a script app at reddit.com/prefs/apps with redirect URI
http://localhost:53683/callback.Save its id and secret to
credentials/client_secret.json— seecredentials/client_secret.example.jsonfor the shape.credentials/is git-ignored.Identify yourself to Reddit. The default User-Agent contains a placeholder, and Reddit throttles generic agents hard, so set one of:
REDDIT_USERNAME=your_reddit_username # fills in the /u/ segment REDDIT_USER_AGENT="platform:app:v1.0.0 (by /u/you)" # or replace it wholesaleAuthorize and register:
npm ci npm run authorize claude mcp add reddit -e REDDIT_USERNAME=your_reddit_username -- node /absolute/path/to/reddit-mcp/src/index.jsOr in Claude Desktop's
claude_desktop_config.json:{ "mcpServers": { "reddit": { "command": "node", "args": ["/absolute/path/to/reddit-mcp/src/index.js"], "env": { "REDDIT_USERNAME": "your_reddit_username" } } } }
Development
npm test # unit tests — no network, no credentials
npm run lint # ESLint
npm run surface # start the server and diff its tool surface against mcp-surface.json
npm run surface:update # re-record mcp-surface.json after an intended changeThe tests cover registration, id and path-segment validation (including the
traversal cases above, asserted at the tool handlers), the json.errors
check, single-flight refresh, rate-limit and timeout messages, and the
User-Agent. CI runs them on Node 20, 22 and 24, then starts the server with
mcp-surface and fails if the tool
surface differs from the committed snapshot.
Layout
src/shared.js version, timeouts, error shaping, tool-result helpers
src/auth.js token load, single-flight refresh, authenticated fetch
src/reddit.js id/path validation and all tool registrations
src/index.js McpServer construction + stdio transport
scripts/authorize.js one-time OAuth consent flow
scripts/check-token.js token health check
mcp-surface.json the committed tool surface CI compares againstNotes
Reddit requires a descriptive, unique
User-Agent; a generic one gets 429s regardless of rate. A 429 is reported with the reset time Reddit sends.Every request has a 30-second timeout, and error bodies are trimmed before they reach the model — an HTML error page would otherwise land in its context whole.
License
MIT — see LICENSE. Changes are recorded in CHANGELOG.md.
Available Tools
12 toolsreddit_get_inboxRead private messages / inboxC
Lists inbox items: private messages, comment replies, and mentions.
Inputs: limit, filter.
reddit_get_meGet authorized Reddit accountB
Profile of the Reddit account this server is authorized as.
Inputs: no named parameters.
reddit_get_postGet a post with commentsB
Fetch a post (submission) and its comment tree by post id (t3_... or bare id) or subreddit+id.
Inputs: postId (required), subreddit (required), commentSort.
reddit_get_subreddit_postsGet subreddit postsB
List posts from a subreddit feed (hot, new, top, rising).
Inputs: subreddit (required), feed, time, limit.
reddit_get_userGet a Reddit user profileB
Public profile info (karma, trophies, account age) for a username.
Inputs: username (required).
reddit_get_user_activityGet a user's posts or commentsC
List a user's submitted posts, comments, or both (overview).
Inputs: username (required), kind, limit.
reddit_mark_readMark inbox messages readB
Marks one or more inbox items as read.
Inputs: ids (required).
reddit_searchSearch RedditC
Search posts across Reddit or within a specific subreddit.
Inputs: query (required), sort, time, limit, +1 more.
reddit_send_messageSend a private messageB
Sends a real private message to a user immediately. No confirmation step.
Inputs: to (required), text (required), subject (required).
reddit_submit_commentSubmit a comment / replyA
Posts a real comment reply to a post or comment immediately. No confirmation step.
Inputs: text (required), parentId (required).
reddit_submit_postSubmit a postB
Creates a real post in a subreddit immediately. No confirmation step.
Inputs: title (required), subreddit (required), url, text.
reddit_voteVote on a post or commentA
Casts an upvote, downvote, or clears a vote immediately.
Inputs: id (required), direction (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
All 12 tools have clearly distinct purposes, e.g., reddit_get_me vs reddit_get_user, reddit_get_subreddit_posts vs reddit_search. No two tools appear to do the same thing.
Every tool uses the consistent pattern reddit_verb_noun in snake_case, e.g., reddit_get_post, reddit_submit_post, reddit_mark_read. Naming is predictable and uniform.
12 tools is well-scoped for a Reddit client, covering reading (posts, user, subreddit, search, inbox) and writing (submit post/comment, vote, message, mark read) without being excessive.
Core CRUD/CUD operations are covered, but missing edit and delete for posts/comments, as well as subreddit info and user subscriptions. Minor gaps for a full Reddit surface.
Maintenance
Related MCP Connectors
Reddit MCP server: search posts, subreddit feeds, comments & user profiles as JSON. No API key.
Real-time Reddit posts, subreddit search, comments & mentions MCP. Local npx or hosted OAuth.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
A MCP server built for developers enabling Git based project management with project and personal…
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables AI assistants to access and interact with Reddit content through features like user analysis, post retrieval, subreddit statistics, and authenticated posting capabilities.15301MIT
- AlicenseBqualityDmaintenanceAn MCP server that provides both read-only and authenticated access to Reddit content and interactions without requiring a developer API key. It enables users to browse posts, search subreddits, and perform write actions like commenting and voting by leveraging browser session cookies.812 PyPI3-
- AlicenseAqualityDmaintenanceReddit MCP Server — No API Keys Required. Browse, post, comment, vote, and manage your Reddit account from any MCP client.205MIT
- AlicenseBqualityDmaintenanceAn MCP server that provides AI agents with full Reddit API capabilities including search, browsing, reading, posting, commenting, voting, editing, and deleting.188 npmMIT