🚀 Massive Context MCP
Massive Context MCPは、chunking、sub - queries、Ollamaを介した無料のローカル推論により、大量のコンテキスト(1000万トークン以上)を扱うことができます。
flowchart TD
A[Claude Code] --> B[RLM MCP Server]
B --> C{rlm_ollama_status}
C -->|cached 60s| D{provider = auto}
D -->|Ollama running| E[🦙 Ollama<br/>gemma3:12b]
D -->|Ollama unavailable| F[☁️ Claude SDK<br/>claude - haiku - 4 - 5]
E --> G[["💰 $0<br/>Free local inference"]]
F --> H[["💰 ~$0.80/1M<br/>Cloud inference"]]
style A fill:#ff922b,color:#fff
style B fill:#339af0,color:#fff
style E fill:#51cf66,color:#fff
style F fill:#748ffc,color:#fff
style G fill:#51cf66,color:#fff
style H fill:#748ffc,color:#fff
このプロジェクトは、Recursive Language Model patternに基づいており、richardwhiteii/rlmからインスピレーションを得ています。
📸 スクリーンショット
🚀 クイックスタート
インストール
オプション1: PyPI(推奨)
uvx massive-context-mcp
pip install massive-context-mcp
オプション付きでのインストール:
pip install massive-context-mcp[firewall]
pip install massive-context-mcp[claude]
pip install massive-context-mcp[firewall,claude]
オプション2: Claude Desktopのワンクリックインストール
Releasesから.mcpbファイルをダウンロードし、ダブルクリックしてインストールします。
オプション3: ソースからのインストール
git clone https://github.com/egoughnour/massive-context-mcp.git
cd massive-context-mcp
uv sync
Claude Code / Claude Desktopへの接続
~/.claude/.mcp.json(Claude Code)またはclaude_desktop_config.json(Claude Desktop)に以下を追加します。
{
"mcpServers": {
"massive-context": {
"command": "uvx",
"args": ["massive-context-mcp"],
"env": {
"RLM_DATA_DIR": "~/.rlm-data",
"OLLAMA_URL": "http://localhost:11434"
}
}
}
}
✨ 主な機能
セットアップとステータスツール
| ツール |
目的 |
rlm_system_check |
システム要件のチェック — macOS、Apple Silicon、16GB以上のRAM、Homebrewの確認 |
rlm_setup_ollama |
Homebrewを介したインストール — 管理されたサービス、自動更新、Homebrewが必要 |
rlm_setup_ollama_direct |
直接ダウンロードによるインストール — sudo不要、完全にヘッドレス、ロックダウンされたマシンでも動作 |
rlm_ollama_status |
Ollamaの利用可能性のチェック — 無料のローカル推論が利用可能かどうかを検出 |
分析ツール
| ツール |
目的 |
rlm_auto_analyze |
ワンステップ分析 — タイプ、チャンク、クエリを自動検出 |
rlm_load_context |
コンテキストを外部変数としてロード |
rlm_inspect_context |
プロンプトにロードせずに構造情報を取得 |
rlm_chunk_context |
行、文字、段落でチャンク化 |
rlm_get_chunk |
特定のチャンクを取得 |
rlm_filter_context |
正規表現でフィルタリング(一致する行を保持/削除) |
rlm_exec |
ロードされたコンテキストに対してPythonコードを実行(サンドボックス化) |
rlm_sub_query |
チャンクに対してサブLLM呼び出しを行う |
rlm_sub_query_batch |
複数のチャンクを並列処理 |
rlm_store_result |
サブ呼び出しの結果を保存して集約する |
rlm_get_results |
保存された結果を取得 |
rlm_list_contexts |
すべてのロードされたコンテキストをリストする |
rlm_auto_analyzeによるクイック分析
ほとんどのユースケースでは、rlm_auto_analyzeを使用するだけで、すべてを自動的に処理します。
rlm_auto_analyze(
name="my_file",
content=file_content,
goal="find_bugs"
)
自動的に行われること:
- コンテンツのタイプ(Python、JSON、Markdown、ログ、散文、コード)を検出
- 最適なチャンク化戦略を選択
- コンテンツのタイプに合わせてクエリを調整
- 並列サブクエリを実行
- 集約された結果を返す
サポートされる目標:
| 目標 |
説明 |
summarize |
コンテンツの目的と要点を要約 |
find_bugs |
エラー、問題、潜在的な問題を特定 |
extract_structure |
関数、クラス、スキーマ、見出しをリストする |
security_audit |
脆弱性とセキュリティ問題を見つける |
answer:<question> |
コンテンツに関するカスタム質問に答える |
rlm_execによるプログラム的分析
決定論的なパターンマッチングとデータ抽出には、rlm_execを使用して、ロードされたコンテキストに対して直接Pythonコードを実行します。これは、論文のREPLアプローチに近く、分析ロジックを完全に制御できます。
ツール: rlm_exec
目的: サンドボックス化されたサブプロセスで、ロードされたコンテキストに対して任意のPythonコードを実行します。
パラメータ:
code(必須): 実行するPythonコード。出力をキャプチャするにはresult変数を設定します。
context_name(必須): 以前にロードされたコンテキストの名前。
timeout(オプション、デフォルト30): 最大実行時間(秒)。
機能:
- コンテキストは読み取り専用の
context変数として利用可能
- 事前にインポートされたモジュール:
re, json, collections
- サブプロセスの分離(サーバーをクラッシュさせない)
- タイムアウトの強制
- Pythonがインストールされた任意のシステムで動作(Docker不要)
例 — ロードされたコンテキスト内のパターンを見つける:
rlm_exec(
code="""
import re
amounts = re.findall(r'\$[\d,]+', context)
result = {'count': len(amounts), 'sample': amounts[:5]}
""",
context_name="bill"
)
例の応答:
{
"result": {
"count": 1247,
"sample": ["$500", "$1,000", "$250,000", "$100,000", "$50"]
},
"stdout": "",
"stderr": "",
"return_code": 0,
"timed_out": false
}
例 — 構造化データの抽出:
rlm_exec(
code="""
import re
import json
# すべてのメールアドレスを見つける
emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', context)
# ドメインごとにカウント
from collections import Counter
domains = [e.split('@')[1] for e in emails]
domain_counts = Counter(domains)
result = {
'total_emails': len(emails),
'unique_domains': len(domain_counts),
'top_domains': domain_counts.most_common(5)
}
""",
context_name="dataset",
timeout=60
)
rlm_execとrlm_sub_queryの使い分け:
| 使用ケース |
ツール |
理由 |
| すべての日付、ID、金額を抽出 |
rlm_exec |
正規表現は決定論的で高速 |
| セキュリティの脆弱性を見つける |
rlm_sub_query |
推論とコンテキストが必要 |
| JSON/XML構造を解析する |
rlm_exec |
標準ライブラリが完璧に機能 |
| テーマやトーンを要約する |
rlm_sub_query |
自然言語理解が必要 |
| 単語の頻度をカウントする |
rlm_exec |
単純な計算、AI不要 |
| "なぜXが起こったのか?"という質問に答える |
rlm_sub_query |
推論と推論が必要 |
ヒント: 大きなコンテキストの場合、両方を組み合わせることができます — rlm_execでフィルタリング/抽出を行い、その後、フィルタリングされた結果のセマンティック分析にrlm_sub_queryを使用します。
コードファイアウォールの統合(オプション)
セキュリティを強化するために、[code - firewall - mcp](https://github.com/egoughnour/code - firewall - mcp)を統合して、実行前に危険なコードパターンをフィルタリングします。
pip install massive-context-mcp[firewall]
インストールすると、rlm_execは既知の危険なパターン(例: os.system()、eval()、subprocessでshell=True)のブラックリストに対してコードを自動的にチェックできます。ファイアウォールは構造的な類似性マッチングを使用しており、コードをその骨格に正規化し、埋め込みを介してブラックリストされたパターンと比較します。
動作原理:
- コードが構文ツリーに解析され、正規化されます(識別子 →
_、文字列 → "S")
- 正規化された構造がOllamaを介して埋め込まれます
- ChromaDB内のブラックリストされたパターンとの類似性がチェックされます
- 類似性が閾値(デフォルト: 0.85)を超えると、コードはブロックされます
設定(環境変数):
RLM_FIREWALL_ENABLED=true — ファイアウォールチェックを有効にする(パッケージがインストールされると自動的に有効になります)
RLM_FIREWALL_MODE=warn|block — マッチ時に警告またはブロックする(デフォルト: warn)
ブロックされるパターンの例:
os.system(user_input) — コマンドインジェクション
eval(untrusted_data) — コードインジェクション
subprocess.Popen(..., shell=True) — シェルインジェクション
rlm_firewall_statusを使用して、ファイアウォールの利用可能性と設定を確認します。
プロバイダと自動検出
RLMは自動的に最適な利用可能なプロバイダを検出して使用します。
| プロバイダ |
デフォルトモデル |
コスト |
使用ケース |
auto |
(利用可能な最適なもの) |
$0または~$0.80/100万トークン |
デフォルト — Ollamaが利用可能な場合はOllamaを優先 |
ollama |
gemma3:12b |
$0 |
ローカル推論、Ollamaが必要 |
claude-sdk |
claude - haiku - 4 - 5 |
~$0.80/100万入力トークン |
クラウド推論、常に利用可能 |
自動検出の動作原理
provider="auto"(デフォルト)を使用すると、RLMは以下のことを行います。
OLLAMA_URL(デフォルト: http://localhost:11434)でOllamaが実行中かどうかをチェックします
- gemma3:12b(またはgemma3のバリアント)が利用可能かどうかをチェックします
- Ollamaが利用可能な場合はOllamaを使用し、そうでない場合はClaude SDKにフォールバックします
ステータスは60秒間キャッシュされ、繰り返しのネットワークチェックを避けます。
Ollamaのステータスを確認する
rlm_ollama_statusを使用して、利用可能なものを確認します。
rlm_ollama_status()
Ollamaが準備できているときの応答:
{
"running": true,
"models": ["gemma3:12b", "llama3:8b"],
"default_model_available": true,
"best_provider": "ollama",
"recommendation": "Ollama is ready! Sub - queries will use free local inference by default."
}
Ollamaが利用できないときの応答:
{
"running": false,
"error": "connection_refused",
"best_provider": "claude-sdk",
"recommendation": "Ollama not available. Sub - queries will use Claude API. To enable free local inference, install Ollama and run: ollama serve"
}
透過的なプロバイダ選択
すべてのサブクエリ応答には、実際に使用されたプロバイダが含まれています。
{
"provider": "ollama",
"model": "gemma3:12b",
"requested_provider": "auto",
"response": "..."
}
自動使用
Claudeが手動で呼び出すことなく自動的にRLMツールを使用できるようにします。
1. CLAUDE.mdの統合
CLAUDE.md.exampleの内容をプロジェクトのCLAUDE.md(またはグローバルの場合は~/.claude/CLAUDE.md)にコピーして、ClaudeにRLMツールを自動的に使用するタイミングを教えます。
2. フックのインストール
.claude/hooks/ディレクトリをプロジェクトにコピーして、10KBを超えるファイルを読み取るときにRLMを自動的に提案します。
cp -r .claude/hooks/ /Users/your_username/your - project/.claude/hooks/
フックはガイダンスを提供しますが、読み取りをブロックすることはありません。
3. スキルリファレンス
.claude/skills/ディレクトリをコピーして、包括的なRLMガイダンスを取得します。
cp -r .claude/skills/ /Users/your_username/your - project/.claude/skills/
これらを設定すると、Claudeは大きなファイルを直接コンテキストに読み込む代わりに、RLMを自動的に検出して使用します。
Ollamaのセットアップ(無料のローカル推論)
RLMは、Apple Siliconを搭載したmacOSでOllamaを自動的にインストールして構成できます。2つのインストール方法があり、それぞれに異なるトレードオフがあります。
インストール方法の選択
| 側面 |
rlm_setup_ollama(Homebrew) |
rlm_setup_ollama_direct(直接ダウンロード) |
| sudoが必要 |
Homebrewがインストールされていない場合のみ |
❌ 決して必要なし |
| Homebrewが必要 |
✅ はい |
❌ いいえ |
| 自動更新 |
✅ はい (brew upgrade) |
❌ 手動 |
| サービス管理 |
✅ brew services (launchd) |
⚠️ ollama serve (フォアグラウンド) |
| インストール場所 |
/opt/homebrew/ |
~/Applications/ |
| ロックダウンされたマシン |
⚠️ 失敗する可能性がある |
✅ 動作する |
| 完全にヘッドレス |
⚠️ sudoを求められる可能性がある |
✅ はい |
推奨事項:
- Homebrewがあり、管理された更新を望む場合はHomebrew方法を使用してください
- 自動化、ロックダウンされたマシン、または管理者アクセスがない場合は直接ダウンロードを使用してください
方法1: Homebrewによるインストール(Homebrewがある場合は推奨)
rlm_system_check()
rlm_setup_ollama(install=True, start_service=True, pull_model=True)
これが行うこと:
- Homebrewを介してOllamaをインストールします (
brew install ollama)
- Ollamaを管理されたバックグラウンドサービスとして起動します (
brew services start ollama)
- gemma3:12bモデルをダウンロードします(約8GB)
要件:
- Apple Silicon(M1/M2/M3/M4)を搭載したmacOS
- 16GB以上のRAM(gemma3:12bを実行するには約8GB必要)
- Homebrewがインストールされている
方法2: 直接ダウンロード(完全にヘッドレス、sudo不要)
rlm_system_check()
rlm_setup_ollama_direct(install=True, start_service=True, pull_model=True)
これが行うこと:
- https://ollama.com/download/Ollama - darwin.zip からOllamaをダウンロード
~/Applications/Ollama.appに抽出(ユーザーディレクトリ、管理者アクセス不要)
ollama serveを介してOllamaを起動(バックグラウンドプロセス)
- gemma3:12bモデルをダウンロード
要件:
- Apple Silicon(M1/M2/M3/M4)を搭載したmacOS
- 16GB以上のRAM
- 特別な権限は必要ありません!
PATHに関する注意: 直接インストールした後、CLIは以下の場所にあります。
~/Applications/Ollama.app/Contents/Resources/ollama
必要に応じてシェル設定に追加してください。
export PATH="$HOME/Applications/Ollama.app/Contents/Resources:$PATH"
少ないRAMのシステムの場合
どちらのインストール方法でも、より小さなモデルを使用できます。
rlm_setup_ollama(install=True, start_service=True, pull_model=True, model="gemma3:4b")
rlm_setup_ollama_direct(install=True, start_service=True, pull_model=True, model="gemma3:4b")
手動セットアップ
手動でのインストールを好む場合、または異なるプラットフォームを使用している場合は、以下の手順を実行します。
-
Ollamaをインストール https://ollama.ai から、またはHomebrewを介して:
brew install ollama
-
サービスを起動:
brew services start ollama
-
モデルをダウンロード:
ollama pull gemma3:12b
-
動作を確認:
rlm_ollama_status()
プロバイダの選択
RLMはOllamaが利用可能な場合は自動的に使用します。特定のプロバイダを強制的に使用することもできます。
rlm_sub_query(query="Summarize", context_name="doc")
rlm_sub_query(query="Summarize", context_name="doc", provider="ollama")
rlm_sub_query(query="Summarize", context_name="doc", provider="claude-sdk")
💻 使用例
基本パターン
# 0. (オプション)macOSでの初回セットアップ - 1つの方法を選択:
# オプションA: Homebrew(ある場合)
rlm_system_check()
rlm_setup_ollama(install=True, start_service=True, pull_model=True)
# オプションB: 直接ダウンロード(sudo不要、完全にヘッドレス)
rlm_system_check()
rlm_setup_ollama_direct(install=True, start_service=True, pull_model=True)
# 0b. (オプション)Ollamaが無料推論で利用可能か確認
rlm_ollama_status()
# 1. 大きなドキュメントをロード
rlm_load_context(name="report", content=<large document>)
# 2. 構造を検査
rlm_inspect_context(name="report", preview_chars=500)
# 3. 管理可能な部分にチャンク化
rlm_chunk_context(name="report", strategy="paragraphs", size=1)
# 4. チャンクに対して並列でサブクエリを実行(Ollamaが利用可能な場合は自動的に使用)
rlm_sub_query_batch(
query="What is the main topic? Reply in one sentence.",
context_name="report",
chunk_indices=[0, 1, 2, 3],
concurrency=4
)
# 5. 結果を保存して集約
rlm_store_result(name="topics", result=<response>)
# 6. すべての結果を取得
rlm_get_results(name="topics")
2MBのドキュメントの処理
H.R.1 Bill(2MB)でテストされています。
# ロード
rlm_load_context(name="bill", content=<2MB XML>)
# 40個の部分にチャンク化(各50K文字)
rlm_chunk_context(name="bill", strategy="chars", size=50000)
# 8つのチャンクをサンプリング(20%)して並列クエリを実行
# (Ollamaが実行中の場合は自動的に使用、そうでない場合はClaude SDK)
rlm_sub_query_batch(
query="What topics does this section cover?",
context_name="bill",
chunk_indices=[0, 5, 10, 15, 20, 25, 30, 35],
concurrency=4
)
結果: Ollamaを使用すると$0、Claudeを使用すると約$0.02のコストで包括的なトピック抽出が可能です。
「戦争と平和」(3.3MB)の分析
Project Gutenbergからのトルストイの叙事詩小説の文学的分析。
curl -o war_and_peace.txt https://www.gutenberg.org/files/2600/2600-0.txt
rlm_load_context(name="war_and_peace", content=open("war_and_peace.txt").read())
rlm_chunk_context(name="war_and_peace", strategy="lines", size=1000)
sample_indices = [0, 7, 14, 21, 28, 35, 42, 49, 56, 63]
rlm_sub_query_batch(
query="List major characters in this section with brief descriptions.",
context_name="war_and_peace",
chunk_indices=sample_indices,
provider="claude-sdk",
concurrency=8
)
結果: 小説全体の完全なキャラクターアーク — ピエールの理想主義者から囚人、そして夫への旅、ナターシャの成長、ニコライ・ロストーヴの兵士から地主への旅 — すべて約$0.03で可能です。
| 指標 |
値 |
| ファイルサイズ |
3.35 MB |
| 行数 |
66,033 |
| チャンク数 |
67 |
| サンプリング数 |
10 (15%) |
| コスト |
~$0.03 |
📚 詳細ドキュメント
データストレージ
graph TD
A[("$RLM_DATA_DIR")] --> B["📁 contexts/"]
A --> C["📁 chunks/"]
A --> D["📁 results/"]
B --> B1[".txt files"]
B --> B2[".meta.json"]
C --> C1["by context name"]
D --> D1[".jsonl files"]
style A fill:#339af0,color:#fff
style B fill:#51cf66,color:#fff
style C fill:#51cf66,color:#fff
style D fill:#51cf66,color:#fff
コンテキストはセッションをまたいで保持されます。チャンク化されたコンテキストは再利用のためにキャッシュされます。
学習用プロンプト
Claude Codeでこれらのプロンプトを使用して、コードベースを探索し、RLMパターンを学習します。コードが唯一の真実の源です。
ツールの理解
src/rlm_mcp_server.pyを読み、すべてのRLMツールとそのパラメータと目的をリストします。
rlm_chunk_contextで利用可能なチャンク化戦略を説明します。
それぞれをいつ使用するのですか?
rlm_sub_queryとrlm_sub_query_batchの違いは何ですか?
実装を見せてください。
アーキテクチャの理解
src/rlm_mcp_server.pyを読み、コンテキストがどのように保存され、永続化されるかを説明します。
データはどこにありますか?
claude-sdkプロバイダは応答からテキストをどのように抽出しますか?
_call_claude_sdkを解説してください。
rlm_load_contextを呼び出したときに何が起こりますか? 完全なフローを追跡してください。
実践的な学習
READMEをコンテキストとしてロードし、段落でチャンク化し、最初のチャンクに対してサブクエリを実行して要約します。
rlm_sub_query_batchを使用して大きなファイルを並列処理する方法を教えてください。
実際の例を使用してください。
1MBのログファイルがあります。RLMパターンを使ってすべてのエラーを抽出する手順を教えてください。
RLMの拡張
テストファイルを読み、カバーされているシナリオを説明します。
気をつけるべきエッジケースは何ですか?
新しいチャンク化戦略(例: 正規表現区切り文字による)を追加するにはどうすればいいですか?
コードを変更する場所を教えてください。
新しいプロバイダ(例: OpenAI)を追加するにはどうすればいいですか?
どの関数を変更する必要がありますか?
📄 ライセンス
MIT