Reddit Research MCP
Provides read-only research on Reddit, including searching subreddits and extracting relevant posts and comments, without performing any write operations.
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 Research MCP Find posts in r/rust where I can help without promoting my product, and list top 3."
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 Research MCP
Reddit を 読むだけ の MCP サーバー。 「自分が自然に役に立てる会話」を探して整理するところまでを担当し、 投稿は必ず人間が Reddit の UI で行う。
このサーバーは Reddit へ 書き込まない。投稿・コメント・編集・削除・投票・DM 送信・ フォローの経路をコードとして持たない。ブラウザ自動操作も HTML スクレイピングもしない。 方針ではなく、実装とテストで固定してある。
なぜそう作ったかは docs/DESIGN.md。
状態: v0.1。実際の Reddit へは 1 リクエストも送っていない。 MCP ツール 13 本・OAuth・rate limiter・SQLite・スコアリング・digest まで実装済み。 テストはすべてモックの Reddit に対して通っている。
実接続していないのは、Reddit の API 利用に事前の承認が要るため(下記)。
規約について(先に読む)
このリポジトリは「Reddit の規約上、この使い方が許されている」とは主張しない。
2026-09-08 時点で、Reddit の Responsible Builder Policy は次のように定めている:
"Approval is required: You must request access and get explicit approval before accessing any Reddit data through our API" / "This policy applies to everyone"
/prefs/apps からの自己申請では通らない。チケットでの申請が必要である。
商用目的での利用には、さらに別の書面での permission が要る。
承認を得るまで、実際の Reddit へ接続しないこと。 テストはモックに対して回るので、待つあいだも開発はできる。
Related MCP server: reddit-mcp
何をするか
自分の活動を読む(貢献と自己宣伝の比率を出すため)
決められたサブレディットだけを検索し、答えられそうな質問を拾う
サブレディットの規約を読む。判定できなければ
unknownのままにする「製品に触れずに有益な回答が成立するか」を最大の重みにして並べる
1 日分の候補として、方針と材料を返す
返すのは方針と材料まで。そのまま貼れるコメント本文は返さない。
動かす
python -m venv .venv
.venv/Scripts/activate # Windows。POSIX なら .venv/bin/activate
pip install -e ".[dev]"
pytestPython 3.14 / mcp 2.2 / httpx / pydantic v2 / 標準の sqlite3 / keyring。
config.yaml が無い状態でもテストは通る。
tests/conftest.py が tests/fixtures/data/ の作り物へ切り替えるため。
自分の設定を作る
cp config.example.yaml config.yaml
cp data/product.example.yaml data/product.yaml
cp .env.example .env # REDDIT_CLIENT_ID などを埋めるdata/subreddits.yaml と data/expertise.yaml は同梱していない(下記)。
形は tests/fixtures/data/ を参考にすること。
Reddit の認可(承認を得たあと)
python -m reddit_research_mcp.auth --status
python -m reddit_research_mcp.authinstalled app として登録し、redirect URI は http://localhost:8765/callback。
refresh token は OS の資格情報ストア(keyring)へ入る。.env には置かない。
MCP サーバーとして起動
python -m reddit_research_mcp.serverReddit の認証が無くても、policy_status と product_* は応答する。
同梱していないもの
運用に使うデータは含まれない。個人の一次情報だからである。
含まれない | 何か |
| どこで貢献してよいか(role 付きのサブレディット表) |
| 本人が一次情報として持っている知識 |
| 製品の事実(既定では返らない) |
| 実機で確認する手順 |
| 運用の設定と資格情報 |
雛形と、テスト用の作り物(tests/fixtures/data/)は入っている。
中身の地図
src/reddit_research_mcp/
├── server.py MCP ツール 13 本。ここに業務ロジックを書かない
├── policy.py 安全境界の純関数。Reddit に触らない。門はすべてここ
├── logs.py 秘密情報を伏せるロガー
├── auth.py 初回の認可 CLI
├── config/ 設定とデータの読み込み。不変条件はここで落とす
├── reddit/ API アクセス層。書き込み系をここに置かない
│ ├── client.py GET だけを出す。唯一の出口は get() / get_dict()
│ ├── oauth.py POST を出す唯一の場所(トークン交換のみ)
│ └── rate_limiter.py 全リクエストがここを通る
├── services/ データを判断の材料に変える
├── product/ ローカル知識。mode が never なら製品情報を返さない
└── storage/ SQLite と retention cleanup候補を出す経路は必ず policy.evaluate() を通る。
サービス側で独自の判定を足さない。
テスト
pytest # 全部
pytest tests/unit/test_safety.py # 安全境界だけ
ruff check src tests
mypytests/unit/test_safety.py は、書き込み経路・ブラウザ自動操作・
秘密情報の漏れ・レート制限の回避を、ソースを読んで機械的に検出する。
ここを緩める変更は、まずテストが落ちる。
運用データを検査する tests/unit/test_data_files.py は、
対象のファイルが無ければ skip される(緩めているのではなく、対象が無い)。
ライセンス
MIT。LICENSE を参照。
Available Tools
13 toolspolicy_statusARead-only
The guardrails currently in force: promotion mode, denied subreddits, per-subreddit roles, scoring weights, and whether a scheduled mode change is due. Mode never changes on its own - only the user editing config.yaml changes it. Read this when you are unsure whether something is allowed.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: no named parameters. Returns: object
product_get_capabilitiesARead-only
Product capabilities and their verification status. Subject to the same promotion-mode gate as product_get_profile.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: no named parameters. Returns: object
product_get_expertiseARead-only
What the user personally knows first-hand - debugging findings they measured or fixed themselves. THIS IS THE PRIMARY SOURCE for helping people; it contains no product marketing and needs none. Each entry carries a confidence: only measured and fixed may be stated as fact. observed and unknown must be phrased as 'I hit the same symptom but never found the cause'. Also lists what the user does NOT have, so you never fabricate first-hand experience.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: tags, about. Returns: object
product_get_profileARead-only
The user's product details. Gated: while the configured promotion mode is never, this deliberately returns NO product information, only the reason. That is correct behaviour, not an error - use product_get_expertise instead. Even when open, product mentions stay optional and require developer disclosure.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: no named parameters. Returns: object
product_get_verification_templateBRead-only
A checklist the user should run on real hardware before making a factual claim. Use whenever a result carries verification_needed: true. Ask the user to run it and report back, rather than asserting numbers they have not measured.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: template. Returns: object
reddit_daily_digestARead-only
The main tool. Produces one day's work queue: new replies to the user, ranked places to contribute, what the user can speak to in each, what needs real-device verification, rule caveats, and reminders. Runs retention cleanup of stored Reddit content as a side effect. Returns URLs for the user to open - it never returns a ready-to-post comment body, and never posts anything.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: days, max_replies, max_opportunities. Returns: object
reddit_find_opportunitiesARead-only
Rank recent threads by how genuinely useful the user could be in them. The largest weight is helpfulness - whether a good answer exists WITHOUT mentioning any product. Threads whose promotion risk exceeds the configured threshold are removed entirely, not merely ranked lower. Each result says what the user can actually speak to, and whether a claim needs real-device checking.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: days, topics, subreddits, max_results. Returns: object
reddit_get_my_activityARead-only
Fetch the user's own recent posts and comments. Used to judge how active they already are in a subreddit (so they do not over-post) and to compute the 9:1 self-promotion ratio. Results are capped; this does not page indefinitely.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: days, limit. Returns: object
reddit_get_replies_to_meARead-only
Find new replies to the user's own posts and comments. Implemented by diffing the user's threads rather than reading the inbox, so this server never needs the privatemessages OAuth scope (which would also grant the ability to send DMs). Costs more requests; that is deliberate.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: limit, since. Returns: object
reddit_get_subreddit_rulesARead-only
Fetch a subreddit's rules and a conservative reading of its self-promotion stance. self_promotion_restricted: null means UNKNOWN, not permitted - never present it as permission. Cached locally per config.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: subreddit (required). Returns: object
reddit_get_threadARead-only
Read the minimum necessary context of one Reddit thread: the post plus a bounded selection of comments (top-level, high-scoring, and any near the user's own replies). Does not fetch entire comment trees. Refuses threads in denied subreddits (e.g. competitors' support communities).
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: url (required), max_depth, max_comments. Returns: object
reddit_search_postsBRead-only
Search recent posts in the subreddits the user has designated as places to contribute. Denied and observe-only subreddits are never searched. Posts that match only a competitor's product name are returned separately under listening_only and must NOT be treated as places to participate - they are for understanding complaints, nothing else.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: sort, limit, queries, subreddits, +1 more. Returns: object
reddit_whoamiARead-only
Show which Reddit account this server is authenticated as, and the current promotion policy mode. Returns no secrets - never any token. Call this first if you are unsure whether authentication is set up.
This server is read-only. It cannot post, comment, vote, edit, delete, follow, or message on Reddit, and no such code exists in it. The user performs every Reddit action manually.
Prioritize genuinely helpful participation over product promotion. Do not rank a thread highly merely because it can be used to promote a product. Respect subreddit rules and surface uncertainty when rules are ambiguous.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 13 tools
Most tools are clearly distinct, but reddit_find_opportunities overlaps heavily with reddit_daily_digest since the digest already includes ranked opportunities, and reddit_whoami duplicates the promotion-mode information also exposed by policy_status. The long descriptions help, but an agent could plausibly select the wrong tool for the same task.
There is a strong reddit_/product_ prefix pattern and most tools use get_ or a clear action verb, so the set is predictable. A few names break the pattern: reddit_daily_digest, reddit_whoami, and policy_status are noun-style rather than verb_noun, which creates minor inconsistency.
13 tools is within the well-scoped range and each major responsibility has a dedicated tool. The count feels slightly heavier than necessary because reddit_find_opportunities could arguably be folded into reddit_daily_digest, but the overall size is reasonable for read-only Reddit research.
The surface covers the core research workflow thoroughly: authentication status, user activity, replies, thread reading, post search, subreddit rules, opportunity ranking, daily digest, product expertise, and verification guidance. Since the server is intentionally read-only, the missing write operations are a deliberate boundary rather than a gap.
Maintenance
Related MCP Connectors
Reddit MCP server: search posts, subreddit feeds, comments & user profiles as JSON. No API key.
Read-only MCP server for verified book recommendations and reading lists.
Search MCP servers, agent skills and open-source AI projects, plus AI tools. Read-only.
Real-time Reddit posts, subreddit search, comments & mentions MCP. Local npx or hosted OAuth.
Related MCP Servers
- 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-
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that connects to the Reddit Data API to search posts, browse subreddits, read comments, view user profiles, and check trending content through the Model Context Protocol.70 npm2MIT
- AlicenseNot gradedqualityBmaintenanceA local, read-only Reddit MCP server that provides tools for searching posts, retrieving posts/comments, subreddit information, and user content via the official Reddit Data API with caching and privacy-focused features.-
- FlicenseNot gradedqualityDmaintenanceMCP server for researching community discussions, with a focus on Reddit. It enables searching Reddit posts and reading threads/comments, providing structured JSON output for LLM consumption.-