This guide covers how to use EvalBench for evaluating Gemini CLI agent workflows using MCP Servers, Extensions, and Skills. It includes configuration reference, evaluation dataset format, scoring metrics, and step-by-step instructions for running evaluations.
- Overview
- Architecture
- Prerequisites
- Quick Start
- Configuration Reference
- Tool Paradigms
- Scorers
- Reporting
- End-to-End Examples
- Troubleshooting
EvalBench's Gemini CLI integration enables automated, multi-turn evaluation of agentic AI workflows. The Gemini CLI acts as the orchestrator that connects to various tool backends—MCP servers, extensions, or skills—and executes scenarios defined in an evaluation dataset. A simulated user powered by an LLM drives multi-turn conversations following a conversation plan, allowing realistic testing without human interaction.
- Multi-turn evaluation with LLM-powered simulated users
- Three tool paradigms: MCP servers, Gemini CLI extensions, and skills
- Fake MCP server support for deterministic, offline testing
- 8 built-in scorers covering correctness, efficiency, and behavior quality
- CSV and BigQuery reporting
┌─────────────────────────────────────────────────────────────────────┐
│ EvalBench Pipeline │
│ │
│ ┌──────────────┐ ┌──────────────────┐ ┌───────────────────┐ │
│ │ Run Config │───▶│ AgentOrchestrator│───▶│ AgentEvaluator │ │
│ │ (YAML) │ │ │ │ │ │
│ └──────────────┘ └──────────────────┘ └────────┬──────────┘ │
│ │ │
│ ┌──────────────┐ ┌──────────────────────┼──────────┐ │
│ │ Eval Dataset│ │ Per Scenario │ │ │
│ │ (JSON) │─────────────▶│ ▼ │ │
│ └──────────────┘ │ ┌──────────────────────────┐ │ │
│ │ │ GeminiCliGenerator │ │ │
│ ┌──────────────┐ │ │ ┌─────────┐ ┌─────────┐ │ │ │
│ │ Model Config │──────────────│─▶│ │MCP/Ext/ │ │Simulated│ │ │ │
│ │ (YAML) │ │ │ │Skills │ │User │ │ │ │
│ └──────────────┘ │ │ └─────────┘ └─────────┘ │ │ │
│ │ └───────────┬──────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ Scorers (8 metrics) │ │ │
│ │ └──────────────────────────┘ │ │
│ └─────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Reporting (CSV / BigQuery) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Flow:
- The Run Config ties together the dataset, model config, scorers, and reporting.
- The AgentOrchestrator loads the
geminiclievaluator. - For each scenario in the evalset, the AgentEvaluator runs a multi-turn conversation loop:
- Sends the starting prompt to Gemini CLI
- A SimulatedUser (LLM) generates realistic follow-up responses based on the conversation plan
- Tools are accumulated across turns
- Conversation continues until
max_turnsis reached or the simulated user sendsTERMINATE
- Results are scored by all configured scorers.
- Reports are written to CSV and/or BigQuery.
-
Python 3.10+ and project dependencies installed using
uv:cd evalbench uv sync -
Node.js and npm (for Gemini CLI execution)
-
GCP Authentication (for Vertex AI models and MCP servers):
gcloud auth application-default login
-
Environment Variables:
export EVAL_GCP_PROJECT_ID=your_project_id export EVAL_GCP_PROJECT_REGION=us-central1
# For MCP Server evaluation:
export EVAL_CONFIG=datasets/gemini-cli-tools/example_run_config.yaml
# For Skills evaluation:
export EVAL_CONFIG=datasets/gemini-cli-tools/example_run_skills_config.yaml
# For Fake MCP (offline testing):
export EVAL_CONFIG=datasets/gemini-cli-tools/example_run_fake_config.yaml./evalbench/run.shThis executes all scenarios, runs scorers, and writes results to the results/ directory.
Three YAML/JSON files work together to define an evaluation run:
The top-level config that ties everything together. For Gemini CLI, set orchestrator: geminicli and dataset_format: gemini-cli-format.
| Key | Required | Description |
|---|---|---|
dataset_config |
Yes | Path to the evalset JSON file |
dataset_format |
Yes | Must be gemini-cli-format |
orchestrator |
Yes | Must be geminicli |
model_config |
Yes | Path to the Gemini CLI model config YAML |
simulated_user_model_config |
Yes | Path to the model config for the simulated user LLM |
scorers |
Yes | Dictionary of scorer configurations (see Scorers) |
reporting |
Optional | CSV and/or BigQuery output options |
Example (example_run_config.yaml):
############################################################
### Dataset / Eval Items
############################################################
dataset_config: datasets/gemini-cli-tools/gemini-cli.evalset.json
dataset_format: gemini-cli-format
# Orchestrator Configuration
orchestrator: geminicli
model_config: datasets/model_configs/gemini_cli_model.yaml
simulated_user_model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
############################################################
### Scorer Related Configs
############################################################
scorers:
trajectory_matcher: {}
goal_completion:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
behavioral_metrics:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
parameter_analysis:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
turn_count: {}
end_to_end_latency: {}
tool_call_latency: {}
token_consumption: {}
############################################################
### Reporting Related Configs
############################################################
reporting:
csv:
output_directory: 'results'The model config defines the Gemini CLI version, environment, and the tool setup (MCP servers, extensions, or skills). This is the critical file that determines which tool paradigm is used.
| Key | Required | Description |
|---|---|---|
gemini_cli_version |
Yes | NPM package specifier for Gemini CLI (e.g., @google/gemini-cli@0.25.1) |
generator |
Yes | Must be gemini_cli |
env |
Optional | Environment variables passed to the CLI process |
setup |
Optional | Tool setup block containing mcp_servers, extensions, skills, or fake_mcp_servers |
| Variable | Description |
|---|---|
GOOGLE_CLOUD_PROJECT |
GCP project for API calls |
GOOGLE_CLOUD_LOCATION |
GCP region |
GOOGLE_GENAI_USE_VERTEXAI |
Set to "true" to use Vertex AI |
GEMINI_API_MODEL |
Override the model used by Gemini CLI |
GEMINI_MODEL |
Alternative model override |
The evalset JSON file defines the test scenarios. Each scenario represents an agentic user journey.
{
"scenarios": [
{
"id": "unique-scenario-id",
"starting_prompt": "The initial user message",
"conversation_plan": "Instructions for the simulated user...",
"expected_trajectory": ["tool_1", "tool_2"],
"env": {
"GOOGLE_CLOUD_PROJECT": "my-project"
},
"kind": "tools",
"max_turns": 6
}
]
}See the agentic dataset format for the full field reference, including optional fields like work_dir, binary_rubric, and expected_skills, plus ${VAR} environment expansion and scenario filtering. The required fields are:
| Field | Required | Description |
|---|---|---|
id |
Yes | Unique identifier for the scenario |
starting_prompt |
Yes | The first user message sent to Gemini CLI |
conversation_plan |
Yes | Natural language instructions that guide the simulated user's behavior across turns. See writing good conversation plans. |
expected_trajectory |
Yes | Ordered list of tool names the agent is expected to call. Used by trajectory_matcher scorer. See Tool name format below. |
max_turns |
Yes | Maximum number of conversation turns before the evaluation stops |
env |
Optional | Per-scenario environment variables (merged with model config env) |
kind |
Optional | Category label (e.g., "tools") |
Entries in expected_trajectory use the canonical form <server>__<tool> (double-underscore separator) for MCP tools, and the bare name for native harness tools (e.g. Read, Bash, run_shell_command). Each harness adapter normalizes its raw tool-call event into this form at the boundary, so the same evalset can score runs from Codex, Claude Code, and Gemini CLI without modification. The <server> segment comes from the MCP server key in your model config and is case-sensitive — e.g. cloud-sql or bigtable. See evalbench/generators/models/tool_naming.py for the canonicalization helper.
By default the trajectory_matcher scorer drops native/harness-internal tools (anything that is not in canonical <server>__<tool> form) from both the expected and actual lists before scoring, so authors can keep expected_trajectory focused on user-visible MCP intent without the score being dragged down by harness-internal calls like update_topic or Bash. Set filter_native_tools: false on the scorer if you intentionally want to score native-tool usage — see the scorer configuration example.
The conversation_plan instructs the simulated user LLM how to behave, and shapes the evaluation as much as the starting prompt does. See writing good conversation plans for the guidance.
Example — Ambiguous Multi-turn Scenario:
{
"id": "csql-create-ambiguous-multiturn-01",
"starting_prompt": "I need a database.",
"conversation_plan": "The user starts with a vague request. You want to CREATE a NEW Cloud SQL instance named 'my-pg-app'. If the agent offers to create one, say YES. When asked for details, provide 'my-pg-app' as the instance name and 'user_data' as the database name. Never claim to have an existing instance. The goal is for the agent to eventually create the database 'user_data' inside 'my-pg-app' in astana-evaluation project.",
"expected_trajectory": ["cloud-sql__list_instances", "cloud-sql__create_instance", "cloud-sql__create_database"],
"env": {
"GOOGLE_CLOUD_PROJECT": "astana-evaluation"
},
"kind": "tools",
"max_turns": 6
}EvalBench supports three distinct tool paradigms for Gemini CLI, each configured in the setup section of the model config YAML. You can also use fake MCP servers for deterministic, offline testing.
MCP (Model Context Protocol) servers expose tools via a standardized protocol. These can be remote HTTP-based APIs (like Google Cloud managed MCP servers) or local stdio-based servers.
In the model config, under setup.mcp_servers:
setup:
mcp_servers:
"server-name":
# For HTTP-based MCP servers:
httpUrl: "https://example.googleapis.com/mcp"
authProviderType: google_credentials
oauth:
scopes:
- https://www.googleapis.com/auth/cloud-platform
headers:
X-Goog-User-Project: my-project
# For stdio-based MCP servers:
# command: "python"
# args:
# - "path/to/server.py"- Setup Phase:
GeminiCliGenerator._setup_mcp_servers()writes the MCP server configuration intosettings.jsonin a sandboxed fake home directory (.venv/fake_home/.gemini/settings.json). - Verification: By default, EvalBench verifies each MCP server by running Gemini CLI and asking it to list loaded tools. If no MCP-specific tools are found, the run fails with a
RuntimeError. This ensures the server is reachable before evaluation begins. - Execution: During evaluation, Gemini CLI connects to the configured MCP server(s) and uses the exposed tools to complete tasks.
# datasets/model_configs/gemini_cli_model.yaml
gemini_cli_version: "@google/gemini-cli@0.25.1"
generator: gemini_cli
env:
GOOGLE_CLOUD_PROJECT: "my-project"
GOOGLE_CLOUD_LOCATION: "us-central1"
GOOGLE_GENAI_USE_VERTEXAI: "true"
setup:
mcp_servers:
"cloud-sql":
httpUrl: "https://sqladmin.googleapis.com/mcp"
authProviderType: google_credentials
oauth:
scopes:
- https://www.googleapis.com/auth/cloud-platform
headers:
X-Goog-User-Project: my-projectNote: Any valid MCP server configuration that Gemini CLI accepts can be used here. The
setup.mcp_serversblock is written directly into the Gemini CLI settings file.
Extensions are GitHub-hosted Gemini CLI plugins that provide additional tools. EvalBench can install, configure, and manage extensions automatically.
In the model config, under setup.extensions:
setup:
extensions:
"https://github.com/org/extension-repo":
settings:
SETTING_KEY_1: "value1"
SETTING_KEY_2: "value2"- Installation:
GeminiCliGenerator._install_extensions()callsgemini extensions install <url> --consentvia the CLI. - Idempotent Management: Before installing, EvalBench lists current extensions, removes any that are no longer in the config, and skips already-installed ones.
- Headless Compatibility: Extension manifests with
"sensitive": trueare automatically patched to"sensitive": falseto avoid keychain requirements in CI/headless environments. - Settings: Extension-specific environment variables (from
settings) are passed during installation and at CLI runtime.
# Model config with extensions
gemini_cli_version: "@google/gemini-cli@0.25.1"
generator: gemini_cli
env:
GOOGLE_CLOUD_PROJECT: "my-project"
GOOGLE_CLOUD_LOCATION: "us-central1"
GOOGLE_GENAI_USE_VERTEXAI: "true"
setup:
extensions:
"https://github.com/gemini-cli-extensions/cloud-sql-postgresql":
settings:
CLOUD_SQL_POSTGRES_PROJECT: "my-project"
CLOUD_SQL_POSTGRES_INSTANCE: "my-instance"
CLOUD_SQL_POSTGRES_REGION: "us-central1"
CLOUD_SQL_POSTGRES_DATABASE: "mydb"
CLOUD_SQL_POSTGRES_USER: "app"
CLOUD_SQL_POSTGRES_PASSWORD: "secret"
CLOUD_SQL_POSTGRES_IP_TYPE: "PUBLIC"Skills are local Gemini CLI skill packages that can be linked, installed, enabled, disabled, or uninstalled.
In the model config, under setup.skills:
setup:
skills:
# Link a skill from a local path
- action: link
path: "/path/to/skill/directory"
# Install a skill by name or path
- action: install
name: "skill-name"
# or
- action: install
path: "/path/to/skill"
# Enable/Disable a skill
- action: enable
name: "skill-name"
- action: disable
name: "skill-name"
# Uninstall a skill
- action: uninstall
name: "skill-name"You can also specify skills by name only (as strings), which copies them from ~/.gemini/skills/:
setup:
skills:
- "my-existing-skill"| Action | Required Fields | Description |
|---|---|---|
link |
path |
Creates a symlink to a local skill directory. Runs gemini skills link <path> --consent. |
install |
name or path |
Installs a skill from a registry or path. Runs gemini skills install <target> --consent. |
enable |
name |
Enables a previously installed skill. |
disable |
name |
Disables a skill without uninstalling it. |
uninstall |
name |
Removes a skill. |
- String-based skills: If a skill is specified as a plain string, EvalBench copies it from
~/.gemini/skills/<name>to the sandboxed fake home. - Action-based skills: If specified as a dict with an
action, EvalBench runs the appropriategemini skills <action>CLI command. - Sandboxing: All skills operate within a fake home directory (
.venv/fake_home/) to isolate the evaluation environment.
# datasets/model_configs/gemini_cli_skills_model.yaml
gemini_cli_version: "@google/gemini-cli@0.31.0"
generator: gemini_cli
env:
GOOGLE_CLOUD_PROJECT: "my-project"
GOOGLE_CLOUD_LOCATION: "us-central1"
GOOGLE_GENAI_USE_VERTEXAI: "true"
GEMINI_API_MODEL: "gemini-2.5-flash"
GEMINI_MODEL: "gemini-2.5-flash"
setup:
skills:
- action: link
path: "/path/to/cloud-sql-postgresql/skills/cloudsql-postgres-admin"Fake MCP servers let you test your evalset and pipeline with deterministic, hardcoded tool responses—no real API calls needed.
Fake MCP servers are defined in two parts: the server process definition in setup.fake_mcp_servers, and the tool definitions in the top-level fake_mcp_tools section of the model config.
Server definition:
setup:
fake_mcp_servers:
"server-name":
command: "python"
args:
- "evalbench/util/fake_mcp_server.py"
- "--server-name"
- "server-name"
- "--config"
- "path/to/this_model_config.yaml"Tool definitions:
fake_mcp_tools:
"server-name":
- name: tool_name
description: "What this tool does"
parameters:
type: object
properties:
param1:
type: string
description: "Description of param1"
required: ["param1"]
response:
status: "success"
message: "Hardcoded response"- EvalBench starts
fake_mcp_server.pyas a stdio-based MCP server. - The server reads tool definitions from the YAML config's
fake_mcp_toolssection. - When called, each tool returns its hardcoded
response(or a default success response containing the tool name and arguments). - Tool verification is skipped for fake servers (
verify_tools=False).
- Success: Return a success message
response: status: "success" message: "Instance created successfully"
- Failure: Return an error
response: status: "failure" error: code: 404 message: "Instance not found or permission denied"
- Default: If no
responseis specified, returns{"status": "success", "tool": "<name>", "args": {<arguments>}}
# datasets/model_configs/gemini_cli_fake_model.yaml
gemini_cli_version: "@google/gemini-cli@0.25.1"
generator: gemini_cli
env:
GOOGLE_CLOUD_PROJECT: "astana-evaluation"
GOOGLE_CLOUD_LOCATION: "us-central1"
GOOGLE_GENAI_USE_VERTEXAI: "true"
setup:
fake_mcp_servers:
"cloud-sql":
command: "python"
args:
- "evalbench/util/fake_mcp_server.py"
- "--server-name"
- "cloud-sql"
- "--config"
- "datasets/model_configs/gemini_cli_fake_model.yaml"
fake_mcp_tools:
"cloud-sql":
- name: create_instance
description: "Creates a Cloud SQL instance"
parameters:
type: object
properties:
project_id:
type: string
instance_name:
type: string
required: ["project_id", "instance_name"]
response:
status: "success"
message: "Instance created successfully"
- name: get_instance
description: "Gets details of a Cloud SQL instance"
parameters:
type: object
properties:
project_id:
type: string
instance_name:
type: string
required: ["project_id", "instance_name"]
response:
status: "failure"
error:
code: 404
message: "Instance not found or permission denied"Scorers are configured in the scorers section of the run config. See the scorer reference for the complete catalog and every configuration option — including cost scorers (tokens_processed, effective_billed_tokens), skills scorers, and custom Python scorers.
The set most commonly used with Gemini CLI:
| Scorer | Type | Score Range | Description |
|---|---|---|---|
trajectory_matcher |
Deterministic | 0–100 | Expected vs. actual tool usage. Jaccard similarity by default; enforce_order: true switches to Levenshtein. Native tools (run_shell_command, ...) are dropped from both sides by default — see Tool name format. |
turn_count |
Deterministic | Count | Number of conversation turns the agent took. Lower is generally better. |
end_to_end_latency |
Deterministic | Milliseconds | Model API latency plus tool execution latency. |
tool_call_latency |
Deterministic | Milliseconds | Sum of all tool execution durations. |
token_consumption |
Deterministic | Count | Total input + output tokens across all turns. |
goal_completion |
LLM | 0–100 | Whether the agent accomplished the conversation plan's intent. 100 for PASS, 0 for FAIL. |
behavioral_metrics |
LLM | 0–100 | Hallucination and clarification rates. Starts at 100, penalizing 50 per hallucination and 20 per unnecessary clarification. |
parameter_analysis |
LLM | 100 (qualitative) | Feedback on tool parameters. Always scores 100 — the value is in the explanation. |
binary_rubric_scorer |
LLM | 0–100 | Pass/fail against user-supplied rubric criteria. |
scorers:
# Deterministic scorers (no model needed)
# trajectory_matcher drops native/harness-internal tools (Read, Bash,
# run_shell_command, ...) by default — uncomment the expanded block
# below to opt out, or to enforce ordered matching.
trajectory_matcher: {}
# trajectory_matcher:
# filter_native_tools: false # keep native tools in the score
# enforce_order: true # use Levenshtein for ordered matching
turn_count: {}
end_to_end_latency: {}
tool_call_latency: {}
token_consumption: {}
# LLM-based scorers (require model_config)
goal_completion:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
behavioral_metrics:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
parameter_analysis:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml
binary_rubric_scorer:
model_config: datasets/model_configs/gemini_2.5_pro_model.yaml{
"scenarios": [
{
"id": "quick_dbt_test",
"starting_prompt": "Set up a bare minimum dbt project with a single model that selects 1. Create a `dbt_project.yml` and `profiles.yml` in the project directory so that `dbt compile` and `dbt run` will pass. In `profiles.yml`, configure a profile named `default` using `type: bigquery` and `method: oauth`. You can assume the environment has default credentials configured.",
"conversation_plan": "The agent should set up a dbt project and run compile and run successfully.",
"expected_trajectory": [],
"binary_rubric": [
"The agent created a profiles.yml with type: bigquery.",
"The agent created a dbt_project.yml."
],
"kind": "tool",
"max_turns": 5,
"enforce_order": false
}
]
}description: "Quick tests for Rubric Scorer."
dataset_config: quick_dbt_test.json
model_config: gemini_cli_test_model.yaml
simulated_user_model_config: gemini_2.5_pro_test_model.yaml
scorers:
goal_completion:
model_config: gemini_2.5_pro_test_model.yaml
binary_rubric_scorer:
model_config: gemini_2.5_pro_test_model.yaml
turn_count: {}
executable_sql: {}Results are output as CSV files in the specified directory:
reporting:
csv:
output_directory: 'results'For centralized result storage and dashboarding:
reporting:
bigquery:
gcp_project_id: my-gcp-projectGoal: Test Cloud SQL management via the managed MCP server.
-
Create model config (
model_configs/gemini_cli_model.yaml):gemini_cli_version: "@google/gemini-cli@0.25.1" generator: gemini_cli env: GOOGLE_CLOUD_PROJECT: "my-project" GOOGLE_CLOUD_LOCATION: "us-central1" GOOGLE_GENAI_USE_VERTEXAI: "true" setup: mcp_servers: "cloud-sql": httpUrl: "https://sqladmin.googleapis.com/mcp" authProviderType: google_credentials oauth: scopes: - https://www.googleapis.com/auth/cloud-platform headers: X-Goog-User-Project: my-project
-
Create evalset (
my-evalset.json):{ "scenarios": [ { "id": "list-and-inspect-01", "starting_prompt": "list all instances in project my-project", "conversation_plan": "Ask the agent to list instances. Once listed, get details of the 'prod-db' instance and verify it is RUNNABLE.", "expected_trajectory": ["cloud-sql__list_instances", "cloud-sql__get_instance"], "env": { "GOOGLE_CLOUD_PROJECT": "my-project" }, "kind": "tools", "max_turns": 3 } ] } -
Create run config (
my-run-config.yaml):dataset_config: my-evalset.json dataset_format: gemini-cli-format orchestrator: geminicli model_config: model_configs/gemini_cli_model.yaml simulated_user_model_config: datasets/model_configs/gemini_2.5_pro_model.yaml scorers: trajectory_matcher: {} goal_completion: model_config: datasets/model_configs/gemini_2.5_pro_model.yaml turn_count: {} reporting: csv: output_directory: 'results'
-
Run:
export EVAL_CONFIG=my-run-config.yaml ./evalbench/run.sh
Goal: Test Cloud SQL management via a linked skill.
-
Create model config (
model_configs/gemini_cli_skills_model.yaml):gemini_cli_version: "@google/gemini-cli@0.31.0" generator: gemini_cli env: GOOGLE_CLOUD_PROJECT: "my-project" GOOGLE_CLOUD_LOCATION: "us-central1" GOOGLE_GENAI_USE_VERTEXAI: "true" GEMINI_API_MODEL: "gemini-2.5-flash" GEMINI_MODEL: "gemini-2.5-flash" setup: skills: - action: link path: "/path/to/skills/cloudsql-postgres-admin"
-
Use the same evalset — the scenarios are tool-paradigm agnostic.
-
Create run config pointing to the skills model config.
-
Run:
export EVAL_CONFIG=my-skills-run-config.yaml ./evalbench/run.sh
Goal: Validate the pipeline without making real API calls.
-
Create model config with fake tools (see Fake MCP Servers section for full example).
-
Create a simple evalset targeting the fake tools:
{ "scenarios": [ { "id": "fake-create-success", "starting_prompt": "Create a new Cloud SQL instance named 'test-db' in project 'my-project'.", "conversation_plan": "All details are in the prompt. The agent should call create_instance and report success.", "expected_trajectory": ["cloud-sql__create_instance"], "env": { "GOOGLE_CLOUD_PROJECT": "my-project" }, "kind": "tools", "max_turns": 3 } ] } -
Run:
export EVAL_CONFIG=datasets/gemini-cli-tools/example_run_fake_config.yaml ./evalbench/run.sh
RuntimeError: MCP Server 'cloud-sql' failed verification
- Ensure the MCP server URL is correct and accessible.
- Check that
gcloud auth application-default loginhas been run. - Verify the OAuth scopes and project ID in the headers.
- Check network/firewall rules if the server is remote.
- Ensure
npmis installed and accessible. - Check the extension GitHub URL is correct and accessible.
- Look at logs for "keychain" errors — these are auto-patched, but the extension may have other issues.
- Run
npm exec --yes @google/gemini-cli -- extensions listmanually to debug.
- Verify the skill path exists and contains a valid skill structure.
- Ensure the Gemini CLI version supports the
skills linkcommand. - Check that the path is an absolute path.
- Confirm
dataset_formatis set togemini-cli-format. - Check that the evalset JSON has the correct
"scenarios"key. - Verify the
model_configpath is correct relative to the repo root.
- EvalBench auto-configures NPM auth tokens for private registries using
gcloud auth print-access-token. - If this fails, run
gcloud auth loginand retry.