关于 http_mcp_headers
这是一份面向 copilot engine 的参考技能,说明如何处理 HTTP MCP 请求头中的 GitHub Actions 密钥,并通过环境变量传递,避免密钥写入 MCP 配置。
主要功能
- 01提取请求头中的密钥表达式
- 02支持密钥默认值
- 03将密钥替换为环境变量引用
- 04向执行步骤传递所需变量
- 05避免密钥写入 MCP 配置
适用场景
- 01配置需认证的 HTTP MCP 请求头
- 02为 Copilot 工作流生成 MCP 配置
- 03向 MCP 服务传递 GitHub Actions 密钥
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 不会通过 shell 展开 env: 的值,因此必须通过 export 设置路径,才能在 HOME 不是 /home/runner 的自托管或容器化运行器上正常工作。
实现详情
关键函数
-
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
- 属性排序
- 环境变量排序
所有测试均已通过 ✓