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

Быстрый старт

Напишите конфиг:

Назовите его .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+ символов сопоставляются с простыми словоформами (pipelinepipelines); более короткие сопоставляются точно, поэтому 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.

-
license - not tested
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
2Releases (12mo)
Commit activity

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.

View all MCP Connectors

Latest Blog Posts

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