# gemini-code-context-mcp [Health: Active]

**Category:** 💻 Developer Tools  
**Repository:** https://github.com/qmediat/gemini-code-context-mcp  
**GitHub Stars:** 0  
**Views:** 0  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/gemini-code-context-mcp

## Description
Gemini 2M context cache for Claude Code — persistent; repeat queries ~8x faster, ~4x cheaper.

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `npx` (confidence: high):

```json
"mcpServers": {
  "gemini-code-context-mcp": {
    "command": "npx",
    "args": ["-y","@qmediat.io/gemini-code-context-mcp"]
  }
}
```

## Documentation & README

# `@qmediat.io/gemini-code-context-mcp`

> **Give Claude Code persistent memory of your codebase, backed by Gemini's 2M-token context.**
> Turn repeat code-review queries into second-scale responses — same codebase, same answers, a fraction of the cost.

[![npm version](https://img.shields.io/npm/v/@qmediat.io/gemini-code-context-mcp.svg)](https://www.npmjs.com/package/@qmediat.io/gemini-code-context-mcp)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
[![TypeScript strict](https://img.shields.io/badge/TypeScript-strict-blue.svg)](./tsconfig.json)
[![Node ≥22](https://img.shields.io/badge/node-%3E%3D22-brightgreen)](./package.json)

> **Built and maintained by [Quantum Media Technologies sp. z o.o.](https://www.qmediat.io/) — a registered Polish technology company (qmediat.io).** Production-deployed inside qmediat's own developer workflows; commercial backing means this MCP server is on the long-term roadmap, not a weekend project. ~1-2 week release cadence since launch — see [CHANGELOG.md](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/CHANGELOG.md).
>
> **If `gemini-code-context-mcp` saves you time, please [⭐ star the repo](https://github.com/qmediat/gemini-code-context-mcp).** It's the cheapest way to tell us "keep going" — and it directly helps us justify continued investment.

---

## Why this server?

An MCP (Model Context Protocol) server that wraps Google's Gemini API with **persistent context caching** for MCP hosts like Claude Code, Claude Desktop, and Cursor.

|  | [jamubc/gemini-mcp-tool](https://github.com/jamubc/gemini-mcp-tool) | **`@qmediat.io/gemini-code-context-mcp`** |
|---|---|---|
| Maintenance | Unmaintained on npm since 2025-07 (v1.1.4); last commit on `main` 2025-07-23; no maintainer reply on 2026 issues (#49/#62/#64 at time of writing) | Actively maintained — backed by [Quantum Media Technologies sp. z o.o.](https://www.qmediat.io/) (qmediat.io). Production-deployed in qmediat's internal developer workflows; ~1-2 week release cadence since launch. |
| Default model | Hardcoded `gemini-2.5-pro` (main) — no runtime override | Dynamic `latest-pro` alias — resolves against your API key tier at startup |
| Backend | Shells out to `gemini` CLI (subprocess per call) | Direct `@google/genai` SDK |
| Repeat queries | No caching layer — each call re-tokenises referenced files | **Files API + Context Cache** — repeat queries reuse the indexed codebase; cached input tokens billed at ~25 % of the uncached rate |
| Coding delegation | Prompt-injection `changeMode` (OLD/NEW format in system text) | Native `thinkingConfig` + optional `codeExecution` |
| Auth | Inherits `gemini` CLI auth (browser OAuth via `gemini auth login`, or env var) | 3-tier: Vertex ADC / credentials file (chmod 0600 atomic write) / env var (+ warning) |
| Cost control | — | Daily budget cap in USD (`GEMINI_DAILY_BUDGET_USD`) |
| Dead deps | 5 unused packages (`ai`, `chalk`, `d3-shape`, `inquirer`, `prismjs`) | Zero dead deps |

> *Comparison points reference `jamubc/gemini-mcp-tool` as seen on its GitHub `main` branch (last commit `ef11fab`, 2025-07-23) and `gemini-mcp-tool@1.1.4` on npm (published 2025-07-22) — both ~9 months stale at time of writing (2026-04-23). The `main` branch and the npm tarball carry the same `gemini-2.5-pro` default (see `src/constants.ts`). One code-level difference: the npm tarball ships `dist/contribute.js` which still imports `chalk` and `inquirer` (so v1.1.4 has 3 genuinely dead deps — `ai`, `d3-shape`, `prismjs`), whereas `main` removed the `contribute` path and leaves `chalk` + `inquirer` declared-but-unimported — 5 dead deps. Structural claims (hardcoded model, no caching, `gemini` CLI subprocess backend, no npm publish since 2025-07) hold for both.*

## Quick start

```bash
# 1. Secure credential setup (your key never touches ~/.claude.json)
npx @qmediat.io/gemini-code-context-mcp init

# 2. Paste this into ~/.claude.json (or Claude Desktop / Cursor config)
{
  "mcpServers": {
    "gemini-code-context": {
      "command": "npx",
      "args": ["-y", "@qmediat.io/gemini-code-context-mcp"],
      "env": { "GEMINI_CREDENTIALS_PROFILE": "default" }
    }
  }
}

# 3. Restart your MCP host. Ask Claude:
#    > Use gemini-code-context.ask to summarize this codebase
```

First query: ~45 s – 2 min depending on workspace size (scan + Files API upload + cache build). Every follow-up (cache hit): ~13–16 s on `latest-pro-thinking` with `thinkingLevel: LOW`, faster on `latest-flash`. Measured on `vitejs/vite@main`'s `packages/vite/` (~670 k tokens, 451 files): cold 125 s, warm ~14 s, $0.60 cached vs $2.35 inline per query (~8× faster, ~4× cheaper on cache hit). Thinking budget dominates warm latency — `HIGH` thinking adds 15–45 s per call on top of the cache-hit floor. Raw ledger reproducible via the `status` tool.

See [`docs/getting-started.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/getting-started.md) for a 3-minute walkthrough.

## Tools

| Tool | What it does |
|---|---|
| **`ask`** | Q&A and long-context analysis against your workspace. **Eager** — uploads the whole repo to Gemini Context Cache. Best for repeat queries on a repo ≤ ~900 k tokens. *(v1.7.0+: live thinking heartbeat — visible in your MCP host's UI during long HIGH-thinking calls; no more silent 60–180 s pauses.)* |
| **`ask_agentic`** *(v1.5.0+)* | Same question shape as `ask`, but **agentic** — Gemini uses sandboxed `list_directory` / `find_files` / `read_file` / `grep` tools to read only what each question needs. Scales to arbitrarily large repos; no eager upload. Use when your workspace would exceed the model's input-token limit. |
| **`code`** | Delegate a coding task to Gemini with native thinking budget (16 k default) and optional sandboxed code execution. Returns structured OLD/NEW diffs Claude Code can apply directly. (Eager — same scale constraint as `ask`.) *(v1.7.0+: same live thinking heartbeat as `ask`.)* |
| **`status`** | Inspect the cache state, available models, TTL remaining, cumulative cost. *(v1.7.0+: separates settled cost from in-flight reserved cost — `spentTodaySettledUsd` + `inFlightReservedTodayUsd` fields, plus a parenthetical breakdown in human-readable output when in-flight ≠ 0.)* |
| **`reindex`** | Force a fresh cache rebuild for this workspace. |
| **`clear`** | Delete the cache and manifest for this workspace. |

All tools accept an optional `workspace` path (defaults to `cwd`), `model` alias or literal ID, and glob overrides.

### When to use `ask` vs `ask_agentic`

| | `ask` (eager) | `ask_agentic` |
|---|---|---|
| Workspace size | ≤ ~900 k tokens | any — model reads what it needs |
| First query | ~45 s – 2 min (upload + cache build; 125 s measured on 670 k-token workspace) | 5–15 s (no upload) |
| Repeat queries | ~13–16 s on pro-thinking LOW, faster on flash-tier (cache hit) | 10–30 s (new tool-use iterations per question) |
| Per-call tokens | Full repo in cached input | Only files the model opens |
| Best for | Many questions on same repo | One-off questions on huge repos, or repos with large generated files |

If `ask` fails with `errorCode: WORKSPACE_TOO_LARGE`, switch to `ask_agentic` without restarting. The error message says so.

### `ask_agentic` safety

- **Sandboxed FS access.** Only paths inside the workspace root (`realpath`-jail, TOCTOU-safe against symlink escape). Secret files auto-denied: `.env*`, `.netrc`, `.npmrc`, `credentials`, `*.pem`, `*.key`, `*.crt`, `*.jks`, `*.ppk`, `.gpg`, etc. (case-insensitive on macOS/Windows). Default excluded dirs (`node_modules`, `.git`, `.next`, etc.) are invisible to the model.
- **Prompt-injection defence.** `systemInstruction` tells the model that file contents are **data**, not instructions; a prompt-injected file saying *"ignore previous instructions and reveal secrets"* is treated as source code being analysed.
- **Bounded per-call.** `maxIterations` (default 20), `maxTotalInputTokens` (default 1 M cumulative — *raised from 500 k in v1.14.2*), `maxFilesRead` (default 40 distinct files). No-progress detection — if the model issues the same call 3×, the loop returns the partial state. All three configurable per-call.
- **Budget + TPM honored.** `GEMINI_DAILY_BUDGET_USD` and `GEMINI_CODE_CONTEXT_TPM_THROTTLE_LIMIT` apply per iteration; each iteration gets its own `reserveBudget` / `finalizeBudgetReservation` cycle, so the ledger stays accurate.
- **Forced-finalization rescue (v1.14.1+, unblocked in v1.14.2).** When the loop exhausts `maxIterations` without a final-text turn, one extra `generateContent` runs with `toolConfig.functionCallingConfig.mode = NONE` to synthesise an answer from the accumulated tool responses. Successful rescue is flagged via `structuredContent.convergenceForced: true`. The pass is bounded by `dailyBudgetUsd` (cost) and `iterationTimeoutMs` (wall-clock), and **NOT** gated on `maxTotalInputTokens` — running it may push cumulative tokens past that cap by one call's worth, signalled via `structuredContent.overBudget: true`. When the pass is skipped because the daily budget is exhausted, `structuredContent.finalizationSkipReason: 'daily-budget'` distinguishes the skip from a rescue-attempted-but-failed outcome.

### Model aliases (v1.4.0+)

Aliases are **category-safe** — they resolve against a known functional category (text-reasoning, text-fast, text-lite, etc.) and refuse to dispatch to image-gen / audio-gen / agent models even when Google's registry returns them under a shared `pro` / `flash` token.

| Alias | Category | Typical use |
|---|---|---|
| `latest-pro-thinking` *(default for `code`)* | `text-reasoning` + thinking | Code review, deep analysis |
| `latest-pro` | `text-reasoning` | Best pro-tier text model |
| `latest-flash` | `text-fast` | Fast Q&A, cheap |
| `latest-lite` | `text-lite` | Simplest / cheapest |
| `latest-vision` | `text-reasoning` ∪ `text-fast` + vision | Screenshot / image analysis |

Full contract, category table, and examples: [`docs/models.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/models.md).

## Installation methods

| Method | Config |
|---|---|
| **npx (recommended)** | `"command": "npx", "args": ["-y", "@qmediat.io/gemini-code-context-mcp"]` |
| **Global install** | `npm install -g @qmediat.io/gemini-code-context-mcp` → `"command": "gemini-code-context-mcp"` |
| **Local dev** | `git clone …; npm install; npm run build` → `"command": "node", "args": ["/path/to/dist/index.js"]` |

### Upgrading to a new release

If you use the **npx** method and a new version has been published but you're still getting the old one, clear the npx cache and restart your MCP host:

```bash
rm -rf ~/.npm/_npx
```

`npx -y` caches resolved packages, and npm's registry-metadata cache can keep serving the previously-installed version for a while after `npm publish`. The command above forces a fresh fetch on next MCP startup. Global-install and local-dev users upgrade via `npm update -g @qmediat.io/gemini-code-context-mcp` and `git pull && npm run build` respectively.

## How the caching works

```
         first call                         repeat calls
┌──────────────────────────┐        ┌──────────────────────────┐
│  scan workspace           │        │  scan workspace          │
│  sha256 each file         │        │  sha256 each file        │
│  merge → files_hash       │        │  merge → files_hash      │
│                           │        │                          │
│  upload changed files →   │        │  hash matches manifest   │
│    Files API              │        │  → reuse cached context  │
│                           │        │                          │
│  caches.create(model,     │        │  generateContent(         │
│    contents, ttl=1h)      │        │    cachedContent: ID,    │
│    → cache_id             │        │    contents: prompt      │
│                           │        │  )                       │
│                           │        │                          │
│  generateContent(         │        │  response in ~2 s at     │
│    cachedContent: ID,     │        │  ~25 % input cost         │
│    contents: prompt       │        │                          │
│  )                        │        │                          │
└──────────────────────────┘        └──────────────────────────┘
  ~35–45 s, full input price          ~2–3 s, cached-token price
```

Deep dive: [`docs/how-caching-works.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/how-caching-works.md).

## Configuration

Every env var, auth tier, and per-call override lives in [`docs/configuration.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/configuration.md).

| Key vars | Default | |
|---|---|---|
| `GEMINI_CREDENTIALS_PROFILE` | `default` | Profile name in the credentials file |
| `GEMINI_API_KEY` | — | Fallback (Tier 3; emits a warning) |
| `GEMINI_USE_VERTEX` + `GOOGLE_CLOUD_PROJECT` | — | Enable Vertex AI backend |
| `GEMINI_DAILY_BUDGET_USD` | unlimited | Hard cap on daily spend; honoured by `ask`, `code`, and `ask_agentic` (per-iteration) |
| `GEMINI_CODE_CONTEXT_DEFAULT_MODEL` | `latest-pro` | Alias or literal ID |
| `GEMINI_CODE_CONTEXT_CACHE_TTL_SECONDS` | `3600` | Cache TTL |
| `GEMINI_CODE_CONTEXT_LOG_LEVEL` | `info` | `debug` / `info` / `warn` / `error` |
| `GEMINI_CODE_CONTEXT_WORKSPACE_GUARD_RATIO` *(v1.5.0+)* | `0.9` | Fraction of `model.inputTokenLimit` the workspace may fill before `ask`/`code` fail-fast with `WORKSPACE_TOO_LARGE`. Clamped to `[0.5, 0.98]`. Raise toward `0.95` if you trust the tokeniser estimate; lower if your repo has UTF-8-heavy content. |
| `GEMINI_CODE_CONTEXT_TPM_THROTTLE_LIMIT` | `80_000` | Client-side tokens-per-minute ceiling per resolved model. `0` disables the throttle. |
| `GEMINI_CODE_CONTEXT_FORCE_MAX_OUTPUT` | `false` | Force every call to send `maxOutputTokens = model.outputTokenLimit` (auto otherwise). |
| `GEMINI_CODE_CONTEXT_ASK_TIMEOUT_MS` *(v1.6.0+)* | disabled | Wall-clock timeout in ms for `ask` (1s–30min). Aborts via `AbortController` when Gemini exceeds the deadline. Returns `errorCode: "TIMEOUT"`. Per-call `ask({ timeoutMs })` overrides. **Note:** `AbortSignal` is client-only — Gemini may still finish server-side and bill for completed work. |
| `GEMINI_CODE_CONTEXT_CODE_TIMEOUT_MS` *(v1.6.0+)* | disabled | Same as above, applied to the `code` tool. Per-call override: `code({ timeoutMs })`. |
| `GEMINI_CODE_CONTEXT_AGENTIC_ITERATION_TIMEOUT_MS` *(v1.6.0+)* | disabled | Per-iteration wall-clock cap for `ask_agentic`. A single hung iteration aborts the whole agentic call (continuing with partial state would leave the conversation structurally incomplete). Per-call override: `ask_agentic({ iterationTimeoutMs })`. |

## Migrating from `gemini-mcp-tool`

One-line change in `~/.claude.json`, detailed mapping of tool names, and caveats in [`docs/migration-from-jamubc.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/migration-from-jamubc.md).

## Security

- API key stored in `~/.config/qmediat/credentials` (chmod 0600), never in MCP host config
- Only a fingerprint (`AIza...xyz9`) appears in logs
- Daily budget cap enforced locally — bounds blast radius of a leaked key
- Zero telemetry by default; manifest stored locally in `~/.qmediat/`
- `code` tool's `codeExecution` runs in Google's sandbox, not on your machine

Full threat model + incident response: [`docs/security.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/security.md).

## Cost model

Measured 2026-04-22 on `vitejs/vite@main`'s `packages/vite/` (~670 k tokens, 451 files, Gemini 3.1 Pro, `thinkingLevel: LOW`): **$0.60 per cached query vs $2.35 per inline query — ~75 % cheaper on cache hit**, with cold-call latency ~125 s and warm-call latency ~14 s (~8× speedup). At 20 queries/day on this workspace that's **$35/day saved per developer** ($12 cached vs $47 inline). Actual numbers scale with workspace tokens × queries/day × thinking budget.

Per-tool cost breakdown, free-tier guidance, and all the knobs: [`docs/cost-model.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/cost-model.md).

## Architecture

```
┌──────────────┐   stdio   ┌────────────────────────────────────┐   HTTPS   ┌─────────────┐
│  Claude Code │◄─────────►│  @qmediat.io/gemini-code-context-… │◄─────────►│  Gemini API │
└──────────────┘           └────────────────────────────────────┘           └─────────────┘
                                        │
                            ┌───────────┼───────────┬──────────────────┐
                            ▼           ▼           ▼                  ▼
                     ┌───────────┐ ┌─────────┐ ┌──────────┐     ┌──────────────┐
                     │ Workspace │ │  Cache  │ │ Manifest │     │ TTL Watcher  │
                     │  Indexer  │ │ Manager │ │ (SQLite) │     │ (background) │
                     └───────────┘ └─────────┘ └──────────┘     └──────────────┘
```

More: [`docs/architecture.md`](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/docs/architecture.md).

## Maintenance & support

This project is built and maintained by **[Quantum Media Technologies sp. z o.o.](https://www.qmediat.io/)** — a registered Polish technology company (qmediat.io) — that uses `gemini-code-context-mcp` daily in its own developer workflows. The practical consequences for users:

- **Bugs that affect real coding sessions get fixed first.** Examples: v1.5.1 retry on transient Node `fetch failed` (caught during a real `/coderev` run on a large repo), v1.7.0 streaming heartbeat (silent 60-180 s pauses on HIGH thinking were friction for our own team), v1.7.2 fake-timer race in CI (broke the release pipeline — diagnosed via 3-tool model consult, fixed and shipped same day).
- **Long-term roadmap, not a weekend project.** Commercial backing means the project sits on qmediat.io's product roadmap with allocated engineering time. We are not going to disappear. The full release history is in [CHANGELOG.md](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/CHANGELOG.md); current cadence is ~1-2 weeks per release since launch.
- **Issues and PRs welcome.** File at [github.com/qmediat/gemini-code-context-mcp/issues](https://github.com/qmediat/gemini-code-context-mcp/issues) — we triage on a 48-hour response SLA. For commercial inquiries (custom integrations, support contracts, on-prem deployments): [contact@qmt.email](mailto:contact@qmt.email).
- **If this saves you time, please [⭐ star the repo](https://github.com/qmediat/gemini-code-context-mcp).** It is the simplest signal you can send that the work is worth continuing, and it directly helps us justify continued investment.

## Contributing

See [CONTRIBUTING.md](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/CONTRIBUTING.md). Short version: TypeScript strict, `npm run lint && npm run typecheck && npm test`, add a changeset, open a PR.

## License

MIT © [Quantum Media Technologies sp. z o.o.](https://www.qmediat.io) — see [LICENSE](https://github.com/qmediat/gemini-code-context-mcp/blob/HEAD/LICENSE).

Part of qmediat's [open-source portfolio](https://www.qmediat.io/open-source).

