Skip to main content

Type

array[McpEntry]

Required

No. Omit mcps: 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 registryglobal_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:
Prefer 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 mcpServers object of every resolved target file.
  • Other top-level keys in the target are preserved.
  • Other entries inside mcpServers that gaal didn’t author are preserved.
  • Removing an entry from gaal.yaml does not remove it from the target unless you pass --prune.
  • gaal does not expand ${VAR} references in args: or env:. 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.

Concepts: MCP servers

Configure MCP servers

Environment & secrets