mcpField
A
auditreach

auditreach

ローカル
github.com/RudrenduPaulソーシャルメディア05 週間前に更新

auditreach について

auditreachは、コンプライアンスを重視する調査やAIエージェント向けのReddit・YouTube検索CLIです。利用者自身の認証情報で公式APIにアクセスし、各クエリを検証可能なハッシュチェーン監査ログに記録します。npm版とPython版があります。

主な機能

  1. 01公式API経由でRedditとYouTubeを検索
  2. 02利用者自身の認証情報を安全に保存
  3. 03クエリをハッシュチェーンで記録
  4. 04ローカルログの改ざんを検証
  5. 05構造化JSON形式の検索結果

活用シーン

  1. 01調査エージェント用にRedditやYouTubeの情報を収集
  2. 02データ照会のプラットフォーム、範囲、根拠を追跡
  3. 03ローカル監査記録の完全性を検証
  4. 04スクリプトで構造化検索結果を処理

MCP 対応

MCPサーバーは、検索、認証情報の状態確認、監査ログの検証を行う`search`、`auth_status`、`verify_log`の3つのツールを公開します。認証情報の設定と削除はMCP経由では行えません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"rudrendupaul-auditreach": {
"command": "uvx",
"args": [
"auditreach-cli"
]
}
}
}
起動コマンドuvx auditreach-cli

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiauditreach-cli0.2.5

ツール

3

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
afteranyいいえ
queryanyいいえ
sinceanyいいえ
beforeanyいいえ
outputanyいいえ
channelanyいいえ
platformstringはい
subredditanyいいえ
max_resultsanyいいえ

詳細

auditreach

CI npm version PyPI version License: Apache 2.0 Node

インストール • できること • はじめに • コマンド • セキュリティ • FAQ

公式 API とご自身のキーのみを使って、AI エージェントから Reddit と YouTube を調査できます。何を、なぜ許可された範囲で照会したのかを正確に証明するログも記録します。

auditreach のデモ:--help を実行し、認証情報をまだ設定していない状態で初回の auth --verify チェックを実行

インストール

auditreach は、独立した同等の第一級パッケージを 2 つ提供しています。npm パッケージ(このリポジトリ、JavaScript/TypeScript)と PyPI パッケージ(python/、 Python)です。どちらも同じハッシュチェーンアルゴリズムと BYOK モデルを実装し、 同じ公式 Reddit/YouTube API を使用します。お使いのツールチェーンに合う方を選ぶか、 両方をインストールしてください。

npm:

npx auditreach-cli search --platform reddit --query "your query"

グローバルにインストールする場合:

npm install -g auditreach-cli
auditreach search --platform reddit --query "your query"

pip:

pip install auditreach-cli
auditreach search --platform reddit --query "your query"

Python 固有の使い方については、python/README.md をご覧ください。 このディストリビューションで追加された、環境変数を使う BYOK 認証情報の設定方法も 記載されています(ヘッドレス CI/エージェントのサンドボックスで便利です)。 npm パッケージでは認証情報を OS のキーチェーンにのみ保存します。

まずコードを読んだり変更したりしたい場合は、次のようにソースからビルドできます。

git clone https://github.com/RudrenduPaul/auditreach.git
cd auditreach
npm install
npm run build
node dist/cli.js search --platform reddit --query "your query"

できること

node dist/cli.js search --platform reddit --query "agent memory poisoning" --subreddit MachineLearning

AuditReach -- 公式 API 調査 CLI
プラットフォーム:Reddit  |  認証:OAuth script-app grant、読み取り専用、公開サブレディットのスコープ

取得中...(公式 API、レート制限を考慮)
✓ 14 件の結果を返しました(Reddit API 利用規約 -- 公開コンテンツ、公式 API、読み取り専用の script-app 認証情報)

結果(14 件)
[1] "長時間稼働するエージェントのメモリポイズニングを、どのようにテストしていますか?"
    u/some_researcher · 2026-07-05T14:22:00.000Z
    https://reddit.com/r/MachineLearning/comments/...
...

