mcpField
H
helm-mcp

helm-mcp

ローカル
github.comクラウド・インフラ23 週間前に更新

helm-mcp について

helm-mcpは、Kubernetesデプロイを管理するAIアシスタントにHelm操作を公開するオープンソースのMCPサーバーです。ネイティブGo SDKにより、単一バイナリでHelm 3.xと4.xに対応し、stdioとStreamable HTTPを利用できます。

主な機能

  1. 01Helm CLIコマンドを網羅する46のツール
  2. 02Helm 3.xおよび4.x SDK対応
  3. 03stdioとStreamable HTTPのトランスポート
  4. 04一部ツールの構造化出力
  5. 05操作の安全性を示すツール注釈

活用シーン

  1. 01Kubernetesリリースのインストールやアップグレード
  2. 02チャートリポジトリやレジストリの検索
  3. 03リリース状態、値、履歴の確認
  4. 04Helmチャートの作成、検査、レンダリング

MCP 対応

stdioまたはStreamable HTTP経由で、MCPクライアントにHelmツール46種を公開します。HTTPはデフォルトでステートレス動作に対応し、以前のMCPプロトコルバージョンともネゴシエーションします。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"scgis-wales-helm": {
"command": "uvx",
"args": [
"helm-mcp"
],
"env": {
"KUBECONFIG": "<KUBECONFIG>",
"HELM_MCP_BINARY": "<HELM_MCP_BINARY>"
}
}
}
}
起動コマンドuvx helm-mcp
設定が必要な環境変数
KUBECONFIGPath to the kubeconfig file. Defaults to ~/.kube/config.
HELM_MCP_BINARYExplicit path to the helm-mcp Go binary. Auto-detected when unset.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypihelm-mcp0.5.0
ocighcr.io/scgis-wales/helm-mcp:0.5.0

ツール

46

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
qpsnumberいいえクライアント側の QPS レート制限
namestringはい作成する chart の名前。パスも指定でき、その場合は最後の要素が chart 名になります。
debugbooleanいいえデバッグ出力を有効にする
starterstringいいえStarter chart:$HELM_DATA_HOME/starters 内の名前、または絶対パス
namespacestringいいえKubernetes のネームスペース
kube_tokenstringいいえKubernetes API 認証用の Bearer トークン
kubeconfigstringいいえkubeconfig ファイルのパス(デフォルトは $KUBECONFIG または ~/.kube/config)
burst_limitintegerいいえクライアント側のデフォルトのスロットリング上限
helm_versionstringいいえHelm SDK のバージョン:v3 または v4(デフォルト:v4)
kube_contextstringいいえkubeconfig の Kubernetes コンテキスト名
kube_apiserverstringいいえKubernetes API サーバーの URL(kubeconfig を上書き)
kube_insecure_tlsbooleanいいえTLS 証明書の検証をスキップします(安全ではありません)
kube_tls_server_namestringいいえTLS 証明書の検証に使用するサーバー名

詳細

Helm MCP

CI/CD Pipeline Go Report Card PyPI version Python versions Downloads License: MIT

Kubernetes パッケージマネージャーである Helm にフルアクセスできる、オープンソースの MCP(Model Context Protocol)サーバーです。ネイティブの Helm Go SDK で構築されており、単一のバイナリで Helm 3.x と 4.x の両方をサポートします。

自然言語で Kubernetes のデプロイを管理できます。
helm-mcp を Claude、Cursor、VS Code、または MCP 互換のクライアントに接続して、チャートのインストール、リリースの管理、リポジトリの検索などを、すべて会話を通じて行えます。


目次

helm-mcp を選ぶ理由

  • 46 個の MCP ツール — シェル補完とヘルプを除くすべての Helm CLI コマンドを網羅
  • 2 種類の Helm SDK をサポート — ネイティブ Go SDK を使用して Helm v3 と v4 に対応(CLI ラッパーではありません)
  • 2 種類のトランスポートモード — stdio(デフォルト)と Streamable HTTP。デフォルトではステートレス
  • クラウドプロバイダーに対応 — EKS、GKE、AKS の kubeconfig 形式をそのまま利用可能
  • セキュリティを最優先 — Linux プロセスの強化、認証情報のメモリ消去、入力検証、パストラバーサル防止
  • Python ラッパー — FastMCP ベースのプロキシで、すべてのツールを自動検出
  • フォワードプロキシをサポート — HTTP_PROXY、HTTPS_PROXY、NO_PROXY を尊重

インストール

ビルド済みバイナリ

GitHub Releases から、お使いのプラットフォーム向けの最新リリースをダウンロードします。

# macOS (Apple Silicon)
curl -LO https://github.com/SCGIS-Wales/helm-mcp/releases/latest/download/helm-mcp-darwin-arm64
chmod +x helm-mcp-darwin-arm64
sudo mv helm-mcp-darwin-arm64 /usr/local/bin/helm-mcp

# macOS (Intel)
curl -LO https://github.com/SCGIS-Wales/helm-mcp/releases/latest/download/helm-mcp-darwin-amd64
chmod +x helm-mcp-darwin-amd64
sudo mv helm-mcp-darwin-amd64 /usr/local/bin/helm-mcp

# Linux (amd64)
curl -LO https://github.com/SCGIS-Wales/helm-mcp/releases/latest/download/helm-mcp-linux-amd64
chmod +x helm-mcp-linux-amd64
sudo mv helm-mcp-linux-amd64 /usr/local/bin/helm-mcp

# Linux (arm64)
curl -LO https://github.com/SCGIS-Wales/helm-mcp/releases/latest/download/helm-mcp-linux-arm64
chmod +x helm-mcp-linux-arm64
sudo mv helm-mcp-linux-arm64 /usr/local/bin/helm-mcp
ソースからビルド

Go 1.27.2 以降が必要です。

git clone https://github.com/SCGIS-Wales/helm-mcp.git
cd helm-mcp
make build
Docker
docker build -t helm-mcp .
docker run -v ~/.kube:/home/helmuser/.kube:ro helm-mcp --mode stdio
Python パッケージ
pip install helm-mcp

詳しくは、以下のPython パッケージを参照してください。

クイックスタート

stdio モード(Claude Code、Cursor など向け)
helm-mcp --mode stdio
HTTP モード(ストリーム可能な HTTP)
helm-mcp --mode http

HTTP モードは、デフォルトで 127.0.0.1:8080 をリッスンします。リモートクライアントからの接続を受け入れるには、認証を設定し(認証を参照)、たとえば --addr 0.0.0.0:8080 のように明示的にバインドしてください。

HTTP モードは、デフォルトでステートレスです(MCP 2026-07-28)。initialize ハンドシェイクも Mcp-Session-Id ヘッダーもないため、セッションの固定化や共有セッションストアがなくても、通常のラウンドロビンロードバランサーの背後にサーバーを配置できます。古いプロトコル改訂版を使用するクライアントも引き続き動作します。SDK が自動的に古いバージョンに合わせてネゴシエーションします。

クライアントで従来のセッション単位の動作が必要な場合:

helm-mcp --mode http --stateless=false

v0.2.0 で削除:--mode sse。 HTTP+SSE トランスポートは、2025-03-26 以降 MCP 仕様で非推奨となっており、2026-07-28 の機能ライフサイクルポリシーに基づき正式に非推奨になりました。同じアドレスでストリーム可能な HTTP を提供する --mode http を使用してください。

