| name | http_mcp_headers |
|---|---|
| description | HTTP MCP Header Secret Support - Implementation Summary |
This document demonstrates the complete implementation of HTTP MCP header secret support for the copilot engine.
When using HTTP MCP tools with headers containing GitHub Actions secrets, the generated mcp-config.json needs to:
- Extract secrets from headers (e.g.,
${{ secrets.DD_API_KEY }}) - Declare those env variables in the execution step
- Configure the MCP config's "env" section to passthrough those variables
- Use the passed variables in the headers section
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.{
"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}"
}
}
}
}env:
DD_API_KEY: ${{ secrets.DD_API_KEY }}
DD_APPLICATION_KEY: ${{ secrets.DD_APPLICATION_KEY }}
DD_SITE: ${{ secrets.DD_SITE || 'datadoghq.com' }}
GH_AW_MCP_CONFIG: /home/runner/.copilot/mcp-config.json
COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
# ... other env vars-
extractSecretsFromValue(value string) - Extracts secret expressions from a string
- Parses
${{ secrets.VAR_NAME }}patterns - Handles default values:
${{ secrets.VAR || 'default' }} - Returns map of variable names to full expressions
- Parses
-
extractSecretsFromHeaders(headers map[string]string) - Extracts all secrets from HTTP headers
- Iterates through all header values
- Collects all unique secret expressions
- Returns consolidated map of secrets
-
replaceSecretsWithEnvVars(value string, secrets map[string]string) - Replaces secret expressions with env var references
- Transforms
${{ secrets.DD_API_KEY }}to${DD_API_KEY} - Used in MCP config headers rendering
- Transforms
-
collectHTTPMCPHeaderSecrets(tools map[string]any) - Collects secrets from all HTTP MCP tools
- Scans all tools for HTTP MCP configurations
- Extracts secrets from each tool's headers
- Returns consolidated map for execution step env
- Extract secrets when rendering HTTP MCP configs for copilot engine
- Add env section to property order when secrets are found
- Render headers with env var references instead of secret expressions
- Render env with passthrough syntax (
\${VAR_NAME})
- Collect all HTTP MCP header secrets from workflow tools
- Add to execution step env map with secret expressions
- Secrets never appear in MCP config - Only env var references
- Proper GitHub Actions secret handling - Uses
${{ secrets.* }}syntax - Environment isolation - Each MCP server receives only its required secrets
- Consistent pattern - Matches existing GitHub remote MCP server implementation
- extractSecretsFromValue
- extractSecretsFromHeaders
- replaceSecretsWithEnvVars
- collectHTTPMCPHeaderSecrets
- renderSharedMCPConfig with HTTP headers
- Single HTTP MCP tool with secrets
- Multiple HTTP MCP tools
- HTTP MCP without secrets
- Property ordering
- Env variable sorting
All tests pass ✓