Why this rule
A public remote MCP server with no declared auth boundary accepts tool calls from any agent that can reach it. Charter checks whether the config declares that auth is required — the minimum signal that the server was configured with access control in mind. Without this declaration, there is no evidence that tool calls to the server are gated at all. See the MCP safety model for how the auth check fits the broader trust boundary.What triggers it
Charter inspects every remote HTTP or SSE server entry in tracked MCP configuration files. For each non-local remote server, it checks whether an auth header is declared in the server’s config block. Accepted auth header names (checked case-insensitively):AuthorizationX-Api-KeyApi-KeyX-Auth-Token
"Bearer ${TOKEN}" counts as a valid declaration — Charter checks for the presence of an auth header, not the validity of the credential.
Scanned files: .mcp.json, mcp.json, .cursor/mcp.json, .vscode/mcp.json, .gemini/settings.json
Always exempt:
Examples
- Failing
- Passing
.mcp.json
How to fix
Add aheaders block to the remote MCP server entry with an auth header that references an environment variable:
X-Api-Key, Api-Key, or X-Auth-Token) with the same env-reference pattern.
Score impact
High (−10 per finding). No hard cap — caps are reserved for raw-secret and Blocker findings. See Scoring and caps.
Edge cases
Local and internal origins never fire. Catalog OAuth vendor hosts never fire. An env-reference header value (${TOKEN}) satisfies the presence check — Charter does not validate the credential itself, only its declaration. A bare ${VAR} URL with no parseable host is skipped entirely.
Related rules
AE-MCP-001
MCP servers must be pinned to exact versions.
AE-MCP-002
Remote MCP server origins must be trusted.
AE-SEC-002
No raw secrets in MCP config files.