MCP クライアントの設定

Claude Desktop

~/.claude/claude_desktop_config.json に追加します:

{
  "mcpServers": {
    "helm": {
      "command": "helm-mcp",
      "args": ["--mode", "stdio"]
    }
  }
}
Claude Code
claude mcp add helm -- helm-mcp --mode stdio
Cursor / Windsurf / VS Code

MCP サーバーの設定に追加します:

{
  "helm-mcp": {
    "command": "helm-mcp",
    "args": ["--mode", "stdio"]
  }
}
リモート / HTTP クライアント

サーバーを HTTP モードで起動し、MCP 互換クライアントをエンドポイントに接続します:

helm-mcp --mode http
# MCP endpoint: http://localhost:8080/mcp

MCP プロトコルのサポート

helm-mcp は MCP 2026-07-28 を実装し、古いクライアント向けに以前の改訂版(2025-11-25、2025-06-18、2025-03-26、2024-11-05)へネゴシエーションします。そのため、サーバーをアップグレードしても、クライアントをアップグレードする必要はありません。

機能状態
ツールサポート済み:46 個のツール。それぞれにトップレベルの title、アノテーション、および(結果の形式が安定している場合は)出力スキーマがあります
進捗サポート済み。helm_install、helm_upgrade、helm_uninstall、helm_rollback、helm_test は、リクエストに進捗トークンが含まれている場合、10 秒ごとに notifications/progress のハートビートを送信します。進捗に応じてタイムアウトをリセットするクライアントは、時間のかかる wait 操作をそのまま待機できます
キャンセルサポート済み。HTTP モードでは、リクエストが切断されると実行中のツール呼び出しがキャンセルされます。これは Ctrl+C で helm CLI がキャンセルされるのと同様です(処理を完了させるには --propagate-cancellation=false を指定します)
ステートレスなトランスポートサポート済みで、--mode http のデフォルトです(無効にするには --stateless=false を指定します)
server/discoverサポート済み
決定的な tools/list の順序サポート済み — ツールは名前順に返されるため、クライアントやプロンプトキャッシュで一貫してヒットします
サーバーの指示サポート済み — サーバーは、バージョンの選択、クラスターの指定、破壊的なツールの安全性について説明します
リソース / プロンプト該当なし — Helm の各操作はすべてツール呼び出しです
Tasks 拡張未実装です。時間のかかる helm install --wait の実行には有用ですが、クライアントのサポートはまだ限定的です。今後の対応項目として追跡しています。
MRTR / Elicitation意図的に未実装です。Helm のツールはすべての入力を引数として受け取るため、呼び出しの途中で質問することはありません。
Roots / Sampling / Logging未実装です。3 つとも 2026-07-28 時点で非推奨です(SEP-2577)。
HTTP+SSE トランスポートv0.2.0 で削除 — 仕様で非推奨となっています。--mode http を使用してください。

利用可能なツール(46)

リリース管理(14)
ツール説明
helm_install新しいリリースとして Helm チャートをインストールします
helm_upgradeリリースを新しいチャートバージョンまたは値にアップグレードします
helm_uninstallリリースをアンインストールし、関連するリソースを削除します
helm_rollbackリリースを以前のリビジョンにロールバックします
helm_listリリースを一覧表示します(フィルター、並べ替え、ページネーションに対応)
helm_statusリリースのステータス、リビジョン、チャート、値を表示します
helm_historyリリースのリビジョン履歴を表示します
helm_testリリースのテストスイートを実行します
helm_get_allリリースのすべての情報(値、マニフェスト、フック、ノート)を取得します
helm_get_hooksリリースのフックを取得します
helm_get_manifestリリースの Kubernetes マニフェストを取得します
helm_get_metadataリリースのメタデータを取得します
helm_get_notesリリースのノートを取得します
helm_get_valuesリリースの値(ユーザー指定または計算された値)を取得します
チャート管理(14)
ツール説明
helm_create新しいチャートを作成します。スターターから作成することもできます
helm_lint問題やベストプラクティスへの適合性についてチャートを lint します
helm_templateインストールせずにテンプレートとフックをローカルでレンダリングします
helm_packageチャートディレクトリをアーカイブ(.tgz)にパッケージ化します
helm_pullリポジトリまたは OCI レジストリからチャートをダウンロードします
helm_pushチャートアーカイブを OCI レジストリにプッシュします
helm_verifyチャートに有効な来歴ファイルがあることを検証します
helm_show_allチャートのすべての情報(Chart.yaml、値、README、CRD)を表示します
helm_show_chartチャートの Chart.yaml を表示します
helm_show_crdsチャートの CRD を表示します
helm_show_readmeチャートの README を表示します
helm_show_valuesチャートのデフォルト値を表示します
helm_dependency_buildChart.lock から charts/ ディレクトリをビルドします
helm_dependency_listチャートの依存関係を一覧表示します
リポジトリ管理(5)
ツール説明
helm_repo_addチャートリポジトリを追加します
helm_repo_list設定済みのチャートリポジトリを一覧表示します
helm_repo_updateチャートリポジトリのインデックスを更新します
helm_repo_removeチャートリポジトリを削除します
helm_repo_indexチャートアーカイブのインデックスファイルを生成します
レジストリ/OCI(2)
ツール説明
helm_registry_loginOCI レジストリにログインします
helm_registry_logoutOCI レジストリからログアウトします
検索(2)
ツール説明
helm_search_hubArtifact Hub でチャートを検索します
helm_search_repoローカルで設定されたリポジトリを検索します
プラグイン管理(6)
ツール説明
helm_plugin_installHelm プラグインをインストールします
helm_plugin_listインストール済みのプラグインを一覧表示します
helm_plugin_uninstallプラグインをアンインストールします
helm_plugin_updateプラグインを更新します
helm_plugin_packageプラグインディレクトリを署名付きアーカイブにパッケージ化します(v4 のみ)
helm_plugin_verifyパッケージ化されたプラグインの署名と来歴を検証します(v4 のみ)
環境(2)
ツール説明
helm_envHelm の環境情報を出力します
helm_versionHelm SDK のバージョン情報を出力します
依存関係の更新(1)
ツール説明
helm_dependency_updateChart.yaml に基づいて charts/ を更新します

ツールのアノテーション

すべてのツールには MCP アノテーションが付与されているため、クライアントや呼び出すツールを判断するエージェントは、クラスターの読み取りと変更を一目で見分けられます。

アノテーション意味ツール
readOnlyHint: true状態を読み取るだけなので、自由に呼び出しても安全ですhelm_list、helm_status、helm_history、すべての helm_get_*、すべての helm_show_*、helm_repo_list、helm_plugin_list、helm_dependency_list、helm_env、helm_version、helm_lint、helm_template、helm_verify、helm_plugin_verify、helm_search_*
destructiveHint: true稼働中の状態を削除または置換する可能性があるため、ユーザーが明示的に意図した場合にのみ呼び出してくださいhelm_uninstall、helm_rollback、helm_upgrade、helm_repo_remove、helm_plugin_uninstall
openWorldHint: true設定済みのクラスターの外部(Artifact Hub、OCI レジストリ、チャートリポジトリ)にアクセスしますhelm_search_hub、helm_search_repo、helm_pull、helm_push、すべての helm_show_*、helm_template、すべての helm_registry_*
idempotentHint: true同じ引数で繰り返し呼び出しても、追加の影響はありませんすべての読み取り専用ツール、および helm_repo_add、helm_repo_update、helm_dependency_*、helm_plugin_update

