Repiscope について
Repiscopeは、コーディングエージェントに隣接リポジトリへの構造化された読み取り専用アクセスを提供し、変更を防ぐMCPサーバーです。プロジェクト概要、検索、ファイル読み取り、エージェント作成要約のキャッシュに対応し、機密ファイルや範囲外のパスを遮断します。
主な機能
- 01隣接リポジトリの一覧とプロジェクト概要
- 02リポジトリ内のファイルと行の検索
- 03サイズ制限付きのファイル読み取り
- 04エージェント作成のプロジェクト要約をキャッシュ
- 05リポジトリへの書き込みと機密ファイルを遮断
- 06パストラバーサルとシンボリックリンクの脱出を拒否
活用シーン
- 01別のプロジェクトを作業中に隣接リポジトリを調査
- 02他プロジェクトのAPIルートやコードを検索
- 03書き込み権限なしでプロジェクトの変更と構成を確認
- 04エージェント作成の要約を後続の概要で共有
MCP 対応
MCPクライアントに、プロジェクト一覧、概要、検索、ファイル読み取りなどの読み取り専用リポジトリツールを公開します。`store_summary`の書き込み先はRepiscope自身のキャッシュに限られます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Repiscope
リポジトリのペリスコープ — すべてを見渡し、何にも触れません。
Repiscope は読み取り専用の MCP サーバーです。コーディングエージェント(Claude Code、Cursor、その他の MCP クライアント)に、作業中のリポジトリの隣にある 兄弟リポジトリ の情報を提供します。兄弟リポジトリを変更することは決してありません。
理由
自分の時間をどこに使うか決めるのを手伝うために、個人用のアシスタントを作りました。そのためには、すべてのプロジェクトの実際の状況、つまり、何が変わり、何が停滞し、次のステップが何かを把握する必要があります。そこで、すべてのリポジトリを 見られる ようにしなければなりません。しかし、エージェントに「何にも触らないで」と伝えても、それはお願いであって保証ではありません。Repiscope なら 保証 できます。サーバーは書き込みツールを一切公開しないため、エージェントは構造上、リポジトリを変更できません。また、プロジェクト A で作業するコーディングエージェントが、プロジェクト B の一部の仕組みを把握する必要があるときにも、同じペリスコープが役立ちます。
サンドボックスは状況を改善するどころか、悪化させます。私のサンドボックスは(当然ながら)、エージェントが許可を求めずに、作業を開始したリポジトリの外を 読むことさえ 防ぎます。サンドボックスの範囲を広げれば、書き込みアクセスも許可されてしまいます。Repiscope は第三の選択肢です。エージェントは 1 つの MCP サーバーを通じて、すべての兄弟リポジトリを構造化された読み取り専用の形で確認でき、サンドボックスは厳格なままです。
動作例
project-a で作業していて、別のプロジェクトの API からデータを取得する必要があるとします。自分でそのコードベースを調べる代わりに、エージェントが Repiscope に直接問い合わせます。
You: Use Repiscope to find out what kind of data I can retrieve
from billing-api through its API.
Agent: (calls list_projects → sees "billing-api")
(calls project_overview "billing-api" → spots src/routes/)
(calls search "route" project="billing-api")
(calls read_file "billing-api" "src/routes/invoices.py")
billing-api exposes three endpoints: /invoices (list, filterable
by customer and date), /invoices/{id} (full invoice with line
items), and /customers/{id}/balance (current balance). All
responses are JSON; auth is a bearer token.
エージェントは 書き込み権限がまったくない リポジトリを調査できました。コピー&ペーストも、「何も編集しないで」というお願いも、リスクもありません。
ツール
| ツール | 入力 | 戻り値 |
|---|---|---|
list_projects() | — | すべての兄弟リポジトリと、各リポジトリの 1 行の説明 |
project_overview(project) | リポジトリ名 | 詳細な概要:目的、技術スタック、構成、最近のコミット |
search(query, project?) | テキスト、任意のリポジトリ | クエリに一致するファイルと行 |
read_file(project, path) | リポジトリとファイルパス | ファイルの全内容(サイズ上限あり) |
store_summary(project, summary) | リポジトリとテキスト | エージェントが作成した概要をキャッシュします(後述) |
最新の状態を保つ仕組み
概要は Markdown としてキャッシュされ、必要に応じて更新されます。Repiscope は呼び出しのたびに、リポジトリの現在の Git コミットハッシュを、概要の作成時に記録したハッシュと比較します。ハッシュが同じなら、キャッシュを返します。異なる場合は、そのリポジトリの概要だけを再構築します。cron もデーモンも不要です。
知性を借りる
Repiscope 自体には LLM がありません。API キーもモデル呼び出しも不要で、コストはゼロです。しかし、常に LLM とやり取りするため、その力を借ります。概要に新しいエージェント作成の要約がない場合、概要の最後に、呼び出し元の エージェントに要約を書いて store_summary で返すよう求めるメモが追加されます。その要約は、そのプロジェクトの今後すべての概要の冒頭に表示されます。1 つのエージェントが書き、次々と続くエージェントが読みます。リポジトリに次のコミットが追加されて古くなるまで、このサイクルが繰り返されます。
アーキテクチャによるセキュリティ
Repiscope は、安全な動作が単なる約束ではなく、それ以外の動作ができないように設計されています。
- リポジトリへの書き込みツールはありません。 サーバーは、リポジトリ内のあらゆるものを作成、編集、削除できるツールを公開していません。データを受け取る唯一のツールである
store_summaryが書き込めるのは、Repiscope 独自のキャッシュ(~/.cache/repiscope)だけです。エージェントは、存在しない機能を悪用できません。 - シークレットは見えません。 単一のフィルター(
privacy.py)がすべてのツールで適用されます。秘密鍵、証明書(.pem、.pfx、.p12など)、.env*ファイル、キーストア、認証情報のような名前が付いたものは、概要、ツリー、検索結果、ファイルの読み取りに表示されません。 正直なところ、限界もあります。 このフィルターが隠すのは機密性の高いファイルです。通常のテキストファイル内に貼り付けられたパスワードなどへの言及は除去されません。 - シンボリックリンクで情報を持ち出せません。 クローンしたリポジトリは信頼できないコンテンツであり、
notes.txt → ~/.ssh/id_rsaのようなシンボリックリンクが含まれている可能性があります。実際の場所がプロジェクトの外にあるものは、すべてのツールから見えません。シークレットフィルターはリンクの実際の参照先も確認し、パストラバーサル(../)は拒否されます。 - 境界はユーザーが定めます。 Repiscope が参照するのは、明示的に指定したフォルダー(
--root)だけです。また、--excludeを使うと指定したリポジトリは完全に不可視になり、名前で解決することもできません。 - 痕跡を残しません。 概要のキャッシュは
~/.cache/repiscopeに保存され、リポジトリ内には保存されません。
上記のすべての主張は tests/ のテストスイートで検証されています。リポジトリをクローンし、pytest を実行してご自身で確認できます。
クイックスタート
pip install repiscope
claude mcp add repiscope --scope user -- repiscope --root ~/your/projects/folder
以上です。--root には、リポジトリそのものではなく、リポジトリを含むフォルダーを指定します。必要に応じて、--exclude repo-a --exclude repo-b でリポジトリを非表示にできます。あらゆる MCP クライアントで動作します。Claude Desktop 向けには、ワンクリックで使える .mcpb バンドルも用意されています(mcpb/build.sh でビルドできます)。
ソースから実行する場合:
git clone https://github.com/3xpr1ment/repiscope.git
cd repiscope
python -m venv .venv && .venv/bin/pip install -e .[dev]
.venv/bin/pytest # the security claims, as executable proof
制限事項
正直に説明します。Repiscope が意図的に行わないことは次のとおりです。
- シークレットフィルターはファイル単位で動作します。 機密性の高いファイルは不可視になりますが、通常の
notes.md内に貼り付けられたパスワードは除去されません。境界を決めるのはユーザーです。エージェントに見せてもよいフォルダーだけを--rootに指定してください。ツールから見えるものは、LLM プロバイダーにも見えます。 - 検索は意図的に単純です。 大文字と小文字を区別しない部分文字列検索で、結果数には上限があり、インデックスも正規表現もありません。検索の前後で知性を補うのは呼び出し元の LLM です。大規模なコード検索には、専用のコード検索ツールを使用してください。
- 概要は機械的なものです。 エージェントが作成した要約がなければ、概要は README の抜粋、言語別の統計、Git ログで構成されます。役には立ちますが、深い洞察はありません。エージェントが要約を残すようになって初めて、洞察が得られます。
- 読み取り専用には両面があります。 呼び出せる更新ツールはありません。キャッシュは次のコミット時に遅延更新され、古くなった要約は、エージェントが新しいものを書き込むまで古いことを示した状態で提供されます。
- Python ≥ 3.11 が必要です。macOS で開発・テストしています。Linux でも同様に動作するはずですが、Windows のシンボリックリンクの動作は未テストです。
ステータス
v0.2.2 — 日常的に実際の作業で使用され、正常に動作しています。読み取り専用ツールが 4 つあり、LLM に要約の生成を委ねる機能、遅延キャッシュ更新、機密ファイルのフィルタリングを備えています。さらに、セキュリティ上の主張(パストラバーサル、シンボリックリンクによる範囲外アクセス、シークレットのフィルタリング)を検証するテストスイートもあります(tests/ を参照)。API は今後変更される可能性があります。
開発の経緯
開発者について、誤解のないように説明します。私はエンジニアではありません。Repiscope のアーキテクチャ上の判断、つまり何を行い、何を拒否し、セキュリティ上の制御をどこに置くかは、すべて私が決めています。一方、コーディング自体は Claude(Anthropic の Fable モデル)が行っています。この協業における私のルールは、自分が理解していないものは一切取り入れないことです。コミット履歴には、コミットごとに共同著作者であることが明記されています。
ライセンス
mcp-name: io.github.3xpr1ment/repiscope
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。