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+ が必要です。ビルドステップなし、ネイティブ依存関係なし。

これが存在する理由

一般的な「ソーシャルリスニング」ツールはメンションを見つけます。それは簡単な半分です。難しい半分はその後のすべてです:このスレッドは実際に関連しているのか、その人は本当は何を尋ねているのか、そしてあなたが投稿しようとしている返信は真実なのか。

このパッケージは、本番環境で実行して得られた3つの主張に基づいて構築されています。

  1. キーワードマッチングはほとんどゴミを生み出す。 新しさ + 質問形式 + 「おすすめはありますか」というヒューリスティックは、文字通りあらゆる最近のReddit投稿に対して50/100をスコアリングします。修正策はアンカールール(下記)であり、これがこのパッケージで最も重要なものです。

  2. スレッドが存在する場所によって、言うべきことが変わります。 バイヤー向けサブレディットとエンジニアリング向けサブレディットの同じ質問には異なるコメントがふさわしいため、サブレディットの階層はランキングだけでなく行動を設定します。

  3. プロモーションコピーを書くモデルは、自分が過剰主張したかどうかの最悪の判断者です。 そのため、主張ゲートは決定的で、ルールベースで、サーバー側で実行されます。ブロックされた下書きを返すことを拒否します。

クイックスタート

設定ファイルを書きます:

プロジェクトがすでに "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

あとはエージェントに話しかけるだけです:「スイープを実行して、返信する価値があるものを表示して」

アンカールール

このパッケージで最も有用なアイデアです。

投稿がアンカーされるのは、何かがそれをあなたのドメインに結びつける場合のみです:実際のドメイン語彙、明確なクエリマッチ、または設定されたサブレディット。投稿の形状を説明するシグナル — 最近である、質問である、「おすすめ」と言っている — は、単独では投稿を支えることはできません。

このゲートがないと、それらの形状シグナルは40以上に合計され、何でも通過させます。これがあれば、r/podcasts で「PODエピソード」について尋ねる投稿が、本物の購入質問を上回ることはなくなります。

同じアイデアから2つの関連する動作が生まれます:

  • 曖昧な用語(「build」、「POD」、「detention」)は、2番目のドメインシグナルが存在する場合にのみカウントされます — または投稿があなたのサブレディットのいずれかにある場合。サブレディット自体がドメインコンテキストだからです。

  • 愚痴は大幅にペナルティされます(-35)。愚痴は購入質問よりもエンゲージメントを得るため、これがないとランキングが逆転し、「機会」が同僚について文句を言っている人々になってしまいます。

エンゲージメントモード

階層はすべての結果にモードを添付し、スイープ出力は各スレッドの隣にそれを繰り返します:

モード

意味

PROMOTE

製品に名前を付け、適合する機能を説明し、所属を開示します。

PROMOTE_SOFT

まず回答します。ツールを求めている場合のみ製品に言及します。

CONTRIBUTE

洞察を共有します。製品はあなたが誰であるかの文脈としてのみ。

TECHNICAL_ONLY

売り込み禁止。 そこに買い手はいません。プロモーションは削除されます。

下書きゲート

check_draft は2つの独立したチェックを実行し、ブロックされた下書きを返すことを拒否します。

主張ゲートfactCheck)— あなたの主張の境界に対する決定的なルール。スターターパックは4つの一般的な失敗モードをカバーします:

パック

ブロック

noPricing

金額、単価レート、価格帯の比較

noFabricatedMetrics

でっち上げのパーセンテージ、稼働時間/SLAの主張、検証不可能な規模

noCustomerNames

クライアントへの言及(匿名でも)、測定結果を伴うケーススタディ

noMarketingSpeak

「leverage」、「seamless」、「robust」、「game-changing」(WARN)

requireDisclosure

所属を開示せずに製品に名前を付けること

知っておくべき2つの動作:

  • 否定は常に許可されます。 「Jenkinsはサポートしていません」は通過します。初期バージョンではこれをブロックしていましたが、それは下書きをギャップについての沈黙へと押しやり、意図とは逆でした。実際の制限を認めることは、利用可能な最も安価な信頼性です。

  • 能力チェックはアサーションにスコープされます。 「セルフホスティングが必要ならJenkinsは堅実な選択です」はゲートに引っかかりません。それはあなたの製品についての主張ではないからです。

品質ゲートstyleCheck)— 未編集の生成された埋め草として読めるテキストをキャッチします:emダッシュ、セミコロン、スマートクォート、否定フレーミング(「Xだけでなく、Yです」)、マーケティング語彙、平坦な文のリズム、薄い内容。

これはAI検出回避ではありません。 それはできず、そうしようともしません。多くのサブレディットは低品質のコンテンツを禁止しており、モデレーターは分類器を実行するのではなくコメントを読みます。したがって、ゲートはそのルールが実際に要求するものを強制します:本当の内容、埋め草なし。人間が依然として編集して投稿し、開示は常に存在します。