監査ログエントリを記録しました:ar_2026-07-12_9f3c2a
同意の根拠:Reddit API 利用規約 -- 公開コンテンツ、公式 API、読み取り専用の script-app 認証情報
全結果:./auditreach-results-2026-07-12.json
監査証跡全体:./auditreach.log.jsonl

auditreach.log.jsonl の各エントリはハッシュチェーンで連結されています。各エントリのハッシュはその内容から計算され、次のエントリがそのハッシュを参照します。エントリの編集、削除、並べ替えを行うと、チェーンが破損します。

$ node dist/cli.js verify-log
./auditreach.log.jsonl を検証しています...
✓ チェーンに異常はありません:14 件のエントリ、欠落なし、改ざんは検出されませんでした。

# 誰かがログファイルの行を手動で編集した後:
$ node dist/cli.js verify-log
./auditreach.log.jsonl を検証しています...
✗ エントリ 3(ar_2026-07-12_9f3c2a)でチェーンが破損しています:エントリ ar_2026-07-12_9f3c2a のハッシュが
  内容と一致しません -- エントリは記録後に編集されています

auditreach のデモ:auditreach.log.jsonl のエントリを手動で編集し、verify-log を実行してハッシュチェーンの破損が検出される様子

比較

auditreachAgent-Reachsnoowrap
アクセス方式公式 API のみ、BYO-keyCookie/セッションのインポート、「API 料金ゼロ」公式 API、BYO-key
対応プラットフォームReddit、YouTubeTwitter、Reddit、YouTube、GitHub、Bilibili、XiaoHongShuReddit のみ
同意/監査ログハッシュチェーン方式、クエリごと、ローカルなしなし
メンテナンス状況アクティブ(本リリース)アクティブ、65k 以上のスター2023 年 2 月以降 アーカイブ済み
ライセンスApache 2.0MITMIT
実行時依存関係(Reddit クライアント)0 -- ネイティブの fetch該当なし(Python、ブラウザーセッションベース)request、request-promise、ws(すべて非推奨)

数値は、執筆時点で各リポジトリの公開 GitHub メタデータと、依存関係の比較については snoowrap 自身が公開している package.json を直接調査したものです。gh api repos/<owner>/<repo> を使えば、誰でも再現できます。

auditreach の Reddit クライアントは、Node エコシステムで最も広く使われている Reddit API ラッパーである snoowrap を基盤として開発し始めました。これをインストールすると、request、request-promise、form-data、har-validator が依存関係として追加されます。この依存関係チェーンには現在、重大度が CRITICAL のアドバイザリが 2 件、HIGH が 2 件、中程度が 5 件(合計 9 件)含まれています(npm audit による)。プロジェクトは 2023 年からアーカイブされているため、snoowrap ではいずれも修正できません。そこで、Reddit が公式に文書化している REST エンドポイントを使用する、fetch ベースの直接的な OAuth2 クライアントとして Reddit クライアントを書き直しました。機能は同じまま、これらの CVE はなく、このクライアントの実行時依存関係も追加されません。auditreach 自体の現在の npm audit の状況については、セキュリティをご覧ください。

auditreach が存在する理由

あるコンサルティング会社が、クライアント向けレポートのためにソーシャル上のセンチメントを収集する AI リサーチエージェントを利用していました。クライアントの法務チームから、データ収集の根拠を文書で示すよう求められるまでは、問題なく機能していました。正直に言える答えは「ブラウザーの Cookie セッション」でした。利用していたツールは、ログイン済みセッションをインポートして、実際のユーザーのようにスクレイピングすることで認証していたのです。それは機能します。しかし、コンプライアンスに関する覚書に書ける答えではありません。また、2025 年に Reddit が Anthropic と SerpApi を提訴した際のまさにその手法であり、2024 年に Reddit が Pushshift の公開 API アクセスを停止させたのも同じ手法でした。

Agent-Reach は悪いツールではありません。Cookie ベースのスクレイピングは、API コストがゼロで、現在どの公式 API よりも実際に幅広いデータをカバーできるため、確かな支持を集めています(星 65k 以上)。しかし、「より幅広くカバーできる」ことと「代理店のクライアントがコンプライアンス審査を通過できる」ことは、求められる基準が異なります。後者をクリアするために特化して作られたものはありませんでした。

