http_mcp_headers について
copilot engineでHTTP MCPヘッダー内のGitHub Actionsシークレットを扱うためのリファレンススキルです。シークレットを環境変数経由で渡し、MCP設定には変数参照を出力する方法を説明します。
主な機能
- 01ヘッダー内のシークレット式の抽出
- 02シークレットのデフォルト値に対応
- 03シークレットを環境変数参照に置換
- 04実行ステップへの必要な変数の受け渡し
- 05MCP設定へのシークレット記載を回避
活用シーン
- 01認証が必要なHTTP MCPヘッダーの設定
- 02Copilotワークフロー用MCP設定の生成
- 03GitHub ActionsシークレットのMCPサーバーへの受け渡し
MCP 対応
HTTP MCPサーバーのヘッダーでシークレットを扱う方法を説明します。必要な環境変数を渡し、MCP設定には変数参照を出力します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ github/ gh-aw --skill http_mcp_headersインストール後、Claude Code で/http_mcp_headersを入力して読み込まれたか確認します。
詳細
HTTP MCP ヘッダーシークレットのサポート - 実装の概要
copilot エンジンで HTTP MCP ヘッダーシークレットをサポートする際は、このリファレンスを使用してください。
問題の説明
HTTP MCP ヘッダーに GitHub Actions のシークレットが含まれる場合、mcp-config.json では次の処理が必要です。
- ヘッダーからシークレットを抽出する(例:
${{ secrets.DD_API_KEY }}) - 実行ステップでそれらの環境変数を宣言する
- MCP 設定の「env」セクションで、それらの変数をパススルーするよう設定する
- ヘッダーセクションで渡された変数を使用する
ワークフローの例
on:
workflow_dispatch:
permissions:
contents: read
engine: copilot
mcp-servers:
datadog:
type: http
url: "https://mcp.datadoghq.com/api/unstable/mcp-server/mcp"
headers:
DD_API_KEY: "${{ secrets.DD_API_KEY }}"
DD_APPLICATION_KEY: "${{ secrets.DD_APPLICATION_KEY }}"
DD_SITE: "${{ secrets.DD_SITE || 'datadoghq.com' }}"
allowed:
- search_datadog_dashboards
- search_datadog_slos
- search_datadog_metrics
- get_datadog_metric
# Datadog Dashboard Search
Search for Datadog dashboards and provide a summary.
生成される出力
1. MCP 設定(mcp-config.json)
{
"mcpServers": {
"datadog": {
"type": "http",
"url": "https://mcp.datadoghq.com/api/unstable/mcp-server/mcp",
"headers": {
"DD_API_KEY": "${DD_API_KEY}",
"DD_APPLICATION_KEY": "${DD_APPLICATION_KEY}",
"DD_SITE": "${DD_SITE}"
},
"tools": [
"search_datadog_dashboards",
"search_datadog_slos",
"search_datadog_metrics",
"get_datadog_metric"
],
"env": {
"DD_API_KEY": "\\${DD_API_KEY}",
"DD_APPLICATION_KEY": "\\${DD_APPLICATION_KEY}",
"DD_SITE": "\\${DD_SITE}"
}
}
}
}
2. 実行ステップの環境変数
env:
DD_API_KEY: ${{ secrets.DD_API_KEY }}
DD_APPLICATION_KEY: ${{ secrets.DD_APPLICATION_KEY }}
DD_SITE: ${{ secrets.DD_SITE || 'datadoghq.com' }}
COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
# ... other env vars
GH_AW_MCP_CONFIG は意図的に YAML の env: ブロックに含めていません。実行スクリプトから export GH_AW_MCP_CONFIG="$HOME/.copilot/mcp-config.json" としてエクスポートすることで、$HOME が実行時に解決されます。GitHub Actions は env: の値をシェル展開しないため、HOME が /home/runner ではないセルフホスト型またはコンテナー化されたランナーで正しく動作させるには、export を使ってパスを設定する必要があります。
実装の詳細
主な関数
-
extractSecretsFromValue(value string) - 文字列からシークレット式を抽出します
${{ secrets.VAR_NAME }}パターンを解析します- デフォルト値を処理します:
${{ secrets.VAR || 'default' }} - 変数名と完全な式のマップを返します
-
extractSecretsFromHeaders(headers map[string]string) - HTTP ヘッダーからすべてのシークレットを抽出します
- すべてのヘッダー値を反復処理します
- 一意なシークレット式をすべて収集します
- 統合されたシークレットのマップを返します
-
replaceSecretsWithEnvVars(value string, secrets map[string]string) - シークレット式を環境変数の参照に置き換えます
${{ secrets.DD_API_KEY }}を${DD_API_KEY}に変換します- MCP 設定のヘッダーのレンダリングで使用されます
-
collectHTTPMCPHeaderSecrets(tools map[string]any) - すべての HTTP MCP ツールからシークレットを収集します
- すべてのツールをスキャンして、HTTP MCP 設定を探します
- 各ツールのヘッダーからシークレットを抽出します
- 実行ステップの環境変数用に統合されたマップを返します
レンダリングロジック
renderSharedMCPConfig(mcp-config.go)内:
- copilot エンジン用の HTTP MCP 設定をレンダリングする際にシークレットを抽出します
- シークレットが見つかった場合は、プロパティの順序にenv セクションを追加します
- シークレット式ではなく環境変数の参照を使ってヘッダーをレンダリングします
- パススルー構文(
\${VAR_NAME})を使ってenv をレンダリングします
GetExecutionSteps(copilot_engine.go)内:
- ワークフローツールからすべての HTTP MCP ヘッダーシークレットを収集します
- シークレット式を使って、実行ステップの環境変数マップに追加します
セキュリティ上の利点
- MCP 設定にシークレットが表示されません - 環境変数の参照のみが含まれます
- GitHub Actions のシークレットを適切に処理します -
${{ secrets.* }}構文を使用します - 環境を分離します - 各 MCP サーバーには必要なシークレットのみが渡されます
- 一貫したパターンです - 既存の GitHub リモート MCP サーバーの実装に準拠しています
テストカバレッジ
ユニットテスト(mcp_http_headers_test.go)
- extractSecretsFromValue
- extractSecretsFromHeaders
- replaceSecretsWithEnvVars
- collectHTTPMCPHeaderSecrets
- HTTP ヘッダーを含む renderSharedMCPConfig
統合テスト(copilot_mcp_http_integration_test.go)
- シークレットを含む単一の HTTP MCP ツール
- 複数の HTTP MCP ツール
- シークレットを含まない HTTP MCP
- プロパティの順序
- 環境変数のソート
すべてのテストに合格 ✓