github-twin
ภาพรวม
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Personal RAG over your GitHub history (commits, code, reviews), served to Claude Code over MCP.
สามเสาของ PopNx MCP
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
- เสียงผู้ใช้iยังไม่มีรีวิวรีวิวเปิดพร้อมระบบบัญชีในขั้นถัดไป
- ผลตรวจเบื้องต้นของเราiผ่าน 2 จาก 2 ข้อตรวจจากข้อมูลที่เปิดอยู่ ยังไม่ได้สแกนโค้ด
- การใช้งานiยังใหม่มาก↓ 38/สัปดาห์ · ★ 0
ใช้ทำอะไรได้
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
- การเชื่อมต่อ: รันบนเครื่อง
- ช่องทาง (transport): stdio
- หมวด: เครื่องมือนักพัฒนา
- ต้องใส่ค่าเหล่านี้: GITHUB_TOKEN, ANTHROPIC_API_KEY, GEMINI_API_KEY
ติดตั้ง
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ก่อนติดตั้ง
- ผลตรวจเบื้องต้น: ผ่าน 2 จาก 2 ข้อ
- รันในเครื่องคุณด้วยสิทธิ์ของผู้ใช้คุณ (ไฟล์ อินเทอร์เน็ต แอปต่าง ๆ)
- ค่าที่คุณต้องใส่เอง:
GITHUB_TOKEN,ANTHROPIC_API_KEY,GEMINI_API_KEY,GT_PATHS__DATA_DIR
ค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
- PyPIติดตั้ง uv ของ Python (มีคำสั่ง uvx) ในเครื่อง
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"github-twin": {
"command": "uvx",
"args": [
"github-twin"
],
"env": {
"GITHUB_TOKEN": "ใส่ค่าของคุณ",
"ANTHROPIC_API_KEY": "ใส่ค่าของคุณ",
"GEMINI_API_KEY": "ใส่ค่าของคุณ",
"GT_PATHS__DATA_DIR": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add github-twin --env GITHUB_TOKEN='ใส่ค่าของคุณ' --env ANTHROPIC_API_KEY='ใส่ค่าของคุณ' --env GEMINI_API_KEY='ใส่ค่าของคุณ' --env GT_PATHS__DATA_DIR='ใส่ค่าของคุณ' -- uvx github-twinเติมค่าที่เว้นว่างไว้ก่อนรัน
หรือคัดลอกค่าตั้งเอง
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"github-twin": {
"command": "uvx",
"args": [
"github-twin"
],
"env": {
"GITHUB_TOKEN": "ใส่ค่าของคุณ",
"ANTHROPIC_API_KEY": "ใส่ค่าของคุณ",
"GEMINI_API_KEY": "ใส่ค่าของคุณ",
"GT_PATHS__DATA_DIR": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
หรือคัดลอกค่าตั้งเอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"github-twin": {
"type": "stdio",
"command": "uvx",
"args": [
"github-twin"
],
"env": {
"GITHUB_TOKEN": "ใส่ค่าของคุณ",
"ANTHROPIC_API_KEY": "ใส่ค่าของคุณ",
"GEMINI_API_KEY": "ใส่ค่าของคุณ",
"GT_PATHS__DATA_DIR": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าที่ต้องใส่เอง
- 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`).
- Optional. Enables the Claude backend for `gt summarize`, `gt distill`, and `gt eval`. Defaults to local Ollama when unset.
- Optional. Enables the Gemini backend for embedding and the LLM seam. Vertex AI ADC via `GT_GEMINI_PROJECT` is also supported.
GT_PATHS__DATA_DIRenvOptional. Override the on-disk data directory holding the SQLite index, embeddings, and cached GitHub responses. Defaults to `$XDG_DATA_HOME/github-twin`.
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
ทำอะไรได้บ้าง
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
ผลตรวจเบื้องต้นi
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 10 พ.ย. 2569
- ✓ ผ่าน
ตัวตนผู้ทำตรงกับ repo
ชื่อใน registry ยืนยันด้วยบัญชี GitHub ChristopherDavenport ซึ่งเป็นเจ้าของ repo
- ✓ ผ่าน
ยังมีคนดูแล
มีการแก้โค้ดล่าสุด 4 เดือนที่ผ่านมา
- … ยังไม่ตรวจ
มีสัญญาอนุญาต (license)
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
- – ไม่เกี่ยว
endpoint ตอบ
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
- – ไม่เกี่ยว
ล็อกอินแบบ OAuth
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
- … ยังไม่ตรวจ
คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับตัวอื่นในหมวด เครื่องมือนักพัฒนาi
- ดาวมากกว่า 0% ของอีก 5723 ตัวในหมวดนี้
- ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 15% ของอีก 5723 ตัวในหมวดนี้
- ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 5723 ตัวในหมวดนี้
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
คำถามที่พบบ่อย
github-twin ปลอดภัยไหม?
จากการตรวจเบื้องต้นของเรา ผ่าน 2 จาก 2 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใช้กุญแจหรือรหัสอะไรบ้าง?
ต้องใส่ค่าเหล่านี้: GITHUB_TOKEN, ANTHROPIC_API_KEY, GEMINI_API_KEY
ตัวนี้รันบนเครื่องหรือบนคลาวด์?
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
ยังมีคนดูแลอยู่ไหม?
repo บน GitHub มีการแก้โค้ดล่าสุด 4 เดือนที่ผ่านมา และส่งรุ่นล่าสุด (0.0.17) เข้า registry 5 เดือนที่ผ่านมา
ใช้กับโปรแกรมไหนได้บ้าง?
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
มีตัวไหนใช้แทนได้บ้าง?
ในหมวดเดียวกันมี REA, Netdata, Front-End Checklist
ตัวที่ใช้แทนได้
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
Netdata
Real-time infrastructure monitoring with metrics, logs, alerts, and ML-based anomaly detection.
Front-End Checklist
Review frontend code and live pages against 386 quality-gated web development rules.
README จากผู้ทำ
เปิดอ่าน README
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
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
geminiembedder 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:
- 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.
- Existing `gh` CLI: if you've already run
gh auth login,gtpicks up the token viagh auth token— nothing to do. - `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.
| Provider | Env var | What it covers |
|---|---|---|
| Anthropic (Claude) | ANTHROPIC_API_KEY | Distill / summarize / eval LLM. Best quality. |
| Google (Gemini, API key) | GEMINI_API_KEY or GOOGLE_API_KEY | Distill / 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]', pullstorch). Useful when an Ollama daemon isn't available or you want a specific HuggingFace model. Local. - Alternative — Gemini (
gemini-embedding-001at 3072-dim by default). Uses thegoogle-genaidep that's already installed; auth viaGEMINI_API_KEY/GOOGLE_API_KEY, or viaGT_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 themuser:email— verified email addresses for the user-mode identity sweepread: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.
| Tool | Returns |
|---|---|
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