auditreach は、私たちがあればよいと思った CLI です。Reddit と YouTube には、公式に文書化された API のみを通じてアクセスし、自分自身の API キーを使います。共有キーは使いません。また、クエリを実行するたびに、ハッシュチェーン方式のエントリーがローカルの監査ログに記録されます。そこには、プラットフォーム、エンドポイント、スコープ、そしてその特定の呼び出しの同意/利用規約上の根拠を平易な言葉で説明する一文が記録されます。Cookie のインポートはありません。セッショントークンの再利用もありません。ログイン中の人間を装うことさえできるコードパスは存在しません。

Agent-Reach の 6 つのプラットフォームを超えることは目指していません。auditreach は意図的に対象を絞っています。Cookie ベースのツールを構造上まったく使えないユーザーのためのものです。

はじめに

1. インストール: 上記の インストール を参照してください。npx auditreach-cli、npm install -g auditreach-cli を実行するか、クローンしてソースからビルドします。

2. 検索するプラットフォームの認証情報を設定します(BYO キー。自分のキーを使い、私たちのキーは使いません):

node dist/cli.js auth --platform reddit
# Client ID、Client secret、username、password の入力を求められます。
# 先に https://www.reddit.com/prefs/apps で script-app を作成してください。

node dist/cli.js auth --platform youtube
# API キーの入力を求められます。
# https://console.cloud.google.com/apis/credentials で作成してください。

すべての認証情報は OS のキーチェーン(@napi-rs/keyring)に保存されます。設定ファイルには保存されず、各プラットフォームの公式認証エンドポイント以外に送信されることもありません。認証情報を設定したら、実際の検索を実行せずに検証できます。

node dist/cli.js auth --platform reddit --verify

3. 検索:

node dist/cli.js search --platform reddit --query "your query" --subreddit some_subreddit
node dist/cli.js search --platform youtube --query "your query" --channel @SomeChannel

セットアップにかかる時間について、率直にお伝えします。Reddit と Google から独自の API 認証情報を取得するには、初回は数分かかります。すでに利用中のブラウザーセッションを再利用する Agent-Reach の Cookie インポート方式より時間がかかりますが、これは意図した設計です。BYOK では、セットアップの手間は実際に発生し、隠されることはありません。

コマンド

auditreach には 4 つのサブコマンドがあります。以下のフラグはすべて、以前サポートしていた機能についての記憶ではなく、CLI 自身の --help 出力から直接取得したものです。

auditreach search

公式 API のみを使用してプラットフォームを検索します。

フラグ説明
--platform <platform>reddit | youtube(必須)
--query <query>検索クエリ(必須)
--subreddit <subreddit>検索対象を 1 つのサブレディットに限定します(Reddit のみ)
--channel <handle>検索対象を 1 つのチャンネルに限定します(例:@AnthropicAI)(YouTube のみ)
--since <date>この日付以降に公開された結果のみを取得します(例:2026-06-01)(YouTube のみ)
--max-results <n>返す結果の最大数(デフォルト:25、プラットフォーム上限:Reddit は 100、YouTube は 50)
--before <fullname>この Reddit の fullname カーソルより前の結果をページ分割して取得します(例:t3_abc123)(Reddit のみ)
--after <fullname>この Reddit の fullname カーソルより後の結果をページ分割して取得します(例:t3_abc123)(Reddit のみ)
--output <path>完全な結果の JSON をこのパスに書き込みます
--json人が読みやすい形式の出力の代わりに、スクリプトやエージェントの呼び出し元向けに構造化 JSON を標準出力に出力します
node dist/cli.js search --platform reddit --query "agent memory poisoning" --subreddit MachineLearning --max-results 50
node dist/cli.js search --platform reddit --query "agent memory poisoning" --json | jq '.results | length'
auditreach auth

プラットフォームの BYOK 認証情報を設定、確認、または消去します(OS のキーチェーンに保存されます)。

フラグ説明
--platform <platform>reddit | youtube(必須)
--clearこのプラットフォームの保存済み認証情報を削除します
--verify検索を実行せずに保存済み認証情報が有効か確認します(結果ファイルも監査ログエントリも作成されません)
--json--verify と併用すると、人が読みやすいテキストの代わりに構造化 JSON の結果を出力します
node dist/cli.js auth --platform reddit --verify
auditreach verify-log

