Reference
Compatibility
Per-provider rendering rules for MCP servers, hooks and agents, and the failure modes Agentyx chooses over writing a wrong value.
Provider facts come from each provider's official documentation, not from Agentyx source comments.
The authoritative version of this page is
docs/compatibility.md in
the repository, which also records what was not verified.
MCP rendering
Agentyx's MCP model has two transports (stdio, http) and values that are environment
references, never secrets.
| Codex | Claude Code | Kimi Code | Qwen Code | |
|---|---|---|---|---|
| Document | .codex/config.toml |
.mcp.json |
.kimi-code/mcp.json |
.qwen/settings.json |
| stdio | command, args, env, enabled |
type: "stdio", command, args, env |
command, args, env |
command, args, env |
| HTTP | url, enabled |
type: "http", url |
url |
httpUrl |
| env reference | env_vars = ["NAME"] |
"NAME": "${NAME}" |
omitted | "NAME": "${NAME}" |
| header reference | env_http_headers = { Header = "NAME" } |
"Header": "${NAME}" |
omitted | fails |
Four rules follow from that table:
- Codex
envholds literal values andenv_varsforwards named host variables, so a reference is only expressible when the server expects the variable under its own name. Any other mapping fails withunsupported_mcp_env_referencerather than writing a wrong value. - Kimi Code documents
envandheadersas literal values with no expansion, so Agentyx writes no reference at all instead of a literal variable name. Whether the child process inherits the host environment is not documented; a server needing a token relies on that. This is a known limitation, not a verified pass. - Qwen Code documents
$VAR/${VAR}expansion forenv, which Agentyx renders. It documentsheadersas literal values, so an authenticated HTTP server cannot be expressed and fails instead. Itshttptransport renders ashttpUrl;urlis Qwen Code's legacy SSE key. - A server whose transport an adapter does not declare fails with
unsupported_mcp_transport.
Codex TOML is parsed and re-serialized, so comments and numeric literal style in .codex/config.toml
are not preserved. Values are.
Hook rendering
Claude Code, Codex and Qwen Code all use the same JSON shape: hooks.<Event>[] = { matcher, hooks[] }.
Each generated entry carries statusMessage: "agentyx:<hook name>", a real field the providers show
as the hook's spinner label. Every run strips every agentyx:-tagged entry and regenerates the active
ones fresh; nothing else in the file is read or touched.
Agentyx registers three observer hooks plus one doctor hook:
| Hook | Event | Purpose |
|---|---|---|
session-doctor-bootstrap |
SessionStart |
Reports project health at session start; silent when healthy. |
observe-session-start |
SessionStart |
Records that a session started. |
observe-session-end |
SessionEnd |
Records that a session ended. |
observe-tool-use |
PostToolUse |
Records which MCP servers were used. |
Hooks run npx --no-install agentyx …, so @agentyx/cli must be a project dependency. They print
nothing, exit 0 whatever happens, and can never block a session.
Codex also reads inline [hooks] from .codex/config.toml and warns when one layer defines hooks in
both representations, so Agentyx writes hooks.json only when the project has no inline [hooks].
Agent rendering
Core knows two access levels, read-only and workspace-write, and no provider tool names. Each
adapter maps them, and all four providers get the same canonical instruction body.
| Codex | Claude Code | Kimi Code | Qwen Code | |
|---|---|---|---|---|
| Format | TOML | Markdown + frontmatter | Markdown + frontmatter | Markdown + frontmatter |
| Fields emitted | name, description, developer_instructions, sandbox_mode |
name, description, tools |
those three plus override: false |
name, description, tools |
read-only |
sandbox_mode = "read-only" |
tools: Read, Grep, Glob |
same | list of read_file, grep_search, glob |
workspace-write |
sandbox_mode = "workspace-write" |
adds Bash, Write, Edit |
same | adds run_shell_command, write_file, edit |
| Enforcement | sandbox | tool allowlist | tool allowlist | tool allowlist |
A read-only agent receives no write, shell or delegation tool, and a workspace-write agent never
receives a delegation tool, a wildcard or MCP tools. Omitting tools would inherit everything in
Claude Code, Kimi Code and Qwen Code, so it is always set.
Codex has no per-tool list in its documented format: sandbox_mode is the only enforceable boundary,
and the provider documents that live parent-turn overrides are reapplied to child agents, so the file
is a default rather than an absolute ceiling.
workspace-write is one coarse level. agentyx-verifier uses it so it can run checks, which also
means it is able to edit files; its instructions, not a permission, keep it from doing so.
Platforms
| Platform | Evidence |
|---|---|
| Linux, Node 22 and 24 | CI check job: frozen install, lint, typecheck, tests, build, CLI smoke, pnpm smoke:pack |
| macOS, Node 22 | CI platform-smoke job: pnpm smoke:pack |
| Windows, Node 22 | CI platform-smoke job: pnpm smoke:pack |
engines.node stays >=22.
What none of this proves
The compatibility tests check configuration rendering and lifecycle safety. They do not prove that a provider loaded, trusted or used anything Agentyx wrote — Claude Code invoking an installed Skill, Codex spawning an installed agent, or Qwen Code connecting to an MCP server. That is real-provider activation evidence and is tracked separately in the roadmap.