破壊的として記載されていないものには、すべて destructiveHint: false が付与されています。これは、MCP 仕様ではこのヒントの既定値が true であるため重要です。

アノテーションはヒントであり、セキュリティ境界ではありません。クライアントが無視する可能性もあります。実際の境界を設けるには、Security で説明している OIDC スコープとロールを使用してください。

構造化出力

11 個のツールは outputSchema を公開し、人が読めるテキストとともに structuredContent を返します。そのため、クライアントは文章を解析せずに結果を利用できます。

helm_list、helm_status、helm_history、helm_get_metadata、helm_get_values、helm_repo_list、helm_search_repo、helm_search_hub、helm_plugin_list、helm_env、helm_version。

// helm_list
{
  "releases": [
    { "name": "my-app", "namespace": "default", "revision": 3, "status": "deployed", ... }
  ],
  "count": 1
}

既存の JSON テキストコンテンツは変更されないため、それを解析するクライアントは引き続き動作します。コレクションは配列のままではなく、count を含むオブジェクトでラップされます。出力が自由形式の YAML またはテキストであるツール(helm_template、helm_lint、helm_get_manifest、helm_show_*、helm_package、helm_dependency_list)には、宣言できる有用な形式がないため、出力スキーマはありません。

Helm CLI の対応状況

すべての helm CLI コマンドと、対応する helm-mcp MCP ツールの完全な一覧です。

Helm コマンドMCP ツール状況
helm createhelm_create対応済み
helm dependency buildhelm_dependency_build対応済み
helm dependency listhelm_dependency_list対応済み
helm dependency updatehelm_dependency_update対応済み
helm envhelm_env対応済み
helm get allhelm_get_all対応済み
helm get hookshelm_get_hooks対応済み
helm get manifesthelm_get_manifest対応済み
helm get metadatahelm_get_metadata対応済み
helm get noteshelm_get_notes対応済み
helm get valueshelm_get_values対応済み
helm historyhelm_history対応済み
helm installhelm_install対応済み
helm linthelm_lint対応済み
helm listhelm_list対応済み
helm packagehelm_package対応済み
helm plugin installhelm_plugin_install対応済み
helm plugin listhelm_plugin_list対応済み
helm plugin uninstallhelm_plugin_uninstall対応済み
helm plugin packagehelm_plugin_package対応済み(v4 のみ)
helm plugin updatehelm_plugin_update対応済み
helm plugin verifyhelm_plugin_verify対応済み(v4 のみ)
helm pullhelm_pull対応済み
helm pushhelm_push対応済み
helm registry loginhelm_registry_login対応済み
helm registry logouthelm_registry_logout対応済み
helm repo addhelm_repo_add対応済み
helm repo indexhelm_repo_index対応済み
helm repo listhelm_repo_list対応済み
helm repo removehelm_repo_remove対応済み
helm repo updatehelm_repo_update対応済み
helm rollbackhelm_rollback対応済み
helm search hubhelm_search_hub対応済み
helm search repohelm_search_repo対応済み
helm show allhelm_show_all対応済み
helm show charthelm_show_chart対応済み
helm show crdshelm_show_crds対応済み
helm show readmehelm_show_readme対応済み
helm show valueshelm_show_values対応済み
helm statushelm_status対応済み
helm templatehelm_template対応済み
helm testhelm_test対応済み
helm uninstallhelm_uninstall対応済み
helm upgradehelm_upgrade対応済み
helm verifyhelm_verify対応済み
helm versionhelm_version対応済み
helm completion—対象外(シェルユーティリティ)
helm help—対象外(シェルユーティリティ)

運用に使う Helm コマンド 46 個すべてに対応しています。除外されているコマンド(completion、help)は、MCP のコンテキストでは意味を持たないシェルユーティリティです。

helm plugin package と helm plugin verify は、署名付きプラグイン配布とともに Helm v4 で導入されたため、helm_version: "v4" が必要です。

フラグのカバレッジ

コマンドは名前だけでなく、フラグも含めて網羅しています。ツールが受け付けるすべての引数は Helm SDK に渡され、レンダリングや適用の動作を変える引数は、実際のチャートをレンダリングまたはドライランするテストで網羅されています。以下のフラグは意図的に公開していません。

フラグ理由
Helm v3 の --post-rendererv3 のポストレンダラーは、サーバーホスト上の任意のバイナリを実行します。Helm v4 のポストレンダラーはインストール済みプラグインであり、post_renderer として公開されています
--set と --set-jsonインラインの values オブジェクトで対応しています。これは --set と同様にディープマージされます
template --output-dirhelm_template は読み取り専用です。output_dir を指定した helm_install を使用してください
create --chart-api-version v3Helm 4.3 では実験的機能であり、機能ゲートの背後にあります
history --show-rollback-revision、get --template、version --template表示専用です。構造化された結果にすでにデータが含まれています
search hub --endpoint、search --fail-on-no-result、repo index --jsonエージェントにとっての価値が低いため、要望に応じて追加する場合があります
push --username/--password、plugin install の TLS とレジストリ認証まず helm_registry_login を使用してください。認証情報は後続の呼び出し用に保存されます

Kubernetes 認証

すべてのツールは、GlobalInput を通じて以下の認証フィールドを受け付けます。

フィールドJSON キー説明
Kubeconfigkubeconfigkubeconfig ファイルのパス(デフォルトは $KUBECONFIG または ~/.kube/config)
コンテキストkube_context使用する Kubernetes コンテキスト名
API サーバーkube_apiserverkubeconfig の API サーバー URL を上書きします
ベアラートークンkube_tokenAPI 認証用のベアラートークン
TLS サーバー名kube_tls_server_nameTLS 証明書の検証に使用するサーバー名
TLS の検証を無効化kube_insecure_tlsTLS 証明書の検証をスキップします
ネームスペースnamespace対象の Kubernetes ネームスペース
EKS(AWS)

EKS は kubeconfig で exec ベースの認証を使用します。aws eks update-kubeconfig で生成された標準の kubeconfig は、そのまま動作します。

{
  "kubeconfig": "/home/user/.kube/config",
  "kube_context": "arn:aws:eks:us-east-1:123456789:cluster/my-cluster"
}

または、トークンを直接使った認証も可能です。

{
  "kube_apiserver": "https://ABCDEF.gr7.us-east-1.eks.amazonaws.com",
  "kube_token": "<bearer-token-from-aws-eks-get-token>"
}
GKE(Google Cloud)

gcloud container clusters get-credentials で生成された GKE kubeconfig は、そのまま動作します。

{
  "kubeconfig": "/home/user/.kube/config",
  "kube_context": "gke_my-project_us-central1_my-cluster"
}
AKS(Azure)

az aks get-credentials で生成された AKS kubeconfig は、そのまま動作します。

{
  "kubeconfig": "/home/user/.kube/config",
  "kube_context": "my-aks-cluster"
}

Helm バージョンの選択

すべてのツールは helm_version フィールドに対応しており、Helm v3 と v4 を選択できます。

