Type
array[McpEntry]
Required
No. Omitmcps: if you don’t manage any.
Entry fields
name
The identifier the entry is upserted under inside the target’s
mcpServers object.
agents
Either a list of registry names (
[claude-code, cursor, codex]) or the wildcard ["*"].
["*"] resolves at sync time to every registered agent that has a non-empty MCP config for the requested scope. Agents whose registry entry has no MCP config for that scope are skipped silently.
The destination JSON file is then looked up in the agent registry — global_mcp_config_file for global: true, project_mcp_config_file for global: false.
global
In the current registry every built-in agent only ships a
global_mcp_config_file. Set global: true on every entry until per-project MCP configs land. With global: false (the YAML default) gaal silently skips the entry for every agent that has no project-scoped MCP path.
source
A URL returning a JSON document with an
mcpServers object. gaal downloads the file and merges the entry whose key matches name into each resolved target.
Mutually exclusive with inline.
inline
The MCP server spec, written directly in
gaal.yaml. Inline entries can describe stdio servers or native HTTP/SSE endpoints, depending on what the target agent supports.
Use
command for stdio servers. Use url for HTTP or SSE servers. type defaults to stdio when command is set, and HTTP when url is set.
Header values may be plain scalars or objects:
env: for secrets. gaal writes the environment variable name into formats that support env-backed headers.
Mutually exclusive with source. Exactly one of source or inline must be set per entry.
merge
Whether to merge the entry into the existing
mcpServers object (preserving siblings) or overwrite it. The default keeps every server gaal didn’t author.
target (deprecated)
Explicit path to the JSON file. Deprecated — set
agents: and global: instead so the path comes from the registry. When both target and agents are set, target wins and gaal logs a deprecation warning.
Example
Behaviour
- gaal upserts under the
mcpServersobject of every resolved target file. - Other top-level keys in the target are preserved.
- Other entries inside
mcpServersthat gaal didn’t author are preserved. - Removing an entry from
gaal.yamldoes not remove it from the target unless you pass--prune. - gaal does not expand
${VAR}references inargs:orenv:. The agent process resolves them when launching the server. - Header
env:values name environment variables; they do not contain the secret itself. - When the resolved target’s parent directory is missing, gaal silently skips the entry — it never creates an agent’s config directory as a side effect.