Periscope について
Periscopeは、コーディングエージェントから稼働中のNeovimと既存設定へのアクセスを仲介するMCPサーバーです。重複する設定を作らずに、LSP、フォーマッター、リンター、DAPの情報を提供します。
主な機能
- 01Neovimの管理起動と接続モード
- 02LSPの定義、参照、診断
- 03フォーマッターとリンターの検出・実行
- 04DAPモジュールと設定の一覧
- 05エージェントの注目対象と調整ボード
活用シーン
- 01プロジェクトの言語サーバー情報の照会
- 02ファイルを書き換えずに設定済み整形を実行
- 03設定済みリンターと診断の確認
- 04共有対象に対するエージェントの注目を調整
MCP 対応
Periscopeはstdio経由でクライアントとMCP通信し、msgpack-RPCでNeovimと通信します。ツールを通じてエディター設定や言語サービスにアクセスし、設定済みの整形・Lint処理を実行できます。また、プロセス内の注目調整ボードを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Periscope
実際に稼働している Neovim と、実際にお使いの diver 設定を仲介する MCP サーバーです。MCP クライアント(エージェント)は、編集時と同じ言語サーバー、フォーマッターレジストリ、リンターレジストリ、DAP モジュールツリーを参照できます。設定の信頼できる唯一の情報源を共有し、サーバーの重複や設定ファイルの変換は不要です。
Periscope は単一の Rust バイナリです。クライアントとは stdio(NDJSON JSON-RPC)、Neovim とは msgpack-RPC で通信します。
動作方法
- 管理モード(デフォルト):独自の
nvim --headless --listen <tmp socket>を起動し、cwd を ワークスペースに設定します。設定は、お使いの環境とまったく同じように読み込まれます。ブローカーが対話中のエディターに触れることはありません。プロジェクトローカルの設定の実行は拒否されます(--cmd "set noexrc")。 - 接続モード(
--attach <socket>):すでに起動している Neovim(--listen付きで起動したもの)に接続します。ブローカーが、自身で起動していないエディターにシグナルを送ったり、終了させたりすることはありません。
ツールは、nvim_exec_lua を介してエディター内で実行される小さな Lua プログラムです。ネイティブ API(vim.lsp、vim.diagnostic、ランタイムファイル)のみを使用し、lsp/*.lua
ファイルにあるサーバーごとの設定をすべて引き継ぎます。これには、rust-analyzer のネイティブ診断を無効にし、代わりに bacon-ls を使うといった意図的な選択も含まれます。
ツール
読み取り専用のインテリジェンスツール(broker_status、get_*、list_*)に加えて、設定独自のパイプラインをエディター内で実行する実行ツール(run_format、run_lint)が 2 つあります。フォーマットはブローカー経由のエディターバッファに適用され、テキストとして返されます。ディスク上のファイルは書き込まれません(written は常に false です。ディスクへの書き込みツールは、明示的な有効化フラグのもとで後続フェーズに追加される予定です)。リンティングは読み取りのみです。4 つの attention_* ツールは、サーバープロセス内に保持される共同注意の調整ボード(phlow-attention からベンダー提供された MATE プロトコル)を利用します。エージェントは順序付きのフォーカスを公開し、互いのフォーカスを読み取り、整合性スコアや調整の判断を求められます。このボードがエディターやファイルシステムに触れることはありません。また、公開操作は initialize 時にクライアントが提示した ID に紐づけられます。
| ツール | 返される内容 |
|---|---|
attention_alignment | 公開したフォーカスとパートナーエージェントのフォーカスとの一致度。同一の顕著性スナップショットフレーム内でのみ測定します(Jaccard 係数による重なり、共通ターゲット、共通の最上位ターゲット)。フレームをまたぐ場合は拒否されます |
attention_decide | パートナーエージェントのフォーカスに基づく連携判断。parallel(競合なし)、serialize(最上位ターゲットが同じ場合。指名された保持者が進め、あなたは待機)、reject(フレームが古い、またはフォーカスが無効な場合。再スナップショットし、決して推測しない) |
attention_focus | 連携ボードから取得した、パートナーエージェントが現在公開しているフォーカス(順序付きの顕著なターゲットと、その算出元となったスナップショットハッシュ) |
attention_publish | フォーカスドキュメント {agent_id, snapshot_hash, seq, targets[]} を連携ボードに公開します(ターゲットは最大 8 件)。agent_id はクライアントの ID と一致する必要があり、シーケンス番号は必ず単調に増加させます |
broker_status | モード、Neovim のバージョン、cwd、設定ルート |
get_definition | 接続されているクライアント間で統合された定義の場所 |
get_diagnostics | vim.diagnostic によるバッファ診断(LSP とリンターのパイプライン)。各項目に生成元の source が記載されます |
get_document_symbols | コンテナーを含むフラット化されたシンボルのアウトライン |
get_hover | 指定位置のホバーテキスト |
get_references | 接続されているクライアント間で統合された参照の場所 |
list_dap | 設定ツリー内の DAP モジュールと、セッションに登録されたアダプター/設定 |
list_formatters | 設定ツリー内のフォーマッターモジュール |
list_linters | 設定ツリー内のリンターモジュール(アンダースコアで始まるモジュールは内部用として報告) |
list_servers | ツリーで設定された LSP サーバーと、開いているバッファーに接続されているサーバー |
run_format | 設定のフォーマッターパイプライン(require('formatters'))を使ってファイルをフォーマットします。フォーマッター名と LSP モード(fallback/never/only)を任意で明示できます。ステータス、changed、実行されたステップ、フォーマット済みテキストを返します |
run_lint | 設定のリンター実行器(require('linters'))を使ってファイルを検査します。リンター名を任意で明示できます。指定しない場合は、ファイルタイプに設定されたリンターが使われます。リンターごとのステータス、終了コード、診断を返します(各診断の source にリンター名が記載されます) |
位置は 0 始まりです。character は UTF-16 コード単位で数えます(LSP の規約)。
LSP リクエスト用ツールは、サーバーが処理中の進捗を報告する間、エディター内でポーリングします。そのため、起動直後の rust-analyzer でも、すばやく空の結果を返すのではなく、実際の回答が返されます(小規模なプロジェクトで約 10 秒)。
使い方
periscope [--workspace <dir>] [--attach <socket>] [--nvim-bin <path>]
--workspaceの既定値は現在のディレクトリで、管理対象のエディターはここで起動します。- MCP サーバーを登録する場所に登録します。diver では、
lua/ai/mcp/declared_servers.luaのdeclared_serversエントリーに記述します。
periscope = {
args = { '--workspace', '/path/to/project' },
cmd = '/home/phaedrus/.local/bin/periscope',
kind = 'stdio',
name = 'periscope',
source = 'local',
timeout = 5000,
tools = 'all',
},
インストール環境に合わせて cmd/args を調整してください。クライアントの作業ディレクトリを使う場合は --workspace 引数のエントリーを削除します。代わりに --attach <socket> を指定すると、起動中のエディターに接続できます。
予算と上限
すべての待機時間とリストには上限があります。エディターへの接続は 20 秒、LSP リクエストフェーズは 30 秒(進捗に応じたポーリング)、診断の安定化は 5 秒、接続期限は 10 秒、VimEnter の準備完了待ちは 20 秒です。結果の上限は次のとおりです。
1 回の呼び出しにつき診断の場所は 500 件、ドキュメントシンボルは 1,000 件(深さ 6)、定義/参照の場所は 500 件、MCP 入力行は 4 MiB です。
エディターからのエラーは 512 文字に制限して転送されます。
ツールの失敗は MCP の isError 結果としてインバンドで返され、プロトコルエラーにはなりません。
セキュリティ方針
stdio トランスポートのみを使用し、ネットワークポートでは何もリッスンしません。管理対象エディターのソケットはプライベートな一時パスに置かれ、シャットダウン時に削除されます。ブローカーは子プロセスを終了させます。どのツールもファイルをディスクに書き込んだり、名前を変更したり、デバッグセッションを開始したりしません。フォーマットによる変更は、ブローカー経由で操作するエディターのバッファーにのみ適用され、テキストとして返されます。また、attention ボードはプロセス内メモリにあり、サーバーの終了時に破棄されます。
ロードマップ
- P2(完了):設定独自のパイプライン(`run_format`、`run_lint`)を通じたフォーマッターとリンターの*実行*。 - P3:明示的な有効化フラグによって制御される、書き込みツール(名前変更、コードアクション、フォーマットして書き込み)。 - P4:`index.scip` に対する SCIP クエリツール(ネイティブ Rust リーダー)。 - P5:DAP セッションの操作。コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。