Configuration Reference

Complete reference for axis.config.json.

Full Example

AXIS is configured via an axis.config.json file in your project root. Here is an example showing all available fields:

{
  "scenarios": "./scenarios",
  "agents": [
    "claude-code",
    {
      "adapter": "gemini",
      "model": "gemini-2.5-pro",
      "scenarios": ["cms/*"],
      "flags": { "yolo": true }
    }
  ],
  "settings": {
    "concurrency": 4,
    "scoring_weights": {
      "goal_achievement": 0.4,
      "environment": 0.2,
      "service": 0.2,
      "agent": 0.2
    },
    "limits": {
      "run": { "time_minutes": 60, "tokens": 2000000 },
      "scenario": { "time_minutes": 10, "tokens": 200000 }
    }
  },
  "env": ["ANTHROPIC_API_KEY", "GEMINI_API_KEY"],
  "mcp_servers": {
    "filesystem": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
    }
  },
  "skills": ["./skills/deploy"],
  "adapters": {
    "my-agent": "./adapters/my-agent.ts"
  }
}

Top-Level Fields

Field Type Required Description
scenarios string Yes Path to the scenarios directory.
agents (string | AgentConfig)[] Yes Agent names or full agent configurations.
settings object No Concurrency, scoring weight, and limit overrides.
env string[] No Additional environment variables to pass through to agent processes.
mcp_servers object No MCP servers available to all agents.
skills string[] No Skills available to all agents.
adapters object No Custom agent module paths, keyed by agent name.

Agent Configuration

Each entry in the agents array can be a simple string (agent name with defaults) or a full configuration object.

Field Type Required Description
adapter string Yes Agent name: claude-code, codex, gemini, goose, etc.
model string No Model override passed to the agent CLI.
scenarios string[] No Subset of scenarios to run. Supports glob patterns like cms/*.
skills string[] No Agent-specific skills (merged with top-level skills).
flags object No CLI flags passed to the agent, e.g. {"full-auto": true}.
command string No Custom CLI command (for custom agents).

Scoring Weights

Override the default dimension weights under settings.scoring_weights. Values must sum to 1.0. See Scoring Framework for what each dimension measures.

Field Type Required Description
goal_achievement number No Goal Achievement weight. Default: 0.4.
environment number No Environment weight. Default: 0.2.
service number No Service weight. Default: 0.2.
agent number No Agent weight. Default: 0.2.
{
  "settings": {
    "scoring_weights": {
      "goal_achievement": 0.5,
      "environment": 0.2,
      "service": 0.2,
      "agent": 0.1
    }
  }
}

Limits

Limits control how much time and tokens a run or individual scenario can consume. This prevents runaway agents from consuming unbounded resources. Limits can be configured at three levels:

Default behavior

Even without any limits configured, each scenario has a default time limit of 15 minutes. You can override this by setting settings.limits.scenario.time_minutes or by adding limits.time_minutes to individual scenarios.

Limit fields

Field Type Description
time_minutes number Maximum wall-clock time in minutes. Accepts fractional values (e.g. 0.5 for 30 seconds). Default: 15 per scenario.
tokens number Maximum total tokens (input + output + cache). Must be a positive integer. No default.

Overall run limits

Set settings.limits.run to cap the total time or tokens across the entire run. When an overall limit is reached, all remaining and currently running jobs are immediately terminated and marked as failed.

{
  "settings": {
    "limits": {
      "run": { "time_minutes": 60, "tokens": 2000000 }
    }
  }
}

Per-scenario limits

Set settings.limits.scenario to define default per-job budgets. These can be overridden by adding a limits field directly in a scenario file.

// axis.config.json — default for all scenarios
{
  "settings": {
    "limits": {
      "scenario": { "time_minutes": 10, "tokens": 200000 }
    }
  }
}

// scenarios/expensive-task.json — override for one scenario
{
  "name": "Expensive task",
  "prompt": "...",
  "rubric": "...",
  "limits": { "time_minutes": 30, "tokens": 500000 }
}
Token limit accuracy

Token limits are enforced using a conservative estimate during execution (based on streamed assistant text). The actual token count may slightly exceed the limit before the job is terminated. The authoritative token count from the agent's API is used for overall run limit tracking.

MCP Servers

Configure Model Context Protocol servers that are automatically wired into each agent environment. AXIS supports both stdio (local process) and HTTP (remote endpoint) servers.

Field Type Required Description
type "stdio" | "http" Yes Server transport type.
command string Yes Command to start the server process (stdio only).
args string[] No Arguments passed to the command.
env object No Environment variables for the server process.
url string Yes Remote server endpoint URL (http only).
headers object No HTTP headers (supports ${VAR} env interpolation).
{
  "mcp_servers": {
    "filesystem": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
      "env": { "LOG_LEVEL": "info" }
    },
    "remote-api": {
      "type": "http",
      "url": "https://mcp.example.com/tools",
      "headers": { "Authorization": "Bearer ${TOKEN}" }
    }
  }
}

Each agent writes MCP configuration in its native format before spawning:

Agent Config File Location
claude-code .mcp.json Workspace root
codex config.toml CODEX_HOME
gemini settings.json GEMINI_CLI_HOME

Skills

Skills extend agent capabilities with reusable instruction sets. Specify them at the top level (shared across all agents), per agent, or per scenario.

Format Example Description
Local path ./skills/deploy Relative to the config file.
GitHub shorthand netlify/axis-skill-deploy owner/repo format, cloned automatically.
Full URL https://github.com/owner/repo GitHub repository URL, cloned automatically.
{
  "skills": [
    "./skills/deploy",
    "netlify/axis-skill-deploy",
    "https://github.com/owner/repo"
  ]
}

Remote skills are cached in .axis/skills-cache/. Use --refresh-skills to force re-clone.

Environment Variables

The env field lists additional environment variables to pass through to agent processes. The following are always passed through by default:

Category Variables
API keys ANTHROPIC_API_KEY, CODEX_API_KEY, GEMINI_API_KEY
System PATH, USER, SHELL, LANG, TERM, TMPDIR
{
  "env": ["MY_CUSTOM_TOKEN", "DATABASE_URL"]
}

Scenarios

Scenarios are JSON files in the configured scenarios directory. The filename (without .json) becomes the scenario key. Nested directories create namespaced keys -for example, scenarios/cms/create-post.json maps to key cms/create-post.

Scenarios can define variants to run the same task under different configurations (skills, MCP servers, prompts, etc.) without duplicating files. Each variant produces a separate job with a key like create-post@variant-name.

See Writing Scenarios for the complete scenario schema, rubric design guidance, and example scenarios.