{
  "helm_version": "v4",
  "release_name": "my-release"
}
  • "v4"(デフォルト):サーバーサイド適用、プラグインベースのポストレンダラー、署名付きプラグインに対応する Helm v4 SDK
  • "v3":後方互換性のための Helm v3 SDK
v4 専用機能

以下のフィールドには helm_version: "v4" が必要です。"v3" とともに指定すると、何もせずに無視されるのではなく、エラーになります。

フィールドツール備考
server_side_applyinstall、upgrade、rollbackサーバーサイド適用を参照してください。v3 ではクライアントサイド適用が常に行われるため、false は指定できます
force_conflictsinstall、upgrade、rollback他のフィールドマネージャーが所有するフィールドの所有権を取得します
wait_strategyinstall、upgrade、rollback、uninstall下記を参照してください
post_renderer、post_renderer_argsinstall、upgrade、templateインストール済みのポストレンダラープラグインの名前
descriptionrollbackロールバックのリビジョンに記録される説明
verify、keyringplugin installverify: false は helm-diff などの未署名プラグインをインストールします

2 つのツールは、ツール全体が v4 専用です。helm_plugin_package と helm_plugin_verify です。

サーバーサイド適用

Helm 4 はデフォルトで Kubernetes のサーバーサイド適用を行います。helm_install も同様です。サーバーサイド適用を使う場合は server_side_apply を未設定のままにし、クライアントサイド適用を使う場合は false に設定します。helm_upgrade と helm_rollback では、未設定の場合、Helm の auto モードが維持され、以前のリリースに記録された適用方法が再利用されます。リリース結果では、適用方法は apply_method("ssa" または "csa")として報告されます。

v0.5.0 より前は、server_side_apply が true でない限り、v4 エンジンはすべてのインストールとロールバックでクライアントサイド適用を強制していました。クライアントサイド適用を利用する場合は、server_side_apply: false を指定してください。

待機:wait と wait_strategy

Helm v4 では、v3 のブール値の --wait が戦略を表す列挙値に置き換えられました。そのため、helm_install、helm_upgrade、helm_rollback、helm_uninstall では、wait とともに wait_strategy フィールドを指定できます。

wait_strategy動作
"watcher"kstatus を使用して待機します。v4 で helm --wait を指定した場合と同じです
"legacy"v3 の準備状況チェックを使用して待機します
"hookOnly"フックのみを待機します。--wait を省略した場合の CLI のデフォルトです

wait_strategy が設定されている場合は、そちらが優先されます。それ以外の場合、wait: true は "watcher" に、wait: false は "hookOnly" に対応します。

v0.2.0 より前は、v4 エンジンで watcher 戦略がハードコードされていたため、wait: false は無視され、すべての v4 操作で待機が行われていました。この動作に依存していた場合は、wait: true(または wait_strategy: "watcher")を明示的に設定してください。

v3 と v4 の両方で利用可能

rollback_on_failure(Helm の --atomic)は両方のエンジンでサポートされており、helm_install と helm_upgrade で利用できます。また、devel、sub_notes、hide_notes、skip_schema_validation、disable_openapi_validation、enable_dns、take_ownership、hide_secret、helm_install の output_dir、use_release_name、force_replace、helm_upgrade の reset_then_reuse_values、helm_uninstall の ignore_not_found、description、helm_list の all、uninstalling、time_format、selector、helm_status の show_resources、helm_test の logs、および helm_show_* ツールの jsonpath も利用できます。

チャートのソース

helm_install、helm_upgrade、helm_template、helm_pull、および helm_show_* ツールでは、Helm のチャートロケーションフラグ(repo、username、password、ca_file、cert_file、key_file、insecure_skip_tls_verify、plain_http、pass_credentials、verify、keyring)を指定できます。TLS と認証情報のオプションは oci:// チャートにも適用されます。

verify は、CLI と同様に、デフォルトで $GNUPGHOME/pubring.gpg(または ~/.gnupg)を使用するキーリングに対してチャートの来歴を検証します。helm_pull の prov は、来歴ファイルを検証せずにダウンロードします(helm pull --prov)。

アップグレードまたはインストール

install: true を指定した helm_upgrade は、リリースが存在しない場合にインストールし、最後のリビジョンがアンインストール済みの場合は置き換えます。これは helm upgrade --install とまったく同じ動作です。create_namespace はこのインストールにも適用されます。

値

値は Helm が使用する順序で結合されます。まず values_files、次にインラインの values オブジェクト(--set と同様にディープマージ)、続いてそれぞれ key=value 文字列のリストである set_string、set_file、set_literal の順です。set_file が読み込むのはローカルファイルのみです。また、{a,b} リスト内や、さらにカンマで区切られたペア内のパスを含め、読み込み対象となるすべてのパスが検証されます。

チャートの依存関係

helm_install、helm_upgrade、helm_template の dependency_update は、CLI フラグと同様に、レンダリング前に不足している依存関係を取得します。これを指定しない場合、依存関係がチャートに同梱されていないチャートは、サブチャートをレンダリングせずにエラーとして報告されます。

Python パッケージ

FastMCP を使用して helm-mcp Go バイナリの透過的なプロキシを作成する Python ラッパーを利用できます。Go バイナリに追加された新しいツールは、コードを変更しなくても Python から自動的に利用できます。

インストール
pip install helm-mcp

Python 3.12 以降が必要です。Go バイナリはプラットフォーム固有の wheel に同梱されているため、Go ツールチェーンは不要です。サポート対象のプラットフォーム:linux-amd64、linux-arm64、darwin-amd64、darwin-arm64、windows-amd64。バイナリは初回使用時に wheel から展開され、改ざん防止のため SHA256 チェックサム検証が行われます。

バイナリが利用可能であることを確認できます。

helm-mcp-python --setup
サーバーとしての使用
from helm_mcp import create_server

# stdio mode (default, for MCP clients)
server = create_server()
server.run()

# HTTP mode
server = create_server()
server.run(transport="http", host="127.0.0.1", port=8080)
クライアントとしての使用
import asyncio
from helm_mcp import create_client

async def main():
    async with create_client() as client:
        # List all available tools
        tools = await client.list_tools()
        print(f"Available tools: {len(tools)}")

        # List Helm releases
        result = await client.call_tool("helm_list", {"namespace": "default"})
        print(result)

        # Install a chart
        result = await client.call_tool("helm_install", {
            "release_name": "my-app",
            "chart": "bitnami/nginx",
            "namespace": "default",
        })
        print(result)

asyncio.run(main())
CLI
# stdio mode (for MCP clients like Claude Code)
helm-mcp-python

# HTTP mode (loopback only by default; the Python proxy has no authentication)
helm-mcp-python --transport http --port 8080

# Bind to all interfaces only behind your own authenticating proxy
helm-mcp-python --transport http --host 0.0.0.0 --allow-remote

# Custom binary path
helm-mcp-python --binary /usr/local/bin/helm-mcp
FastMCP との統合

Python パッケージは FastMCP を基盤として構築されており、標準の FastMCP サーバー/クライアントオブジェクトを返します。他の FastMCP サーバーと組み合わせて使用できます。

from fastmcp import FastMCP
from helm_mcp import create_server as create_helm_server

# Create a composite server
app = FastMCP("my-platform")

