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. Решение — правило якоря (ниже), и это самое важное здесь.
То, где находится ветка, меняет то, что вам следует говорить. Один и тот же вопрос в сабреддите покупателей и в инженерном сабреддите заслуживает разных комментариев, поэтому уровни сабреддитов задают поведение, а не только ранжирование.
Модель, пишущая рекламный текст, — худший судья того, не преувеличила ли она. Поэтому шлюз утверждений детерминирован, основан на правилах и выполняется на сервере. Он отказывается возвращать заблокированный черновик.
Related MCP server: reddit-marketing
Быстрый старт
Напишите конфиг:
Назовите его .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 deployed
Maintenance
Related MCP Connectors
Reddit threads and reply drafts, LinkedIn leads, on-brand articles, chatbots and short links.
Find high-intent Reddit conversations and manage lead workflows from MCP-compatible AI agents.
Search your brand's Reddit, X, LinkedIn, Quora and Hacker News mentions, and draft replies.
- LeadFastOAuthvip.leadfast
Buyer-intent Reddit posts matched to your product, with suggested replies. Read-only.
Related MCP Servers
- AlicenseBqualityDmaintenanceSignal Found is a Reddit-native B2C/B2B outreach platform. You describe your product, we find people on Reddit already asking for it, and your AI agent handles the rest — messaging prospects, tracking replies, and optimizing your funnel in real time.403MIT
- AlicenseNot gradedqualityDmaintenanceAI-powered Reddit marketing automation via Model Context Protocol, enabling smart search, audience analysis, engagement finding, and comment generation.MIT
- AlicenseAqualityCmaintenanceAn MCP server that turns Claude into a Reddit lead-finding agent: search for buying-intent conversations, score them against your product, and read full threads before drafting a reply.3MIT
- AlicenseAqualityAmaintenanceEnables AI models to search, fetch, and read Reddit content with resilient rate-limit handling and smart comment filtering, including zero-config fallback to alternative sources.537MIT