reddit-radar-mcp
reddit-radar-mcp
找到你的产品真正契合的 Reddit 讨论串,还原完整对话,并根据你定义的声明边界对每一条草稿回复把关。
设计上只读。 不存在任何发帖、投票或以账号身份操作的代码路径,并且有一条测试断言今后也不会有。草稿是留给人工审阅、编辑和发布的。
npx reddit-radar-mcp # run as an MCP server
npm install reddit-radar-mcp # or use the scoring/gate functions directly需要 Node 20.10+。无构建步骤,无原生依赖。
为什么存在
通常的“社交倾听”工具会找到提及。这不过是简单的一半。其中另一个部分才困难:这个帖子是否真的相关、这个发帖人到底在问什么,以及你准备发出的回复是否属实?
这个包围绕三个来自生产环境排查的主张构建:
关键词匹配大多产生垃圾结果。 一个“足够新 + 疑问句式 + 任意提及“求推荐””的启发式评分,对任何随手翻到的近期 Reddit 帖子都能打出 50/100。然后这三条就形成了锚定规则(见下文),是本包最关键的部分。
一个帖子所在的位置,决定你该怎么回答。 同一个问题,在买家 subreddit 和工程 subreddit 里需要不同的评价,所以 subreddit 层级配置的是行为,而不只是排名。
一个写出推广文案模型的模型,是判断它有没有过度承诺的最差裁判。 所以 claim gate 是确定性、基于规则,并且在服务端运行的。如果草稿被拦截了,它不会原样交付给你。
快速开始
写一个配置文件:
除非你的项目已经设置了 "type": "module",否则请命名为 .mjs——否则 Node 会把它解析为 CommonJS,导入就会失败。
// radar.config.mjs
import { defineConfig, packs, composePacks } from 'reddit-radar-mcp';
export default defineConfig({
product: {
name: 'Acme',
what: 'CI/CD pipeline observability.',
claims: ['flaky test detection', 'build timing breakdowns'],
},
queries: ['flaky tests', 'CI pipeline slow', 'build times'],
// REQUIRED. Without it, every recent question looks like an opportunity.
domainTerms: ['ci', 'pipeline', 'flaky', 'github actions', 'test suite'],
// Words that mean something else outside your niche.
ambiguousTerms: ['build', 'runner'],
tiers: {
tier1: { mode: 'PROMOTE', weight: 20, subreddits: ['devops'] },
tier2: { mode: 'PROMOTE_SOFT', weight: 15, subreddits: ['sre', 'kubernetes'] },
tier3: { mode: 'CONTRIBUTE', weight: 8, subreddits: ['ExperiencedDevs'] },
tier4: { mode: 'TECHNICAL_ONLY', weight: 3, subreddits: ['programming'] },
},
gate: {
...composePacks(packs.noPricing, packs.noFabricatedMetrics, packs.noCustomerNames),
productPattern: /\bAcme\b/i,
unsupported: [
{ term: /\bJenkins\b/i, why: 'No Jenkins integration exists.' },
],
},
});把它注册为一个 MCP 服务:
claude mcp add radar --scope user \
-e RADAR_CONFIG=/abs/path/radar.config.mjs \
-- npx reddit-radar-mcp然后直接对你的智能体说:“跑一次扫描,看看哪些值得回复。”
锚定规则
这是本工具里唯一最有用的概念。
一个帖子只有在有内容把它和你的领域联系起来时才真正被锚定(anchored)。真正的领域词汇、无歧义的查询精确命中、或者一个配置给你的 subreddit。描述帖子外貌的信号——它是不是新的、是不是一个提问、是不是要求“推荐”——这些信号本身永远“把一个帖子撑起来”。
如果没有这道闸门,这些“形状”信号加起来会因为 >40 上了。有了锚定规则,r/podcasts 里一个问“POD episode”的帖子,就不会再压过真正的购买问题。
同一件事还推出两个相关行为:
当兩个领域信号同时触发时:有歧义的词(比如 “build”“POD”“detention”):只有当第二条领域信号——或者——帖子正好在你配置的某一个 subreddit 里,这个歧义词才算数,因为 subreddit 本身就是领域上下文。
抱怨类内容会被强制修改(-35)。废话比购买意图更容易带动传播,所以如果没有这条,排序会反转,你得到“机会”。
参与模式
层级模式给每条结果挂一个模式,/plays 输出会在每个 thread 旁边重复提及:
模式 | 含义 |
| 说产品名,描述它多大程度上符合,需要注明我们与产品的关系。 |
| 先直接回答问题。只有对方明确问软件工具事靠,才会提到产品。 |
| 只分享专业观点;产品只作为你是谁的解释。 |
| 绝不推销。 那里的用户当前并不会购买,推销会直接删除。 |
审阅拦截层(draft gate)
check_draft 执行两次独立检查,并且会拦截(拒绝返回)被判据卡住的草稿。
声明噪音门禁 (called check) — 一组确定性规则,跑在你的声明边界中。以下 starter pack 覆盖四种常见失败模式:
Pack | 会拦截的内容 |
| 金额、每单位价格、各档位价格对比 |
| 编造的百分比、uptime/SLA 声称、无法验证的规模 |
| 引用客户(甚至是匿名的)、带测量结果的客户案例 |
| “leveraging”、“seamless”、“robust”、“game-changing”(TRIPBLE quote)(标记) |
| 提到你的产品但未说明关联关系 |
有两个值得注意的行为:
To deny is always allowed. “我们不支持 Jenkins”可以通过。早期版本会拦截它,进而让草稿漏掉真实能力边界的说明,这违背了初衷。承认一个真实的局限是最廉价的信任建立。
能力判断是围绕断言完成的展开的。 所以“如果你需要 self-host,Jenkins 是一个可站得住的选择”不会触发拦截,因为它没有窝于你的产品断言范围。
质量门禁(styleCheck) —— 检测像未人工编辑的生成填充式内容:破折号、分号、弯曲引用、否定化框架(“不是X,而是Y ”)、营销用词、平庸的句式节奏,以及薄弱的论据。
这不是要规避AI 检测。它并不可、也没有试图去做到。很多 subreddit 厚反正 AI 一类的“低质内容”,而版主读评论,而不是跑classifier。所以这个 gate 只是实现 subreddit 规则的实际所指:有真实内容,没有填充。最终还是人工编辑和发布,并且总是带上关联透、确定关系声明。
把你的领域词源告诉它,substance check 才能知道合法的具体名词是什么样:
styleCheck(draft, { anchorTerms: [...config.domainTerms, ...config.featureTerms] });MCP 工具
工具 | 它能做的 | LLM 成本 |
| 返回带搜索 URL 列表 + 每个页面提取器 | none |
| 去重、评分、将 sweep 结果整理排列,形成 opportunity list | none |
| 对单帖 0–100 打分,并逐条说明理由 | none |
| 重建整个 thread,并返回有约束的声明条件 | none |
| 同上,但来源于浏览器端提取的 HTML | none |
| 执行点。返回 APPROVED 或 BLOCKED | none |
| 能声明什么、不能声明什么 | none |
每个工具都是确定性的。模型只管写;服务器管给事实和决定权。
对 Reddit 的访问
用一个接口支撑三个相互调用适配器:
BrowserRedditClient— 读取和真人看到的相同公共页面,来自你自带的浏览器工具。无凭据。这是当前默认方案。RedditApiClient— 通过 OAuth 官方 Data API 访问。API 可能有限量且受审查;见 docs/REDDIT-ACCESS.md。FixtureRedditClient— 用于测试和开发的本地 JSON 导入。
fixture 与 同一套 normalizer 处理,和线上地解析器公开基础之上的可真正确认:
fixtures 与 live responses 使用完全同一套 normalizers,所以解析不只是首次面对线上的真数据。
需要坦白:浏览器模式依赖 Reddit 的 DOM,而 Reddit 会做改版。提取器设计成宁可明显报错,也不悄悄出现一个空 thread,避免“没有找到讨论”的幻觉。
用它来写代码
import { scoreRelevance, factCheck, styleCheck, packs, composePacks } from 'reddit-radar-mcp';
import config from './radar.config.js';
const result = scoreRelevance(post, config, { matchedQueries: ['flaky tests'] });
if (result.passed) console.log(result.score, result.reasons);
const gate = factCheck(draft, config.gate);
if (!gate.allowed) console.log(gate.findings);语义与政策
这个工具存在是为了帮助你找到你可以真实贡献内容的对话。它不会帮助你假装自己是天然民间。
不提供发帖自动化。 没有实现,并通过测试强制。
明确是哪个号的关联。
requireDisclosure默认开启。未申报关系的 vendor comment 会被删除,可能让你在这个社区永久无法开口,整个渠道就此消失。单账号。 Reddit 的 Responsible Builder Policy 禁止同目的注册多个账号。不要用它来跑马甲网络。
给 thread 评分,从来不评价人。 这里完全不存在对用户画像/推断,符合 Reddit 关于不允许推断用户特质的规则。
尊重 subreddit 规则。
TECHNICAL_ONLY存在的理由:在不该推销的地方推销,既冒犯别人,也无效。
环境变量
变量 | 默认值 | 作用 |
| — | 必填。 配置文件绝对路径(解析为 |
|
|
|
| — | 只有 |
| — | 只有 |
| — | 只有 |
|
|
|
|
|
|
|
|
|
完整注释列表在 .env.example。
日志只向 stderr 打印。在 stdio 环境下 stdout 承载着 JSON-RPC 协议,往 stdout 打印任何内容都会损坏这条流。URL 中出现的 key 和敏感字段在打印前都会被遮蔽。
故障排除
“每个帖子看起来都像机会”。你把 domainTerms 设太宽泛了,或者漏了。它才是链接某个 thread 到你的领域的核心;没有它,形似“相关”的信号就能自己把帖子冲上来。这就是为什么配置校验把空列表当成错误。
“完全没有帖子评分”。 检查 domainTerms 里的词是不是真的能在帖子里出现。超过 5 个字符的术语,会匹配简单词形变化(pipeline → pipelines);比较短的词只能精确匹配,所以 app 不会命中 apps。
一个合理的草稿被当作“不够充实”给拦截了把你的术语当作 anchorTerms 传给 styleCheck。——MCP-server 会自动从 config 带进去,但如果你直接调用 styleCheck(),你需要显式传。
一个实际的限制条件被卡了。 不应该发生;恰定式否定是明确允许的。请 告诉我。
Reddit 显示 “Prove your humanity”:冷启动搜索会遇到一个 JS 挑战。通常先去随便浏览任何一个 subreddit 页可解决该会话的挑战。
“Cannot use import statement outside a module” :你的配置是 .js,项目配置没有 "type": "module",因此 Node 按 CommonJS 处理。解决方式是将文件改成 radar.config.mjs,或在最近的 package.json 加上 "type": "module"。json config 可以完全绕开该问题,但代价是丢失正则表达式字面量和 composePacks 调用。
更详细的内容见 SUPPORT.md.
测试
npm test # 33 unit tests
npm run smoke # 14 checks over the real MCP wire protocol
npm run verify # everything, including the metadata consistency guard安全测试套件断言:没有任何客户端暴露“写”方法、没有任何源文件引用 Reddit 的写操作接口、并且“包”不导出任何发帖函数。
贡献 / 参加
Issue 和 PR 都欢迎——见 CONTRIBUTING.md。注意其中列出的“永久排除依赖项”:发布自动化、多账号支持、以及“规避 AI 检测”是刻意做成的不支持项,而不是缺失功能。
支持此项目
如果它能为你节省时间,在 GitHub 上赞助有助于持续维护它。完全可选——该软件包采用 MIT 许可,并且永远如此。
非财务贡献同样有用:一份带有可复现配置的 bug 报告、一个具有泛化能力的规则包,或一条关于让你意外的评分案例的说明。
许可证
MIT — 参见 LICENSE。
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Agentic Reddit/HN buying-signal detection for Claude Code, Cursor, and Windsurf via MCP.
A personal RAG database you build from chat, so AI creates work that sounds like you.
Reddit & X data for AI agents over MCP. Semantic search, hosted, no Reddit API.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sourav2024/reddit-radar-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server