# Mount helm-mcp as a sub-server
helm = create_helm_server()
app.mount("helm", helm)

# Add your own tools alongside Helm
@app.tool()
def my_custom_tool(param: str) -> str:
    return f"Custom: {param}"

app.run()
バイナリの検出

Python パッケージは、次の順序で helm-mcp Go バイナリを検索します。

  1. HELM_MCP_BINARY 環境変数
  2. パッケージの bin/ ディレクトリに同梱されたバイナリ
  3. GitHub Releases からの自動ダウンロード(SHA256 チェックサム検証付き)
  4. PATH 上の helm-mcp
環境変数

プロキシは、以下の環境変数を Go サブプロセスに転送します。

カテゴリ変数
プロキシHTTP_PROXY、HTTPS_PROXY、NO_PROXY(および小文字の表記)
KubernetesKUBECONFIG、KUBERNETES_SERVICE_HOST、KUBERNETES_SERVICE_PORT
HelmHELM_CACHE_HOME、HELM_CONFIG_HOME、HELM_DATA_HOME、HELM_PLUGINS、HELM_DEBUG
AWSAWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_SESSION_TOKEN、AWS_REGION、AWS_PROFILE
GCPGOOGLE_APPLICATION_CREDENTIALS、CLOUDSDK_COMPUTE_ZONE
AzureAZURE_TENANT_ID、AZURE_CLIENT_ID、AZURE_CLIENT_SECRET、AZURE_SUBSCRIPTION_ID
TLSSSL_CERT_FILE、SSL_CERT_DIR

レジリエンス設定(Python)

Python パッケージには、FastMCP のミドルウェア、circuitbreaker、tenacity を基盤とする包括的なレジリエンス機能が含まれています。すべての設定は、適切なデフォルト値が設定された HELM_MCP_* 環境変数で変更できます。

環境変数
変数型デフォルト説明
HELM_MCP_RETRY_ENABLEDbooltrueプロキシレベルの再試行ミドルウェアを有効にします
HELM_MCP_RETRY_MAX_RETRIESint2最大再試行回数
HELM_MCP_RETRY_BASE_DELAYfloat1.0初回のバックオフ遅延(秒)
HELM_MCP_RETRY_MAX_DELAYfloat30.0最大バックオフ遅延(秒)
HELM_MCP_RETRY_BACKOFF_MULTIPLIERfloat2.0バックオフ倍率
HELM_MCP_RATE_LIMIT_ENABLEDboolfalseトークンバケット方式のレート制限を有効にします
HELM_MCP_RATE_LIMIT_MAX_RPSfloat10.01 秒あたりの最大リクエスト数(0 より大きい値が必要です)
HELM_MCP_RATE_LIMIT_BURSTint20バースト容量(1 以上が必要です。不正な値の場合、起動時に失敗します)
HELM_MCP_CACHE_ENABLEDboolfalseTTL ベースのレスポンスキャッシュを有効にします
HELM_MCP_CACHE_TOOL_TTLint300ツール呼び出しキャッシュの TTL(秒)
HELM_MCP_CACHE_LIST_TTLint60ツール一覧キャッシュの TTL(秒)
HELM_MCP_ERROR_HANDLING_ENABLEDbooltrue構造化エラーレスポンスを有効にします
HELM_MCP_ERROR_INCLUDE_TRACEBACKboolfalseエラーにトレースバックを含めます
HELM_MCP_TIMING_ENABLEDbooltrueリクエストの計測を有効にします
HELM_MCP_TIMING_DETAILEDboolfalse詳細な計測ミドルウェアを使用します
HELM_MCP_CIRCUIT_BREAKER_ENABLEDbooltrueツール呼び出しのサーキットブレーカーを有効にします
HELM_MCP_CIRCUIT_BREAKER_FAILURE_THRESHOLDint5サーキットが開くまでの失敗回数
HELM_MCP_CIRCUIT_BREAKER_RESET_TIMEOUTfloat30.0ハーフオープン状態で再試行するまでの秒数
HELM_MCP_TENACITY_ENABLEDbooltrueジッター付きの tenacity 再試行を有効にします
HELM_MCP_TENACITY_MAX_ATTEMPTSint3最大再試行回数
HELM_MCP_TENACITY_MIN_WAITfloat0.5再試行間の最小待機時間(秒)
HELM_MCP_TENACITY_MAX_WAITfloat10.0再試行間の最大待機時間(秒)
HELM_MCP_TENACITY_MULTIPLIERfloat1.5指数バックオフの基準値
HELM_MCP_BULKHEAD_ENABLEDbooltrue同時実行数の制限を有効にします
HELM_MCP_BULKHEAD_MAX_CONCURRENTint10同時に実行できるツール呼び出しの最大数
HELM_MCP_OTEL_ENABLEDboolfalseOpenTelemetry トレーシングを有効にします
HELM_MCP_OTEL_SERVICE_NAMEstrhelm-mcpOTel サービス名
HELM_MCP_OTEL_EXPORTERstrconsoleOTel エクスポーター(console または otlp)
CLI フラグ
helm-mcp-python --no-retry                   # Disable proxy retry middleware
helm-mcp-python --rate-limit 50              # Enable rate limiting at 50 rps
helm-mcp-python --cache                      # Enable response caching
helm-mcp-python --no-circuit-breaker         # Disable circuit breaker
helm-mcp-python --bulkhead-max 5             # Limit to 5 concurrent tool calls
helm-mcp-python --otel                       # Enable OpenTelemetry tracing
プログラムによる設定
from helm_mcp import create_server, HelmClient
from helm_mcp.resilience import (
    ResilienceConfig,
    RateLimitConfig,
    CircuitBreakerConfig,
    BulkheadConfig,
)

# Server with custom resilience
config = ResilienceConfig(
    rate_limit=RateLimitConfig(enabled=True, max_requests_per_second=50),
    circuit_breaker=CircuitBreakerConfig(failure_threshold=3),
    bulkhead=BulkheadConfig(max_concurrent=20),
)
server = create_server(resilience=config)

# Client with custom resilience
async with HelmClient(resilience=config) as helm:
    releases = await helm.list(namespace="default")
OpenTelemetry

FastMCP は OpenTelemetry API を介してトレースを出力します。実際のトレースデータを受信するには、SDK をインストールしてください。

pip install helm-mcp[otel]

次に、トレーシングを有効にします。

export HELM_MCP_OTEL_ENABLED=true
export HELM_MCP_OTEL_EXPORTER=otlp        # or "console"
export HELM_MCP_OTEL_SERVICE_NAME=helm-mcp

レスポンスペイロードの管理

大きな Helm 出力(マニフェスト、値、テンプレートのレンダリング結果)は、LLM のコンテキストウィンドウを超えることがあります。helm-mcp には、これを防ぐためのレスポンスサイズ管理機能が 2 層用意されています。

レスポンスの切り詰め

すべてのツールレスポンスは、設定可能なサイズ上限を超えると自動的に切り詰められます。デフォルトは 256 KB(約 64K トークン)です。切り詰められたレスポンスには、元のサイズを示すメタデータと、より具体的なクエリを使用するための提案が含まれます。

CLI フラグまたは環境変数で上限を設定します。

# CLI flag (in bytes, 0 to disable)
helm-mcp --mode stdio --max-response-bytes 524288

