mcpField
F
fluxgit-mcp-server

fluxgit-mcp-server

ローカル
fluxgit.comバージョン管理04 週間前に更新

fluxgit-mcp-server について

fluxgit-mcp-serverは、Gitリポジトリを調べるコーディングエージェント向けのRust製MCPサーバーです。構造化された読み取りツールと、FluxGitのデスクトップアプリで人が確認・承認してから実行する操作提案を提供します。

主な機能

  1. 0125種類の読み取り専用Gitツール
  2. 02構造化されたリポジトリ・競合情報
  3. 03Git操作の提案
  4. 04FluxGitでの人による承認
  5. 05復元ポイントと監査記録

活用シーン

  1. 01リポジトリとブランチの状態を要約
  2. 02解決前に競合を調査
  3. 03承認用のコミットやブランチ操作を提案
  4. 04複数リポジトリの変更を確認

MCP 対応

MCPクライアントにGitの調査ツールと操作提案ツールを公開します。書き込み提案はFluxGitに渡されて人の承認を受け、sidecar自身はGitへの書き込みを実行しません。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ
パッケージ
cargofluxgit-mcp-sidecar0.2.1

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

fluxgit-mcp-sidecar

mcp-name: io.github.fluxgit-hq/fluxgit-mcp-server

License Glama score MCP

安全性を最優先した、Git 用の Model Context Protocol(MCP)サーバーです。

AI エージェントが調査し、FluxGit が制御を維持します。

AI コーディングエージェント向けに38 個のコントラクトを備えた Rust 製 MCP サーバーです。読み取り専用ツールが 25 個、人間の承認が必要な操作ツールが 13 個(提案 12 個と保留中の提案のキャンセル)あります。サイドカーが Git の書き込みを実行することはありません。承認済みの提案を FluxGit デスクトップアプリに橋渡しします。

AI エージェントがマージを提案すると、FluxGit に差分、理由、競合の事前チェックが表示され、人間の承認を待ちます。

コンテキスト予算の比較については、公開されているGit コンテキストトークンのベンチマークをご覧ください。幅広い CLI の一斉調査と、より小規模で手作業により調整された反例の両方を含め、フィクスチャ、生の出力、スクリプト、チェックサムを公開しています。


このプロジェクトが生まれた理由

AI コーディングエージェントには、実際のリポジトリを調査するタスクがますます増えています。ブランチの状態を説明したり、差分を要約したり、失われたコミットを見つけたり、安全な次の手順を提案したりします。これを適切に行うには、git status よりも豊富で、推論しやすい構造化された Git コンテキストが必要です。安全に行うには、エージェントが人間の承認なしに参照先を変更したり、強制プッシュしたり、作業を破棄したり、パッチを適用したりできないようにする必要があります。

他の MCP Git サーバーでは、読み取り専用に徹して機能が限られるか、書き込みツールを直接公開して危険を招くかの選択を迫られます。エージェントは幻覚を起こし、プロンプトは汚染される可能性があり、誤りは破壊的な結果につながりかねません。このサイドカーは、どちらも選びません。調査はスキーマで検証され、範囲が制限されます。操作にはUI ハンドシェイクを伴う書き込みを採用しています。エージェントが提案し、FluxGit がプレビューを表示し、ユーザーがアプリで承認すると、復元ポイントと監査を備えた安全パイプラインを通じて FluxGit が実行します。


公開されている機能