内容チェックが具体的な名詞がどのように見えるかを知るように、ドメイン語彙を渡します:

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

MCPツール

ツール

機能

LLMコスト

plan_sweep

検索URL + 各ページで実行するページ抽出器を返します

なし

ingest_sweep

スイープ結果を重複排除、スコアリング、ランキングして機会リストにします

なし

score_thread

1つの投稿に対する0〜100のスコアとポイントごとの理由付け

なし

analyze_thread

スレッドを再構築し、拘束力のある主張制約を返します

なし

parse_thread_html

クライアント側ブラウザ抽出から同じことを行います

なし

check_draft

執行ポイント。 APPROVED または BLOCKED

なし

get_claim_boundary

何を主張してよく、何を主張してはいけないか

なし

すべてのツールは決定的です。モデルが文章を提供し、サーバーが事実と拒否権を提供します。

Redditアクセス

1つのインターフェースの背後にある3つの交換可能なアダプター:

  • BrowserRedditClient — 人が読むのと同じ公開ページを、あなた自身のブラウザツールから読み取ります。認証情報は不要です。これが現在のデフォルトパスです。

  • RedditApiClient — 公式Data APIに対するOAuth。アクセスは承認制です。docs/REDDIT-ACCESS.md を参照してください。

  • FixtureRedditClient — テストと開発用のローカルJSONフィクスチャ。

フィクスチャはライブレスポンスと同じ正規化器を通過するため、パーサーは本番で実際のデータに初めて遭遇するのではなく、実際に鍛えられます。

明確に述べる価値のある注意点:ブラウザモードはRedditのDOMに依存しており、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 はデフォルトでオンです。開示されていないベンダーコメントは削除され、恒久的な禁止につながる可能性があり、チャネル全体が終了します。

  • 1つのアカウント。 RedditのResponsible Builder Policyは、同じユースケースで複数のアカウントを登録することを禁止しています。これをソックパペットネットワークの運営に使用しないでください。

  • スレッドがスコアリングされ、人々はされません。 ここでは著者のプロファイリングは行われず、Redditのユーザー特性の推測禁止に沿っています。

  • サブレディットのルールを尊重します。 TECHNICAL_ONLY が存在するのは、間違った場所での売り込みが失礼であり、逆効果だからです。

環境変数

変数

デフォルト

目的

RADAR_CONFIG

必須。 設定ファイルへの絶対パス(デフォルトエクスポートを持つ .js ESM、または .json)。

REDDIT_MODE

browser

browserlive、または fixturedocs/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

silenterrorwarninfodebug

RADAR_LOG_FORMAT

json

json または text

完全な注釈付きリストは .env.example にあります。

ログはstderrのみに出力されます。stdioトランスポートではstdoutがJSON-RPCプロトコルを運ぶため、そこに何かを書き込むとストリームが破損します。URL内の認証情報と機密キーは、ログ記録前に編集されます。

トラブルシューティング

すべてが機会としてスコアリングされる。 domainTerms が一般的すぎるか欠落しています。そのリストが投稿をあなたのドメインにアンカーするものであり、それがないと形状シグナルが単独で投稿を支えます。このため、設定検証は空のリストをエラーとして扱います。

何もスコアリングされない。 domainTerms が投稿タイトルに実際に現れる単語を使用しているか確認してください。5文字以上の用語は単純な屈折にマッチします(pipelinepipelines)。短いものは完全一致するため、appapps にマッチしません。

良い下書きが薄い内容としてブロックされる。 語彙を anchorTerms として渡してください — MCPサーバーは設定から自動的にこれを行いますが、直接の styleCheck() 呼び出しでは明示的に必要です。

正直な制限がブロックされる。 それは起こるべきではありません。否定は明示的に許可されています。報告してください。

Redditが「Prove your humanity」を表示する。 コールド検索はJSチャレンジに遭遇することがあります。最初に任意のサブレディットページを読み込むと、通常セッション中はクリアされます。

「Cannot use import statement outside a module」。 設定が "type": "module" のないプロジェクト内の .js ファイルであるため、NodeがCommonJSとして解析します。radar.config.mjs という名前を付けるか、最も近い package.json"type": "module" を追加してください。.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の書き込みエンドポイントを参照せず、パッケージが投稿関数をエクスポートしないことをアサートします。

貢献

問題とPRを歓迎します — CONTRIBUTING.md を参照してください。そこに記載されている恒久的な除外事項に注意してください:投稿自動化、複数アカウントサポート、AI検出回避は、欠落した機能ではなく意図的な非目標です。

このプロジェクトを支援する

これが時間の節約になっているなら、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