# Environment variable
export HELM_MCP_MAX_RESPONSE_BYTES=524288
helm-mcp --mode stdio

CLI フラグは環境変数より優先されます。

マニフェストのサニタイズ

Kubernetes YAML を返すツール(helm_get_manifest、helm_get_all、helm_get_hooks、helm_template)は、結果を返す前にノイズとなるフィールドを自動的に削除します。これにより、通常、意味のある情報を失うことなく、マニフェストのサイズを**40〜60%**削減できます。

削除されるフィールド:

  • metadata.managedFields — Kubernetes の内部管理用データ(単一のフィールドとして最大になることがよくあります)
  • kubectl.kubernetes.io/last-applied-configuration — オブジェクト全体の冗長なコピー
  • deployment.kubernetes.io/revision — コントローラーの内部アノテーション
  • control-plane.alpha.kubernetes.io/leader — リーダー選出データ

これらのフィールドは LLM とのやり取りで役立つことがないため、このサニタイズは常に有効で、無効にはできません。元のサニタイズされていないデータは、直接 kubectl を使って引き続き利用できます。

レジリエンスの基本機能

internal/resilience パッケージは、本番環境向けの追加のレジリエンスパターンを提供します。

パターン説明
サーキットブレーカーバックエンドが利用できない場合に素早く失敗するための、3 状態(Closed/Open/HalfOpen)パターンです。失敗のしきい値と復旧タイムアウトを設定できます。
バックオフ付きリトライ一時的な失敗に対する、ジッター付きの指数バックオフです。コンテキストを考慮したキャンセルと、リトライ可能なエラーのフィルタリングに対応しています。
ツールごとのタイムアウトカテゴリ別のデフォルトタイムアウトです。query(30s)、mutate(120s)、chart(60s)、repo(60s)に設定されています。既存のコンテキスト期限を尊重します。

既知の制限事項

プラグインツールは Helm CLI を使用します

6 つすべてのプラグインツールは、システムの helm CLI をシェルから呼び出します。これは、Helm のプラグインパッケージが内部実装であり、インポートできないため、Helm Go SDK を経由しない helm-mcp の唯一の部分です。

  • Helm v4 では、デフォルトでプラグインの署名が検証されます。helm-diff などの署名されていないプラグインは、verify: false を指定して helm_plugin_install でインストールしてください。
  • 公開されているコンテナーイメージには、固定された helm CLI が含まれているため、そこでプラグインツールを使用できます。バイナリを直接実行する場合は、helm が PATH にある必要があります。また、デフォルトの helm_version: "v4" を使用する場合は Helm v4 CLI が必要です。v3 CLI では --verify=false などの v4 フラグが拒否されます。

セキュリティ

プロセスの強化(Linux)

Linux で実行する場合、helm-mcp は起動時にプロセスレベルの強化を適用し、stdio トランスポートの攻撃対象領域を縮小します。IDE の子プロセスとして実行される MCP サーバーは、ユーザーのすべての権限を継承します。これらの緩和策により、プロセスが侵害された場合に攻撃者が実行できることを制限します。

仕組み内容
PR_SET_DUMPABLE(0)ptrace によるアタッチ、コアダンプ、/proc/pid/mem の読み取りをブロックします。他のプロセスがメモリー内の認証情報を調べるのを防ぎます。
ケイパビリティの削除バウンディングセットからすべての Linux ケイパビリティを削除します。root 以外のユーザー(一般的なケース)では何もしませんが、設定に不備のある Docker/Kubernetes 環境で実行する場合に権限昇格を防ぎます。
認証情報のメモリー消去各ツールハンドラーの完了後に defer 経由で ZeroCredentials() を呼び出し、メモリー内のベアラートークンとパスワードを上書きします。これは多層防御です。Go の文字列は不変で、GC がコピーを保持する可能性がありますが、コードパス内で認証情報が存続する時間を短縮します。

強化はベストエフォートであり、失敗しても致命的ではありません。失敗は(--debug を指定した場合に)ログに記録されますが、プロセスがクラッシュすることはありません。Linux 以外のプラットフォーム(macOS、Windows)では、情報ログを出力して強化をスキップします。

# Verify hardening is active (Linux)
helm-mcp --mode stdio --debug 2>&1 | grep "security hardening"

# Disable for debugging (e.g., when using strace or delve)
helm-mcp --mode stdio --no-harden
評価したが実装しなかった仕組み
仕組み採用しなかった理由
Seccomp BPFサーバーはプラグインに exec.CommandContext を使用し、Kubernetes API およびレジストリとの通信にネットワーク I/O を使用します。カーネルのバージョンをまたいで Helm SDK の内部処理を壊さずに安全にフィルタリングするには、システムコールの対象範囲が広すぎます。
Namespace isolationプロセスには ~/.kube/config、クラウド認証情報ファイル、DNS、ネットワークへのアクセスが必要です。Namespace isolation を導入すると、コア機能が動作しなくなります。
Cgroup resource limits5 分の pluginExecTimeout によって、すでに暴走する処理の実行時間が制限されており、プロセスのライフサイクルは IDE が管理します。
AppArmor/SELinux profiles動的なファイルパスのメンテナンス負荷が高いためです。バイナリに組み込むのではなく、外部のアーティファクトとしてデプロイする方が適しています。
認証情報のマスキング

