p4plan-mcp について
p4plan-mcpは、P4 PlanのGraphQL APIを通じてAIアシスタントがプロジェクトデータを扱うためのステートレスなMCPサーバーです。読み取り専用モードも利用できます。
主な機能
- 01GraphQL経由でP4 Planに接続
- 02タスク、スプリント、バグの管理
- 03コメントとカスタムフィールドの操作
- 04フォルダーを制限した添付ファイルのアップロード
- 05読み取り専用モード
活用シーン
- 01プロジェクトのタスク検索と更新
- 02スプリントやバグ情報の確認
- 03コメントの追加やファイルの添付
- 04アシスタントの操作を読み取り専用に制限
MCP 対応
stdio経由でClaudeやVS Code CopilotなどのクライアントにP4 Planのツールを提供し、JWT認証をGraphQL APIに転送します。読み取り専用モードでは読み取りツールのみを登録します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @perforce/p4plan-mcpP4PLAN_API_AUTH_TOKENシークレットJWT bearer token for the P4 Plan GraphQL API. Forwarded as Authorization on every tool call.P4PLAN_API_URLURL of the P4 Plan GraphQL API (default: http://localhost:4000).P4PLAN_ALLOW_SELF_SIGNED_CERTSSet to 'true' to accept self-signed TLS certificates from the GraphQL API. Default: false.P4PLAN_READONLYSet to 'true' to expose only the tools that read (same as the --readonly argument). Default: false.P4PLAN_UPLOAD_DIRSFolders upload_attachment may read files from, besides the workspace folders the MCP client shares. Separate several with ':' (';' on Windows).ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
P4 Plan MCP サーバー
MCP(Model Context Protocol)サーバー for P4 Plan。Claude や VS Code Copilot などの AI アシスタントが、P4 Plan のプロジェクト管理データを操作できるようにします。
アーキテクチャ · 前提条件 · クイックスタート · インストール · クライアント設定 · ツール
スキル · ログ記録 · トラブルシューティング · 開発 · ライセンス
アーキテクチャ
このサービスは、stdio トランスポート(stdin/stdout)を使用して、MCP クライアント(AI アシスタント)と P4 Plan GraphQL API の間をつなぐステートレスなプロトコルアダプターとして機能します。
┌─────────────────┐ stdio (stdin/stdout) ┌─────────────────┐ GraphQL ┌─────────────────┐
│ AI Client │ ────────────────────────▶ │ P4 Plan MCP │ ──────────────▶ │ P4 Plan GraphQL │
│(Claude, Copilot)│ Spawns as child process │ Server │ Port 4000 │ API │
│ │ P4PLAN_API_AUTH_TOKEN │ (stateless) │ Bearer token │ │
└─────────────────┘ env var └─────────────────┘ forwarded └─────────────────┘
クライアントは、子プロセスとして MCP サーバーを起動します。認証には P4PLAN_API_AUTH_TOKEN 環境変数を使用します。サーバーは起動時にこの変数を検証し、各ツール呼び出しで GraphQL API に転送します。
前提条件
| 要件 | バージョン | 備考 |
|---|---|---|
| Node.js | >= 20(24+ 推奨) | サーバーは ES2023 を対象としています。node -v で確認してください。 |
| npm | >= 9 | Node.js に付属しています。npm -v で確認してください。 |
| P4 Plan API | >= 2026.1.002 | すべてのツール操作に必要です。それ以前のバージョンはサポートされていません。 |
ヒント: nvm を使用して Node.js のバージョンを管理するか、Docker を使用して Node.js の要件を完全に回避できます。
クイックスタート(npx)
最も手軽に始められる方法です。インストールは不要です。MCP クライアントで npx を使用するよう設定するだけです。
npx -y @perforce/p4plan-mcp
npx はサーバーの最新バージョンを自動的にダウンロードして実行します。MCP クライアント(VS Code、Claude Desktop など)が処理するため、以下の設定を追加してチャットを始めるだけです。
VS Code — .vscode/mcp.json に追加します:
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
Claude Desktop — 設定に追加します:
{
"mcpServers": {
"p4-plan": {
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
注:
-yフラグを指定すると npm のインストール確認プロンプトが自動的に承認されるため、ユーザーの操作なしでサーバーが起動します。
Docker、セキュアなトークンプロンプト、ローカルビルドなど、その他のオプションについてはクライアント設定をご覧ください。
MCP レジストリ
このサーバーは、公式 MCP Registry に io.github.perforce/p4plan-mcp として公開されています。レジストリ API から見つけることができます:
curl 'https://registry.modelcontextprotocol.io/v0/servers?search=io.github.perforce/p4plan-mcp'
レジストリ検索に対応した MCP クライアントでは、npm パッケージ識別子を知らなくても、名前を指定してサーバーをインストールできます。
インストール
ソースからビルド
開発時や、ローカルクローンから実行する場合:
npm ci
npm run build
# For using npx locally
npm link
Docker から実行
Node.js をローカルにインストールする代わりに、Docker 経由で MCP サーバーを実行します。MCP クライアント(VS Code、Claude Desktop)がコンテナを子プロセスとして起動します。npx と同じ動作ですが、コマンドに docker を使用します。
イメージは Docker Hub の perforce/p4plan-mcp で公開されています。リリースのたびに、SLSA の来歴情報と SBOM の証明書を付けて、マルチアーキテクチャ(linux/amd64 + linux/arm64)向けにビルドされます。
VS Code(.vscode/mcp.json):
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "P4PLAN_API_AUTH_TOKEN=YOUR_JWT_TOKEN",
"-e", "P4PLAN_API_URL=http://host.docker.internal:4000",
"perforce/p4plan-mcp:latest"
]
}
}
}
Claude Desktop:
{
"mcpServers": {
"p4-plan": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "P4PLAN_API_AUTH_TOKEN=YOUR_JWT_TOKEN",
"-e", "P4PLAN_API_URL=http://host.docker.internal:4000",
"perforce/p4plan-mcp:latest"
]
}
}
}
注: ホストマシン上で稼働している P4 Plan GraphQL API に接続するには、
host.docker.internal(macOS/Windows)または172.17.0.1(Linux)を使用します。
特定のバージョンを固定するには、 再現可能なデプロイのために
:latestを:2026.3.2(または任意のタグ)に置き換えます。
ローカルでビルドする場合(未リリースの変更を使った開発用):
docker build -t p4plan-mcp:dev .
# then swap "perforce/p4plan-mcp:latest" for "p4plan-mcp:dev" in the configs above
設定
サンプル設定をコピーし、次のように設定します。
cp config-example.env .env
.env を編集し、設定を追加します。
# JWT token for authenticating with P4 Plan GraphQL API
# Obtain via: login mutation on the GraphQL API
P4PLAN_API_AUTH_TOKEN=your-jwt-token
# P4 Plan GraphQL API URL — base origin only. Do not include a path or a
# trailing slash: the server appends /graphql, /healthcheck and /attachment/<id>
# itself, so a trailing slash produces //graphql.
P4PLAN_API_URL=https://p4plan-api.example.com
# Logging
LOG_LEVEL=info
# Maximum number of results returned by search_tasks (default: 400)
# SEARCH_LIMIT=400
# Allow self-signed TLS certificates when connecting to the P4 Plan API over HTTPS
# Set to true if your API uses a self-signed or untrusted certificate
# P4PLAN_ALLOW_SELF_SIGNED_CERTS=true
# Read-only mode: expose only the tools that read (same as the --readonly argument)
# P4PLAN_READONLY=true
# Folders upload_attachment may read files from, besides the workspace folders
# the MCP client shares. Separate several with ":" (";" on Windows)
# P4PLAN_UPLOAD_DIRS=/Users/me/Screenshots:/Users/me/logs
サーバーは stdin/stdout 経由で通信します。対話的な実行を想定していません。MCP クライアント(VS Code、Claude Desktop)が子プロセスとして自動的に起動します。
読み取り専用モード
--readonly 引数を指定してサーバーを起動するか、P4PLAN_READONLY=true を設定すると、読み取り専用になります。
- 読み取りを行うツールだけが登録されます。作成、更新、コメント追加、リンク、コミット、削除を行うツールは、モデルに一切提供されません。
- さらに、各ツールが実行するすべての GraphQL リクエストを検証し、単純なクエリだけを P4 Plan API に送信します。ミューテーション、サブスクリプション、および分類できないものは拒否されます。
- 変更できないことをモデルに伝えるため、モデルは変更を試みず、その旨を説明します。書き込みのみを対象とするスキル(
comment-html-format、mentions)は除外されます。
これにより、P4 Plan から読み取ったコンテンツ(タスクの説明やコメントなど)が、このサーバーを介してモデルにデータを変更させることはできません。
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp", "--readonly"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
Docker では、-e P4PLAN_READONLY=true を渡すか、イメージ名の後に --readonly を指定します。Docker Compose では、シェルまたは .env で P4PLAN_READONLY=true を設定します。docker-compose.yml がその値をコンテナに渡します。
読み取り専用モードで制限されるのは MCP サーバーの動作であり、トークンの権限ではありません。最も強い保証を得るには、読み取りアクセスのみを持つ P4 Plan ユーザーとして認証してください。
ファイルのアップロード
upload_attachment は、ローカルファイルまたはモデルが作成したテキストを、タスク、バグ、スプリント、またはリリースに添付します。ローカルファイルの読み取りが可能だと、プロンプトインジェクションによって ~/.ssh/id_rsa のようなファイルを要求されるおそれがあるため、サーバーは許可されたフォルダー内のファイルのみを読み取ります。
- MCP クライアントがサーバーと共有するワークスペースフォルダー(MCP ルート)、および
P4PLAN_UPLOAD_DIRSに指定されたフォルダー(複数指定する場合は:で区切り、Windows では;で区切ります)。
チェックの前にシンボリックリンクは解決され、隠しファイルと隠しフォルダー(.env、.ssh、.git など、名前が . で始まるもの)はアップロードされず、通常のファイルのみが読み取られます。クライアントがフォルダーを共有せず、P4PLAN_UPLOAD_DIRS も設定されていない場合は、テキストのアップロード(content + fileName)のみが可能です。
Docker ではコンテナからファイルを参照できません。フォルダーをマウントし、P4PLAN_UPLOAD_DIRS にコンテナ内のパスを指定してください。たとえば、-v "$HOME/Screenshots:/uploads:ro" -e P4PLAN_UPLOAD_DIRS=/uploads を指定し、/uploads/bug.png のようなパスを渡します。
ファイルは P4 Plan API(POST /attachment/<id>/upload)にストリーミングされるため、その内容がモデルを経由することはありません。P4 Plan サーバー独自の制限(添付ファイルのサイズ制限とブロック対象のファイル形式)が適用されます。同じ名前のファイルがすでに添付されている場合、サーバーは新しいファイルを name (1).ext として保存します。アップロードがタイムアウトしても完了している可能性があるため、再試行する前に get_attachments を確認してください。
コメントや複数行フィールド(バグの説明、再現手順、複数行テキスト列)に画像を表示するには、同じアイテムに画像をアップロードし、返された imageHtml(<img src="hansoft://...">)を HTML に含めてください。これは P4 Plan クライアントが貼り付けた画像を埋め込む方法です。それ以外の src を持つ画像は、サーバーによって通常のリンクに変換されます。
1 つのクライアントが P4 Plan API に過剰な負荷をかけないよう(ループから抜け出せないモデルや、多数のファイルを要求するプロンプトインジェクションなど)、各 MCP サーバーはアップロードを一度に 1 件ずつ実行し、1 分あたり最大 20 件のアップロードを開始します。それ以上の呼び出しには、待機時間を示すエラーが返されます。
すべてのツールは MCP ツールアノテーションを公開します。readOnlyHint は読み取りのみを行うツールを示します。書き込みを行うツールには、destructiveHint(呼び出しによってデータが削除または上書きされるかどうか)と idempotentHint も付与されます。アノテーションをサポートするクライアントは、書き込みの前に確認を求めるために利用できます。
認証
MCP サーバーには、P4PLAN_API_AUTH_TOKEN 環境変数で指定する JWT トークンが必要です。トークンは起動時に検証され、各ツール呼び出しで P4 Plan GraphQL API に転送されます。セッションや状態は保持されません。
JWT トークンの取得
curl を使って P4 Plan GraphQL API から JWT トークンを取得します。パスワードまたは**個人用アクセストークン(PAT)**のいずれかで認証できます。
パスワードを使う
curl -s -X POST http://localhost:4000/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "mutation Login($loginUserInput: LoginUserInput!) { login(loginUserInput: $loginUserInput) { access_token } }",
"variables": { "loginUserInput": { "username": "YOUR_USERNAME", "password": "YOUR_PASSWORD" } }
}'
個人用アクセストークンを使う(推奨)
PAT は、同じログインミューテーションでパスワードの代わりに使用できます。これにより、実際のパスワードを公開せずに済みます。
curl -s -X POST http://localhost:4000/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "mutation Login($loginUserInput: LoginUserInput!) { login(loginUserInput: $loginUserInput) { access_token } }",
"variables": { "loginUserInput": { "username": "YOUR_USERNAME", "password": "YOUR_PERSONAL_ACCESS_TOKEN" } }
}'
どちらの方法でも、同じレスポンスが返されます。
{
"data": {
"login": {
"access_token": "eyJhbGciOiJIUzI1NiIs..."
}
}
}
access_token の値をコピーし、MCP クライアントの設定で使用してください。
個人用アクセストークンの取得
- P4 Plan にログインします
- ユーザー設定 → 個人用アクセストークンに移動します
- 新しいトークンを生成をクリックします
- 適切な有効期限を設定します
- トークンをコピーします。上記のログインミューテーションで使用して JWT を取得します
注: JWT トークンには有効期限があります。トークンの有効期限が切れると、サーバーは認証エラーで起動に失敗します。上記と同じ
curlコマンドを使って新しい JWT を生成してください。
利用可能なツール(合計 31 個)
ツールの引数は柔軟に解析されるため、性能が低いモデルでも成功しやすくなっています。列挙値は、大文字と小文字、スペース、_、- の違いを無視して照合されます("Time Spent" → timeSpent)。ブール値には "true"/"yes"、IDには数値、数値には数値文字列を使用できます。また、JSON 形式のリストやカンマ区切りの ID リストも使用できます。許可された値に一意に対応付けられない値は拒否されます。
プロジェクト
list_projects - ユーザーがメンバーになっているすべてのアクティブなプロジェクトを一覧表示します
- ユースケース:他のツールで必要なプロジェクト ID を確認します
get_project - archivedStatus、バックログ ID、QA ID など、プロジェクトの設定を取得します
- パラメーター:
projectId - ユースケース:他のツールで使用するセクション ID(バックログ、QA、計画)を取得します
create_project - プロジェクトを作成し、チームを一度の呼び出しで設定します
- パラメーター:
name、任意のmethodTemplate、defaultMode、members(ユーザー名またはグループ全体の名前/ID)、managers(通常のユーザー名/ID)、addMeAsManager(デフォルトは true)、または既存のプロジェクトを基にする場合はcopyUsers/copyColumnsとともにcopyFromProjectId - ユースケース:UI を使わずにチームの新しいプロジェクトを立ち上げます。P4 Plan の管理者権限が必要です。プロジェクトの作成後に失敗した手順は
failedに一覧表示されます
タスク
get_my_tasks - 現在のユーザーに割り当てられたタスク(todoList)を取得します
- パラメーター:
showCompleted、showOnlyNextFourWeeks、showHidden、showPipelineTasksThatCannotStart - ユースケース:すべてのプロジェクトを対象に、自分の作業キューを確認します
get_tasks - ID を指定して 1 件以上の項目の詳細情報を取得します(最大 20 件)
- パラメーター:
taskIds(文字列の配列、最大 20 件)-- データベース項目 ID。つまり、他のツールが返すidです - 各項目のレスポンスには、すべてのツールが受け取るデータベース ID の
idと、P4 Plan UI の「ID」列に表示される番号のlocalIDの両方が含まれます。 - ユースケース:項目の詳細情報の取得、リンクの確認、複数項目の一括取得
search_tasks - P4 Plan の検索クエリを使って、プロジェクトのセクション内の項目を検索します
- パラメーター:
findQuery、projectId - すべての検索で P4 Plan の検索クエリ構文を使用します。正確な列名、演算子、値の形式を確認するには、最初に
skillName="search-queries"を指定してread_skillを呼び出してください。名前の単純検索にはItemname:Text("text")を使用します。ステータス、担当者、重大度、項目の種類、日付、ブール条件、および AND/OR/NOT を使った組み合わせで絞り込めます。 - 各プロジェクトには、異なる ID を持つ 3 つのセクション(バックログ、QA、計画)があります。
- ID を特定するには、直接クエリを実行します。
ID=<n>は UI の「ID」列(セクション内でのみ一意のローカル ID)に一致し、Databaseid=<n>はデータベース ID に一致します。 - ユースケース:項目の検索、絞り込み、レポート作成
create_item - 任意の種類の項目を作成します
- 種類:
backlog_task、bug、scheduled_task、sprint、release、sprint_task - パラメーター:
type、name、projectId、parentItemId、previousItemId、および種類固有のフィールド - ユースケース:タスクやスプリントの作成、バグの登録
update_item - 任意の項目を更新します(種類は自動判別されます)
- 種類:BacklogTask、Bug、ScheduledTask、Sprint、Release
- パラメーター:
itemIdと、更新可能な任意のフィールド(name、status、assignedTo、points など) - ユースケース:ステータスの更新、担当者の割り当て、見積もり、スプリントの設定
commit_to_sprint - バックログのタスクまたはバグをスプリントに追加します
- Parameters:
taskId,sprintId - Use cases: スプリント計画、バックログへのコミット
uncommit_from_sprint - タスクをスプリントから削除します(バックログに戻します)
- Parameters:
taskId - Use cases: スプリントのスコープ調整
カスタムフィールドとワークフロー
get_custom_columns - プロジェクトで利用できるカスタム列の定義を取得します
- Parameters:
projectId - Use cases: 値を読み書きする前にカスタムフィールドを確認します
create_custom_column - プロジェクトのセクションにカスタム列(例:作業時間)を作成します
- Parameters:
projectId(planning、backlog、または QA ID)、name、columnType、activated、readOnly、および型固有のunitName、updateOn*/updateOnlyFirstTime、useForTimeReporting/updateWorkRemaining、dropListItems(ラベル、またはicon、autoAssignToUsers、autoAssignToUserGroupsを含むオブジェクト) - Use cases: UI を使わずにプロジェクトの列を設定します。メインプロジェクトマネージャーの権限が必要です
get_custom_fields - タスクに設定されたカスタムフィールドの値を取得します
- Parameters:
taskId、onlySet - Use cases: プロジェクト固有のメタデータを読み取ります
set_custom_field - タスクのカスタムフィールド値を設定します
- Parameters:
taskId、customFieldId、value - Use cases: プロジェクト固有のメタデータを更新します
get_workflows - プロジェクトのワークフロー定義とステータス ID を取得します
- Parameters:
projectId - Use cases: ステータス遷移に必要なワークフローのステータスを確認します
タスクの操作
complete_task - タスクを完了としてマークします
- Parameters:
taskId - Use cases: ステータスを手早く更新するための便利なメソッドです
start_task - タスクを進行中としてマークします
- Parameters:
taskId - Use cases: ステータスを手早く更新するための便利なメソッドです
get_comments - タスクのすべてのコメントを取得します
- パラメーター:
taskId - 使用例: ディスカッションの履歴を読む
post_comment - タスクに新しいコメントを投稿します
- パラメーター:
taskId,text - 使用例: ディスカッション、受け入れ条件、メモを追加する
update_comment - 既存のコメントを編集します
- パラメーター:
taskId,commentId,text - 使用例: 既存のコメントを修正または更新する
delete_comment - タスクからコメントを削除します
- パラメーター:
taskId,commentId - 使用例: 古くなったコメントや誤ったコメントを削除する
get_attachments - タスクのすべての添付ファイルを取得します
- パラメーター:
taskId - 使用例: 添付ファイルを一覧表示し、ダウンロード用のパスを確認する
download_attachment - 添付ファイルをダウンロードし、ファイルの内容を返します
- パラメーター:
taskId,path - テキストファイルはインラインで返され、画像は base64 で返されます
- 使用例: 添付されたドキュメントを読んだり、スクリーンショットを表示したりする
upload_attachment - ローカルファイルまたはテキストをタスクに添付します
- パラメーター:
taskIdと、filePath(名前を変更する場合は任意でfileName)またはcontent+fileName - ローカルファイルは許可されたフォルダー内にある必要があります。ファイルのアップロードを参照してください
- 新しい添付ファイルの
pathを返します。最初に添付された画像がカバー画像になります - 画像の場合、
imageHtmlも返します。これは同じアイテムのコメント、説明、再現手順、または複数行テキストフィールド内に画像を表示する<img>タグです - 使用例: バグレポートやユーザーストーリーにスクリーンショット、ログ、再現用ファイルを添付する
delete_attachment - タスクから添付ファイルを削除します
- パラメーター:
taskId,path - 使用例: 古くなった添付ファイルを削除する
set_cover_image - タスクのカバー画像を設定または解除します
- パラメーター:
taskId,imagePath - 使用例: カードやアイテムに視覚的なアイデンティティを設定する
リンク
link_items - 内部リンクまたは外部リンクを作成します
- パラメーター:
fromItemId,toItemIdまたはurl、relation(blocks、duplicates、relatedTo) - 使用例: 依存関係の追跡、相互参照、外部 URL
unlink_items - 内部リンクまたは外部リンクを削除します
- パラメーター:
fromItemId,toItemIdまたはurl - 使用例: 古くなった依存関係を整理する
ユーザー
get_current_user - 現在のユーザー情報を取得します
- 使用例: 本人確認、ユーザーコンテキスト
list_project_users - プロジェクト内のユーザーを一覧表示します
- パラメーター:
projectId - 使用例: 割り当てやスプリントメンバーの管理に使うユーザー ID を確認する
read_skill - 実行時に P4 Plan のスキルドキュメントを読み込む
- パラメーター:
skillName - 指定したスキルドキュメントの Markdown 全文を返します。AI エージェントは、
search_tasks用のfindQueryを作成する前に、skillName="search-queries"を指定して必ずこのツールを呼び出す必要があります。 - 利用可能なスキル:
project-navigation、search-queries、task-management、planning、backlog-refinement、bug-tracking、custom-fields、gantt-scheduling、workflows、pipeline、comment-html-format、mentions - 使用例:正しいクエリ構文の習得、ツールの使用パターンの確認、ドメインの概念の理解
クライアントの設定
VS Code (Copilot) — npx 経由(推奨)
ワークスペースに .vscode/mcp.json を作成します。
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
注:
-yフラグを指定すると npm のインストール確認プロンプトに自動で同意し、ユーザーの操作なしでサーバーが起動します。
VS Code (Copilot) — node 経由(ローカルビルド)
npm ではなくローカルクローンから実行する場合:
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "node",
"args": ["/path/to/MCP/dist/main.js"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
VS Code — セキュアなトークンプロンプトを使用
セキュリティを強化するため、VS Code の入力プロンプトを使用して、トークンをファイルに保存しないようにできます。
{
"inputs": [
{
"type": "promptString",
"id": "p4-plan-jwt",
"description": "P4 Plan JWT Token",
"password": true
}
],
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "${input:p4-plan-jwt}",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)または %APPDATA%\Claude\claude_desktop_config.json(Windows)に追加します。
{
"mcpServers": {
"p4-plan": {
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
YOUR_JWT_TOKEN を、ログインミューテーションで取得したトークンに置き換えます(JWT トークンの取得を参照)。
Claude Code (CLI / VS Code extension)
プロジェクトのルートに .mcp.json を作成します。
{
"mcpServers": {
"p4-plan": {
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
ローカルビルドの場合は、"command" と "args" を次のように置き換えます。
{
"mcpServers": {
"p4-plan": {
"command": "node",
"args": ["/path/to/MCP/dist/main.js"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
または、CLI から追加します。
claude mcp add p4-plan \
-e P4PLAN_API_AUTH_TOKEN=YOUR_JWT_TOKEN \
-e P4PLAN_API_URL=http://localhost:4000 \
-- npx -y @perforce/p4plan-mcp
注: サーバー名は
-eフラグより前に指定する必要があります。そうしないと、可変長引数を処理する-eパーサーがサーバー名を環境変数の値として解釈します。
実行を確認する: Claude Code 内で /mcp と入力して、サーバーの状態を確認します。
ヒント:
.mcp.jsonをプロジェクトのルートに配置すると、トークンを含めずにチームで設定を共有できます。個人用の設定では、代わりに~/.claude.jsonにサーバーを追加します。
接続の確認
- P4 Plan GraphQL API が実行中であることを確認します
.vscode/mcp.jsonを含むワークスペースを VS Code で開きます- 拡張機能のサイドバーで「MCP SERVERS」を探し、「p4-plan」が表示されていることを確認します
- Copilot で新しいチャットを開始し、「自分に割り当てられているタスクは何ですか?」と尋ねます
環境変数
P4PLAN_API_AUTH_TOKEN- P4 Plan GraphQL API の認証に使用する JWT トークンP4PLAN_API_URL- P4 Plan GraphQL API の URL。ベースオリジンのみを指定し、パスや末尾のスラッシュは含めません(サーバーが/graphql、/healthcheck、/attachment/<id>を追加します)。未設定時のデフォルトはhttp://localhost:4000です。config-example.envには HTTPS の例が含まれています。P4PLAN_ALLOW_SELF_SIGNED_CERTS- HTTPS 経由で API に接続する際、自己署名証明書または信頼されていない TLS 証明書を受け入れるにはtrueを設定します(デフォルト:false)P4PLAN_READONLY- 読み取り専用のツールのみを公開するにはtrue(または1、yes、on)を設定します。これは--readonly引数と同じです(デフォルト:false)。大文字と小文字、および前後の空白は無視されます。認識されない値を指定すると読み取り専用モードが有効になり、警告がログに記録されます。読み取り専用モードを参照してください。P4PLAN_UPLOAD_DIRS- MCP クライアントが共有するワークスペースフォルダーに加えて、upload_attachmentがファイルを読み取ることのできるフォルダー。複数指定する場合は:(Windows では;)で区切ります。ファイルのアップロードを参照してください。LOG_LEVEL- ログレベル:debug、info、warn、error(デフォルト:debug)SEARCH_LIMIT-search_tasksが返す結果の最大数(デフォルト:400)
スキルとリソース
サーバーにはスキルファイルが含まれており、AI エージェントが正しいツール呼び出しを構成するための、ドメイン固有のガイドとして役立ちます。スキルには次の2つの方法でアクセスできます。
read_skillツール — どの MCP クライアントでも、skillNameを指定してread_skillを呼び出すことで、実行時にスキルの内容を取得できます。これが主要なアクセス方法で、すべてのクライアントで利用できます。- MCP リソース — ネイティブのリソース読み取りに対応したクライアント向けに、スキルは MCP リソース(例:
skill://p4-plan/search-queries)としても登録されています。
| スキル | 目的 |
|---|---|
| project-navigation | プロジェクトやアイテムの検索・作成、利用開始 |
| search-queries | P4 Plan Find のクエリ構文(列名、値、演算子) |
| task-management | タスクの CRUD、ステータス、割り当て、コメント、添付ファイル |
| planning | スプリント、リリース、コミットメント、割り当て |
| backlog-refinement | バックログ項目、見積もり、優先順位付け |
| bug-tracking | バグ、重大度、QA セクション |
| custom-fields | カスタム列、プロジェクト固有のメタデータ |
| gantt-scheduling | スケジュール済みタスク、タイムライン、依存関係 |
| workflows | ステータスワークフロー、ステータス状態マシン |
| pipeline | パイプラインのステップ、分解、パイプラインステップ内の欠陥 |
| comment-html-format | コメントや複数行フィールドで許可される HTML のサブセット |
| mentions | コメント内の @user メンション構文 |
さまざまな AI クライアントでのスキルの使用方法については、skills/README.md を参照してください。
開発
npm link を使ったローカルテスト
npm に公開せずに、npx の動作をローカルでテストするには:
# Build and create a global symlink
npm run build
npm link
# Now test exactly as an end user would
P4PLAN_API_AUTH_TOKEN=your-jwt-token npx @perforce/p4plan-mcp
# Clean up when done
npm unlink -g @perforce/p4plan-mcp
シンボリックリンクは再ビルド後も維持されます。コードを変更した後は、npm run build を実行するだけです。
新しいツールの追加
-
src/tools/にツールファイルを作成または編集します -
次の内容を定義してツールを作成します:
name:ツールを一意に識別する名前description:ツールの機能(AI に表示されます)inputSchema:パラメーター用の JSON Schemahandler:ツールを実行する関数
-
ToolsModuleに登録します
テスト
# Unit tests
npm run test
# E2E tests (MCP protocol compliance via @modelcontextprotocol/sdk)
npm run test:e2e
ロギング
サーバーでは Winston を使用し、2つのトランスポートを設定しています。
- コンソール(stderr): 警告とエラーのみが stderr に出力されます。VS Code では、Output パネルの「p4-plan」ドロップダウンに表示されます。出力を見やすく保つため、
warnとerrorレベルのメッセージのみが表示されます。 - ファイル: 詳細なデバッグログが
logs/P4PlanMCP_<timestamp>.logに書き込まれます。詳細なトラブルシューティングには、これらのログを使用してください。
注: コンソール出力はすべて stderr に出力されます(stdout には出力されません)。これは stdout が MCP プロトコルのチャネルであるためです。VS Code は stderr の出力をすべて
[warning]として表示します。これは想定された動作であり、問題を示すものではありません。
プロトコル
このサーバーではMCP stdio トランスポートを使用します。通信は stdin/stdout 経由で JSON-RPC 2.0 メッセージを使って行われます。クライアントはサーバーを子プロセスとして起動します。
- トランスポート: stdio(stdin/stdout)
- プロトコル: JSON-RPC 2.0
- 認証:
P4PLAN_API_AUTH_TOKEN環境変数(起動時に検証) - SDK:
StdioServerTransportを使用する@modelcontextprotocol/sdk
トラブルシューティング
サーバーが起動しない
-
P4PLAN_API_AUTH_TOKEN が設定されているか確認します: サーバーを実行するには、
P4PLAN_API_AUTH_TOKEN環境変数に有効な JWT トークンが必要です。設定されていない場合、エラーが発生してすぐに終了します。 -
トークンが有効か確認します: トークンの有効期限が切れているか無効な場合、サーバーは「Authentication failed」というエラーを出して終了します。ログインミューテーションを使って新しい JWT を生成してください。
-
GraphQL API に接続できるか確認します: P4 Plan GraphQL API が、設定された
P4PLAN_API_URL(デフォルト:http://localhost:4000)でアクセス可能である必要があります。
VS Code でサーバーが検出されない
-
mcp.json の構文を確認します:
.vscode/mcp.jsonが有効な JSON であることを確認してください。末尾のカンマがないか確認します。 -
コマンドが利用可能か確認します:
npxを使う場合は、Node.js が VS Code の PATH に含まれていることを確認してください。npxが見つからない場合は、代わりにnodeの絶対パスを使ってください(ローカルビルドの設定を参照)。 -
VS Code ウィンドウを再読み込みします:
Cmd+Shift+Pを押し、「Developer: Reload Window」を選択します。 -
新しいチャットを開始します: MCP サーバーは、新しいチャットセッションの開始時に接続されます。
ツールが動作しない
-
GraphQL サーバーが実行中か確認します: P4 Plan GraphQL API が、設定された URL でアクセス可能である必要があります。
-
サーバーログを確認します: VS Code で出力パネルを開き、ドロップダウンから「p4-plan」を選択して、警告やエラーを確認します。詳細なデバッグログは
logs/ディレクトリで確認してください。 -
JWT の有効期限が切れていないか確認します: 必要に応じて新しい JWT を生成し、mcp.json の設定を更新してください。
ライセンス
このプロジェクトは MIT License の下でライセンスされています。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。