ローカルのハッシュチェーン監査ログが改ざんされていないことを検証します。

フラグ説明
--path <path>監査ログファイルのパス(省略した場合のデフォルトは ./auditreach.log.jsonl です)
node dist/cli.js verify-log --path ./auditreach.log.jsonl
auditreach mcp

標準入出力経由で Model Context Protocol サーバーを実行します(公式の @modelcontextprotocol/sdk を使用)。AI エージェントが標準出力を解析するためにシェルコマンドを実行する代わりに、この CLI を直接呼び出せるよう、ツールを3つだけ公開します。

ツール相当するコマンド備考
searchauditreach search --json同じパラメーター:platform、query、subreddit/channel、since、maxResults、before/after
auth_statusauditreach auth --platform <p> --verify --json読み取り専用です。 保存済みの認証情報が有効かどうかを確認します。設定や削除はできません
verify_logauditreach verify-log --json同じパラメーター:path
node dist/cli.js mcp
# または、公開後は次のコマンドを使用します:npx auditreach-cli mcp

MCP クライアントの設定に追加してください(Claude Desktop の場合は claude_desktop_config.json)。どちらの配布方法でも同じ mcp サブコマンドを利用できます。

{
  "mcpServers": {
    "auditreach": {
      "command": "npx",
      "args": ["-y", "auditreach-cli", "mcp"]
    }
  }
}

または、PyPI パッケージから:

{
  "mcpServers": {
    "auditreach": {
      "command": "uvx",
      "args": ["--from", "auditreach-cli", "auditreach", "mcp"]
    }
  }
}

BYOK 認証情報の設定や削除(auditreach auth --platform <p> / --clear)は、意図的に MCP 経由では公開していません。これは人間が操作するローカル CLI 専用のアクションです。そのため、呼び出し元のエージェントは認証情報が機能するか確認できますが、自ら認証情報を登録したり消去したりすることはできません。エージェントやエージェントレジストリが、人間が先に README を読まなくてもこのサーバーを見つけられるよう、機械可読なマニフェスト(認証要件、ツールのスキーマ、呼び出しコマンド)を記載した .well-known/agent.json を参照してください。

auditreach の使用例:標準入出力経由で auditreach mcp に生の MCP initialize + tools/list JSON-RPC リクエストを送信し、登録済みの3つのツールを受け取る様子

auditreach <command> --help を実行すると、インストール済みバージョンでサポートされる正確なフラグをいつでも確認できます。

ライブラリ API リファレンス

auditreach-cli はインポート可能なライブラリとしても機能します。以下のエクスポートはすべて、公開済みパッケージの dist/index.d.ts にそのまま記載されています。

import {
  RedditClient,
  YoutubeClient,
  getCredential,
  setCredential,
  deleteCredential,
  getRedditCredentials,
  getYoutubeCredentials,
  appendAuditLogEntry,
  getLastEntryHash,
  computeEntryHash,
  verifyAuditLogChain,
  credentialFingerprint,
  canonicalJson,
  sha256Hex,
  DEFAULT_AUDIT_LOG_PATH,
  executeSearch,
  SearchCommandError,
  checkAuthStatus,
  executeVerifyLog,
  buildMcpServer,
  runMcpServerCommand,
} from "auditreach-cli";

クライアント

  • new RedditClient(credentials: RedditCredentials) -- Reddit の公式 OAuth API のみを、パスワードグラント(「スクリプトアプリ」フロー)を使用して呼び出します。.search(options: RedditSearchOptions): Promise<SearchOutcome>、.verifyCredentials(): Promise<void>。
  • new YoutubeClient(credentials: YoutubeCredentials) -- 公式 YouTube Data API v3 をラップします。.search(options: YoutubeSearchOptions): Promise<SearchOutcome>、.verifyCredentials(): Promise<void>(クエリは不要で、クォータを 1 ユニット消費する呼び出しです)。
const credentials = getRedditCredentials();
if (!credentials) throw new Error("run `auditreach auth --platform reddit` first");

