# Gemini CLI Configuration

You can configure the Gemini CLI to use this MCP server, allowing you to
interact with Gerrit directly from your terminal. The server can be installed as
a **Gemini Extension**, or run in **HTTP** or **STDIO** modes.

## Gemini Extension (recommended)

This method is recommended as it is easy and requires only one step. You do not
need to manually modify the Gemini settings file.

Run the following command:

```bash
gemini extension install <path-to-gerrit-mcp-server>
```

> Read more about Gemini extensions in
> [https://geminicli.com/docs/extensions/](https://geminicli.com/docs/extensions/).

## HTTP Mode

In HTTP mode, the server runs as a persistent background process. This is
recommended for frequent use.

1. **Start the Server:** From the `gerrit-mcp-server` project directory, run:

   ```bash
   ./server.sh start
   ```

2. **Configure Gemini CLI:** Add the following to your
   `$HOME/.gemini/settings.json` file. This tells the CLI to connect to the
   running HTTP server.

   ```json
   {
     "mcpServers": {
       "gerrit": {
         "httpUrl": "http://localhost:6322/mcp",
         "timeout": 15000
       }
     }
   }
   ```

## STDIO Mode

In STDIO mode, the Gemini CLI starts the MCP server on-demand for each request.
This is useful if you don't want a server running in the background.

**Configure Gemini CLI:** Add the same content from
[`gemini-extension.json`](./gemini-extension.json) to your
`$HOME/.gemini/settings.json` file. Make sure to replace `${extensionPath}` with
the absolute path to your `gerrit-mcp-server` project directory.

Now, when you run `gemini`, you can use the `@gerrit` tool directly.
