mcpField
H
http_mcp_headers

http_mcp_headers

github.com/github安全5.5k56 次安装今天更新
代码仓库

关于 http_mcp_headers

这是一份面向 copilot engine 的参考技能,说明如何处理 HTTP MCP 请求头中的 GitHub Actions 密钥,并通过环境变量传递,避免密钥写入 MCP 配置。

主要功能

  1. 01提取请求头中的密钥表达式
  2. 02支持密钥默认值
  3. 03将密钥替换为环境变量引用
  4. 04向执行步骤传递所需变量
  5. 05避免密钥写入 MCP 配置

适用场景

  1. 01配置需认证的 HTTP MCP 请求头
  2. 02为 Copilot 工作流生成 MCP 配置
  3. 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 必须:

  1. 从请求头中提取密钥(例如,${{ secrets.DD_API_KEY }})
  2. 在执行步骤中声明这些环境变量
  3. 将 MCP 配置的 "env" 部分设为透传这些变量
  4. 在请求头部分使用传入的变量

工作流示例

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 的自托管或容器化运行器上正常工作。

实现详情

关键函数
  1. extractSecretsFromValue(value string) - 从字符串中提取密钥表达式

    • 解析 ${{ secrets.VAR_NAME }} 模式
    • 处理默认值:${{ secrets.VAR || 'default' }}
    • 返回变量名到完整表达式的映射
  2. extractSecretsFromHeaders(headers map[string]string) - 从 HTTP 请求头中提取所有密钥

    • 遍历所有请求头值
    • 收集所有不重复的密钥表达式
    • 返回汇总的密钥映射
  3. replaceSecretsWithEnvVars(value string, secrets map[string]string) - 将密钥表达式替换为环境变量引用

    • 将 ${{ secrets.DD_API_KEY }} 转换为 ${DD_API_KEY}
    • 用于渲染 MCP 配置请求头
  4. collectHTTPMCPHeaderSecrets(tools map[string]any) - 收集所有 HTTP MCP 工具中的密钥

    • 扫描所有工具,查找 HTTP MCP 配置
    • 从每个工具的请求头中提取密钥
    • 返回用于执行步骤环境变量的汇总映射
渲染逻辑
在 renderSharedMCPConfig (mcp-config.go) 中:
  1. 为 copilot 引擎渲染 HTTP MCP 配置时提取密钥
  2. 找到密钥时,将 env 部分加入属性顺序
  3. 渲染请求头时使用环境变量引用,而非密钥表达式
  4. 使用透传语法(\${VAR_NAME})渲染 env
在 GetExecutionSteps (copilot_engine.go) 中:
  1. 从工作流工具中收集所有 HTTP MCP 请求头密钥
  2. 使用密钥表达式将其添加到执行步骤环境变量映射中

安全优势

  1. 密钥不会出现在 MCP 配置中——只包含环境变量引用
  2. 正确处理 GitHub Actions 密钥——使用 ${{ secrets.* }} 语法
  3. 环境隔离——每个 MCP 服务只接收其所需的密钥
  4. 一致的模式——与现有的 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
  • 属性排序
  • 环境变量排序

所有测试均已通过 ✓

评论

支持 Markdown