Skip to main content
Glama
sourav2024

reddit-radar-mcp

by sourav2024

reddit-radar-mcp

Находите ветки Reddit, в которые ваш продукт действительно вписывается, восстанавливайте ход обсуждения и проверяйте каждый черновик ответа на соответствие заданной вами границе допустимых утверждений.

Только чтение по замыслу. В коде нет пути, который публикует, голосует или действует от имени аккаунта, и тест подтверждает, что такого пути никогда не будет. Черновики предназначены для того, чтобы человек их просмотрел, отредактировал и опубликовал.

CI npm node license

npx reddit-radar-mcp          # run as an MCP server
npm install reddit-radar-mcp  # or use the scoring/gate functions directly

Требуется Node 20.10+. Без этапа сборки, без нативных зависимостей.

Зачем это существует

Обычный инструмент «социального прослушивания» находит упоминания. Это лёгкая половина. Сложная половина — всё, что после: действительно ли эта ветка релевантна, о чём на самом деле спрашивает человек, и правдив ли ответ, который вы собираетесь опубликовать.

Этот пакет построен на трёх утверждениях, которые возникли в результате его эксплуатации в продакшене:

  1. Сопоставление по ключевым словам даёт в основном мусор. Эвристика «недавний + вопросительная форма + „любые рекомендации“» даёт 50/100 буквально на любом недавнем посте Reddit. Решение — правило якоря (ниже), и это самое важное здесь.

  2. То, где находится ветка, меняет то, что вам следует говорить. Один и тот же вопрос в сабреддите покупателей и в инженерном сабреддите заслуживает разных комментариев, поэтому уровни сабреддитов задают поведение, а не только ранжирование.

  3. Модель, пишущая рекламный текст, — худший судья того, не преувеличила ли она. Поэтому шлюз утверждений детерминирован, основан на правилах и выполняется на сервере. Он отказывается возвращать заблокированный черновик.

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). Сетования вовлекают сильнее, чем вопросы о покупке, поэтому без этого ранжирование инвертируется, и вы получаете «возможности», которые представляют собой людей, жалующихся на коллег.

Режимы вовлечения

Уровни привязывают режим к каждому результату, и вывод обхода повторяет его рядом с каждой веткой:

Режим

Значение

PROMOTE

Назовите продукт, опишите подходящую возможность, раскройте аффилированность.

PROMOTE_SOFT

Сначала ответьте. Упомяните продукт, только если спрашивают об инструментах.

CONTRIBUTE

Поделитесь мыслью. Продукт — только как контекст того, кто вы.

TECHNICAL_ONLY

Не предлагайте. Там никто не покупает; рекламу удаляют.

Шлюз черновиков

check_draft выполняет две независимые проверки и отказывается возвращать заблокированный черновик.

Шлюз утверждений (factCheck) — детерминированные правила поверх вашей границы утверждений. Стартовые наборы покрывают четыре распространённых типа ошибок:

Набор

Блокирует

noPricing

Денежные суммы, ставки за единицу, сравнения ценовых уровней

noFabricatedMetrics

Выдуманные проценты, заявления об аптайме/SLA, непроверяемые масштабы

noCustomerNames

Упоминания клиентов (даже анонимные), кейсы с измеренными результатами

noMarketingSpeak

«леверидж», «бесшовный», «надёжный», «меняющий правила игры» (WARN)

requireDisclosure

Называние вашего продукта без раскрытия аффилированности

Два поведения, о которых стоит знать:

  • Отрицания всегда разрешены. «Мы не поддерживаем Jenkins» проходит. Ранняя версия блокировала это, что подталкивало черновики к молчанию о пробелах — противоположно замыслу. Признание реального ограничения — самая дешёвая доступная форма доверия.

  • Проверки возможностей ограничены областью утверждения. «Jenkins — надёжный выбор, если вам нужен self-hosting» не срабатывает на шлюзе, потому что это не утверждение о вашем продукте.

Шлюз качества (styleCheck) — ловит текст, который читается как неотредактированный сгенерированный заполнитель: длинные тире, точки с запятой, типографские кавычки, отрицательные конструкции («не просто X, а Y»), маркетинговую лексику, плоский ритм предложений и слабое содержание.

Это не обход детекторов ИИ. Это невозможно и не является целью. Многие сабреддиты запрещают небрежный контент, а модераторы читают комментарии, а не запускают классификаторы. Поэтому шлюз обеспечивает то, о чём на самом деле говорит это правило: реальное содержание, без заполнителей. Человек по-прежнему редактирует и публикует, и раскрытие всегда присутствует.

Передайте свою терминологию домена, чтобы проверка содержания знала, как выглядит конкретное существительное:

styleCheck(draft, { anchorTerms: [...config.domainTerms, ...config.featureTerms] });

MCP-инструменты

Инструмент

Что делает

Стоимость LLM

plan_sweep

Возвращает URL поиска + экстрактор страниц для запуска на каждом

нет

ingest_sweep

Дедуплицирует, оценивает, ранжирует результаты обхода в список возможностей

нет

score_thread

Оценка 0–100 для одного поста с обоснованием по пунктам

нет

analyze_thread

Восстанавливает ветку + возвращает обязательные ограничения утверждений

нет

parse_thread_html

То же самое, из извлечения на стороне браузера

нет

check_draft

Точка принуждения. APPROVED или BLOCKED

нет

get_claim_boundary

Что можно и что нельзя утверждать

нет

Каждый инструмент детерминирован. Модель обеспечивает написание; сервер обеспечивает факты и право вето.

Доступ к 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 существует, потому что предлагать продукт не в том месте — это и грубо, и контрпродуктивно.

Переменные окружения

Переменная

По умолчанию

Назначение

RADAR_CONFIG

—

Обязательно. Абсолютный путь к вашему конфигу (.js ESM с экспортом по умолчанию, или .json).

REDDIT_MODE

browser

browser, live или fixture. См. docs/REDDIT-ACCESS.md.

REDDIT_CLIENT_ID

—

Только для режима live.

REDDIT_CLIENT_SECRET

—

Только для режима live.

REDDIT_USER_AGENT

—

Только для режима live. Должен быть <platform>:<appid>:<version> (by /u/<user>).

REDDIT_QPM

60

Лимит запросов для режима live. Намеренно ниже заявленных Reddit 100.

RADAR_LOG_LEVEL

info

silent, error, warn, info, debug.

RADAR_LOG_FORMAT

json

json или text.

Полный аннотированный список в .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.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Signal 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.
    40
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    AI-powered Reddit marketing automation via Model Context Protocol, enabling smart search, audience analysis, engagement finding, and comment generation.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    An 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.
    3
    MIT