p4mcp-server について
Perforce P4 MCP Server は、FastMCP と P4 Python バインディングで構築された、Perforce P4 バージョン管理システム向けの MCP サーバーです。AI アシスタントから P4 リポジトリを操作したいユーザー向けで、既定では読み取り専用モードで動作し、削除系の操作には確認が入ります。
主な機能
- 01変更リスト、ファイル、シェルブ、ワークスペースの読み書きツール
- 02投票や状態遷移に対応する P4 Code Review サポート
- 03REST API による P4 DAM 連携
- 04既定の読み取り専用モードと所有者チェック
- 05delete と obliterate 操作の対話型確認
- 06ツールカテゴリごとの有効化設定
活用シーン
- 01AI アシスタントからの P4 変更リストとファイル状態の確認
- 02コードレビュー ワークフローでの変更への投票と確認
- 03AI アシスタントによる P4 DAM アセットの検索とタグ更新
MCP 対応
本プロジェクトは MCP サーバーであり、ファイル、変更リスト、レビューなどの P4 操作を MCP クライアントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Perforce P4 MCP サーバー
Perforce P4 MCP サーバーは、Perforce P4 バージョン管理システムと統合する Model Context Protocol(MCP)サーバーです。FastMCP と P4 Python バインディングを直接使用して構築されており、変更リスト、ファイル、シェルフ、ワークスペース、ジョブ、レビュー、サーバーメタデータに対する安全で構造化された読み取り/書き込みツールを提供します。また、REST API を通じて P4 DAM と統合し、リソースを管理できます。
機能 · 前提条件 · システム要件 · インストール · デプロイ · クライアント設定 · P4 設定 · ツール
ログ記録 · トラブルシューティング · サポート · 貢献 · ライセンス
機能
- 包括的な P4 統合:ファイル、変更リスト、シェルフ、ワークスペース、ジョブ、レビュー、ストリーム、サーバー情報にわたる読み取り/書き込みツールを提供します。
- コードレビューのワークフロー:レビューの検索、投票、状態遷移、コメント、参加者管理に対応する P4 Code Review をサポートします。
- P4 DAM 統合:MCP 対応の AI アシスタントから P4 DAM のアセットとメタデータにアクセスできます。アセットの検索、メタデータの取得、レビューの管理、アセットバンドルの作成、アセットタグの更新、プロジェクトの参照が可能です。詳しくは、P4 DAM のドキュメントにある「P4 MCP Server 用の P4 DAM アクセスを設定する」をご覧ください。
- 安全性を最優先:デフォルトでは読み取り専用モードです。所有権を確認し、破壊的な削除および抹消操作の前に、対話型の MCP 入力(PROCEED/CANCEL)を求めます。
- 柔軟なツールセット:有効にするツールカテゴリを設定できます:server、files、changelists、shelves、workspaces、jobs、reviews、streams、p4dam。
- 堅牢なログ記録:アプリケーションとセッションのログを
logs/ディレクトリに記録します。 - オプションのテレメトリ:同意を得た場合に使用状況の統計情報を収集します。デフォルトでは無効です。
- クロスプラットフォーム対応:ビルド済みバイナリにより、macOS、Linux、Windows でサポートされています。
前提条件
- P4 Server へのアクセス:適切な認証情報を使用して P4 Server に接続できること
- 認証:有効な P4 ログイン(チケットベースまたはパスワード)
システム要件
| コンポーネント | サポート対象バージョン |
|---|---|
| オペレーティングシステム | Windows 10 以降 macOS 12 以降 Linux(glibc 2.34 以降、例:Ubuntu 22.04 以降、Rocky Linux 9 以降) |
| Perforce P4 Server | 2026.1 (以前のバージョンは未検証) |
| Python | 3.11 以降 (ソースからビルドする場合のみ必要) |
ローカル P4 MCP サーバーのインストール
uvx(最も簡単、インストール不要)
uv がインストールされている場合は、手動でインストールせずに P4 MCP Server を直接実行できます。
# Run the server
uvx p4mcp-server
# Check version
uvx p4mcp-server --version
# Run with arguments
uvx p4mcp-server --readonly --allow-usage
PyPI から最新バージョンを自動的に取得して実行します。Python 仮想環境のセットアップや依存関係の管理は不要です。
要件:
- システムに uv がインストールされていること
- Python 3.11 以降(uv が自動的に処理します)
ビルド済みバイナリ(オフライン/エアギャップ環境に推奨)
お使いのオペレーティングシステムに適したバイナリをダウンロードします。
- macOS: p4-mcp-server-mac.zip
- Windows: p4-mcp-server-win.zip
- Linux: p4-mcp-server-linux.zip
展開して、実行ファイルを直接使用します。Python のインストールは不要です。
# macOS / Linux
unzip p4-mcp-server-mac.zip # or p4-mcp-server-linux.zip
./p4-mcp-server --help
# Windows
Expand-Archive p4-mcp-server-win.zip -DestinationPath .
.\p4-mcp-server.exe --help
ソースからビルド
要件:
- Python 3.11 以降(Tkinter を含む)
ビルド:
- macOS:
chmod +x build.sh && ./build.sh package - Linux:
chmod +x build.sh && ./build.sh package - Windows:
build.bat package
出力:
- macOS および Linux:
p4-mcp-server-<version>.tgz - Windows:
p4-mcp-server-<version>.zip
デプロイ
STDIO ベースのデプロイ
ローカル
デフォルトの STDIO トランスポートを使用して、P4 MCP Server をマシン上で直接実行します。
次の内容を mcp.json に追加します。
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
注: この例では
envの値を明示的に指定しています。P4CONFIGが設定されている場合は、これらを省略して、代わりに「MCP クライアントの設定」セクションにある汎用設定例を使用できます。
Docker
STDIO トランスポートを使用して、Docker コンテナから P4 MCP Server を実行します。これにより、MCP クライアントがコンテナのライフサイクルを管理できます。
注: Docker を使用した実行は、現在 macOS と Linux のみでサポートされています。
前提条件
- Docker がインストールされ、実行中であること
- 有効な P4 認証情報と P4 サーバーへのアクセス権があること
Docker イメージをプルする
docker pull ghcr.io/perforce/p4mcp-server:latest
代わりにソースからビルドする
cd /path/to/p4mcp-server
docker build -t ghcr.io/perforce/p4mcp-server .
MCP クライアントの設定
次の内容を mcp.json に追加します。
{
"servers": {
"perforce-p4mcp-docker": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--hostname", "your-hostname",
"-e", "P4PORT=ssl:perforce.example.com:1666",
"-e", "P4USER=your_username",
"-e", "P4CLIENT=your_workspace",
"-e", "P4DAM_API_KEY=your_api_key",
"-v", "/Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:ro",
"ghcr.io/perforce/p4mcp-server:latest"
]
}
}
}
設定オプション
| フラグ | 説明 |
|---|---|
-i | 対話モード(STDIO に必須) |
--rm | 停止時にコンテナを削除する |
--hostname | ワークスペースのホスト制限に合わせる |
-e P4PORT | P4 サーバーのアドレス |
-e P4USER | P4 ユーザー名 |
-e P4CLIENT | ワークスペース名 |
-v | P4 チケットファイルをマウントする |
認証
P4 チケットを使用する場合:
# macOS/Linux
-v /Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:ro
注: チケットファイルにはフルパスを使用してください(
~は使用しないでください)。p4 loginの実行後、新しいチケットを読み込ませるために MCP サーバーを再起動してください。
注: デフォルトでは、コンテナは root として起動し、バインドマウントされたチケットファイルを非 root ユーザーの
mcpuserが読み取り可能な場所にコピーした後、権限を落として(gosu経由)、サーバーをmcpuserとして実行します。この自動コピーにより、ホストの所有権を保持するランタイム(ネイティブ Linux Docker/podman)では、別の uid が所有する所有者のみ読み取り可能な(0600)チケットファイルを使用できます。チケットの:roバインドマウントもサポートされています。ファイルはコピーされ、元の場所では変更されません(これは読み取り専用のコンテナルートファイルシステムとは異なります。後述を参照してください)。この自動コピーは、コンテナが root として起動した場合(デフォルト)のみ実行される点に注意してください。非 root uid の強制や読み取り専用ルートファイルシステムの使用により、この動作は以下で説明するように変わります。 **Kubernetes/制限付き(非 root 強制)プロファイル:**イメージは意図的に root として起動し、gosuを介してmcpuser(uid 1000)に切り替えるため、サーバーは常に非 root で実行されます。どちらの方法にも対応しています。runAsNonRoot/制限付き PodSecurity/OpenShift の制限付き SCC を使用する場合は、securityContext.runAsUser: 1000(チケットをマウントする場合はfsGroup: 1000も)を設定してください。このモードでは、エントリーポイントによる root 専用のチケットコピーがスキップされるため、マウントしたチケットは uid 1000 で読み取り可能である必要があります(所有者が一致するマウント、-e P4PASSWD="your_ticket_content"、またはpodman -v <host>:/home/mcpuser/.p4tickets:U)。
**ルートファイルシステムが読み取り専用(
--read-only/readOnlyRootFilesystem)の場合:**チケットのコピー先として書き込み可能な/home/mcpuserを用意してください(例:--tmpfs /home/mcpuser)。用意しない場合、チケットのコピーに失敗し、P4 は通常の認証エラーを報告します。
パスワードを使用する場合:
-e P4PASSWD="your_password"
ワークスペースのホスト制限
⚠️ **重要:**Docker コンテナーには、ローカルマシンとは異なる独自のホスト名があります。P4 ワークスペースが特定のホストに制限されている場合、
syncなどの操作は失敗します。
これを解決するには、コンテナーのホスト名をワークスペースのホスト制限に一致させます。
--hostname your-hostname
ワークスペースのホスト名を確認するには:
# macOS/Linux
p4 client -o your_workspace | grep "^Host:"
書き込み操作のためのクライアントルートのマウント
⚠️ 重要:デフォルトでは、Docker コンテナーからローカルのワークスペースファイルにアクセスできません。
sync、submit、reconcileなどの書き込み操作を行うには、クライアントルートディレクトリを同じパスでコンテナーにマウントする必要があります。
クライアントルートのボリュームマウントを追加します。
-v /path/to/your/client/root:/path/to/your/client/root
クライアントルートをマウントした設定例:
{
"servers": {
"perforce-p4mcp-docker": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--hostname", "your-hostname",
"-e", "P4PORT=ssl:perforce.example.com:1666",
"-e", "P4USER=your_username",
"-e", "P4CLIENT=your_workspace",
"-e", "P4DAM_API_KEY=your_api_key",
"-v", "/Users/your_username/.p4tickets:/home/mcpuser/.p4tickets",
"-v", "/path/to/client/root:/path/to/client/root",
"ghcr.io/perforce/p4mcp-server:latest"
]
}
}
}
クライアントルートを確認するには:
p4 client -o your_workspace | grep "^Root:"
**注:**コンテナー内のマウントパスは、クライアントルートのパスと完全に一致している必要があります。P4 は絶対パスでファイルを追跡するためです。
HTTP ベースのデプロイ
VM
HTTP トランスポートを使用して VM 上で MCP サーバーを実行すると、クライアントはネットワーク経由で接続できます。
VM 上でサーバーを起動します:
P4PORT=ssl:perforce.example.com:1666 P4USER=your_username P4PASSWD=YOUR_TICKET ./p4-mcp-server --readonly --transport http --port 8000
MCP クライアントを設定します:
以下を mcp.json に追加します。
{
"servers": {
"perforce-p4-mcp": {
"type": "http",
"url": "http://<ip-or-hostname>:8000/mcp"
}
}
}
**注:**選択したポートでの受信接続を VM のファイアウォールが許可していることを確認してください。本番環境で使用する場合は、TLS 対応のリバースプロキシの背後にサーバーを配置することを検討してください。
Docker
HTTP トランスポートを使用して Docker コンテナー内で MCP サーバーを実行し、ホストポート経由で MCP エンドポイントを公開します。
コンテナーを起動します:
docker run --rm -p 8000:8000 \
-e P4PORT=ssl:perforce.example.com:1666 \
-e P4USER=your_username \
-e P4PASSWD=YOUR_TICKET \
-e P4DAM_API_KEY=your_api_key \
ghcr.io/perforce/p4mcp-server:latest \
python3 -m p4mcp.main --readonly --transport http --port 8000
MCP クライアントを設定します:
以下を mcp.json に追加します。
{
"servers": {
"perforce-p4-mcp": {
"type": "http",
"url": "http://<ip-or-hostname>:8000/mcp"
}
}
}
**注:**Docker も HTTP ベースのデプロイに対応しています。コンテナーイメージのデフォルトは STDIO トランスポートのため、HTTP の起動コマンドでデフォルトのコマンドを明示的に上書きする必要があります。書き込み操作が必要な場合は、クライアントルートとチケットファイルのパスもコンテナーにマウントしてください。
Note: 以下の設定例では、
P4CONFIGが設定されている場合、envブロックで環境変数を設定する必要はありません。サーバーは、指定された P4CONFIG ファイルの設定を使用します。
Tip: uv がインストールされている場合は、
commandフィールドで/absolute/path/to/p4-mcp-serverの代わりにuvx p4mcp-serverを使用できます。これにより、バイナリを手動でダウンロードまたはビルドする必要がなくなります。uvx を使用したサーバー設定の例
{ "mcpServers": { "perforce-p4-mcp": { "command": "uvx", "args": [ "p4mcp-server", "--readonly", "--allow-usage" ], "env": { "P4PORT": "ssl:perforce.example.com:1666", "P4USER": "your_username", "P4CLIENT": "your_workspace", "P4DAM_API_KEY": "your_api_key" } } } }バイナリパスを使用したサーバー設定の例
{ "mcpServers": { "perforce-p4-mcp": { "command": "/absolute/path/to/p4-mcp-server", "env": { }, "args": [ "--readonly", "--allow-usage" ] } } }
JetBrains IDE(IntelliJ IDEA、Rider、PyCharm など)
詳しい設定手順については、JetBrains AI Assistant VCS Integration のドキュメントをご覧ください。
Claude Code
詳しくは、Claude Code MCP のドキュメントをご覧ください。
uvx を使用する場合(インストール不要):
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "uvx",
"args": [
"p4mcp-server",
"--readonly", "--allow-usage"
],
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
}
}
}
}
ビルド済みバイナリを使用する場合:
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Cursor
詳しくは、Cursor MCP のドキュメントをご覧ください。
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Eclipse
詳しくは、Eclipse MCP のドキュメントをご覧ください。
{
"servers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Kiro
詳しくは、Kiro MCP のドキュメントをご覧ください。
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
VS Code
詳しくは、VS Code のドキュメントをご覧ください。
{
"servers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Windsurf
詳しくは、Windsurf MCP のドキュメントをご覧ください。
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
P4 環境変数
P4PORT- P4 サーバーのアドレス。例:ssl:perforce.example.com:1666、localhost:1666P4USER- P4 のユーザー名P4CLIENT- 現在の P4 ワークスペース。省略可能ですが、設定を推奨します
結果数の上限を設定する環境変数
P4MCP_MAX_RESULTS- P4 サーバーがコマンドごとに返す行数の上限(p4.maxresults)。デフォルト:10000。上限を無効にするには0を設定します(サーバーのデフォルトが適用されます)。コマンドの結果がこの上限を超える場合、サーバーは結果を切り詰めずにエラーで処理を中止するため、余裕のある値を設定してください。--max-resultsCLI 引数で上書きできます。0 以上の整数を指定する必要があります。無効な値の場合、P4 への接続を試みる前に起動時にエラーとなります。P4MCP_MAX_SCAN_ROWS- P4 サーバーがコマンドごとにスキャンする行数の上限(p4.maxscanrows)。デフォルトでは未設定のため、スキャン上限は管理者/グループのポリシーに従います。--max-scan-rowsCLI 引数で上書きできます。指定する場合は、0 以上の整数である必要があります。
ログ用環境変数
P4MCP_LOG_DIR- ログファイルのディレクトリです。既定値は、サーバー実行ファイルのディレクトリ内のlogs/です。--log-dirCLI 引数で上書きできます。
SSL/TLS 用環境変数
P4MCP_TLS_CA_MODE- TLS 証明書のソースモードです。system(既定値):truststoreを介して OS の信頼ストアを使用します。注: このモードでは、truststoreがverify=パラメーターを上書きします。P4MCP_CA_BUNDLEまたは--ca-bundleで指定したカスタム CA バンドルは無視されます。カスタム CA バンドルを使用するには、P4MCP_TLS_CA_MODE=certifiを設定してください。certifi:truststoreの挿入を無効にし、Python の既定の TLS 証明書動作を使用します。カスタム CA バンドル(P4MCP_CA_BUNDLE/--ca-bundle)が有効になるのは、このモードのみです。
P4MCP_SSL_VERIFY- P4 Code Review API リクエストの SSL 検証を無効にするには、falseに設定します。既定値はtrueです。どちらの TLS モードでも機能します。P4MCP_CA_BUNDLE- P4 Code Review API リクエスト用のカスタム CA 証明書バンドル(PEM)のパスです。P4MCP_SSL_VERIFYより優先されます。有効にするには、P4MCP_TLS_CA_MODE=certifiが必要です。
テレメトリ用環境変数
OTEL_EXPORTER_OTLP_ENDPOINT- テレメトリのエクスポート先となる OTLP コレクターのエンドポイントです。既定値はhttps://grpc.public.prd.shared.perforce.comです。OTEL_EXPORTER_OTLP_PROTOCOL- OTLP エクスポートプロトコルです。grpcのみがサポートされています。それ以外の値を指定すると、警告が表示され、grpcにフォールバックします。
P4 DAM 用環境変数
P4DAM_API_KEY- P4 DAM API キーです。すべての P4 DAM API リクエストでAuthorization: account_key='<key>'として送信されます。有効な P4 DAM セッションが必要です。未設定の場合、P4 DAM ツールは登録されません。 起動時にツールセットは通知なしでスキップされます。
P4 DAM の URL の検出: P4 DAM のベース URL は、サーバー上の
P4.HTH.URLP4 プロパティから読み取られます。このプロパティが未設定の場合、P4 DAM のツール呼び出しは実行時に失敗します。P4 DAM の SSL: P4 DAM API リクエストでは、Swarm と同じ SSL 設定(
P4MCP_TLS_CA_MODE、--ca-bundle/P4MCP_CA_BUNDLE、--ssl-no-verify/P4MCP_SSL_VERIFY)が使用されます。
サポートされている引数
-
--readonly- 書き込み操作を制御します。- 指定した場合は読み取り専用モードを使用します。調査やテストに安全です。
- 省略した場合は書き込み操作を有効にします。P4 Server に対する適切な権限が必要です。
-
--allow-usage- 使用状況の統計情報を許可します。- 指定した場合は、匿名の使用状況統計情報の収集を許可します。
- 省略した場合は、すべての使用状況統計情報を無効にします。
-
--toolsets- 有効にするツールカテゴリを指定します。- 使用可能な値:
files、changelists、shelves、workspaces、jobs、reviews、streams、p4dam - デフォルト:すべてのツールセットが有効です。
--toolsetsの設定にかかわらず、query_serverは常に使用できます。
- 使用可能な値:
-
--search-transform- 検索ベースのツール検出を有効にし、トークンのオーバーヘッドを削減します。regex— 正規表現パターンマッチング検索ツールを公開します。対象を絞った検索に最適です。bm25— 自然言語による関連度順の検索ツールを公開します。探索的なクエリに最適です。both— それぞれ異なる名前(regex_search_tools/regex_call_toolおよびsemantic_search_tools/semantic_call_tool)で両方の検索ツールを公開します。- 省略した場合は、ツールカタログ全体がクライアントに送信されます(デフォルト。後方互換性があります)。
- 有効にした場合も、
query_serverは常にクライアントから直接確認できます。 - セキュリティ: 管理者権限チェック(
CheckPermissionMiddleware)と--readonlyによるフィルタリングは、引き続き完全に適用されます。検索変換は実際のツールカタログを内部で検索するため、ミドルウェアによってブロックされたツールや読み取り専用モードで除外されたツールが、検索インターフェースから検出または呼び出されることはありません。
-
--max-results <N>- P4 サーバーがコマンドごとに返す行数の上限(p4.maxresults)です。- デフォルト:
10000。上限を無効にするには0を設定します(サーバーのデフォルトが適用されます)。 - AI によるクエリの暴走でローカルメモリが枯渇したり、サーバーに過剰な負荷がかかったりするのを防ぎます。
- コマンドがこの上限を超える場合、サーバーはエラーで処理を中断します。結果は切り詰められないため、余裕のある値を設定してください。
- 0 以上の整数を指定する必要があります。無効な値の場合は、P4 への接続を試みる前に起動時に即座に失敗します。
優先順位:
--max-results>P4MCP_MAX_RESULTS> デフォルト(10000)。 - デフォルト:
-
--max-scan-rows <N>- P4 サーバーがコマンドごとにスキャンする行数の上限(p4.maxscanrows)です。- デフォルトでは未設定のため、スキャン上限は管理者またはグループのポリシーに従います。
- 指定する場合は0以上の整数を指定する必要があります。無効な値の場合は、起動時に即座に失敗します。
優先順位:
--max-scan-rows>P4MCP_MAX_SCAN_ROWS> デフォルト(未設定)。 -
--ssl-no-verify- P4 Code Review API リクエストの SSL 証明書検証を無効にします。- 自己署名証明書または内部 CA 証明書を使用する環境で便利です。
systemとcertifiの両方の TLS モードで動作します。- これらの SSL オプションは HTTPS の Swarm 接続にのみ影響します。Swarm URL が
http://の場合、効果はありません。
-
--ca-bundle <path>- P4 Code Review API リクエスト用のカスタム CA 証明書バンドル(PEM)へのパスです。- 検証を完全に無効にせずに内部 CA を信頼するには、このオプションを使用します。
- 有効にするには
P4MCP_TLS_CA_MODE=certifiが必要です。 デフォルトのsystemモードでは、truststoreが OS の信頼ストアを使用するため、この設定は無視されます。 --ca-bundleと--ssl-no-verifyの両方が指定された場合は、--ca-bundleが優先されます(指定されたバンドルを使用して検証が行われます)。
優先順位:
--ca-bundle>--ssl-no-verify>P4MCP_CA_BUNDLE>P4MCP_SSL_VERIFY> デフォルト(true)。CLI 引数は環境変数より優先されます。 -
--log-dir <path>- ログファイル用のディレクトリです。- ログファイル(アプリケーションログとセッションログの両方)の保存先として、任意のディレクトリを指定します。
- デフォルト:サーバー実行ファイルのディレクトリにある
logs/。 P4MCP_LOG_DIR環境変数でも設定できます。- CLI 引数は環境変数より優先されます。
優先順位:
--log-dir>P4MCP_LOG_DIR> デフォルト(サーバー実行ファイルのディレクトリにあるlogs/)。
必須の設定
- すべての設定で、
commandフィールドには絶対パスを使用してください。 - 各ホストで環境変数が適切に設定されていることを確認してください。
- ホストによって引数の解析方法が異なる場合があります。ホストのドキュメントを参照してください。
P4 の設定
ユーザー設定
設定例
# Windows (PowerShell)
$env:P4PORT = "ssl:perforce.example.com:1666"
$env:P4USER = "your_username"
$env:P4CLIENT = "your_workspace"
# macOS/Linux (Bash)
export P4PORT="ssl:perforce.example.com:1666"
export P4USER="your_username"
export P4CLIENT="your_workspace"
P4USERは標準ユーザーである必要があります。 P4 MCP Server はp4 describeやp4 changesなど、serviceタイプのユーザーには実行が許可されていないコマンドを実行するため、サービスユーザーを設定すると実行時にツールが失敗します。P4USERにはstandardタイプの Perforce ユーザーを設定してください。詳しくは、P4 CLI ドキュメントのp4 userを参照してください。
接続制限オプション
これらのオプションは、1 つの P4 コマンドで実行できる処理量を制限し、過剰なクエリからサーバーを保護します。
max_results— P4 サーバーがコマンドごとに返す行数の上限です。過剰なクエリから保護するため、デフォルトで有効になっており、十分に余裕のある値が設定されています。上限を厳しくするには、値を小さくしてください。P4MCP_MAX_RESULTSまたは--max-resultsで設定します。max_scan_rows— サーバーがコマンドごとにスキャンする行数の上限です。デフォルトでは未設定で、管理者/グループのポリシーに従います。P4MCP_MAX_SCAN_ROWSまたは--max-scan-rowsで設定します。
管理者設定
グループレベルおよびユーザーレベルのサーバープロパティを通じてアクセスを管理します。 P4 は次の 2 つのルールを順に適用し、各プロパティの値を 1 つに決定します。
- シーケンス番号が最も大きいものが優先されます。
-sフラグが主要なソートキーです。これはすべてのスコープに適用されるため、-s1のユーザープロパティやデフォルト値より、-s5のグループプロパティが優先されます。 - シーケンス番号が同じ場合は、スコープが優先順位を決めます。 ユーザー > グループ > グローバルの順です。同じシーケンス番号のグループ間では、グループ名のアルファベット順で最初のものが優先されます。
P4 は値の意味を比較しません。false が true より制限が厳しいとは判断しません。優先されたプロパティの値がそのまま返され、MCP サーバーによって確認されます。
適用されるプロパティがない場合、明示的に無効化されていない限り、MCP は有効なままです。
マスタースイッチ(グローバル無効化)
すべてのユーザーに対して MCP を無効にするには、次のようにします。
p4 property -a -n mcp.enabled -v false
グループ/ユーザーベースの制御を再び有効にするには、まずグローバルプロパティを削除します。
p4 property -d -n mcp.enabled
グループベースの制限
特定のグループのすべてのメンバーがアクセスできないようにするには、次のようにします。
p4 property -a -n mcp.enabled -v false -g noaccessgroup
同じ方法で、複数のグループ制限を設定できます。
ユーザーが設定の競合する複数のグループに属している場合、どの値が優先されるかは P4 のプロパティ解決によって決まります。
シーケンス番号(-s)が最も大きいものが優先されます。シーケンス番号が同じ場合は、グループ名のアルファベット順で最初のものが優先されます。
例:
p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true -s2 -g accessgroup
この例では、-s2 が -s1 より大きいため、accessgroup が優先されます。
ユーザーベースの制限
グループへの所属状況にかかわらず、特定のユーザーをブロックするには、次のようにします。
p4 property -a -n mcp.enabled -v false -u noaccessuser
シーケンス番号が同じ場合、ユーザーレベルのプロパティはグループレベルおよびグローバルの設定より優先されます(P4 のスコープによる優先順位)。
例:noaccessuser が MCP を有効にしている accessgroup に属していても、同じシーケンス番号のユーザープロパティが優先され、MCP は無効になります。
注:
-sの値が大きいグループプロパティは、シーケンス番号が小さいユーザープロパティより優先される場合があります。ユーザーレベルのプロパティを常に優先させるには、高い-s値を設定するか、それより大きいシーケンス番号のグループプロパティが存在しないようにしてください。
ツールセットの許可リスト(グローバル)
mcp.toolsets.allowed を使用して、サーバー全体で利用可能なツールセットを制限します。リストに記載されたツールセットのみが有効になり、それ以外はすべてブロックされます。
利用可能なツールセット:server、changelists、files、jobs、reviews、shelves、workspaces、streams
changelists と files のみを許可します。
p4 property -a -n mcp.toolsets.allowed -v changelists,files
すべてのツールセットを再び利用可能にするには、許可リストを削除します。
p4 property -d -n mcp.toolsets.allowed
グローバル読み取り専用モード
書き込み操作(変更ツール)をすべて無効にし、読み取り操作(クエリツール)は引き続き利用できるようにします: ``` p4 property -a -n mcp.toolsets.write -v false ```書き込みを再び有効にします:
p4 property -a -n mcp.toolsets.write -v true
write=false の場合、すべての modify_* ツールがブロックされますが、すべての query_* ツールは引き続き機能します。
グループごとのツールセットの有効化/無効化
特定のグループに対して、個々のツールセットを有効または無効にします。
特定のグループでツールセットを無効にします:
p4 property -a -n mcp.toolset.changelists.enabled -v false -g reviewers
reviewers のユーザーはチェンジリストを利用できなくなります。ほかのグループのユーザー(明示的な設定がない場合)は、デフォルトのアクセス権を維持します。
ツールセットを1つのグループだけに制限するには、アクセスを許可しないほかのすべてのグループで無効にします:
p4 property -a -n mcp.toolset.files.enabled -v false -g reviewers
p4 property -a -n mcp.toolset.files.enabled -v false -g interns
# Only groups without an explicit "false" retain default access to files
注: すべてのツールセットはデフォルトで有効です。グループに
enabled=trueを設定するのは、以前のfalse設定を明示的に上書きする場合を除き、冗長です。同じシーケンス番号では、グループのプロパティがグローバルプロパティより優先されます(P4のスコープ優先順位)。そのため、グループのenabled=trueはグローバルのenabled=falseを上書きできます。グローバル設定が上書きされないようにするには、高い-s値を指定してください。特定のグループだけにツールセットを限定するには、ブロックするグループで無効にします。
グループごとのツールセット別書き込み制御
グループレベルで、各ツールセットの書き込みアクセスを制御します。
グループごとに特定のツールセットへの書き込みを無効にします:
p4 property -a -n mcp.toolset.workspaces.write -v false -g reviewers
これにより、そのグループでは modify_workspaces がブロックされますが、query_workspaces は引き続き利用できます。
ツール固有のオーバーライド
mcp.toolset.<name>.tools を使用して、グループのアクセスをツールセット内の特定のツールに制限します。
開発者には query_files のみを許可し(modify_files はブロック)、次のように設定します:
p4 property -a -n mcp.toolset.files.tools -v query_files -g developers
リードにはクエリと変更の両方を許可します:
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews,modify_reviews -g leads
書き込みが有効な場合でも、ツール固有のオーバーライドによってアクセスを制限できます:
p4 property -a -n mcp.toolsets.write -v true
p4 property -a -n mcp.toolset.files.tools -v query_files -g developers
# Result: modify_files is BLOCKED — tool list restricts
注: ツール固有のオーバーライドで書き込み制限を回避することはできません。サーバーはツールリストを評価する前に、書き込み権限を確認します。いずれかのレベルで
write=falseが設定されている場合、ツールリストにかかわらず書き込みツールはブロックされます。
複数グループ間の競合解決
ユーザーが設定の競合する複数のグループに所属している場合、P4は各プロパティを単一の値に解決します。MCP サーバーは独自の複数グループ処理を行わず、P4が返す値を使用します。
指定されたプロパティ名に対するP4の解決ルール:
- 最も高い
-s(シーケンス番号)が優先されます。 これが第一のソートキーです。 - シーケンス番号が同じ場合: ユーザースコープ > グループスコープ > グローバルスコープ。
- 同じシーケンス番号のグループ間では: アルファベット順で最初のグループ名が優先されます。
P4は値を比較しません。内容ではなく、位置に基づいて優先されるエントリを選びます。
例 — シーケンス番号が同じグループ(デフォルト):
p4 property -a -n mcp.toolset.files.enabled -v true -g developers
p4 property -a -n mcp.toolset.files.enabled -v false -g leads
# User in both groups → resolved value is "true"
# Reason: "developers" < "leads" alphabetically, so developers wins
値を入れ替えても結果は false になります。値にかかわらず、引き続き developers が優先されます。
例 — 設定があるグループが1つだけの場合:
p4 property -a -n mcp.toolset.files.enabled -v false -g leads
# developers has no setting
# User in developers + leads → resolved value is "false"
# Reason: leads is the only group with a value, so it wins
例 — 書き込みアクセス:
p4 property -a -n mcp.toolset.files.write -v false -g developers
p4 property -a -n mcp.toolset.files.write -v true -g leads
# User in both groups → resolved value is "false"
# Reason: "developers" < "leads" alphabetically, not because false is "more restrictive"
例 — ツールリスト(結合されません):
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews -g developers
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews,modify_reviews -g leads
# User in both groups → resolved value is "query_reviews"
# Reason: "developers" wins alphabetically. P4 returns one value, not a union.
例 — -s を使用して優先されるグループを制御する場合:
p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true -s2 -g accessgroup
# accessgroup wins because -s2 > -s1 (highest sequence wins)
ヒント: 複数のグループがある場合に予測可能な結果を得るには、アルファベット順のグループ名に頼らず、常に明示的な
-s値を使用してください。
特定のツールセットをグローバルに無効化する
ほかのツールセットに影響を与えずに、すべてのユーザーに対して単一のツールセットを無効にします:
p4 property -a -n mcp.toolset.reviews.enabled -v false
これにより、すべてのユーザーに対して query_reviews と modify_reviews の両方がブロックされます。ほかのツールセットには影響しません。
特定のグループを緊急に読み取り専用にする
ほかのグループに影響を与えずに、特定のグループを読み取り専用に制限します:
p4 property -a -n mcp.toolsets.write -v false -g problematic_group
ほかのグループのユーザーは、引き続き完全な書き込みアクセスを維持します。ユーザーが制限対象のグループと制限のないグループの両方に所属している場合は、P4のプロパティ解決によって結果が決まります。同じシーケンス番号では、通常、アルファベット順で最初のグループ名が優先されます。予測可能な結果を得るには、明示的な -s 値を使用してください。
#### プロパティの解決方法
MCP サーバーは、以下の順序でプロパティを確認します。各プロパティは、標準の解決ルール(最も高い -s が優先され、同じシーケンスではユーザー > グループ > グローバル、その後にグループ名のアルファベット順で最初のものが優先)に従って、P4 によって個別に解決されます。
| 確認順 | プロパティ | MCP サーバーの動作 |
|---|---|---|
| 1 | mcp.enabled | 解決された値が false の場合、すべてのアクセスをブロックします |
| 2 | mcp.toolsets.write | 解決された値が false で、ツールが書き込み操作の場合、ブロックします |
| 3 | mcp.toolsets.allowed | 設定されている場合、一覧にあるツールセットのみ利用できます |
| 4 | mcp.toolset.<name>.enabled | 解決された値が false の場合、ツールセットをブロックします |
| 5 | mcp.toolset.<name>.write | 解決された値が false で、ツールが書き込み操作の場合、ブロックします |
| 6 | mcp.toolset.<name>.tools | 設定されている場合、ツールセット内で一覧にあるツールのみ利用できます |
重要な注意事項
-
各プロパティは、MCP サーバーが値を受け取る前に、P4 によって単一の値に解決されます。P4 では、まず最も高いシーケンス番号(
-s)を優先し、次に同順位の場合はスコープ(ユーザー > グループ > グローバル)、さらにグループ名のアルファベット順で最初のものを優先します。MCP サーバーは、複数のグループやスコープを独自に解決しません。 -
mcp.enabledはメインスイッチとして機能します。解決された値がfalseの場合、すべてのアクセスがブロックされます。 -
シーケンス番号が同じ場合、グループまたはユーザーのプロパティはグローバルプロパティより優先されます。グローバルの
falseが上書きされないようにするには、高い-s値を割り当ててください。 -
スコープの優先順位(ユーザー > グループ > グローバル)は、シーケンス番号が同じ場合のタイブレーカーとしてのみ適用されます。
-s5のグループプロパティは、デフォルトのシーケンスまたは-s1のユーザープロパティより優先されます。 -
ユーザーが複数のグループに所属している場合、(
-sが同じなら)アルファベット順で最初のグループ名が優先されます。優先された値はそのまま使用されます。P4 はtrueとfalseを比較したり、「最も制限の厳しい」値を選んだりしません。どのグループを優先するか制御するには、明示的な-s値を使用してください。 -
ツール固有のオーバーライド(
mcp.toolset.<name>.tools)によってアクセスをさらに制限できますが、書き込み制限を回避することはできません。書き込みの確認はツール一覧の確認より先に行われます。 -
サーバー側のキャッシュにより、プロパティの変更は60秒以内に反映されます。または、新しい MCP サーバー接続時に即時反映されます。
-
値が
falseの場合(大文字と小文字は区別しません)に限り、アクセスが無効化またはブロックされます。それ以外の値(true、1、yes、無効な文字列など)は、ブロックしない値として扱われます。
利用可能なツール
クエリツール(読み取り操作)
query_server - サーバー情報と現在のユーザーの詳細を取得します
- アクション:
server_info- P4 のバージョン、稼働時間、構成を取得しますcurrent_user- 現在のユーザー情報と権限を取得します
- ユースケース - サーバーの診断、ユーザーの確認、接続テスト
query_workspaces - ワークスペースの情報と管理
- アクション:
list- すべてのワークスペースを一覧表示します(ユーザーでの絞り込みは任意)get- ワークスペースの詳細な仕様を取得しますtype- ワークスペースの種類と構成を確認しますstatus- ワークスペースの同期状態を確認します
- パラメーター:
workspace_name、user、max_results - ユースケース: ワークスペースの検索、構成の確認、状態の確認
query_changelists - チェンジリストの情報と履歴にアクセスします
- アクション:
get- チェンジリストの詳細情報(ファイル、説明、ジョブ)を取得しますlist- フィルター(状態、ユーザー、ワークスペース)を指定してチェンジリストを一覧表示します
- パラメーター:
changelist_id、status(pending/submitted)、workspace_name、max_results - ユースケース: コードレビュー、履歴の追跡、チェンジリストの分析
query_files - ファイルの操作と情報
- **アクション**:
- `content` - 指定したリビジョンのファイル内容を取得します
- `history` - ファイルのリビジョン履歴と統合記録を取得します
- `info` - ファイルの基本情報(種類、サイズ、権限)を取得します
- `metadata` - ファイルのメタデータ(属性、ファイルサイズなど)を取得します
- `diff` - ファイルのバージョンを比較します(デポ間、または混在形式)
- `annotations` - blame 情報付きのファイル注釈を取得します
- `search` - 名前パターン(ワイルドカード照合)でファイルを検索します
- `grep` - 内容パターン(テキスト検索)でファイルを検索します
- **パラメーター**:`file_path`、`file2`(diff 用)、`pattern`(search/grep 用)、`case_insensitive`(grep 用)、`max_results`、`diff2`(ブール値)、`ranges`(content 用)
- `ranges` - `[start, end]`形式の行範囲のペアを指定する任意のリストです。行番号は1始まりで、終端を含みます(例:`[[10, 20], [50, 60]]`)。`content` アクションにのみ適用されます。設定すると、ファイル全体の代わりに、各範囲に対応するエントリーを含む `chunks` 配列がレスポンスとして返されます。
- **ユースケース**:コード分析、ファイル比較、履歴追跡、blame 分析、ファイル検出、内容検索、大きなファイルから指定した行範囲を取得
query_shelves - シェルブされたチェンジリストの操作と確認
- アクション:
list- ユーザー別または全体のシェルブされた変更を一覧表示しますdiff- シェルブされたファイルの差分を表示しますfiles- 特定のシェルフ内のファイルを一覧表示します
- パラメーター:
changelist_id、user、max_results - ユースケース:コードレビュー、作業中の進捗追跡、コラボレーション
query_jobs - ジョブ追跡と不具合管理
- アクション:
list_jobs- チェンジリストに関連付けられたジョブを一覧表示しますget_job- ジョブの詳細情報とステータスを取得します
- パラメーター:
changelist_id、job_id、max_results - ユースケース:不具合追跡、要件のトレーサビリティ、プロジェクト管理
query_reviews - レビューの検出、詳細、アクティビティ
- アクション:
list- 任意のフィルターを指定してすべてのレビューを一覧表示しますdashboard- 現在のユーザーのレビューダッシュボード(自分のレビュー、対応が必要なレビュー)を取得しますget- レビューの詳細情報を取得しますtransitions- レビューで利用可能な状態遷移を取得しますfiles_readby- ユーザーごとのファイル閲覧状況を取得しますfiles- レビュー内のファイルを取得します(バージョン範囲の指定は任意)activity- レビューのアクティビティ履歴を取得しますcomments- レビューへのコメントを取得します
- パラメーター:
review_id- レビュー ID(get、transitions、files_readby、files、comments、activity で必須)review_fields- 返すフィールドをカンマ区切りで指定します(例:"id,description,author,state")comments_fields- コメントのフィールド(デフォルト:"id,body,user,time")up_voters- 遷移時の賛成投票者のリストfrom_version、to_version- files アクションのバージョン範囲max_results- 結果の最大数(デフォルト:10)
- ユースケース:コードレビューの検出、レビュー状況の追跡、コメントの取得、レビューアクティビティの監視
query_streams - ストリーム階層、統合状況、ワークスペースの検証
- **アクション**:
- `list` - 任意のフィルター(パスパターン、所有者、タイプ)を指定してストリームを一覧表示します
- `get` - ストリームの詳細な仕様を取得します
- `children` - 指定したストリームの子ストリームを取得します
- `parent` - 親ストリームを取得します
- `graph` - ストリームグラフ全体(親と子)を取得します
- `integration_status` - ストリームと親ストリーム間の統合ステータスを取得します(p4 istat)
- `get_workspace` - ストリームに関連付けられたワークスペース仕様を取得します
- `list_workspaces` - ストリームに関連付けられたワークスペースを一覧表示します
- `validate_file` - ファイルパスがストリームのビューに適合するかを検証します
- `validate_submit` - ストリームのワークスペースで送信するため、オープン中のファイルを検証します
- `check_resolve` - 保留中のストリーム仕様の競合を確認します
- `interchanges` - ストリーム間で統合待ちの変更リストを一覧表示します
- **パラメーター**:
- `stream_name` - ストリームのデポパス(get、children、parent、graph、check_resolve、interchangesでは必須)
- `stream_path` - list用のパスパターン(例:`["//depot/..."]`)
- `filter` - list用のフィルター式(例:`"Owner=alice&Type=development"`)
- `fields` - listで返すフィールド(例:`["Stream", "Owner", "Type"]`)
- `workspace` - get_workspace、validate_file、validate_submit用のワークスペース名
- `file_paths` - validate_file用のファイルパス
- `view_without_edit` - 編集用にオープンせず、ロックされたストリーム仕様を表示します
- `at_change` - 変更リスト番号時点の過去のストリーム仕様を取得します
- `both_directions` - 両方向の統合ステータスを表示します
- `force_refresh` - istatキャッシュの更新を強制します
- `reverse`、`long_output`、`limit` - interchangesのオプション
- `unloaded`、`all_streams`、`viewmatch` - list用のフィルター
- `max_results` - 最大結果数
- **ユースケース**:ストリーム階層の探索、統合ステータスの追跡、ワークスペースの検証、ビューの互換性チェック
query_p4dam_assets - キーワードまたはフィルターでP4 DAMアセットを検索します
- パラメーター:
search_term、project_ids、repository_ids、path、tag、file_extension、user、all_revisions、max_results、offset - ユースケース:アセットの検索、プロジェクト/リポジトリ/タグ/拡張子によるフィルタリング、P4 DAMコンテンツの閲覧に使用します。まだデポパスがわからない場合に利用します。
query_p4dam_asset - 単一のP4 DAMアセットの完全なメタデータを取得します
- パラメーター:
depot_path(必須)、identifier、project_id、repository_id、include - ユースケース:既知のアセットについて、コミット情報、アセットバンドル、ウェブリンク、カスタム属性、プロジェクト/リポジトリとの一致情報を取得します。特定のファイルの詳細を取得するには、
query_p4dam_assetsの後に使用します。
query_p4dam_projects - P4 DAMプロジェクトを一覧表示します
- パラメーター:
search_term、limit、offset - ユースケース:アセットバンドルまたはファイルレビューを作成する前に利用可能なプロジェクトを探したり、他の呼び出しで使うプロジェクトIDを特定したりします。
query_p4dam_repositories - P4 DAMプロジェクト内のリポジトリを一覧表示します
- パラメーター:
project_id(必須)、search_term、limit、offset - ユースケース:アセットバンドルまたはファイルレビューの作成時に
stream_pathを指定したり、ブランチを見つけたりするために必要なリポジトリタイプ(helix_streamまたはhelix_classic)とlinked_streamsを確認します。
query_p4dam_helix_classic_branches - リポジトリ内のHelix Classicブランチを一覧表示します
- パラメーター:
project_id(必須)、repository_id(必須)、limit、offset - ユースケース:Helix Classicリポジトリでアセットバンドルまたはファイルレビューを作成する際に必要なブランチIDを確認します。
fetch_p4dam_media - P4 DAMのメディアURLを取得し、画像として表示します
- **パラメーター**:`url`(必須 — アセットの結果に含まれる `thumbnail_url`、`preview_url`、`sprite_url`、または `file_url`)
- **ユースケース**:画像アセットのサムネイル、プレビュー、スプライトシートをクライアントで直接レンダリングします。画像以外のファイルの場合は、画像コンテンツの代わりに MIME タイプとサイズを返します。`query_p4dam_assets` または `query_p4dam_asset` の結果から URL を渡してください。画像ファイルの場合にのみ `thumbnail_url`、`preview_url`、`sprite_url` が含まれます。
query_p4dam_file_reviews - プロジェクトのファイル(アセット)レビューを一覧表示
- パラメーター:
project_id(必須)、depot_path、include、limit、offset - ユースケース:プロジェクト内の進行中のレビューの閲覧、depot パスによる絞り込み、詳細取得に使用するレビュー UUID の検索。
query_p4dam_file_review - UUID で単一のファイルレビューを取得
- パラメーター:
project_id(必須)、review_id(必須) - ユースケース:状態、view_paths、asset_bundle、作成者、バンドルレビューの
download_urlなど、レビューの詳細をすべて取得します。
query_p4dam_workflows - P4 DAM ワークフローを一覧表示
- パラメーター:
include、limit、offset - ユースケース:利用可能なワークフローとその状態を確認します。
include=['states']を渡すと、すべての状態を 1 回の呼び出しで取得できます。ファイルレビュー操作のstateパラメーターには、状態のshort_nameを使用します。
query_p4dam_workflow - 短縮名または UUID で単一のワークフローを取得
- パラメーター:
workflow_id(必須)、include - ユースケース:ワークフローの状態(
kind:open/review/done、color、position)と遷移ルールを確認します。
query_p4dam_workflow_states - ワークフローの状態を一覧表示
- パラメーター:
workflow_id(必須)、limit、offset - ユースケース:
short_name、kind、color、positionを含むすべての状態を一覧表示します。ファイルレビューの作成または更新時にstateとして渡す値はshort_nameです。
query_p4dam_custom_attribute_templates - プロジェクトのカスタム属性テンプレートを一覧表示
- パラメーター:
project_id(必須) - ユースケース:値を設定する前に利用可能なカスタム属性を確認します。各テンプレートの UUID、名前、タイプ(
text、single-select、multi-select、checkbox)、選択式タイプのavailable_valuesを返します。UUID はupdate_p4dam_asset_custom_attributesに渡します。
変更ツール(書き込み操作)
modify_workspaces - ワークスペースの作成と管理
- アクション -
create、update、delete、switch - パラメーター -
name、specs(View、Root、Options などを含む WorkspaceSpec オブジェクト) - 要件 - 読み取り専用モードが無効であること、適切な権限があること
- ユースケース - 環境のセットアップ、ワークスペースのメンテナンス、ブランチの切り替え
modify_changelists - チェンジリストのライフサイクル管理
- アクション -
create、update、submit、delete、move_files - パラメーター -
changelist_id、description、file_paths - 安全性 - 所有権の確認、項目の詳細を示す、削除操作用の対話型 PROCEED/CANCEL 確認プロンプト
- ユースケース - コードの提出、作業の整理、ファイルのグループ化
modify_files - ファイルシステム操作とバージョン管理
- **アクション** - `add`、`edit`、`delete`、`move`、`revert`、`reconcile`、`resolve`、`sync`
- **パラメーター** - `file_paths`、`changelist`、`force`、`mode`(resolve 操作用)
- **resolve モード** - `auto`、`safe`、`force`、`preview`、`theirs`、`yours`
- **ユースケース** - ファイル編集、競合の解決、ワークスペースの同期
modify_shelves - 作業中の変更を棚上げする操作
- アクション -
shelve、unshelve、update、delete、unshelve_to_changelist - パラメーター -
changelist_id、file_paths、target_changelist、force - ユースケース - 一時保存、コードの共有、実験前のバックアップ
modify_jobs - ジョブとチェンジリストの連携
- アクション -
link_job、unlink_job - パラメーター -
changelist_id、job_id - ユースケース - 不具合追跡との連携、要件の紐付け
modify_reviews - レビューの作成、状態遷移、参加者、コメント
- アクション:
create- チェンジリストから新しいレビューを作成refresh_projects- プロジェクトとの関連付けを更新vote- レビューに投票(up、down、clear)transition- レビューの状態を変更(needsRevision、needsReview、approved、committed、rejected、archived)append_participants- レビューにレビュアー/グループを追加replace_participants- すべての参加者を置き換えdelete_participants- レビューから参加者を削除add_comment- レビューにコメントを追加reply_comment- 既存のコメントに返信edit_comment- 既存のコメントの本文やタスク状態を編集append_change- 既存のレビューにチェンジリストを追加replace_with_change- レビューの内容をチェンジリストで置き換えjoin- 参加者としてレビューに参加leave- レビューから退出archive_inactive- 非アクティブなレビューをアーカイブmark_comment_read/mark_comment_unread- 個別のコメントの既読状態を設定mark_all_comments_read/mark_all_comments_unread- すべてのコメントの既読状態を設定update_author- レビューの作成者を変更update_description- レビューの説明を更新obliterate- レビューを完全に削除
- パラメーター:
review_id- レビュー ID(ほとんどのアクションで必須)change_id- チェンジリスト ID(create、append_change、replace_with_change で必須)description- レビューの説明reviewers、required_reviewers- レビュアーのユーザー名リストreviewer_groups- 要件を指定したレビュアーグループvote_value- 投票値:up、down、clearversion- 投票対象のレビューのバージョンtransition- 遷移先の状態:needsRevision、needsReview、approved、committed、approved:commit、rejected、archivedjobs、fix_status、cleanup- 状態遷移時のジョブの紐付けおよびクリーンアップのオプションusers、groups- 追加/置換/削除する参加者の構造化データbody- コメント本文task_state- コメントのタスク状態:open、comment、addressed、verified。add_commentで指定できるのはopenとcommentのみです。addressedとverifiedはedit_commentで設定できます。notify- 通知モード:immediate、delayedcomment_id- 返信、編集、既読/未読の設定に使うコメント IDcontext- コメントのコンテキスト(ファイル、行番号、内容、バージョン)not_updated_since、max_reviews- archive_inactive のフィルターnew_author、new_description- 更新アクションに指定する値
- ユースケース: コードレビューのワークフロー、レビュー状態の管理、共同でのコメント、参加者の管理、レビューのクリーンアップ
modify_streams - ストリームのライフサイクル、仕様の編集、伝播、ワークスペース管理
- **アクション**:
- `create` - 新しいストリームを作成します(メインライン、開発、リリース、タスク、仮想など)。
- `update` - ストリームのプロパティ(名前、説明、オプション、パス、parent_view)を更新します。
- `delete` - ストリームを削除します。
- `edit_spec` - ストリーム仕様を編集用に開きます(p4 stream edit)。
- `resolve_spec` - ストリーム仕様の競合を解決します。
- `revert_spec` - ストリーム仕様の編集を取り消します。
- `shelve_spec` - ストリーム仕様の編集を番号付き変更リストにシェルブします。
- `unshelve_spec` - ストリーム仕様の編集をアンシェルブします。
- `copy` - 親ストリームと子ストリーム間で変更をコピーします。
- `merge` - 親ストリームと子ストリーム間で変更をマージします。
- `integrate` - 高度なオプションを指定して変更をインテグレートします。
- `populate` - ファイルを使用して新しいストリームを作成します(ブランチ)。
- `switch` - ワークスペースを別のストリームに切り替えます。
- `create_workspace` - ストリームに関連付けられた新しいワークスペースを作成します。
- **パラメーター**:
- `stream_name` - ストリームのデポパス(create、update、delete、edit_spec、resolve_spec、revert_spec、switchで必須)。
- `stream_type` - 作成するストリームの種類:`mainline`、`development`、`sparsedev`、`release`、`sparserel`、`task`、`virtual`
- `parent` - mainline以外を作成する場合の親ストリーム
- `name`、`description` - ストリームの表示名と説明
- `options` - ストリームのオプション:`allsubmit/ownersubmit`、`unlocked/locked`、`toparent/notoparent`、`fromparent/nofromparent`、`mergedown/mergeany`
- `parent_view` - 親ビューの扱い:`inherit`または`noinherit`
- `paths`、`remapped`、`ignored` - ストリームのビューマッピング
- `changelist` - 仕様の編集または伝播操作に使用する変更リスト
- `resolve_mode` - resolve_specの解決モード:`auto`、`accept_theirs`、`accept_yours`
- `parent_stream` - 伝播時に親を上書きします(-Pフラグ)。
- `branch` - integrate/populate用のブランチ仕様(-bフラグ)
- `file_paths` - 伝播するファイルのパス
- `preview` - プレビューのみを実行し、変更は行いません(-nフラグ)。
- `force` - 操作を強制します(-fフラグ)。
- `reverse` - 方向を逆にします(-rフラグ)。
- `max_files` - 処理するファイル数を制限します(-mフラグ)。
- `quiet` - 情報メッセージを抑制します(-qフラグ)。
- `output_base` - 解決がスケジュールされたベースリビジョンを表示します(merge/integrateの-Obフラグ)。または、作成されたファイルを一覧表示します(populateの-oフラグ)。
- `virtual` - 仮想ストリームを使用してコピーします(-vフラグ、copyのみ)。
- `schedule_branch_resolve` - 自動ブランチ作成の代わりにブランチ解決をスケジュールします(-Rbフラグ、integrateのみ)。
- `integrate_around_deleted` - 削除されたリビジョンを回避してインテグレートします(-Diフラグ、integrateのみ)。
- `skip_cherry_picked` - すでにインテグレートされたチェリーピック済みのリビジョンをスキップします(-Rsフラグ、integrateのみ)。
- `source_path`、`target_path` - populateのソースパスとターゲットパス
- `workspace` - switchで使用するワークスペース名
- `workspace_name`、`root`、`host`、`alt_roots` - ワークスペース作成用のパラメーター
- **安全対策**: ストリームの存在確認、ロックされたストリームの検出、関連付けられたワークスペースに関する警告、ビューに影響する変更に対するオープン中のファイルの確認
- **ユースケース**: ストリームの作成と管理、ブランチの伝播(merge/copy/integrate)、仕様の競合解決、ワークスペースのプロビジョニング
create_p4dam_asset_bundle - P4 DAMアセットバンドルを作成
- パラメーター:
depot_path(必須。.p4bundleで終わる必要があります)、project(必須)、repository(必須)、view_paths(必須)、stream_path、helix_classic_branch、description、hero_file_path - ユースケース: レビュー用に、名前と範囲を指定したデポファイルのコレクションを作成します。Helix Streamリポジトリでは
stream_pathを、Helix Classicリポジトリではhelix_classic_branchを指定してください。
update_p4dam_asset_bundle - 既存のアセットバンドルを更新
- パラメーター:
bundle_id(必須)、description、view_paths、hero_file_path - ユースケース: バンドルの説明の変更、ファイル範囲(
view_paths)の調整、カバー画像の更新に使用します。作成後、depot_pathは変更できません。
delete_p4dam_asset_bundle - P4 DAM アセットバンドルを削除します
- パラメーター:
bundle_id(必須) - ユースケース:不要になったアセットバンドルを削除します。元に戻せません。
sync_p4dam_asset_bundle - アセットバンドルのファイルをローカルワークスペースに同期します
- パラメーター:
view_paths(必須)、workspace_root(必須)、client_name、bundle_id、stream_path - ユースケース:アセットバンドルの対象ファイルを
p4 syncでダウンロードします。名前付きの P4 クライアントを作成または再利用し、以降の同期は差分のみを取得します。Helix Stream リポジトリではstream_pathを使用します(LimitViewを適用するには Perforce 2025.2 以降が必要です)。
create_p4dam_file_review - P4 DAM ファイルレビューを作成します
- パラメーター:
project_id(必須)、name(必須)、depot_path(必須)、view_paths(必須)、state(必須)、repository、helix_classic_branch、asset_bundle、hero_file_path、description、position、base_commit_id、head_commit_id - ユースケース:単一アセットまたはアセットバンドル(
.p4bundle)のレビューを開始します。バンドルのレビューでは、asset_bundleを省略するとdepot_pathから自動検出されます。
update_p4dam_file_review - P4 DAM ファイルレビューを更新します
- パラメーター:
project_id(必須)、review_id(必須)、state、name、view_paths、hero_file_path、description、position - ユースケース:レビューを新しいワークフロー状態に移行したり、名前や説明を更新したり、表示範囲を調整したりします。状態の遷移は、現在のユーザーに対してプロジェクトのワークフローで許可されている必要があります。
delete_p4dam_file_review - P4 DAM ファイルレビューを削除します
- パラメーター:
project_id(必須)、review_id(必須) - ユースケース:不要になったレビューを削除します。元に戻せません。成功すると、API は削除されたレビューオブジェクトを返します。
update_p4dam_asset_tags - アセットタグと自動タグを追加または削除します
- パラメーター:
paths(必須 —{path, identifier?}のリスト)、create、delete、delete_auto、propagatable、identifier - ユースケース:1 回の呼び出しで 1 つ以上のアセットにタグを付けます。個別のファイル、特定のリビジョン、再帰的なフォルダーパス(
//depot/folder/...)に対応しています。createはユーザータグを追加し、deleteはユーザータグを削除し、delete_autoは自動生成されたタグを削除します。propagatable=trueを設定すると、最新のリビジョンと今後のすべてのリビジョンにタグが適用されます。
create_p4dam_comment - ファイルレビューまたはファイルにコメントを投稿するか、コメントに返信します
- パラメーター:
type(必須)、content(必須)、project、repository、file_review、commit、path、stream_path、helix_classic_branch、comment - ユースケース:アセットバンドルのファイルレビュー(
file_review)、レビュー内の特定ファイル(file_review_file)、レビューなしのコミット済みファイルまたはアセットバンドル(commit_file)にコメントするか、既存のコメント(comment)に返信します。必須パラメーターはタイプによって異なります。typeの説明を参照してください。
update_p4dam_asset_custom_attributes - アセットのカスタム属性値を設定または削除します
- パラメーター:
paths(必須 —{path, identifier?}のリスト)、create({uuid, value}のリスト)、delete(削除する属性 UUID のリスト)、propagatable - ユースケース:1 つ以上のアセットのカスタムメタデータを設定またはクリアします。まず
query_p4dam_custom_attribute_templatesで利用可能な属性とその UUID を確認してください。text/single-select/checkboxタイプではvalueは文字列、multi-selectタイプでは文字列のリストです。
regenerate_p4dam_preview - アセットのプレビュー画像を再生成します
- パラメーター:
depot_path(必須)、commit_id(必須) - ユースケース: プレビューが存在しない場合や古くなっている場合に、プレビュー生成を再実行します。
commit_idはquery_p4dam_assetの結果に含まれるチェンジセット番号です。
ツールの応答に含まれる警告
P4 コマンドが問題のない情報メッセージや警告メッセージ(たとえば、
file(s) up-to-dateやfile not on client)を出力した場合、ツールは成功を示すstatusを返し、メッセージ本文を省略可能なトップレベルのwarningsリストに含めます。このフィールドは、警告が1つ以上ある場合にのみ表示されます。実際のエラーには影響せず、従来どおりcodeフィールドとerrorフィールドを含むエラーを示すstatusが返されます。
ログと使用状況データ
ログシステム
ログの保存場所:
- アプリケーションログ:
logs/p4mcp.log- サーバーの主な操作とエラー - セッションログ:
logs/sessions/*.log- サーバーの起動引数に--allow-usageフラグを指定した場合にのみ、個別のセッションの操作が記録されます。
使用状況データ
プライバシーを最優先する方針:
- デフォルトで無効: 明示的な同意がない限り、データは収集されません
- 同意に基づく: 初回起動時にテレメトリーへの許可を求めます
- 透明性: 収集するデータについて明確に説明します
- いつでも撤回可能: いつでも簡単にオプトアウトできます
収集されるデータ(同意した場合):
- ツールの使用頻度(匿名化)
- エラー率と種類(個人データは含まれません)
- パフォーマンス指標
- 機能の利用状況
- P4 サーバーのバージョン
収集されないデータ:
- ファイルの内容や名前
- バージョンを除く P4 サーバーの詳細
- ユーザー認証情報や個人情報
- 特定のプロジェクトに関する情報
制御:
- 使用状況データは、起動時に
--allow-usage引数を指定した場合にのみ収集されます。
トラブルシューティング
サーバーの起動に関する問題
サーバーを起動できない
症状: OS がバイナリを見つけられない、または実行できません。エラーには ENOENT または "No such file or directory" が含まれます。
解決策:
- パスを確認する:
commandフィールドに、OS に応じた正しい絶対パスが指定されていることを確認します。- macOS/Linux:
/absolute/path/to/p4-mcp-server - Windows:
C:\absolute\path\to\p4-mcp-server.exe
- macOS/Linux:
- バイナリが存在し、実行可能であることを確認する:
- macOS/Linux:
ls -l /absolute/path/to/p4-mcp-server && chmod +x /absolute/path/to/p4-mcp-server - Windows:
dir C:\absolute\path\to\p4-mcp-server.exe
- macOS/Linux:
- Windows では、バイナリがブロックされていないことを確認する:
.exeファイルを右クリックし、プロパティを選択して、表示される場合はブロックの解除をクリックします。
サーバーへの接続に失敗しました。$P4PORT を確認してください
症状:P4 Server に接続できません
解決策:
P4PORT環境変数を確認します:echo $P4PORT(macOS)またはecho $env:P4PORT(Windows)- 直接接続をテストします:
p4 info - サーバーが利用可能か確認します:
ping perforce.example.com - ポートとプロトコルを確認します(SSL 接続の場合は
ssl:プレフィックスを付けます)。
SSL 証明書が信頼されていません(P4 接続)
症状:P4 サーバーへの接続時に SSL の信頼エラーが発生します
解決策:
- サーバーを信頼します:
p4 trust -f -y - 信頼ステータスを確認します:
p4 trust -l - 問題が解決しない場合は、SSL の設定を確認します。
P4 Code Review API(reviews)の SSL 証明書エラー
症状:レビュー ツールの使用時に CERTIFICATE_VERIFY_FAILED エラーが発生します
解決策:
- システムの信頼ストア:デフォルトでは、サーバーは
truststoreを介して OS の信頼ストアを使用します。社内 CA が OS の証明書ストアにインストールされていることを確認してください。 - カスタム CA バンドル:カスタム CA 証明書を使用するには、まず
P4MCP_TLS_CA_MODE=certifiを設定して(truststoreを無効にして)から、--ca-bundle /path/to/ca.pemまたはP4MCP_CA_BUNDLEで CA パスを指定する必要があります。デフォルトのsystemモードでは、truststoreがカスタム CA バンドルを上書きするため、これらは通知なく無視されます。 - 検証を無効にする:
--ssl-no-verifyを使用するか、P4MCP_SSL_VERIFY=falseを設定します(本番環境では推奨されません)。これはどちらの TLS モードでも機能します。
注: これらの SSL 設定が適用されるのは、Swarm URL が HTTPS を使用している場合のみです。Swarm が
http://URL で設定されている場合、SSL 検証は行われず、これらの設定も効果がありません。
認証の問題
ユーザーがログインしていません
症状:認証に失敗します
解決策:
- P4 にログインします:
p4 login -a - ログイン状態を確認します:
p4 login -s - ユーザーが存在することを確認します:
p4 users -m 1 your_username - 問題が解決しない場合は、パスワードを確認するか、チケットベースの認証を使用します。
パスワードが無効です
症状:ログインに失敗します
解決策:
- P4 管理者を通じてパスワードをリセットします。
- チケットベースの認証を使用します:
p4 login -a - ユーザー名が正しいことを確認します:
p4 info
ワークスペースの問題
クライアントが不明です
症状:ワークスペースが見つからないというエラーが発生します
解決策:
- 利用可能なワークスペースを一覧表示します:
p4 clients P4CLIENT環境変数を確認します。- 必要に応じてワークスペースを作成します:
p4 client workspace_name - ワークスペースの所有者を確認します:
p4 client -o workspace_name
ファイルがクライアントビューにありません
症状:ファイルがワークスペースのマッピング範囲外にあります
解決策:
- クライアントビューを確認します:
p4 client -o workspace_name - 必要なパスが含まれるようにワークスペースのマッピングを更新します。
p4 where file_pathを使用してマッピングを確認します。
権限エラー
操作が許可されていません
症状:操作に必要な権限が不足しています
解決策:
- ファイルの所有権を確認します:
p4 opened file_path - ユーザー権限を確認します:
p4 protects file_path - 適切なグループに所属していることを確認します。
- 管理者操作の場合は、管理者権限を確認します。
ファイルは別のユーザーによって開かれています
症状:排他ロックが競合しています
解決策:
- ファイルを開いているユーザーを確認します:
p4 opened file_path - 競合を解決するため、該当ユーザーに連絡します。
- 必要に応じて、管理者が操作を強制できます。
操作が遅い
症状:応答時間が長い
解決策:
max_resultsパラメーターを使用して、クエリのサイズを制限します。- ワイルドカードではなく、具体的なファイルパスを使用します。
- P4 へのネットワーク接続を確認します。
- サーバーのパフォーマンスを監視します。
メモリの問題
症状:メモリ使用量が多い
解決策:
- 大きなクエリでは
max_resultsを減らします。 - ファイルをバッチ処理します。
- 長時間実行するセッションでは、MCP サーバーを定期的に再起動します。
ツールの実行
ツールを実行できない
症状:組み込みツールまたは他の MCP ツールとの競合
解決策:
- 環境または設定で、組み込みツールや競合する MCP サーバーツールを無効にします。
- P4 MCP サーバーのツールが適切に登録され、有効になっていることを確認します。
- 設定変更を適用した後、正しいツールを読み込むために MCP サーバーを再起動します。
正しいツールが選択されない
症状:コンテキストが無効、またはセッション履歴が古い
解決策:
- プロンプトを作成する際に、P4 関連のコンテキストを指定します。
- 既存のセッションが古い場合や、競合するプロンプト履歴が含まれている場合は、新しいセッションを開始します。
よくあるエラーパターン
- 認証:MCP の操作を行う前に、有効なログイン状態であることを確認します。
- ワークスペースのマッピング:クライアントビューに対象ファイルが含まれていることを確認します。
- 権限:書き込み操作に必要なユーザーとファイルの権限を確認します。
- ネットワーク:リモート P4 サーバーへの接続を確認します。
ヘルプの利用
- ログを確認する:まず、必ず
logs/p4mcp.logを確認します。 - P4 をテストする:MCP のトラブルシューティングを行う前に、
p4 infoが機能することを確認します。 - コミュニティに問題を報告する:ログの抜粋と環境の詳細を添えて問題を報告します。
サポート
Perforce P4 MCP Server はコミュニティによってサポートされるプロジェクトであり、Perforce による公式サポートの対象ではありません。 プルリクエストと問題への対応は、プロジェクトのモデレーター(Perforce 組織外のメンバーを含む、審査済みの個人またはチームの場合があります)の責任です。 すべての問題は GitHub を通じて報告し、管理してください(Perforce の標準サポートプロセスは利用しないでください)。
貢献
P4 MCP Server プロジェクトへの貢献を歓迎します。
ライセンス
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細については LICENSE を参照してください。
サードパーティに関する通知
このプロジェクトにはサードパーティのコンポーネントが含まれています。それらのライセンスと帰属表示は THIRD-PARTY-NOTICES に記載されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。