Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

github-twin

by ChristopherDavenportversion 0.0.17i★ –iRuns on your computer
Registry nameio.github.ChristopherDavenport/github-twin

Install

Overview

Description from the maker (original English)

Personal RAG over your GitHub history (commits, code, reviews), served to Claude Code over MCP.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Developer tools
  • You need to fill in: GITHUB_TOKEN, ANTHROPIC_API_KEY, GEMINI_API_KEY

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • You fill in yourself: GITHUB_TOKEN, ANTHROPIC_API_KEY, GEMINI_API_KEY, GT_PATHS__DATA_DIR

Values marked secret are keys to your account. Never share them or paste them into a chat.

You need

  • PyPIPython’s uv installed (for the uvx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "github-twin": {
      "command": "uvx",
      "args": [
        "github-twin"
      ],
      "env": {
        "GITHUB_TOKEN": "your-value",
        "ANTHROPIC_API_KEY": "your-value",
        "GEMINI_API_KEY": "your-value",
        "GT_PATHS__DATA_DIR": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add github-twin --env GITHUB_TOKEN=your-value --env ANTHROPIC_API_KEY=your-value --env GEMINI_API_KEY=your-value --env GT_PATHS__DATA_DIR=your-value -- uvx github-twin

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "github-twin": {
      "command": "uvx",
      "args": [
        "github-twin"
      ],
      "env": {
        "GITHUB_TOKEN": "your-value",
        "ANTHROPIC_API_KEY": "your-value",
        "GEMINI_API_KEY": "your-value",
        "GT_PATHS__DATA_DIR": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "github-twin": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "github-twin"
      ],
      "env": {
        "GITHUB_TOKEN": "your-value",
        "ANTHROPIC_API_KEY": "your-value",
        "GEMINI_API_KEY": "your-value",
        "GT_PATHS__DATA_DIR": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • GITHUB_TOKEN secret env
    GitHub personal access token. Optional: github-twin can also pick the token up from `gh auth token` or from its own OAuth device-flow login (`gt auth login`).
  • ANTHROPIC_API_KEY secret env
    Optional. Enables the Claude backend for `gt summarize`, `gt distill`, and `gt eval`. Defaults to local Ollama when unset.
  • GEMINI_API_KEY secret env
    Optional. Enables the Gemini backend for embedding and the LLM seam. Vertex AI ADC via `GT_GEMINI_PROJECT` is also supported.
  • GT_PATHS__DATA_DIR env
    Optional. Override the on-disk data directory holding the SQLite index, embeddings, and cached GitHub responses. Defaults to `$XDG_DATA_HOME/github-twin`.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 6, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account ChristopherDavenport, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Developer toolsi

  • More stars than 0% of the other 1389 servers in this category
  • Published to the registry more recently than 24% of the other 1389 servers in this category
  • Basic checks equal to or better than 100% of the other 1389 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is github-twin safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: GITHUB_TOKEN, ANTHROPIC_API_KEY, GEMINI_API_KEY

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.0.17) reached the registry 5 months ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.

What can I use instead?

In the same category: GitHub, Desktop Commander, Cloudflare MCP

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

GitHub

by github

GitHub’s official server lets AI read and manage code, issues and pull requests in your account. Use GitHub’s hosted version or run it locally with Docker.

Computer or cloud★ 34,245MITUpdated 3 days ago
Install

Desktop Commander

by wonderwhy-er

MCP server for terminal commands, file operations, and process management

Runs on your computer★ 10,225MITUpdated 15 days ago
Install

Cloudflare MCP

by cloudflare

Cloudflare MCP servers

Runs in the cloud★ 4,446Apache-2.0Updated 14 months ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

github-twin

You reviewed a permission check six months ago. Claude doesn't remember

it. github-twin does — it indexes your commits and review comments,

and surfaces them as retrieval hits whenever an agent writes or reviews

new code in your style.

Try it now from Claude Code — drop this into ~/.claude.json and reload:

{

"mcpServers": { "github-twin": { "command": "uvx", "args": ["github-twin", "serve"] } } }

Your code stays on your box. Embeddings are computed locally

(Ollama or sentence-transformers); only the LLM seam (gt summarize,

gt distill, gt eval) optionally calls a hosted provider, and even

that's swappable to local Ollama. The gemini embedder is the one

exception — opt-in only.


A personal RAG over your GitHub history, served to Claude Code (or any MCP client) as a stdio server. Two scopes, one codebase:

  • User mode — index your own commits + review comments. Surfaces your past code as style examples and your past comments as review hints when an agent is writing or reviewing new code.
  • Org mode — index a whole GitHub org's files-at-HEAD, commits, and PR reviews across every member. Queries scope by repo, language, or reviewer login.

Retrieval is hybrid (BM25 + vector via RRF), AST-aware via tree-sitter for python/scala/javascript/typescript/go/rust, and contextually enriched at embed time with per-chunk headers + optional LLM-generated summaries.

Install

The fastest path is uvx — no virtualenv to manage, isolated per-tool:

# One-shot

uvx github-twin --help

Pinned version

uvx github-twin@0.1.0 --help

With sentence-transformers for the alt embedder

uvx --with 'github-twin[st]' github-twin --help

If you prefer a project-local install:

uv add github-twin            # or: pip install github-twin

gt --help

gt and github-twin are the same Typer app — use whichever fits your muscle memory.

Authenticate

Pick whichever is least friction — github-twin tries them in this order:

  1. OAuth device flow (no `gh` install needed):
   uvx github-twin auth login        # opens browser, persists token

uvx github-twin auth status # show which source is active

   Token persists in the OS keyring (macOS Keychain / Linux Secret

Service / Windows Credential Manager) or, when unavailable, a 0600 file under your data dir.

  1. Existing `gh` CLI: if you've already run gh auth login, gt picks up the token via gh auth token — nothing to do.
  2. `GITHUB_TOKEN` env var: a classic PAT works too; useful for CI / headless / docker. Required scopes: repo, read:org, user:email.

Wire into Claude Code

The MCP server runs over stdio via github-twin serve (or gt serve). Run uvx github-twin auth login once on the box that will host the server.

Option A — via the Claude Code plugin marketplace (lowest-friction):

/plugin marketplace add ChristopherDavenport/christopherdavenport-marketplace

/plugin install github-twin@christopherdavenport

This registers the MCP server entry automatically; set GT_PATHS__DATA_DIR in your environment (or in ~/.claude.json's env block for this server) to point at the DB directory.

Option B — manual wiring: add an entry to ~/.claude.json (or your mcp_servers.json):

{

"mcpServers": { "github-twin": { "command": "uvx", "args": ["github-twin", "serve"], "env": { "GT_PATHS__DATA_DIR": "/path/to/your/github-twin-data" } } } }

If you'd rather not persist a token and instead supply it inline (CI, ephemeral container), add "GITHUB_TOKEN": "ghp_..." to that env block; it acts as the lowest-priority fallback.

Restart Claude Code; the find_*, predict_review_outcome, summarize_review_patterns, and sync tools will be available.

Quickstart

Pick a directory to hold the SQLite DB, config, and ingested cache — everything per-data-dir lives under this one root:

export GT_PATHS__DATA_DIR=~/github-twin-data

uvx github-twin auth login # one-time OAuth (or set GITHUB_TOKEN)

user mode (your own GitHub history)

uvx github-twin init # discover identity via /user uvx github-twin sync # ingest + summarize + embed uvx github-twin serve # MCP server over stdio

layer an org into the SAME DB

uvx github-twin init --kind org --org http4s uvx github-twin sync

OR keep the org in its own DB by switching data dirs

GT_PATHS__DATA_DIR=~/twin-http4s \ uvx github-twin init --kind org --org http4s GT_PATHS__DATA_DIR=~/twin-http4s uvx github-twin sync

gt sync is incremental on subsequent runs.

config.toml lives next to the DB at /config.toml and is created on the first gt init --embed-backend ... call. Default is $XDG_DATA_HOME/github-twin (or ~/.local/share/github-twin) when GT_PATHS__DATA_DIR is unset.

LLM provider matrix

The retrieval surface (find_*, predict_review_outcome) always runs locally on the SQLite index — no API call. LLM calls only happen in three places:

  • gt distill — clusters review comments / commits into rules.
  • gt summarize — generates per-chunk NL summaries used by the embed-time prefix.
  • gt eval reviews / eval predictions — held-out RAG-vs-baseline scoring.

Each picks a backend by precedence Claude → Gemini → Ollama (whichever API key is set), or you can force one explicitly.

ProviderEnv varWhat it covers
Anthropic (Claude)ANTHROPIC_API_KEYDistill / summarize / eval LLM. Best quality.
Google (Gemini, API key)GEMINI_API_KEY or GOOGLE_API_KEYDistill / summarize / eval LLM. Free tier is generous.
Google (Gemini, Vertex / ADC)GT_GEMINI_PROJECT (+ optional GT_GEMINI_LOCATION, default us-central1)Same backends, but auth via gcloud auth application-default login — no key in your shell. API key wins if both are set.
Ollama (local)OLLAMA_HOST (default http://127.0.0.1:11434)Distill / summarize / eval LLM. Fully offline.

The Vertex / ADC path needs the aiplatform.googleapis.com API enabled on your project, and billing applies even for "free" Gemini models — the AI Studio free tier does not extend to Vertex. Project IDs are not secrets; the credential itself lives at ~/.config/gcloud/application_default_credentials.json and is refreshed by gcloud.

Embedder backends

We keep the embedder backend separate from the LLM backend. Choose one:

  • Default — Ollama (nomic-embed-text, 768-dim, ~50ms/chunk). Requires a running Ollama daemon. Zero cost, fully local.
  • Alternative — sentence-transformers (uv add 'github-twin[st]', pulls torch). Useful when an Ollama daemon isn't available or you want a specific HuggingFace model. Local.
  • Alternative — Gemini (gemini-embedding-001 at 3072-dim by default). Uses the google-genai dep that's already installed; auth via GEMINI_API_KEY / GOOGLE_API_KEY, or via GT_GEMINI_PROJECT
  • ADC (gcloud auth application-default login) to route through Vertex AI without managing a key. Remote — this is the only embedder that sends chunk text off-box. Pick it when you have Gemini auth but no Ollama / [st] install, and your corpus is okay to share with Google.

The embedder is a per-DB commitment — sqlite-vec bakes the vector dimension into the table at first creation. Stamp the choice into /config.toml at init time so every subsequent command picks it up:

gt init --embed-backend gemini                              # gemini-embedding-001, 3072

gt init --embed-backend gemini --embed-dim 1536 # request shorter output gt init --embed-backend sentence_transformers \ --embed-model BAAI/bge-small-en-v1.5 --embed-dim 384

Re-running with the same values is a no-op; running with different values against an existing config.toml fails loud rather than silently changing the corpus. GT_EMBED__* env vars still work for one-off overrides and CI.

A "cloud-LLM only" setup either needs an embedder process (Ollama / [st]) or has to opt into the remote Gemini embedder.

Required GitHub token scopes

When you gt init, the GH client needs:

  • repo — private repos and PR comments on them
  • user:email — verified email addresses for the user-mode identity sweep
  • read:org — org member listing and private org repo discovery

A fine-grained PAT works; classic tokens too.

Retrieval

Hybrid search by default: BM25 (SQLite FTS5) and vector similarity run in parallel, then fuse via Reciprocal Rank Fusion (k=60). The vector leg matches semantic intent; the BM25 leg catches exact identifiers (getUserById, SQLITE_OPEN_READWRITE) that vector search routinely misses. Design reference: Anthropic — Contextual Retrieval.

At embed time, each chunk gets a deterministic header prepended: # path :: symbol_name (node_kind), plus the function's leading docstring/comment when present, plus an optional LLM-generated summary (see gt summarize). The header lets vector queries land on chunks whose bodies only contain identifiers (e.g. natural-language queries against a VaultSecretEq function).

BM25 query expansion is on by default (cfg.retrieval.query_expansion = "rule"), with rule-based code-shaped synonyms applied only to the BM25 leg — embeddings already capture synonymy, so expansion never touches the vector query. Switch to "ollama" to add LLM-generated alternates on top, cached on disk per-token.

predict_review_outcome stays on pure vector retrieval because its inverse-distance vote weighting depends on calibrated L2 distance.

MCP tools

All retrieval tools accept optional repo= and author_login= filters.

ToolReturns
find_review_comments(diff_hunk, language?, repo?, author_login?, k=5)Past review comments on diffs similar to the input.
find_style_examples(query, language?, repo?, author_login?, k=5)Past code chunks matching a description.
find_code(query, language?, repo?, path_glob?, node_kind?, k=5)Source snippets from files at HEAD (org mode).
find_applicable_rules(query, language?, repo?, author_login?, k=5)Distilled code-pattern rules relevant to a coding task.
predict_review_outcome(diff_or_summary, language?, repo?, author_login?, k=20)Weighted prediction over nearest past PRs: {approved, changes_requested, commented}.
summarize_review_patterns(language?, limit=20)Distilled rules from clustered review comments (run gt distill first).
sync(since?)Incremental ingest + summarize + embed.

CLI

gt init [--kind user|org|repo] [--org N] [--repo owner/name]

gt repos # list discovered org repos gt ingest # backfill gt summarize [--limit N] [--backend ...] # LLM NL summaries per chunk gt embed

Only the beginning is shown; read the rest in the repo

Ask PopNx