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+. Без этапа сборки, без нативных зависимостей.
Зачем это существует
Обычный инструмент «социального прослушивания» находит упоминания. Это лёгкая половина. Сложная половина — всё, что после: действительно ли эта ветка релевантна, о чём на самом деле спрашивает человек, и правдив ли ответ, который вы собираетесь опубликовать.
Этот пакет построен на трёх утверждениях, которые возникли в результате его эксплуатации в продакшене:
Сопоставление по ключевым словам даёт в основном мусор. Эвристика «недавний + вопросительная форма + „любые рекомендации“» даёт 50/100 буквально на любом недавнем посте Reddit. Решение — правило якоря (ниже), и это самое важное здесь.
То, где находится ветка, меняет то, что вам следует говорить. Один и тот же вопрос в сабреддите покупателей и в инженерном сабреддите заслуживает разных комментариев, поэтому уровни сабреддитов задают поведение, а не только ранжирование.
Модель, пишущая рекламный текст, — худший судья того, не преувеличила ли она. Поэтому шлюз утверждений детерминирован, основан на правилах и выполняется на сервере. Он отказывается возвращать заблокированный черновик.
Быстрый старт
Напишите конфиг:
Назовите его .mjs, если ваш проект ещё не задаёт "type": "module" — иначе 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Затем просто поговорите со своим агентом: «запусти обход и покажи, на что стоит ответить».
Правило якоря
Самая полезная идея в этом пакете.
Пост заякорен, только если что-то связывает его с вашей областью: реальная терминология домена, однозначное совпадение по запросу или настроенный сабреддит. Сигналы, описывающие форму поста — он недавний, это вопрос, в нём сказано «рекомендации» — никогда не могут сами по себе пронести пост.
Без этого шлюза такие сигналы формы в сумме дают 40+ и пропускают что угодно. С ним пост в r/podcasts с вопросом о «POD-эпизоде» перестаёт обгонять подлинный вопрос о покупке.
Из той же идеи вытекают два связанных поведения:
Неоднозначные термины («build», «POD», «detention») засчитываются только при наличии второго сигнала домена — или когда пост находится в одном из ваших сабреддитов, поскольку сам сабреддит является контекстом домена.
Вентилирование жёстко штрафуется (-35). Сетования вовлекают сильнее, чем вопросы о покупке, поэтому без этого ранжирование инвертируется, и вы получаете «возможности», которые представляют собой людей, жалующихся на коллег.
Режимы вовлечения
Уровни привязывают режим к каждому результату, и вывод обхода повторяет его рядом с каждой веткой:
Режим | Значение |
| Назовите продукт, опишите подходящую возможность, раскройте аффилированность. |
| Сначала ответьте. Упомяните продукт, только если спрашивают об инструментах. |
| Поделитесь мыслью. Продукт — только как контекст того, кто вы. |
| Не предлагайте. Там никто не покупает; рекламу удаляют. |
Шлюз черновиков
check_draft выполняет две независимые проверки и отказывается возвращать заблокированный черновик.
Шлюз утверждений (factCheck) — детерминированные правила поверх вашей границы утверждений. Стартовые
наборы покрывают четыре распространённых типа ошибок:
Набор | Блокирует |
| Денежные суммы, ставки за единицу, сравнения ценовых уровней |
| Выдуманные проценты, заявления об аптайме/SLA, непроверяемые масштабы |
| Упоминания клиентов (даже анонимные), кейсы с измеренными результатами |
| «леверидж», «бесшовный», «надёжный», «меняющий правила игры» (WARN) |
| Называние вашего продукта без раскрытия аффилированности |
Два поведения, о которых стоит знать:
Отрицания всегда разрешены. «Мы не поддерживаем Jenkins» проходит. Ранняя версия блокировала это, что подталкивало черновики к молчанию о пробелах — противоположно замыслу. Признание реального ограничения — самая дешёвая доступная форма доверия.
Проверки возможностей ограничены областью утверждения. «Jenkins — надёжный выбор, если вам нужен self-hosting» не срабатывает на шлюзе, потому что это не утверждение о вашем продукте.
Шлюз качества (styleCheck) — ловит текст, который читается как неотредактированный сгенерированный
заполнитель: длинные тире, точки с запятой, типографские кавычки, отрицательные конструкции («не просто X, а Y»),
маркетинговую лексику, плоский ритм предложений и слабое содержание.
Это не обход детекторов ИИ. Это невозможно и не является целью. Многие сабреддиты запрещают небрежный контент, а модераторы читают комментарии, а не запускают классификаторы. Поэтому шлюз обеспечивает то, о чём на самом деле говорит это правило: реальное содержание, без заполнителей. Человек по-прежнему редактирует и публикует, и раскрытие всегда присутствует.
Передайте свою терминологию домена, чтобы проверка содержания знала, как выглядит конкретное существительное:
styleCheck(draft, { anchorTerms: [...config.domainTerms, ...config.featureTerms] });MCP-инструменты
Инструмент | Что делает | Стоимость LLM |
| Возвращает URL поиска + экстрактор страниц для запуска на каждом | нет |
| Дедуплицирует, оценивает, ранжирует результаты обхода в список возможностей | нет |
| Оценка 0–100 для одного поста с обоснованием по пунктам | нет |
| Восстанавливает ветку + возвращает обязательные ограничения утверждений | нет |
| То же самое, из извлечения на стороне браузера | нет |
| Точка принуждения. APPROVED или BLOCKED | нет |
| Что можно и что нельзя утверждать | нет |
Каждый инструмент детерминирован. Модель обеспечивает написание; сервер обеспечивает факты и право вето.
Доступ к Reddit
Три взаимозаменяемых адаптера за одним интерфейсом:
BrowserRedditClient— читает те же публичные страницы, которые читает человек, из вашего собственного браузерного инструмента. Без учётных данных. Это путь по умолчанию на сегодня.RedditApiClient— OAuth против официального Data API. Доступ требует одобрения; см. docs/REDDIT-ACCESS.md.FixtureRedditClient— локальные JSON-фикстуры для тестов и разработки.
Фикстуры проходят через те же нормализаторы, что и живые ответы, поэтому парсеры действительно проверяются, а не впервые встречаются с реальными данными в продакшене.
Оговорка, которую стоит высказать прямо: браузерный режим зависит от DOM Reddit, а Reddit выпускает редизайны. Экстракторы написаны так, чтобы громко падать, а не молча возвращать пустые ветки, которые выглядят как «обсуждение не найдено».
Программное использование
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включён по умолчанию. Нераскрытые комментарии вендора удаляются и могут привести к пожизненному бану, что полностью закрывает канал.Один аккаунт. Responsible Builder Policy Reddit запрещает регистрацию нескольких аккаунтов для одного и того же случая использования. Не используйте это для запуска сети марионеток.
Оцениваются ветки, а не люди. Ничто здесь не профилирует автора, в соответствии с запретом Reddit на вывод характеристик пользователей.
Уважайте правила сабреддитов.
TECHNICAL_ONLYсуществует, потому что предлагать продукт не в том месте — это и грубо, и контрпродуктивно.
Переменные окружения
Переменная | По умолчанию | Назначение |
| — | Обязательно. Абсолютный путь к вашему конфигу ( |
|
|
|
| — | Только для режима |
| — | Только для режима |
| — | Только для режима |
|
| Лимит запросов для режима |
|
|
|
|
|
|
Полный аннотированный список в .env.example.
Логи идут только в stderr. На stdio-транспорте stdout несёт JSON-RPC-протокол, поэтому всё, что туда записано, портит поток. Учётные данные в URL и чувствительные ключи редактируются перед логированием.
Устранение неполадок
Всё оценивается как возможность. Ваши domainTerms слишком общие или отсутствуют.
Именно этот список заякоривает пост на вашей области, и без него сигналы формы проносят
посты сами по себе. Проверка конфига считает пустой список ошибкой по этой причине.
Ничего не оценивается вообще. Проверьте, что domainTerms использует слова, которые действительно
встречаются в заголовках постов. Термины из 5+ символов сопоставляются с простыми словоформами
(pipeline → pipelines); более короткие сопоставляются точно, поэтому app не совпадёт с apps.
Хороший черновик блокируется как слабое содержание. Передайте свою лексику как anchorTerms —
MCP-сервер делает это из вашего конфига автоматически, но прямому вызову styleCheck() это нужно
явно.
Честное ограничение блокируется. Так быть не должно; отрицания явно разрешены. Пожалуйста, сообщите об этом.
Reddit показывает «Prove your humanity». Холодный поиск может наткнуться на JS-челлендж. Загрузка любой страницы сабреддита сначала обычно снимает его на сессию.
«Cannot use import statement outside a module». Ваш конфиг — это .js-файл в проекте
без "type": "module", поэтому Node разбирает его как CommonJS. Либо назовите его
radar.config.mjs, либо добавьте "type": "module" в ближайший package.json. Конфиг .json
полностью обходит этот вопрос, ценой литералов регулярных выражений и 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, и пакет не экспортирует функцию публикации.
Участие
Приветствуются issues и PR — см. CONTRIBUTING.md. Обратите внимание на постоянные исключения, перечисленные там: автоматизация публикаций, поддержка нескольких аккаунтов и обход детекторов ИИ — это намеренные не-цели, а не отсутствующие функции.
Поддержка этого проекта
Если это экономит ваше время, спонсирование на GitHub помогает поддерживать его. Совершенно необязательно — пакет имеет лицензию MIT и всегда будет.
Нефинансовые вклады так же полезны: отчёт об ошибке с воспроизводимой конфигурацией, набор правил, который обобщается, или заметка о случае оценки, который вас удивил.
Лицензия
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