25 個の読み取り専用ツール
ツール用途
repo.brief1 回の呼び出しで状況を把握 — ブランチ、先行/遅延状況、進行中の操作、作業ツリーの概要、スタッシュ、サブモジュールの差分の集約、最近のコミット、検出された規約、次のステップのヒントを取得します。エージェントセッションで最初に呼び出すことを推奨します。生の Git 呼び出しを 6~10 回行う代わりになり、トークン予算を考慮して設計されています
repo.scopeモノレポのスコープ設定 — 1 回の呼び出しで、1 つのサブツリーの作業ツリーの変更、最近のコミット、変更状況(期間内のコミット数と作成者)、CODEOWNERS のオーナーを取得します
repo.status作業ツリー、現在のブランチ、変更のあるパス
repo.refsブランチ、タグ、リモート、スタッシュ
repo.branchStack現在のブランチとアップストリーム/ベース/関連ブランチとの比較
repo.historyページネーション対応のコミット履歴
repo.reflog復旧のヒントを含む移動履歴
repo.conflictPreflight実行前にマージ/リベースの結果を予測します
conflict.read進行中の競合を構造化データとして取得 — 進行中の操作、競合を生じさせた ours/theirs のコミット、ファイルごとのステージ分類、ベース/ours/theirs の内容(サイズ上限付き、バイナリフラグ付き)、マーカー領域の行範囲を取得します。<<<<<<< の混在した内容を解析する必要はもうありません
commit.details1 つのコミットのメタデータと変更されたファイル
worktree.changesパスごとの作業ツリー変更の概要
worktree.listブランチ/デタッチ状態、HEAD SHA、ロック/プルーニング可能フラグを含む、すべてのワークツリー(メイン+リンク済み)。並列エージェントのワークツリーで使用する読み取り専用のベースです
submodule.statusサブモジュールの一覧と状態
diff.text標準的なテキストパッチ(git diff 互換)
diff.semantic機能に応じてネゴシエーションされる意味的な説明
diff.semanticFallbacks意味的な形式からテキスト形式にフォールバックしたパス
fleet.radar複数リポジトリの注意事項キュー
fleet.digest指定した時点以降に複数のリポジトリで何が変わったか — 多数のリポジトリの HEAD とローカルブランチの reflog の移動を新しい順に取得します。maxEvents で上限を指定します(既定値 200、最大 1000)。省略した場合は、repoPaths、または許可されたルート内にある FluxGit 登録済みリポジトリが対象です。identity は Git に記録された内容そのものです(設定済みの ID であり、人間やエージェントの証明ではありません)。rewrote は直前の先端を破棄した移動(リセット、アメンド、リベース、強制移動)を示します。reflog ファイルのみを読み取り、フェッチも書き込みも行いません
agents.presenceこのリポジトリで作業している他のコーディングエージェント — ローカルの情報源のみを使用します(実行中のエージェントプロセスとその子プロセス、各エージェント自身のセッションストア、リポジトリ内に保持しているファイル、エージェントを組み込みで備えたエディター、FluxGit MCP のプレゼンスレコード)。エージェントごとに、state(working/open/recent)、sources、ブランチ、最後に使用したツール、判明している場合はリポジトリ相対パスを返します。名前は各ツールまたは MCP クライアントが自身について申告したものです。自身の MCP レコードは除外され、自身のセッションと思われる検出結果には likelyCaller のマークが付きます。プロンプト、メッセージ、ファイルの内容は返しません
safety.timeline復元ポイントと reflog から統合した安全イベント
safety.eventDetailsタイムライン内の 1 つのイベントを詳しく表示します
flux.latestRestorePoint最新の FluxGit 復元ポイント
flux.restorePoints復元ポイントの一覧
flux.restorePointDetails変更前/変更後の参照情報を含む 1 つの復元ポイント
operation.statuspreviewId による非同期操作の正式なステータス。プレビューから accepted: true が返された後にポーリングし、終端状態になる前に Git の結果を報告しないでください
13 個の UI ハンドシェイク付き書き込みツール

設定されている場合、12 個すべての operation.preview.* 提案は FluxGit ゲートウェイ経由で送信されます。 サイドカーは提案を POST し、上限付きでステータスを 1 回読み取り、 通常は accepted: true、正規の previewId、現在のステータス、 nextAction.tool: "operation.status" を直ちに返します。 FluxGit アプリは、人間による確認が非同期で続く間、「Requested by AI agent」という承認カードを表示します。コード 10003 はブリッジが存在しない、無効、または到達不能な場合に使用されるものであり、人間による承認のタイムアウトではありません。 12 個すべてのプレビュー用スキーマでは、省略可能な長さ制限付きの idempotencyKey を受け付けます。同じ論理的な意図を再試行する場合に限り、同じ値を再利用してください。サイドカーはキーの適用範囲を操作の種類ごとに限定するため、再試行時には既存のゲートウェイ提案が解決されます。新たな意図の場合は、ほかの引数が一致していても省略してください。その場合、サイドカーは新しい UUID ベースのキーを送信します。そのため、プレビューツールは引き続き idempotentHint: false を通知します。