const client = new RedditClient(credentials);
const outcome = await client.search({
  query: "agent memory poisoning",
  subreddit: "MachineLearning",
});

認証情報(setCredential / getCredential / deleteCredential / getRedditCredentials / getYoutubeCredentials)-- 認証情報の入出力はすべてこのモジュールを経由します。生のシークレットに触れることが許可されているのはここだけです。値はクライアントのコンストラクターに直接渡す場合にのみ返され、ログへの記録や出力は行われません。

監査ログ

  • appendAuditLogEntry(entryWithoutHash: UnhashedAuditLogEntry, logPath?: string): Promise<AuditLogEntry> -- ログへの唯一の書き込み経路です。エントリーがその場で編集または削除されることはありません。
  • getLastEntryHash(logPath?: string): Promise<string | null>
  • computeEntryHash(entry: UnhashedAuditLogEntry): string
  • verifyAuditLogChain(logPath?: string): Promise<ChainVerificationResult> -- すべてのエントリーのハッシュを再計算し、チェーン全体を最初から最後まで検証します。
  • DEFAULT_AUDIT_LOG_PATH -- "./auditreach.log.jsonl"
const result = await verifyAuditLogChain();
if (!result.valid) {
  console.error(`Chain broken at entry ${result.brokenAtIndex}: ${result.reason}`);
}

暗号ユーティリティ

  • canonicalJson(value: unknown): string -- オブジェクトのキーを再帰的にソートします。同じ論理エントリーが常に同じバイト列にシリアライズされるため、ハッシュチェーンを決定論的に検証できます。
  • sha256Hex(input: string): string
  • credentialFingerprint(secret: string): string -- scrypt で導出したハッシュの末尾 6 桁の 16 進数のみを保持します(監査ログには scrypt:<6 hex> として出力)。ローカルの監査ログでローテーションされたキーを区別するには十分ですが、認証情報の一部が漏れることはありません。

コマンドのコア処理と MCP

  • executeSearch(args)、checkAuthStatus(platform)、executeVerifyLog(path?) -- search / auth --verify / verify-log CLI コマンドと MCP ツールの両方が呼び出す、同じプログラム用コア処理です。いずれもコンソールや標準出力には書き込まないため、MCP トランスポートと標準出力を共有するホストを含め、どのホストからでも安全に呼び出せます。
  • SearchCommandError -- executeSearch が、想定されるユーザー側で対処可能な失敗に対してスローするエラークラスです。対象プラットフォームの BYOK 認証情報がまだ保存されていない場合、または --query を指定せずに Reddit 検索を呼び出した場合に発生します。これを個別にキャッチすることで、「呼び出し方が誤っている」ケースと、実際のネットワーク/API 障害を区別できます。
  • buildMcpServer({ version }): McpServer -- @modelcontextprotocol/sdk から MCP サーバーを構築し、search / auth_status / verify_log ツールを登録します。トランスポートは開始しません。テストや、より大きな MCP サーバーへの埋め込みに便利です。
  • runMcpServerCommand({ version }) -- auditreach mcp が実行する処理です。サーバーを構築し、stdio 経由で接続します。サーバーの実行中に戻ることはありません。

現時点では生成された API ドキュメントサイトはありません(TypeDoc のビルドは CI に組み込まれていません)。上記のエクスポートが公開 API のすべてです。正確な型については、公開済みパッケージの dist/index.d.ts を確認してください。

Python パッケージ(PyPI 上の auditreach-cli)も、同じ API を snake_case 名で公開しています。例:from auditreach import RedditClient, YoutubeClient, get_reddit_credentials, verify_audit_log_chain, ...。Python API の完全なリファレンスについては、python/README.md を参照してください。

プラットフォームの対応状況

プラットフォーム使用 APIステータス既知の制約
RedditReddit API(OAuth2 パスワードグラント、直接 REST)リリース済みレート制限は、実際の調査で必要となる件数であれば概ね対応可能です
YouTubeYouTube Data API v3(googleapis)リリース済みクォータ制(デフォルトで 1 日あたり 10,000 単位)ですが、概ね対応可能です
X(Twitter)X API v2未リリース2023 年の料金改定以降、公式 API の料金と投稿数の上限は、意味のある調査を行う小規模チームには法外だと広く報告されています。この制約を乗り越えるための費用を負担してでも利用したいユーザーが現れるまで、対応を保留しています。中途半端な状態でリリースすれば、このツールの根幹である「公式 API でできることとできないことについて、誠実に伝える」という前提を損なうためです。