すべてのエラーメッセージから、以下の情報が自動的にマスキングされます。

  • Bearer トークン(EKS、GKE、Azure の JWT トークンを含む)
  • Basic 認証情報
  • URL に埋め込まれたパスワード(https://user:password@host)
入力の検証

すべてのツールハンドラーは実行前に ValidateGlobalInput を呼び出し、すべてのリクエストで namespace と kubeconfig のフィールドが検証されるようにします。

セキュリティパッケージは以下の検証機能を提供します。

  • リリース名(DNS-1123 準拠)
  • Namespace 名
  • Kubeconfig ファイルパス(パストラバーサルの防止、シンボリックリンクの検出、機密パスの拒否 — /etc/shadow、/proc/、/dev/、/sys/ はブロックされます)
  • URL(スキームの検証と SSRF 保護:DNS 解決時に、0.0.0.0/8、127.0.0.0/8、10.0.0.0/8、100.64.0.0/10、172.16.0.0/12、192.168.0.0/16、169.254.0.0/16、IPv4 マップドアドレス、NAT64、および IPv6 の未指定・ループバック・リンクローカル・ユニークローカル範囲のプライベート IP をブロックします)。リポジトリ URL、URL 形式のチャート参照、リモートの values ファイル、OCI のプッシュ先に適用されます
  • ファイルパス(トラバーサルの防止、親ディレクトリのシンボリックリンクを含むシンボリックリンクの拒否、機密パスの拒否)。values ファイル、set_file エントリー、キーリング、CA/証明書/鍵ファイル、パスフレーズファイル、出力先と untar ディレクトリ、helm_lint と helm_package のチャートパス、および helm_create のチャート名と starter に適用されます
  • リポジトリ名(英数字、ピリオド、ダッシュ、アンダースコア。キャッシュパスのトラバーサルを防止)
  • タイムアウト時間(最大 24h)
  • プラグイン名(英数字とダッシュ/アンダースコア。引数インジェクションを防ぐため、先頭のダッシュは使用不可)
ファイル権限
  • リポジトリの設定ファイルは 0600(所有者のみ読み取り/書き込み可能)で書き込まれます
  • 設定ディレクトリは 0700(所有者のみアクセス可能)で作成されます
HTTP サーバーの強化

HTTP モードで実行する場合:

  • --addr で別のアドレスが指定されない限り、127.0.0.1:8080 で待ち受けます
  • ReadHeaderTimeout: 10s と ReadTimeout: 30s — 遅いクライアントによる攻撃を防ぎます
  • WriteTimeout: 30m(--write-timeout)— wait を指定した helm_install/helm_upgrade に十分な時間です。クライアントがより長い Helm タイムアウトを使用する場合は、値を引き上げてください
  • リクエストが切断されると、そのツール呼び出しはキャンセルされます(--propagate-cancellation はデフォルトで有効)。これにより、放棄された操作が書き込みタイムアウトまで実行され続けることはありません
  • IdleTimeout: 120s — アイドル状態の接続を解放します
  • MaxHeaderBytes: 1MB — ヘッダーベースの DoS を防ぎます
  • 5 秒のタイムアウトを設定したグレースフルシャットダウン
認証(OIDC/OAuth2)

HTTP モードで実行する場合、helm-mcp は JWT 検証、クレームベースの認可、構造化された監査ログを備えた OAuth2/OIDC 認証をサポートします。これは MCP セキュリティのベストプラクティスに準拠しています。

認証は完全にオプトインです。 OIDC またはトークンの環境変数が設定されていない場合、サーバーは認証なしで実行されます(以前のバージョンと同じです)。Stdio モードは認証設定の影響を受けません。

クイックスタート — Entra ID(Azure AD / ADFS)
# Required: issuer and audience
export HELM_MCP_OIDC_ISSUER="https://login.microsoftonline.com/{tenant-id}/v2.0"
export HELM_MCP_OIDC_AUDIENCE="api://helm-mcp-server"

# Optional: restrict access by scopes, roles, or client app IDs
export HELM_MCP_REQUIRED_SCOPES="helm.read,helm.write"
export HELM_MCP_REQUIRED_ROLES="HelmOperator"
export HELM_MCP_ALLOWED_CLIENTS="client-app-id-1,client-app-id-2"

# Optional: explicit JWKS URL (auto-discovered from issuer if omitted)
export HELM_MCP_OIDC_JWKS_URL="https://login.microsoftonline.com/{tenant-id}/discovery/v2.0/keys"

helm-mcp --mode http --addr 0.0.0.0:8080

認証イベント(auth_success、auth_failure)は、--debug の設定にかかわらず、Info レベルの JSON として stderr に出力されます。

環境変数
変数必須説明
HELM_MCP_OIDC_ISSUERはい(OIDC の場合)OIDC 発行者 URL です。トークンの iss クレームと一致する必要があります。
HELM_MCP_OIDC_AUDIENCEはい(OIDC の場合)想定される aud クレームです。他のリソース向けに発行されたトークンは拒否されます。
HELM_MCP_OIDC_JWKS_URLいいえ署名検証用の JWKS エンドポイントです。省略した場合は、発行者から自動検出されます。
HELM_MCP_REQUIRED_SCOPESいいえscp クレームで必須となる OAuth2 スコープを、カンマ区切りで指定します。
HELM_MCP_REQUIRED_ROLESいいえroles クレームで必須となるアプリロールを、カンマ区切りで指定します。
HELM_MCP_ALLOWED_CLIENTSいいえazp/appid クレームで許可するクライアントアプリ ID を、カンマ区切りで指定します。
HELM_MCP_SESSION_TTLいいえセッションキャッシュの非アクティブ時の TTL(Go の期間形式。例:5m、15m)です。デフォルト:5m。
HELM_MCP_AUTH_TOKENいいえ静的ベアラートークン(レガシー)です。OIDC より優先度は低くなります。
認証の優先順位
  1. OIDC/OAuth2 — HELM_MCP_OIDC_ISSUER が設定されている場合、JWKS による JWT 検証が有効になります。
  2. 静的ベアラートークン — HELM_MCP_AUTH_TOKEN のみが設定されている場合、定時間比較が使用されます。
  3. 認証なし — どちらも設定されていない場合、サーバーはすべてのリクエストを受け付けます(ローカルの stdio 使用に適しています)。
トークンの検証

受信するすべての JWT は、次の項目について検証されます。

チェック項目説明
署名JWKS の公開鍵に対して RSA 署名を検証します(RS256/384/512)。鍵は 1 時間キャッシュされ、kid が見つからない場合は自動更新されます(鍵ローテーション)。
発行者(iss)HELM_MCP_OIDC_ISSUER と完全に一致する必要があります。
対象者(aud)HELM_MCP_OIDC_AUDIENCE と一致する必要があります。他の API 向けに発行されたトークンは拒否されます。これはトークンのパススルーを防ぐための中核的な対策です。
有効期限(exp)必須です。期限切れのトークンは拒否されます。
認可パーティ(azp/appid)設定されている場合は、HELM_MCP_ALLOWED_CLIENTS と照合されます。OIDC の azp と Entra ID v1 の appid クレームの両方に対応しています。
スコープ(scp)スペース区切りのスコープを HELM_MCP_REQUIRED_SCOPES と照合します。
ロール(roles)アプリロールの配列を HELM_MCP_REQUIRED_ROLES と照合します。
セッションキャッシュ

検証済みトークンは、JWKS の重複した検索を避けるため、メモリ内にキャッシュされます。

  • 非アクティブ時の TTL:デフォルトは 5 分です(HELM_MCP_SESSION_TTL で設定可能。例:5m、10m、1h)。
  • トークンの有効期限:キャッシュされたトークンは、exp クレームの期限を超えて使用されることはありません。
  • キャッシュキー:生のベアラートークンの SHA-256 ハッシュ(トークンそのものがメモリに保存されるのを防ぎます)。
  • スライディングウィンドウ:アクセスのたびに非アクティブタイマーがリセットされます。
  • 最大エントリ数:10,000 件(上限を超えると最も古いエントリが削除されます)。
監査ログ

OIDC 認証が有効な場合、認証の試行ごとに slog を通じて構造化監査イベントが出力されます。

level=INFO msg=security_audit audit.event_type=auth_success audit.principal_id=oid-123 [email protected] audit.tenant_id=tenant-abc audit.client_app_id=client-1 audit.scopes="helm.read helm.write" audit.token_id=uti-xyz audit.remote_addr=10.0.0.1:54321

監査イベントには、プリンシパル ID/名前、テナント ID、クライアントアプリ ID、スコープ、ロール、トークン ID、セッション ID、アクション、リソース、結果、所要時間、リモートアドレスが含まれます。監査情報をすべて確認するには --debug を有効にするか、ログアグリゲーターで security_audit メッセージを収集するよう設定してください。

オンビハーフオブ(OBO)トークン交換

helm-mcp が認証済みユーザーに代わって下流 API(Kubernetes API など)を呼び出す必要がある場合、受信したトークンを、その下流サービスを対象とする新しいトークンと交換します。これにより、元のトークンを転送せずに済みます。元のトークンを転送すると、下流サービスが侵害された場合や、トークンの対象者が一致しない場合に悪用される可能性があります。

仕組み
User        MCP Client        helm-mcp (MCP Server)      Kubernetes API
 │              │                      │                        │
 ├─(SSO)──────▶│ gets token            │                        │
 │              │ aud=helm-mcp          │                        │
 │              ├─(Bearer token)──────▶│                        │
 │              │                      ├─OBO exchange──────────▶│
 │              │                      │ grant_type=jwt-bearer   │
 │              │                      │ assertion=user token    │
 │              │                      │ scope=K8s API scopes    │
 │              │                      │◀─new token──────────────│
 │              │                      │  aud=Kubernetes API     │
 │              │                      ├─(K8s API call)────────▶│
 │              │                      │  with OBO token         │

チェーン内の各ホップでは、次の処理が行われます。

  1. 受信したトークンの対象者を検証します(このサーバーと一致する必要があります)。
  2. OBO を通じて、次のサービスを対象とする新しいトークンに交換します。
  3. 元のユーザーの ID を新しいトークンのクレームに保持します。
  4. (Entra ID で設定されている場合)Conditional Access の評価を新たに実行します。
OBO の設定
# OBO token exchange (for downstream API calls with user context)
export HELM_MCP_OBO_TOKEN_URL="https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token"
export HELM_MCP_OBO_CLIENT_ID="helm-mcp-app-id"
export HELM_MCP_OBO_CLIENT_SECRET="helm-mcp-client-secret"
トークンを転送しない理由

ユーザーのトークンを下流サービスに転送するのは魅力的ですが、問題があります。MCP Security Best Practices では、これを明確に推奨していません。OBO を使用すると、各サービスにはそのサービス独自のオーディエンス向けに発行されたトークンが渡され、必要な権限だけにスコープが限定されます。トークンが傍受された場合でも、影響範囲はチェーン全体ではなく、単一のサービスに限定されます。

AWS EKS と OBO のサポート
OIDC を使用する AWS EKS 1.34+

AWS EKS は EKS 1.21 からクラスター認証用の OIDC ID プロバイダーをサポートしており、1.34 以降では大幅に改善されています。ただし、EKS は Kubernetes API 認証における Entra ID OBO フローをネイティブにサポートしていません。認証パターンは次のように異なります。

パターンサポート状況詳細
EKS OIDC Identity ProviderはいEKS で Entra ID を OIDC プロバイダーとして設定します。ユーザーは aud = EKS cluster の Entra ID トークンを使用して直接認証します。OBO は不要です。トークンはクラスター向けに直接発行されます。
IRSA (IAM Roles for Service Accounts)はい投影されたサービスアカウントトークンを使用する、Pod レベルの ID です。これは M2M(クライアント資格情報)であり、ユーザー委任ではありません。
EKS Pod Identityはい(EKS 1.34+)EKS Pod Identity Agent を使用した、簡素化された Pod ID です。こちらも M2M であり、ユーザー委任ではありません。
OBO → Kubernetes API部分的Entra ID OBO は、登録済みの任意のリソース向けにトークンを発行できます。EKS が Entra ID を OIDC プロバイダーとして設定されており、Kubernetes API が Entra ID のアプリとして登録されていれば、OBO で発行されたトークンを EKS の認証に使用できます。EKS OIDC プロバイダーでカスタムの --oidc-issuer-url、--oidc-client-id、--oidc-username-claim の設定が必要です。

EKS に推奨されるパターン:Entra ID を EKS OIDC ID プロバイダーとして設定します。MCP クライアントはユーザーを認証し、aud = helm-mcp のトークンを取得します。helm-mcp はこのトークンを検証し、その後 OBO 交換を実行して、aud = EKS cluster OIDC client ID の新しいトークンを取得します。この OBO で発行されたトークンを Kubernetes API 呼び出しに使用することで、ユーザー ID を維持し、ユーザーごとの RBAC を有効にします。

AWS Labs MCP と OBO

AWS Labs MCP サーバー(例:awslabs/mcp)と Amazon Bedrock AgentCore は、OAuth2 OBO または RFC 8693 Token Exchange を実装していません。AgentCore は別のモデルを使用します。

  • ユーザー ID の伝播:不透明な X-Amzn-Bedrock-AgentCore-Runtime-User-Id HTTP ヘッダーを介して行います。暗号学的に署名されたトークンではありません
  • 送信時の認証:OAuth Authorization Code(3Lo)または Client Credentials(2Lo)を使用しますが、これらは委任された ID の伝播ではなく、個別の認証イベントです
  • Token Vault:サードパーティサービス向けのリフレッシュトークンを保存しますが、これはエージェントのスコープに限定され、ユーザー委任ではありません

つまり、AWS Labs MCP サーバーは Entra ID OBO チェーンにネイティブには参加できません。AWS ホスト型 MCP サーバーを介したユーザー委任 ID の伝播がアーキテクチャ上必要な場合は、カスタムのミドルウェアレイヤーとして OBO 交換を実装するか、helm-mcp に組み込まれた OBO サポートをリファレンス実装として使用する必要があります。

フォワードプロキシのサポート

helm-mcp は標準的なプロキシ環境変数を尊重します。

export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
export NO_PROXY=localhost,127.0.0.1,.internal.company.com

開発

前提条件
  • Go 1.27.2+
  • Python 3.12+(Python パッケージ用)
  • golangci-lint v2(任意。リンティング用)
ビルド
make build        # Build binary
make install      # Install to $GOPATH/bin
make build-all    # Cross-compile for Linux/macOS (amd64/arm64)
テスト
# Go tests
make test         # Run all tests with race detection and coverage
make test-short   # Run tests without integration tests

# Python tests
cd python && pip install -e ".[dev]" && pytest -v tests/
リント
make lint         # Run golangci-lint + go vet
make vet          # Run go vet only
セキュリティチェック
make security     # Run govulncheck
カバレッジ
make coverage     # Generate coverage report (coverage.html)

アーキテクチャ

cmd/helm-mcp/          Entry point, transport selection, CLI flags
internal/
  helmengine/           Engine interface and shared types
    v3/                 Helm v3 SDK implementation
    v4/                 Helm v4 SDK implementation
  tools/                MCP tool handlers
    release/            Install, upgrade, uninstall, rollback, list, status, etc.
    chart/              Create, lint, template, package, pull, push, show, etc.
    repo/               Add, list, update, remove, index
    registry/           Login, logout
    search/             Hub, repo
    plugin/             Install, list, uninstall, update, package, verify
    env/                Env, version
  security/             Process hardening, input validation, credential scrubbing
  resilience/           Response budget, circuit breaker, retry, timeouts, manifest sanitisation
  server/               MCP server creation and tool registration
python/                 FastMCP-based Python wrapper
  src/helm_mcp/         Python package source
  tests/                Python tests

コントリビューション

コミュニティからのコントリビューションを歓迎します!バグ報告、機能リクエスト、ドキュメントの改善、コードのコントリビューションなど、どのようなご協力もありがたく受け止めます。

詳しいガイドラインについては、CONTRIBUTING.md をご覧ください。

  • 開発環境のセットアップ
  • テストとリンターの実行
  • プルリクエストの提出
  • コミットメッセージの規約

コミュニティ

ライセンス

このプロジェクトは MIT License の下でライセンスされています。自由に使用、変更、配布できます。

コメント

MCP は初めてですか?

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

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