ツール用途ゲートウェイのディスパッチ
operation.preview.merge人によるレビュー用にマージを提案しますPOST /v1/mcp/operation/preview/merge → FluxGit に承認カードを表示
operation.preview.rebase非対話型のリベースを提案しますinteractive: true は POST/カード作成前にスキーマ検証で失敗します。受理されたリクエストは POST /v1/mcp/operation/preview/rebase され、履歴を書き換える警告カードが表示されます
operation.preview.discard作業ツリーの変更の破棄を提案しますPOST /v1/mcp/operation/preview/discard → パス固有の警告が表示されます。FluxGit は一致する変更を破棄する前に、安全のためのスタッシュを要求します
operation.preview.resetsoft/mixed/hard リセットを提案しますPOST /v1/mcp/operation/preview/reset → モードに応じたカードが表示されます(hard モードでは強い確認が必須です)
operation.preview.patchエージェントが生成したパッチの適用を提案しますPOST /v1/mcp/operation/preview/patch → 等幅フォントのパッチプレビューと applyToIndex の切り替えが表示されます
operation.preview.planサポートされている 5 種類の計画ステップ(merge、rebase、discard、reset、patch)を使った、1~10 ステップの手順を提案しますPOST /v1/mcp/operation/preview/plan → 番号付きのステップカードが表示されます。破壊的なステップには明示的なチェックボックスが必要です。interactive: true を指定した rebase ステップは、ディスパッチ前のスキーマ検証で拒否されます。実行は最初の失敗時に停止します。計画前のチェックポイントで記録されるのはブランチのコミットのみです。保護された復元では HEAD と追跡対象ファイルが復元されますが、元のインデックス、作業ツリー、未追跡ファイルの復元には、別途ステップごとのスナップショット/Safety Timeline の復元機能が必要です
operation.preview.worktree並行タスク用の分離された worktree の作成を提案します(破壊的な操作ではなく、履歴には一切触れません)POST /v1/mcp/operation/preview/worktree → ブランチ、対象パス、理由を記載した承認カードが表示されます。手動クリック時と同じ worktree 作成アクションが実行されます
operation.preview.commitメッセージを指定したステージングとコミットを提案します(破壊的な操作ではなく、amend はサポートされていません)POST /v1/mcp/operation/preview/commit → ステージングしてコミットするファイルを正確に記載した承認カードが表示されます。通常のコミットパイプライン(フック、署名、ポリシー)で実行され、完了時に新しい SHA が返されます
operation.preview.pushブランチのリモートへのプッシュを提案します(set-upstream は任意です。force-with-lease では高リスク警告が表示されます)POST /v1/mcp/operation/preview/push → リモート、ブランチ、該当する場合は force 警告を記載した承認カードが表示されます。保護されたプッシュフローが実行されます
operation.preview.branch開始地点からのブランチ作成(および任意でチェックアウト)を提案しますPOST /v1/mcp/operation/preview/branch → 名前、開始地点、チェックアウトの選択を記載した承認カードが表示されます
operation.preview.branchDelete1 つ以上のリポジトリで、マージ済みのローカルブランチの削除を提案します(targets は最大 20 リポジトリ × 20 ブランチ、合計 100 件)。ブランチ名はエージェントが指定し、削除可能かどうかは FluxGit が判断します。リモートブランチには一切触れませんPOST /v1/mcp/operation/preview/branchDelete → カードはすべてのブランチをネイティブに検査し、HEAD またはそのアップストリームにないコミットがあるブランチ、どこかでチェックアウトされているブランチ、または先端が移動したブランチを保持します。削除された各先端は Fleet のブランチ削除履歴に記録され、Restore で復元できます。完了時にブランチごとの deleted/failed/skipped 結果が返されます
operation.preview.submodulePointer任意の深さにあるサブモジュールポインターの記録(record、message が必要)または復帰(return)を提案します(parentPath + relativePath)。submodule.status から読み取った任意の expectedRecordedOid/expectedCheckedOutOid で固定できますPOST /v1/mcp/operation/preview/submodulePointer → record は Git 自身のコミット処理を通じて親の gitlink のみをコミットします(フックと署名が適用されます。プッシュは行われません)。return は記録済みコミットを detached 状態でチェックアウトし、以前のチェックアウトを復元ポイントとして記録します。サブモジュールは初期化済みかつクリーンで、記録済みのポインターと異なっている必要があります
operation.cancelpreviewId を指定して、エージェント自身の保留中の提案をキャンセルしますPOST cancel。期限切れの提案と同様に、カードがユーザーのキューから消えます
すべての書き込み提案には自由記述の reason が必要です。これにより、ユーザーは承認モーダルでエージェントの判断理由を確認できます。すべての提案で、同じ永続的なゲートウェイのライフサイクル(`pending → approved → executing → completedfailed。拒否/キャンセル/期限切れの分岐あり)と、UI 内の同じ Tauri ブリッジを使用します。6 つのシムが、保留、復旧可能、承認、クレーム、拒否、完了を担います。再起動後、承認済みの提案は、リポジトリと ref の再検証およびクレームが完了した場合にのみ再開できます。実行中の提案は明示的な照合のために表示され、決して確認なしに再実行されません。承認済みの操作で復元ポイントが取得されると、完了時の result` にその復旧メタデータが含まれるため、エージェントは推測せずにユーザーへ報告できます。

承認時に境界で確実に処理を拒否する設計になっています。FluxGit は提案の repoPath を正規のオープンリポジトリ ID に解決し、それが人間のレビュー対象リポジトリと一致することを必須とします。パスを解決できない場合、一致しない場合、またはリポジトリが切り替わった場合は、実行をブロックします。ツールの引数はディスパッチ前とゲートウェイで再度検証されます。宣言型のエージェントポリシーを任意で設定すると、カードを開く前に提案を拒否できます。ルールはサイドカーが転送する agentId(サニタイズ済みの自己申告 clientInfo.name。例:claude-code)に一致し、そのエージェントが実行できる操作、ref、さらに pathConstraints を使ってリポジトリおよびワークツリーのパスプレフィックスを制限できます。FLUXGIT_MCP_AGENT_POLICY が設定されているにもかかわらず、ファイルが存在しない、読み取れない、形式が不正、またはサポート対象外の場合、ゲートウェイは起動しません。ポリシーが設定されていない場合は、互換性のために制限を設けませんが、操作ごとの人間による承認は引き続き必須です。

同じリポジトリ内の他のエージェント(競合のヒント)

すべての operation.preview.* の結果には、任意の otherAgents オブジェクトが含まれる場合があります。これは、提案対象のリポジトリ内で agents.presence が検出した他のエージェントと、両方が対象ファイルを指定している場合の overlappingPaths(破棄とコミットの paths、パッチヘッダー、計画のステップ、submodulePointer のサブモジュールディレクトリ)です。この情報は参考用に限られます。ゲートウェイの判断後に追加され、提案をブロックすることも、承認方法を変えることもありません。エージェント検出が無効な場合は含まれません。

"otherAgents": {
  "informational": true,
  "agents": [{ "agent": "codex", "state": "working", "sources": ["process", "session"],
               "branch": "codex/fix-login", "lastTool": "apply_patch",
               "files": ["src/login.rs"], "overlappingPaths": ["src/login.rs"],
               "pid": 4242, "lastActivityMs": 1790000000000, "mcpClient": null,
               "sameAgentAsCaller": false }],
  "agentCount": 1, "overlappingAgentCount": 1, "proposalPathsKnown": true,
  "omittedLikelyCaller": 1, "note": "Informational only: ..."
}

検出はローカルで読み取り専用です。他のエージェントの SQLite ストアは読み取り専用で開かれ、リポジトリ相対パス、ツール名、ブランチ、時刻のみが検出機能の外部に出ます。FLUXGIT_MCP_AGENT_DETECTION_DISABLED に何らかの値を設定すると、検出が無効になります。その場合、agents.presence は 10011 を返し、プレビューにヒントは含まれません。

各サイドカーは、クライアントが使用したリポジトリも記録するため、デスクトップと他のサイドカーから確認できます。保存先は <run_dir>/presence/mcp/<pid>.json(0600)で、自己申告の clientInfo の名前とバージョンに加え、リポジトリごとの正規パス、時刻、最後に使用したツール名が記録されます。記録されるのは受け付けられた呼び出しのみです(エージェントポリシーまたは FluxGit が見つからないことを理由に拒否された提案は記録されません)。正常終了時にファイルは削除されます。FLUXGIT_MCP_PRESENCE_DISABLED を設定すると、記録が無効になります。

プロトコルの詳細

すべての operation.preview.* 呼び出しは、同じワイヤープロトコルに従います。operation.preview.merge の例を示します。

1. Sidecar が提案を POST します:

POST /v1/mcp/operation/preview/merge HTTP/1.1
Host: 127.0.0.1:59647
Content-Type: application/json

{
  "previewId": "1f3c5b9a-...-uuid",
  "agentId": "external-mcp-sidecar",
  "operationType": "merge",
  "repoPath": "/Users/dev/projects/checkout",
  "sourceRef": "feature/cart-redesign",
  "targetRef": "main",
  "reason": "Cart redesign work is complete; tests pass on the feature branch.",
  "strategy": "merge",
  "requestedAt": "2026-05-28T11:42:09.512Z"
}

2. Gateway が 202 Accepted を返します:

{ "previewId": "1f3c5b9a-...-uuid", "status": "pending", "expiresAt": "2026-05-28T11:47:09.512Z" }

3. Sidecar が範囲を限定したステータス読み取りを 1 回実行します:

GET /v1/mcp/operation/status/1f3c5b9a-...-uuid HTTP/1.1
Host: 127.0.0.1:59647

提案がまだ有効な場合、プレビューツールは速やかに返ります:

{
  "tool": "operation.preview.merge",
  "readOnly": false,
  "accepted": true,
  "previewId": "1f3c5b9a-...-uuid",
  "status": "pending",
  "nextAction": {
    "tool": "operation.status",
    "data": { "previewId": "1f3c5b9a-...-uuid" }
  }
}

これは提案の送信に成功したことを示すものであり、Git 操作の成功を示すものではありません。

4. クライアントは、Gateway が終端状態を報告するまで operation.status をポーリングします:

{
  "previewId": "1f3c5b9a-...-uuid",
  "operationType": "merge",
  "status": "completed",
  "result": {
    "commitSha": "9a8b7c6d...",
    "restorePointId": "rp_2026_05_28_1142",
    "conflicts": []
  }
}

completed は isError: false を返します。有効な pending または approved の提案も、受け付けられた結果として成功を返しますが、Git が変更されたとは主張しません。rejected、failed、expired、cancelled など、完了以外の終端状態では、構造化ペイロードとともに isError: true が返されるため、エージェントは結果を捏造せず、実際の結果を報告できます。

同じパターンが 12 個すべての operation.preview.* ツールに適用されます。異なるのはリクエスト本文のフィールドと結果の形式だけです。提案の送信、直後の読み取り 1 回、非同期の operation.status による継続、およびエラーのセマンティクスは共通です。公開されている契約の概要は fluxgit.com/features/mcp-agent-git で管理されています。


境界:フリーシェルと FluxGit 対応機能

Sidecar は FluxGit がインストールされていなくても MCP と通信します。標準的な Git の調査(status、refs、history、reflog、diff.text など)は動作します。FluxGit が必要なツールは、エージェントにインストール/設定の手順を案内する upgradeHint を含む JSON-RPC エラーコード 10001 を返します。

ティアの分類:

  • フリーシェル — ローカルの git のみで動作します:repo.brief、repo.scope、repo.status、repo.refs、repo.branchStack、repo.history、repo.reflog、commit.details、worktree.changes、worktree.list、submodule.status、diff.text、conflict.read、fleet.digest。agents.presence も FluxGit は不要です。ローカルのエージェント状態(および存在する場合は FluxGit の MCP プレゼンスレコード)を読み取ります。
  • ハイブリッド — 文書化されたフォールバックを使用してローカルで動作し、FluxGit によって機能が強化されます:fleet.radar、diff.semantic、diff.semanticFallbacks、repo.conflictPreflight。
  • FluxGit 必須 — ローカルの refs だけから生成するとエージェントに誤解を与えるため、FluxGit がない場合は gateway_not_configured を返します:safety.timeline、safety.eventDetails、flux.latestRestorePoint、flux.restorePoints、flux.restorePointDetails。
  • 書き込みハンドシェイク — Gateway のハンドシェイクサーバーを介して、FluxGit UI の承認フローにルーティングします。12 個の operation.preview.* ツールは、有効な提案を受け付けた結果を速やかに返し、その後 operation.status で処理を継続します。operation.cancel は、同じエージェントが所有する保留中の提案を取り下げます。コード 10003 は、ブリッジがハンドシェイクを受け付けられない、または提供できない場合にのみ使用されます。

クイックスタート

公開されているクレートをインストールします(fluxgit-mcp-sidecar が PATH に追加されます):

cargo install fluxgit-mcp-sidecar --locked

代わりに、現在のソースブランチをインストールするには:

cargo install --git https://github.com/fluxgit-hq/fluxgit-mcp-server fluxgit-mcp-sidecar --locked

または、クローンからビルドします:

# Build
cargo build --release

# Run as MCP server (stdin/stdout transport)
./target/release/fluxgit-mcp-sidecar
MCP 対応エージェントに接続する

以下の汎用ブロックを任意の MCP ホスト設定に貼り付けます。クライアント固有のインストールは不要です。

{
  "mcpServers": {
    "fluxgit": {
      "type": "stdio",
      "command": "/absolute/path/to/fluxgit-mcp-sidecar",
      "env": {
        "FLUXGIT_MCP_HANDSHAKE_ADDR": "127.0.0.1:59647",
        "FLUXGIT_MCP_AUDIT_LOG": "/optional/path/to/audit.jsonl"
      }
    }
  }
}

FLUXGIT_MCP_HANDSHAKE_ADDR は、FluxGit Quick Connect によって生成される標準のブリッジアドレスです。FLUXGIT_GATEWAY_ADDR と FLUXGIT_GATEWAY_URL は、引き続き互換性のためのフォールバックとして使用できます。Sidecar が受け付けるのは、明示的なポートを持つループバックホスト上のプレーン HTTP のみです。リモートホスト、認証情報、パス、クエリ、フラグメント、HTTPS、ポートの指定がないアドレスは拒否されます。有効なローカルブリッジがなくても、フリーシェルティアは引き続き動作します。

FLUXGIT_MCP_AUDIT_LOG を設定すると、すべての tools/call の追記専用 JSONL 監査ログが有効になります。引数はハッシュ化され、生のパスや識別子がそのまま記録されることはありません。


セマンティック差分の契約

diff.semanticはAI エージェントに最もよく使われるツールであり、最も誤用されやすいツールでもあります。ルールは厳格です。

data.supportedが厳密にtrueの場合に限り、結果をセマンティックと呼べます。

FluxGitのセマンティックエンジンを利用できない場合(FluxGitアプリが起動していない、ゲートウェイアドレスが設定されていない、またはリポジトリがFluxGitに登録されていない場合)、diff.semanticは次を返します。

{
  "tool": "diff.semantic",
  "readOnly": true,
  "data": {
    "supported": false,
    "fallback": "diff.text",
    "reason": "Semantic diff is not available in local sidecar fallback mode.",
    "textDiffArguments": { "repoPath": "...", "base": "...", "head": "...", "path": "..." }
  }
}

FluxGitアプリが起動していて、リポジトリがFluxGitに登録されている場合、同じ呼び出しはゲートウェイの読み取り専用ブリッジを通じてFluxGitのdiff-engineで処理され、ファイルごとのセマンティックなハンクとともに supported: trueを返します。

{
  "tool": "diff.semantic",
  "readOnly": true,
  "source": "fluxgit-gateway",
  "data": {
    "supported": true,
    "engine": "fluxgit-diff-engine",
    "files": [
      {
        "path": "src/main.rs",
        "fallbackToText": false,
        "hunks": [{
          "header": "fn main",
          "lines": [{
            "type": "modified", "oldLine": 3, "newLine": 3,
            "content": "let x = 2;", "oldContent": "let x = 1;",
            "changedTokens": ["2"], "oldChangedTokens": ["1"]
          }]
        }]
      },
      {
        "path": "logo.bin",
        "fallbackToText": true,
        "hunks": [],
        "reason": "The semantic engine could not parse this file (unsupported language, binary or unreadable source); use a text diff for it.",
        "textDiffArguments": { "repoPath": "...", "base": "...", "head": "...", "path": "logo.bin" }
      }
    ],
    "changedFiles": 2,
    "filesTruncated": false
  }
}

誠実さは呼び出し単位ではなく、ファイル単位で保たれます。エンジンが解析できなかったファイルは、fallbackToText: true、理由、およびすぐに使えるtextDiffArgumentsとともに返され、合成されたセマンティックなハンクとして返されることはありません。diff.semanticFallbacksも同じ使い分けに従い、接続時にはエンジンが実際に記録したファイルごとのフォールバック情報を一覧表示します。

接続中のエージェントは、次の手順に従う必要があります。

  1. diff.semanticを呼び出します。
  2. data.supportedを確認します。
  3. trueの場合はセマンティックペイロードを使用し、結果をセマンティックとして示します。ただし、fallbackToText: trueのエントリーはテキストフォールバックとして提示する必要があります。
  4. falseの場合は、data.textDiffArgumentsを指定してdiff.textを呼び出し、結果をテキスト差分のフォールバックとして提示します。
  5. テキストパッチだけから関数やクラスの移動を推測してはいけません。

使用可能な表現:「このファイルについて、FluxGitはテキスト差分へのフォールバックを報告しました」。 使用禁止の表現:supported=falseの場合に「これはセマンティック差分です」。


Presenceファイル(各エージェントの作業場所)

FLUXGIT_MCP_PRESENCE_DISABLEDが設定されていない限り、各サイドカープロセスはローカルファイル<FluxGit run dir>/presence/mcp/<pid>.jsonを1つ保持します。これにより、FluxGitデスクトップアプリは、どのコーディングエージェントが接続されていて、どのリポジトリで作業しているかを表示できます。このファイルに含まれるのは、エージェントがinitializeで申告したクライアント名とバージョン、およびリポジトリごとの(最大16件)検証済みのrepoPath、最終呼び出し時刻、ツール名のみです。その他の引数や結果は含まれません。監査ログとは異なり、デスクトップが照合できるようにリポジトリパスはそのまま保存されます。このファイルはプライベート(0700のディレクトリ内で0600)で、アトミックに書き換えられ、正常終了時に削除され、24時間経過後に削除されます。また、このファイルへの書き込みがツール呼び出しに影響することはありません。クライアント名は自己申告であり、認証済みのIDではありません。


監査ログ

FLUXGIT_MCP_AUDIT_DISABLEDが設定されていない限り、サイドカーは各tools/callを共有JSONL台帳に追記しようとします。ゲートウェイは、同じライターを通じて人間の判断記録を追記しようとします。FLUXGIT_MCP_AUDIT_LOGを設定するとパスが上書きされます。設定されていない場合は、両プロセスとも<FluxGit run dir>/audit/mcp.jsonlを使用します(FLUXGIT_RUN_DIRを含みます)。

{
  "id": "bdeca765-488c-4e2a-b86b-25cd734f2988",
  "timestamp": 1712345678901,
  "auditSchemaVersion": 1,
  "auditChainVersion": 1,
  "sequence": 42,
  "segmentId": "7ab6fa7a-c5bf-4d82-86a8-26b4728b5acd",
  "previousHash": "sha256:...",
  "entryHash": "sha256:...",
  "tool": "repo.status",
  "event_type": "tool_call",
  "repo_scope": "repoPath:sha256:...",
  "args_fingerprint": "sha256:...",
  "risk": "read",
  "approval": "none",
  "result": "success",
  "session_id": "my-agent",
  "duration_ms": 12,
  "summary": "...",
  "readOnly": true,
  "sidecarReadOnly": true,
  "signature": "base64url-ed25519",
  "signatureKeyId": "1a2b3c4d5e6f7a8b",
  "signatureVersion": 3
}

機密性の高いパスや識別子はハッシュ化され、そのまま保存されることはありません。安定したプロセス間ロック1つで、検証、ローテーション、同期を含む完全な追記処理を保護します。各行の上限は256 KiBです。アクティブなセグメントは4 MiBでローテーションされ、ローテーション済みセグメントは最大4つまで保持されます。署名が設定されている場合は、署名付きチェックポイントも作成されます。

エントリごとの Ed25519 署名(2026-05-28 リリース)

監査署名はオプトインです。FLUXGIT_MCP_AUDIT_SIGN_KEY が PEM PKCS8 Ed25519 秘密鍵を指している場合、追加されるすべてのエントリにその鍵で署名します。署名付きエントリには次の項目が追加されます。

  • signature — エントリの署名フィールドを除いた正規化 JSONに対する Ed25519 署名(パディングなしの base64url)。
  • signatureKeyId — 対応する公開鍵の 16 文字の 16 進数プレフィックスです。鍵をローテーションしても、同じ JSONL 内で共存できます。
  • signatureVersion: 3 — 現在の連鎖署名ドメインです。鍵 ID、シーケンス番号、前のハッシュ、エントリのハッシュが署名対象のバイト列に含まれます。

正規化 JSON の規則(検証側は完全に一致させる必要があります):各オブジェクトのキーを UTF-8 バイト順の辞書順で再帰的に並べ替えます。配列の順序は維持し、signature は除外します。コンパクトにシリアライズします。バージョン 2 と 3 では、署名対象のオブジェクトに signatureKeyId と signatureVersion を残します。バージョンがない旧形式の署名付きエントリでは、検証側も signatureKeyId を除外します。

環境変数が設定されていない場合、後方互換性のため、新しいエントリは連鎖に追加されますが、署名はされません。明示的に設定されている場合、空の鍵、見つからない鍵、安全でない鍵、サイズ超過の鍵、または無効な鍵があると、監査の起動はフェイルクローズします。署名なしの出力にフォールバックすることはありません。

監査ログの検証

サイドカーのバイナリは検証ツールも兼ねています。

fluxgit-mcp-sidecar verify-audit /path/to/mcp.jsonl --pubkey /path/to/install.pub.pem

CLI は、アクティブなファイルと保持されているローテーション済みファイルを、メモリ使用量を制限しながらストリーミング処理します。シーケンス番号、ハッシュ、セグメント名、チェックポイント、署名を検証し、上限のあるカウンター(entries、chained、legacy、signed、unsigned、segments と保持されているシーケンス範囲)のみを報告します。エントリごとの旧形式のレコードは引き続き読み取りと検証が可能ですが、改ざん検知チェーンの一部としてではなく、legacy として報告されます。厳格な証拠ゲートには、次を実行してください。

fluxgit-mcp-sidecar verify-audit /path/to/mcp.jsonl --pubkey /path/to/install.pub.pem --require-signed

成功時の終了コードは 0 です。データの不正、チェーンまたはローテーションの破損、署名の不正がある場合、また厳格モードで署名のないエントリがある場合は 3、使用方法のエラーは 2 を返します。

プログラムから台帳全体を検証するには verify_audit_ledger を使用します。従来の verify_audit_event_signature も、互換性のあるエントリごとの検証用に引き続き利用できます。ローカルのチェーンだけでは、独立して信頼できる外部アンカーがなければ、保持されている履歴全体(またはそのローカルチェックポイント)の削除や置き換えを証明できません。保持されている署名付きエントリにより、秘密鍵を持たない攻撃者が変更後のチェーンを再計算することは防止されます。

監査設定(明示的に指定された署名鍵を含む)に問題がある場合、起動時にフェイルクローズします。後でファイルシステムまたはディスク容量不足により追加に失敗した場合は、縮退状態としてログに記録しますが、ツールの応答や、すでに永続化されたゲートウェイのライフサイクル遷移は取り消されません。復旧時には、ゲートウェイのライフサイクルジャーナルが引き続き正となります。


プロトコルの詳細

このサーバーは、次の2つのプロトコル世代をサポートしています。

  • 2026-07-28(推奨、ステートレス): server/discover を呼び出してから、すべてのリクエストに params._meta.io.modelcontextprotocol/protocolVersion と params._meta.io.modelcontextprotocol/clientCapabilities を含めてください。 新しい形式の結果には resultType: "complete" とサーバーのメタデータが含まれます。リスト の結果には ttlMs と cacheScope が追加されます。tools/list には title、inputSchema、outputSchema、アノテーションが含まれます。tools/call には、表示用の content と、同じペイロードを含む structuredContent の両方が含まれます。 outputSchema で previewId、status、accepted、nextAction を提示するのは、 提案ツールと operation.status のみです。スキーマ オブジェクトは "additionalProperties": false と指定されていない限り、追加プロパティを許可します。
  • 2024-11-05(レガシー互換性): 古いホストは引き続き initialize を使用します。 レガシーの結果では、新しい形式専用のフィールドは省略されます。

Stdio の出力は、標準的な改行区切りの JSON-RPC 2.0 形式です。1行につきコンパクトな JSON 値を1つだけ出力します。結果の content[0].text 内の JSON もコンパクトで、 structuredContent と同じキーと値を含みます。標準化以前の Content-Length フレーミングは、 古い FluxGit クライアント向けに入力のみ引き続き受け付けます。サーバーがこれを出力することはありません。フレームの上限は8 MiBです。JSON-RPC の通知には応答せず、ID なしで送信されたリクエストメソッドは実行されません。

新しい形式の tools/list には38個のツールがあります。25個は annotations.readOnlyHint: true を提示し、12個の operation.preview.* ツールと operation.cancel は readOnlyHint: false を提示します。これらのアノテーションは、 ホストに対する影響を示すものであり、認可ではありません。

エラーコード:

コード意味
-32700解析エラー
-32600無効なリクエスト(不正な JSON-RPC)
-32601メソッドが見つかりません
-32602無効なパラメーターまたは不明なツール
-32603内部エラー
-32022サポートされていない新しい形式の MCP バージョン。data には supported と requested が含まれます
10001ゲートウェイが設定されていません — FluxGit が必要なツールを使うには、FluxGit をインストールして起動してください
10002設定済みの FluxGit ブリッジに提供できるペイロードがありませんでした(たとえば、ローカルフォールバックに絶対パスの repoPath がありませんでした)
10003ローカルの書き込みハンドシェイクブリッジが存在しない、無効、または到達不能です。提案が受理されたと推測してはいけません
10004提案が完了せずに終了しました(rejected、failed、expired、cancelled)
10005ゲートウェイは要求された previewId を認識していません(誤った ID、受理されたことのない ID、または終端状態の保持期間終了後の削除)。再起動しただけでは、新しい提案を行う根拠になりません。Approved/Executing レコードは永続的に復元されます。また、開始した可能性のある Git 操作の結果は、まず照合する必要があります。
10006ゲートウェイはカードを開く前に提案を拒否しました(ポリシー、検証、またはクォータ)
10007ゲートウェイが不正または安全でない正規の previewId を返したため、サイドカーはそれに従いません
10010ローカルの読み取り専用 Git コマンドが失敗しました
10011エージェント検出が無効です(FLUXGIT_MCP_AGENT_DETECTION_DISABLED)。agents.presence は応答できません

ステータス

これは開発中の MCP サーバーです。読み取り専用のインターフェイスと、12個すべての operation.preview.* ルートが実装されています。operation.cancel が管理するのは、 同じ自己申告のエージェント ID が所有する保留中の提案のみです。書き込みハンドシェイクでは FluxGit に承認カードを表示し、アプリの保護されたパイプラインを通じて処理を完了します。 クライアントには、合成された成功ではなく、構造化されたライフサイクルの結果が返されます。clientInfo.name は、 ポリシー、クォータ、監査のためのサニタイズ済みの帰属情報です。 これは自己申告であり、認証済みの ID として扱ってはいけません。

ロードマップ

  • エンドツーエンドのデモ動画 — エージェントが提案し、ユーザーが承認し、FluxGit が実行する一連の流れを、実際のインストール環境で記録した公開動画です。
  • 監査ログを CSV/JSON でエクスポート — リリース済み:各エントリーに Ed25519 署名を付与(2026-05-28)。残り:FluxGit アプリの監査パネルでの CSV/JSON エクスポートと保持ポリシーです。
  • HTTP / SSE トランスポート — クラウド/共有 MCP ホストへのデプロイ向けです。
  • 公式 MCP Registry — io.github.fluxgit-hq/fluxgit-mcp-server が公開されており、公開済みの fluxgit-mcp-sidecar クレートに解決されます。

ライセンス

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

関連項目

コメント

MCP は初めてですか?

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

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