結果の上限

--max-results <n> は、単一の search 呼び出しで返す項目数を指定します。このオプションを省略すると、auditreach はデフォルトで 25 件を黙って適用します。これは、PRAW の get_comments() が長年そうだったことと同じ種類の意外な動作です(praw#119)。このフラグを指定する必要があると知らない呼び出し元は、結果セットがひそかに切り詰められます。

メモ

検索結果が適用された上限(デフォルトでは 25 件、または指定した --max-results の値)とちょうど同じ件数の場合、結果セットの全件が返されていない可能性があります。この場合、auditreach は stderr に警告を出力しますが、stdout/--json 出力のみを解析するスクリプトでは確認できません。完全性が重要な場合は、警告を確認するか、--max-results を明示的に指定してください。

プラットフォームデフォルト(フラグ省略時)最大(--max-results)
Reddit25100
YouTube2550

上限を超える値は、黙って上限値に切り詰められます。Reddit では、--before/--after を使って、Reddit 自身のレスポンスが返す実際のカーソルで検索結果をページ分割できます。Reddit 独自の約 1,000 件という検索上限まで対応します(カーソルによるページネーションだけではそれ以上進めない理由については、導入事例を参照してください)。YouTube には、現時点で同等の機能はありません。返された項目数が、黙って適用されたデフォルト値であれ明示的な --max-results の値であれ、実際に適用された上限と一致する場合は必ず、結果がさらに存在する可能性と --max-results の値を引き上げる方法(プラットフォームの上限まで)を示す警告が auditreach から stderr に出力されます。

「同意の根拠」とは、正確には何ですか

各監査ログエントリーの consent_basis フィールドには、そのクエリで使用した特定のプラットフォーム API 利用規約と認証メカニズムが記載されています。これは、リクエストが、お客様が提供した認証情報を使用して、プラットフォームの公式かつ文書化された API を通じて行われたことを証明します。お客様の特定のユースケースが、ご利用の法域や契約において法的に十分であることを証明するものではありません。実際に何が行われたかを正確かつ完全に記録し、改ざんを検知できる記録に基づいて判断するのは、お客様ご自身です。

デフォルトでセルフホスト/ローカルのみ

auditreach の利用に、ホストされたアカウントやサーバーは必要ありません。すべてのコマンドはお使いのマシン上で完全に実行され、監査ログはお客様が所有する単なるファイルです。以下は、上記のインストールと同じ手順です。

git clone https://github.com/RudrenduPaul/auditreach.git
cd auditreach
npm install
npm run build
node dist/cli.js search --platform reddit --query "..."

開発

TypeScript(このパッケージ):

npm install
npm run lint          # ESLint
npm run format        # Prettier check
npm run typecheck     # tsc --noEmit --strict
npm run test:coverage # vitest, 91 tests, 95.1% statement coverage

Python(python/):

cd python
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest                # 95 tests

新しいプラットフォームクライアントを追加する際のルールについては、CONTRIBUTING.md をご覧ください。要点は、公式 API のみを使用すること、レート制限を正直に開示すること、ネットワーク境界をモックするテストを用意すること、そして src/auth/credential-store.ts(Python 側では python/src/auditreach/auth/credential_store.py)以外で、生の認証情報を読み書きする処理を一切行わないことです。

セキュリティ

脆弱性の開示ポリシーについては、SECURITY.md をご覧ください。ローンチ前に OWASP/STRIDE レビューを実施した結果、auditreach 自体のコードに CRITICAL/HIGH に該当する問題は見つかりませんでした。ip-address と hono は、公式の @modelcontextprotocol/sdk 依存関係に含まれる HTTP トランスポートコードを通じて、どちらも間接的に取り込まれています。auditreach の mcp コマンドではこの経路は実行されず、SDK の標準入出力トランスポートである StdioServerTransport のみを起動します。これらのパッケージには以前アドバイザリがありましたが、現在は package.json の overrides フィールドで修正済みバージョンに固定しています。この記事の執筆時点では、新規インストール環境で npm audit --audit-level=high を実行すると、脆弱性は 0 件と報告されます。このリポジトリでは、GitHub のシークレットスキャンとプッシュ保護が有効になっています。

成功事例

praw-dev/praw に報告された実際の問題4件です。PRAWはReddit公式のPython APIラッパーであり、このプロジェクトにとって最も参考になる先行事例です。auditreachのソースコードを調査して原因を特定し、外部ユーザーが1人もいない段階で、このツールに実在していた不足を解消しました。以下の各項目は、そのきっかけとなった実際の報告に対応しています。

  • praw#614 (@mananwason) — Redditの検索結果が約1,000件に制限される問題を越えてページを進める方法について質問がありました。実際の修正はそれより限定的です。issueのスレッドで直接確認されたとおり、その上限を超えると、ページングにカーソルを使っているかどうかにかかわらず、RedditのAPIは前後のカーソルを一切返しません。現在のsearch()が行うのは、Redditのレスポンスから実際のカーソル(SearchOutcome.nextCursor)を抽出し、--before/--afterフラグを公開することです。これにより、最初のページしか見られない状態ではなく、1回の検索で取得できる上限内の結果をページングできます。1,000件の上限そのものを超えるには、cloudsearchによるタイムスタンプ範囲を区切った再検索が必要ですが、まだ実装されていません。
  • praw#1939 (@Auditormadness9) — サブレディット名に先頭のr/が付いたままだったことが原因で、原因不明の400エラーが発生しました。原因として考えられる場合、検索エラーでその原因を具体的に示すようになりました。以前はCLIがステータスコードだけを返し、原因の推測はユーザーに委ねられていました。
  • praw#984 (@MaxMatti) — PRAWの分かりにくいgetMe()再帰回避策を使わずに、Redditボットの認証情報がまだ有効かどうかを簡単に確認する方法について質問がありました。現在はauditreach auth --platform reddit --verifyで、まさにそれができます。軽量な確認を1回行うだけで、検索は不要で、ディスクへの書き込みもありません。
  • praw#119 (@nsp) — PRAWには、無関係な基底クラスのdocstringを読まなければ分からない、歴史的なデフォルト25件という仕様がありました。PRAWのメンテナー自身も「これを明確にする最善の方法が分からなかった」と認めています。現在は--helpとこのREADMEで、実際のデフォルト件数とプラットフォームごとの上限を明記しており、検索結果が実際に切り詰められた場合には実行時警告が表示されます。

よくある質問

auditreachとは何ですか? Reddit/YouTubeの他のリサーチツールとの違いは何ですか? auditreachはBYOK方式のCLI(およびMCP サーバー)で、RedditとYouTubeの公式かつ文書化されたAPIのみを通じてアクセスします。APIキーはユーザー自身のものを使用し、クエリごとに、プラットフォーム、エンドポイント、対象範囲、その呼び出しに適用される具体的な同意/ToS上の根拠を含むハッシュチェーン型の監査ログエントリーを記録します。差別化要因は、あえて行わないことです。Cookieのインポート、共有セッションを使ったスクレイピング、ログイン中の人間のふりをするコード経路は一切ありません。詳しい理由はWhy auditreach existsを、名前を挙げた代替手段との比較表はHow it comparesをご覧ください。

auditreachはどのプラットフォームとバージョンで動作しますか? npmパッケージ(auditreach-cli)にはNode.js 20以降が必要です(package.jsonのenginesフィールドを参照)。PyPIパッケージ(同じくauditreach-cli)にはPython 3.10以降が必要です(python/pyproject.tomlのrequires-pythonを参照)。また、このパッケージにはOperating System :: OS Independent分類子が設定されています。認証情報は設定ファイルではなく、@napi-rs/keyring(npm)またはkeyring(PyPI)を通じてOSのキーチェーンに保存されるため、NodeまたはPythonがインストールされていれば、プラットフォーム固有の設定は不要です。

auditreachはRedditやYouTubeの認証情報をどこかに保存しますか? いいえ。認証情報は@napi-rs/keyring(src/auth/credential-store.ts)を通じて、OSのキーチェーンに直接保存されます。設定ファイルも環境変数もなく、生の認証情報をディスクに書き込むコード経路もありません。 検索ではデフォルトで何件の結果が返されますか? また、さらに多く取得できますか? --max-results を指定しない場合、デフォルトで25件が通知なく返されます。詳しくは結果数の上限を参照してください。上限はRedditで100件、YouTubeで50件です。検索が実際に適用された上限に達すると、それが通知のないデフォルト値でも明示的に指定した値でも、stderr に警告が出ます。

実際に検索を実行せずに、認証情報がまだ有効か確認するにはどうすればよいですか? node dist/cli.js auth --platform reddit --verify(または --platform youtube)を実行します。最小限の認証チェックを行い、成功または失敗を報告します。--query は不要で、結果ファイルも書き込まれず、監査ログにもエントリーは追加されません。

監査ログは実際に改ざんを検知できるのですか? それとも単なるログファイルですか? 改ざんを検知できます。各エントリーのハッシュはその内容から計算され、次のエントリーがそのハッシュを参照するため、verify-log で手動編集によって破損した正確なエントリーを特定できます。機能のデモを参照してください。

auditreach の現在の制限事項は何ですか? 事前に知っておくべき点が2つあります。1つ目は、X(Twitter)には対応していないことです。2023年の変更以降、X API v2 の料金と投稿件数の上限は、実際の調査を行う小規模チームにとって高すぎるものになっています。詳しくはプラットフォームの対応状況を参照してください。2つ目は、Reddit のページングです。search() はRedditのレスポンスから実際の after/before カーソルを読み取り、1回の検索結果をページングするための --before/--after フラグを公開しますが、これではReddit独自の検索上限である約1,000件を超えることはできません。この修正で対応できることとできないことについては、praw#614 の成功事例を参照してください。

MCP サーバーモードはどのように動作しますか? auditreach mcp(npm)または pipx run auditreach-cli mcp(PyPI)を実行すると、公式の @modelcontextprotocol/sdk/mcp SDK を基盤とするModel Context Protocolサーバーが stdio 経由で起動します。公開するツールは3つだけです。search、auth_status(読み取り専用で、認証情報の設定や消去はできません)、verify_log です。それぞれがCLIコマンドと同じプログラム用コアを薄くラップしているため、エージェント向けに再実装されたものはありません。ツールの一覧については上記のauditreach mcpを、エージェントレジストリが直接読み取れる機械可読マニフェストについては.well-known/agent.jsonを参照してください。

auditreach は Agent-Reach と具体的にどう違いますか? Agent-Reach は、ログイン済みブラウザーセッションをインポートし、そのユーザーとしてスクレイピングすることで、より多くのプラットフォーム(auditreach の2つに対して6つ)に対応し、API費用もかかりません。auditreach は自身のキーを使って公式の文書化されたAPIのみを呼び出し、クエリごとにハッシュチェーンでつながれた同意/監査エントリーを記録します。セッションをインポートするコードパスはありません。どちらの方法が優れているというわけではなく、対象とする利用者が異なります。詳しい比較については比較を参照してください。

auditreach は商用利用でも無料ですか? また、ライセンスで実際に何が求められますか? はい。auditreach は Apache 2.0(LICENSEを参照)で、クローズドソース製品の一部としての利用も含め、商用利用、変更、再配布が認められています。条件は、再配布するものにライセンスのコピーを含めること、変更したファイルにその旨を記載すること、既存の著作権表示と帰属表示を保持することです。auditreach の名称や商標の使用権は付与されません。

コントリビューション

新しいプラットフォームクライアントを追加する際のルールについては、CONTRIBUTING.mdを参照してください。要点は、公式APIのみを使用すること、レート制限を正直に開示すること、ネットワーク境界をモックするテストを用意すること、src/auth/credential-store.tsの外部で生の認証情報を読み書きするコードパスを決して作らないことです。

ライセンス

Apache 2.0です。LICENSEを参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。