You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: skills/aw-author/SKILL.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -383,3 +383,7 @@ These rules apply across ALL modes:
383
383
10.**`read-all` permission shorthand** expands to read on all permission scopes
384
384
11.**`event.json` fallback** — when `${{ github.event }}` is unavailable, agents should check for `event.json` in the workspace
385
385
12.**Container-based MCP servers from `ghcr.io` require a GHCR login step** — add a `steps:` block with `docker login ghcr.io` using `${{ github.token }}` before `safe-outputs:`, or container pulls fail silently
386
+
13.**Minimal/scratch Docker images have no CA certificates** — if a container-based MCP server uses `FROM scratch` or a distroless base, mount host certs with `mounts: ["/etc/ssl/certs:/etc/ssl/certs:ro"]` and set `SSL_CERT_FILE: "/etc/ssl/certs/ca-certificates.crt"` in `env:`, or TLS calls fail with "certificate verify failed"
387
+
14.**`strict: false` is also required for custom API domains** — ecosystem identifiers (`defaults`, `github`, `containers`, `node`, `python`) work in strict mode, but custom domains like `*.datadoghq.com` require `strict: false`
388
+
15.**Add `node` and `python` ecosystems** when MCP servers use `npx` or `uvx` — these ecosystems allow package registry access (npm, PyPI) needed for process-based MCP servers
389
+
16.**MCP gateway logs are the primary debug source** — when MCP tool calls return vague errors (e.g., "no data found"), download `agent-artifacts/mcp-logs/{server}.log` from the workflow run to see the real error (TLS failures, auth errors, timeouts)
- `node`— npm registries (needed for `npx`-based MCP servers)
248
+
- `python`— PyPI (needed for `uvx`-based MCP servers)
249
+
250
+
**Custom domains require `strict: false`.** Any domain not covered by an ecosystem identifier (e.g., `*.datadoghq.com`, `api.pagerduty.com`, `*.atlassian.net`) requires setting `strict: false` at the frontmatter root level, or the compiler rejects it.
| `entrypointArgs` | list | Arguments passed to the container's ENTRYPOINT |
310
+
| `mounts` | list | Volume mounts in `"host:container:mode"` format |
311
+
312
+
**CA Certificate Warning:** Containers built from `FROM scratch` or distroless base images have no CA certificate bundle. Without CA certs, all TLS connections fail with "certificate verify failed". Mount the host's CA certs read-only and set `SSL_CERT_FILE` to point to them.
| `registry` | string | MCP registry URI (informational only, does not affect execution) |
258
259
| `env` | mapping | Environment variables |
260
+
| `mounts` | list | Volume mounts in `"host:container:mode"` format |
259
261
| `allowed` | list | Tool name restrictions |
260
262
261
263
### Execution Modes
@@ -296,6 +298,30 @@ steps:
296
298
297
299
This applies to **all** container-based MCP servers pulling from `ghcr.io`, regardless of whether the image is public or private. The `github.token` is automatically available and has sufficient scope for package reads.
298
300
301
+
### CA Certificates for Minimal Images
302
+
303
+
Containers built from `FROM scratch` or distroless base images have **no CA certificate bundle**. Any TLS connection (HTTPS API calls) will fail with "certificate verify failed". The MCP tool may return a misleading error (e.g., "no data found") instead of the real TLS error — check `agent-artifacts/mcp-logs/{server}.log` for the actual failure.
304
+
305
+
**Fix:** Mount the host runner's CA certs and set `SSL_CERT_FILE`:
Copy file name to clipboardExpand all lines: skills/aw-author/references/validation.md
+22-1Lines changed: 22 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -50,6 +50,10 @@ Occur during GitHub Actions execution.
50
50
-**Network blocked:** External URL access when no `network` configuration
51
51
-**MCP server connection failed:** Server not available, wrong args, missing env vars
52
52
-**Container pull failed (silent):** Container-based MCP servers from `ghcr.io` fail silently if no GHCR login step is present. Add a `steps:` block with `docker login ghcr.io` using `${{ github.token }}`
53
+
-**TLS certificate verify failed:** Container-based MCP servers built from `FROM scratch` or distroless images have no CA certificate bundle. Mount host certs: `mounts: ["/etc/ssl/certs:/etc/ssl/certs:ro"]` and set `SSL_CERT_FILE: "/etc/ssl/certs/ca-certificates.crt"` in `env:`
54
+
-**MCP server registers no tools (`tools: None`):** Server started but returned empty tool list — usually caused by an init-time API call failure (check MCP gateway logs for auth errors or TLS failures)
55
+
-**Misleading tool error messages:** MCP tool errors like "no data found" may mask underlying TLS, auth, or network failures — always check `agent-artifacts/mcp-logs/{server}.log` for the real error
56
+
-**Firewall blocking MCP traffic:** If firewall logs show only `api.openai.com` with no other domains, the MCP containers' API calls are being blocked — add the required API domains to `network.firewall.allowed` with `strict: false`
|`container:` with non-Docker value | Compilation error | Use valid Docker image reference |
118
122
|`container: ghcr.io/…` without GHCR login step | Silent runtime failure | Add `steps:` with `docker login ghcr.io`|
123
+
|`container:` from scratch/distroless without CA certs | TLS calls fail silently | Add `mounts` + `SSL_CERT_FILE` env |
124
+
| Custom API domains without `strict: false`| Compiler rejects non-ecosystem domains | Set `strict: false` in frontmatter |
125
+
| Missing `node`/`python` ecosystem for npx/uvx MCP servers | Package install fails at runtime | Add `node`/`python` to network allowed |
119
126
120
127
### Prose Anti-Patterns
121
128
@@ -167,8 +174,22 @@ When a workflow fails, check in this order:
167
174
-[ ] Edge cases handled
168
175
-[ ] Output format matches safe-output types
169
176
170
-
### 6. Runtime
177
+
### 6. Network & TLS
178
+
-[ ] Custom API domains (e.g., `*.datadoghq.com`) present in `network.firewall.allowed`
179
+
-[ ]`strict: false` set if custom domains are used (ecosystem identifiers like `defaults`, `github`, `containers`, `node`, `python` work in strict mode; custom domains do not)
180
+
-[ ]`node` ecosystem included if MCP servers use `npx` (for npm registry access)
181
+
-[ ]`python` ecosystem included if MCP servers use `uvx` (for PyPI access)
182
+
-[ ] Container-based MCP servers from minimal/scratch images have CA cert mounts (`mounts: ["/etc/ssl/certs:/etc/ssl/certs:ro"]` + `SSL_CERT_FILE` env var)
0 commit comments