ContextSmith

io.github.RahulSankhla312由 GitHub 账号 RahulSankhla312 发布v0.1.1更新于 Oct 25, 2026

Give your coding agent the right code: graph + hybrid search, packed into a token budget. Local.

已验证STDIO仅桌面知识与记忆开发者工具

概览

AI 生成的概览

本地代码上下文引擎:为仓库建立索引,按任务返回最相关的代码,并打包进指定的 token 预算。

可以做什么
  • 按任务取代码:在 token 预算内返回最相关的函数、类与文件大纲
  • 搜索与导航代码:符号排序搜索、符号定位、调用者与被调用者、变更的传递影响面
  • 了解结构:查看由代码关系和 git 共同变更关联的文件,以及语言、规模、核心与高频变更文件的概览
  • 记录知识:把笔记固定到文件或符号上,之后的会话会在上下文中看到
  • 维护索引:强制增量重建索引,只重新读取发生变化的文件
适用场景
适合编码助手在大型仓库中工作、因全文搜索和整文件读取而浪费上下文的场景。也适合希望助手从正确函数入手、快速理解陌生代码或评估改动影响面的开发者,以及要求检索完全留在本机完成的团队。
运行要求
作为本地 stdio 进程运行,从 PyPI 安装(pipx 或 pip,可选 semantic 附加包,也可用 uvx)。需要 Python 3.11-3.13 和待索引的仓库,通过 CTXSMITH_ROOT 或 serve 的路径参数指定。semantic 附加包会在首次使用时从 Hugging Face 下载开源嵌入模型;可选变量 CTXSMITH_EMBED_MODEL、CTXSMITH_RERANK_MODEL 和 FASTEMBED_CACHE_PATH 用于调整模型与缓存位置。无需账号或 API 密钥。
安装前请注意
索引写入仓库内的 .contextsmith 目录,并会自动加入 git 忽略。代码不会上传,但助手收到的上下文仍会发送给它自己的模型提供方。add_note 工具会向索引写入笔记,reindex 会改变本地索引状态。项目自述为 v0.1 版本,可能存在不完善之处。

安装

在 SourceWeft 中

  1. 打开 控制台中的 ContextSmith,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

ContextSmith

Give your coding agent the right code, not more code.

A local context engine for Claude Code, Cursor, Codex and any MCP agent. It indexes your repository into a code graph, hybrid search and git history, and answers every task with the code that matters, packed into a token budget you choose.

[CI] [PyPI] [Python] [License: MIT]

[ContextSmith indexing Flask, ranking files for a bug report, packing context into a token budget and printing the Claude Code setup]

▶ Watch the 60-second video: indexing, context packing, live MCP calls and the benchmark.

Coding agents spend their context window on the wrong code. They grep, open whole files, and run out of room before they reach the function that needs the fix, and you pay for every token they read. ContextSmith answers one question as well as possible: given this task and N tokens, what code should the agent read?

92%
of real bug fixes had the right file inside a 4,000-token context
vs 29% for search + whole files
1.7x
more often the exact lines to change are shown
48% vs 29%, same budget
100% local
no API keys, no cloud,
code never leaves the machine

Measured on 114 Django issues from SWE-bench Lite that no tuning step ever saw. Method and full results.

Quickstart (60 seconds)

bash
pipx install "contextsmith[semantic]"      # or: pip install "contextsmith[semantic]"cd your-repoctxsmith index                              # once; afterwards only changed files are re-readctxsmith context "Coupons are applied twice at checkout" --budget 4000

Connect it to your agent (the command prints the exact line for your machine):

bash
ctxsmith mcp-config claude    # or: cursor, windsurf, codexclaude mcp add contextsmith -- ctxsmith serve --path /path/to/your-repo

From then on the agent calls get_context itself and gets ranked, budgeted code instead of grepping. Without the [semantic] extra everything still works, using keyword search only.

Who it's for

Developers

  • Faster, better agent sessions on big repos. The agent starts from the right functions instead of exploring; fewer wrong edits and "I couldn't find it" loops.
  • Understand unfamiliar code. ctxsmith context "where are payment retries handled?" returns the relevant functions with their file and line numbers.
  • Change safely. ctxsmith impact charge_card lists everything that calls it, transitively: what a change could break, before you make it.
  • Remember the gotchas. ctxsmith note add "never call without the account lock" --symbol charge_card pins a note to the code; it shows up in every future context for that code, for you and for the agent.

Teams and companies

NeedHow ContextSmith covers it
Code that must not leave the building (finance, health, government, enterprise IP)Runs entirely on the developer's machine. Parsing, search and embeddings are local; the only network use is a one-time download of two small open models, which you can mirror internally for air-gapped machines
Predictable AI spendEvery answer has a hard token budget you set, so context cost per task is fixed instead of "whatever the agent opened"
Works with the agents you already pay forStandard MCP server: Claude Code, Cursor, Windsurf, Codex, Copilot agents and in-house agents use the same index
OnboardingNew engineers and their agents ask questions in plain language and land on the right code
Code review and CIctxsmith context "$PR_TITLE" -b 6000 gives a review bot the code a PR touches and depends on; ctxsmith impact NAME shows the blast radius
Team knowledgeDecisions and invariants live next to the code as notes, not in someone's head
No lock-in, no procurementMIT licence (commercial use is fine), a single SQLite file per repository, no server to run, no account

Typical rollout: each developer installs it with pipx, runs ctxsmith index in the repositories they work on, and adds one MCP line to their agent. There is nothing to host. See Using it at a company for CI and offline setups.

Builders of AI tools

ContextSmith is also a Python library. Use it as the retrieval layer of your own agent, review bot or internal assistant:

python
from contextsmith import Engine
eng = Engine("path/to/repo")eng.index()pack = eng.context("Fix the race when two users book the last seat", budget=6000)prompt = f"{pack.text}\n\nTask: fix the race when two users book the last seat."

Results

The test: take a real GitHub issue from SWE-bench Lite, check the repository out at the issue's own commit (so no future code or history leaks in), give the issue text to the tool, and check whether the code the real fix changed comes back.

Final test on Django: 114 issues that no tuning step ever saw.

BM25, whole filesContextSmith
The fix's file is ranked 1st / in the top 3 / top 550.9% / 70.2% / 77.2%51.8% / 79.8% / 85.1%
The fix's file is inside a 4,000-token context28.9%92.1% (3.2x)
The exact lines the fix changes are shown in 4,000 tokens28.9%48.1% (1.7x)
Query time (median, laptop CPU, 2,800-file repository)145 ms238 ms

The baseline pastes BM25-ranked files whole until the budget runs out, which is what "search the repo and open files" agents do. ContextSmith spends the same tokens on the functions that matter and outlines of the rest, so the right file almost always makes it in.

All strategies and ablations
strategyR@1R@3R@5R@10file in 4kfile in 8klines in 4klines in 8kms
BM25, whole files50.970.277.284.228.949.128.949.1145
lexical (no embeddings)48.274.678.986.086.089.542.346.2145
embeddings only48.269.378.986.8––––249
ContextSmith (default)51.879.885.188.692.196.548.150.7238
+ cross-encoder re-rank34.273.781.691.2––––1824
without git history56.178.984.290.4––––249

Full numbers: bench/results-django/summary.md.

What the ablations say, including what didn't work:

  • Embeddings earn their place: adding them to the lexical ranker lifts top-5 from 79% to 85% and exact-line coverage from 42% to 48%.
  • The cross-encoder re-rank hurts the top result (52% → 34%) at 8x the latency, so it is off by default and marked experimental. A general web-search re-ranker doesn't understand issue-to-code relevance; a code-trained one is on the roadmap.
  • Git commit history is mixed: it helped on the tuning repositories, but on Django removing it raises recall@1 by 4 points. It stays on because the default was fixed before the Django run; changing it now would be tuning on the test set.
  • At 8,000 tokens whole files catch up on exact lines (49% vs 51%): every Django fix here touches one file, and at that budget it often fits whole.

Method. Weights were chosen by grid search on 89 issues from 8 other repositories (pytest, requests, flask, sphinx, pylint, xarray, astropy, seaborn) with bench/tune.py and bench/tune_pack.py, then frozen before Django was run once. Reproduce it with ctxsmith bench --repos django/django (first run: about two hours on a laptop).

How it works

mermaid
flowchart LR    subgraph Index["ctxsmith index (incremental)"]        TS["tree-sitter<br/>7 languages"] --> SYM["symbols · calls · imports"]        SYM --> G["call graph<br/>PageRank"]        SYM --> FTS["FTS5 BM25<br/>files · symbols · bodies"]        SYM --> EMB["ONNX embeddings<br/>symbol summaries"]        EMB --> VEC["sqlite-vec<br/>cosine index"]        GIT["git log"] --> H["commit-message index<br/>co-change pairs"]    end    subgraph Query["get_context(task, budget)"]        Q["task text"] --> S1["file BM25"] & S2["semantic kNN"] & S3["paths in task"] & S4["history BM25"]        S1 & S2 & S3 & S4 --> RRF["reciprocal-rank<br/>fusion"]        RRF --> KS["knapsack packer<br/>value per token"]        KS --> OUT["≤ N tokens of code"]    end    Index -. one SQLite file .-> Query

One SQLite file per repository holds everything: files, symbols, call and import edges, three FTS5 indexes, git statistics, team notes, and the vector index (a vec0 virtual table from sqlite-vec; a numpy fallback runs where SQLite can't load extensions).

Retrieval (RAG). Each signal produces its own ranked list of files; reciprocal-rank fusion combines them, so no single noisy signal dominates:

SignalWhat it catches
BM25 over whole files (camelCase/snake_case split, paths weighted up)exact vocabulary
Semantic kNN over symbol summaries (BAAI/bge-small-en-v1.5, ONNX, CPU)the same idea in different words
Paths named in the task (tracebacks, "in foo/bar.py")explicit pointers
BM25 over each file's commit messages"this was touched for a similar bug before"
Co-change, call-graph neighbours, PageRank, exact-name mentionsavailable as weights; off by default because the benchmark showed they hurt file ranking

The weights come from a grid search (bench/tune.py) on 89 SWE-bench Lite issues from 8 repositories and were then checked on Django, which tuning never saw.

What gets embedded, and why. Not whole files and not raw chunks: one short summary per function or class — path, qualified name, signature, first docstring sentence. On a laptop CPU this is ~30x cheaper than embedding bodies, and it is what identifies "which function is this about". Vectors are cached by content hash, so a function that didn't change is never embedded twice — across re-indexes and across git checkouts. Test files are skipped.

Experimental re-rank. ctxsmith context --rerank re-scores the top 20 files with a cross-encoder (ms-marco-MiniLM-L-6-v2). It is off by default because the benchmark shows it hurts (see Results).

Packing. Candidates are function bodies (matched by name, docstring and body text), class outlines and file outlines. A greedy knapsack takes the best value per token, discounts repeats from one file, and enforces the budget on the final rendered text, so the answer is never over budget.

Always fresh. Re-indexing compares file size and mtime before reading anything and only re-parses and re-embeds what changed; checking an unchanged 2,800-file repository takes about half a second. The MCP server does this before answering (at most every 2 seconds), so the agent never reads code it has just edited from a stale index.

Use it from your agent (MCP)

ctxsmith mcp-config <client> prints the exact snippet for your machine.

Claude Code

bash
claude mcp add contextsmith -- ctxsmith serve --path /path/to/repo

No install, with uv (the server indexes the folder the agent opens):

bash
claude mcp add contextsmith -- uvx --from "contextsmith[semantic]" contextsmith

Cursor, Windsurf and other clients (mcp.json):

json
{  "mcpServers": {    "contextsmith": { "command": "ctxsmith", "args": ["serve", "--path", "/path/to/repo"] }  }}

Codex (~/.codex/config.toml):

toml
[mcp_servers.contextsmith]command = "ctxsmith"args = ["serve", "--path", "/path/to/repo"]
ToolReturns
get_context(task, budget_tokens)the best code for the task, packed to the budget
search(query)ranked functions and classes
find_symbol(name)where something is defined
callers(name) / callees(name)one hop of the call graph
impact(name)everything that transitively calls it: what a change could break
related_files(path)files linked by code, and files that change together in git
add_note(text, path, symbol)a decision or gotcha that later sessions should know
overview()languages, size, central and most-changed files
reindex()force an incremental re-index

CLI

CommandWhat it does
ctxsmith index [PATH] [--no-semantic]Index; incremental, embeddings on when the extra is installed
ctxsmith context "task" -b 4000Best context within a token budget
ctxsmith rank "task"Ranked files, with the signals that found each
ctxsmith search "query"Ranked functions and classes
ctxsmith symbol / callers / callees NAMENavigate the call graph (--json for scripts)
ctxsmith impact NAMEWhat could break if NAME changes
ctxsmith related FILEFiles linked by code, and files that change together
ctxsmith note add "text" --file FRemember a decision or gotcha
ctxsmith overviewLanguages, size, central and most-changed files, semantic status
ctxsmith serveMCP server over stdio
ctxsmith mcp-config [claude|cursor|codex]Setup snippet for your agent
ctxsmith bench --repos django/djangoRun the SWE-bench Lite benchmark yourself

Python API

python
from contextsmith import Engine
eng = Engine("path/to/repo")       # index stored in path/to/repo/.contextsmith/eng.index()                        # incremental; returns counts and timingspack = eng.context("Fix the race when two users book the last seat", budget=6000)pack.text, pack.tokens, pack.files, pack.spans   # markdown, size, files, line ranges shown
eng.rank("seat double-booked").files  # ranked files, with the signals that found eacheng.search("seat reservation")     # ranked functions and classeseng.impact("reserve_seat")         # transitive callerseng.related_files("booking/models.py")eng.add_note("Seats are locked per show, not per seat", path="booking/models.py")

Configuration

VariableDefault
CTXSMITH_EMBED_MODELBAAI/bge-small-en-v1.5 (any fastembed text model, e.g. jinaai/jina-embeddings-v2-base-code)
CTXSMITH_RERANK_MODELXenova/ms-marco-MiniLM-L-6-v2
FASTEMBED_CACHE_PATH~/.cache/contextsmith/models

The index lives in <repo>/.contextsmith/ (git-ignored automatically). Without the semantic extra everything still works, lexically.

Using it at a company

Per developer (the usual rollout). pipx install "contextsmith[semantic]", then ctxsmith index in each repository and one ctxsmith mcp-config line per agent. Nothing to host, no accounts, no shared service to secure.

In CI: give a review bot the code a pull request is about.

yaml
# .github/workflows/pr-context.ymlname: PR contexton: pull_requestjobs:  context:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4        with: { fetch-depth: 0 }            # full history powers the git signals      - uses: actions/setup-python@v5        with: { python-version: "3.12" }      - uses: actions/cache@v4               # reuse the index and the model between runs        with:          path: |            .contextsmith            ~/.cache/contextsmith/models          key: contextsmith-${{ github.base_ref }}      - run: pip install "contextsmith[semantic]" && ctxsmith index      - run: ctxsmith context "$TITLE" --budget 6000 > pr-context.md        env:          TITLE: ${{ github.event.pull_request.title }}   # via env, never inline: no injection      - uses: actions/upload-artifact@v4        with: { name: pr-context, path: pr-context.md }

Feed pr-context.md to whichever review model you use, or post ctxsmith impact <function> output as a comment so reviewers see the blast radius.

Offline and air-gapped machines.

bash
# on a machine with internet access (same OS and Python version as the target)pip download "contextsmith[semantic]" -d wheelsctxsmith index                     # downloads the embedding model (65 MB) once# copy wheels/ and ~/.cache/contextsmith/models/ across, then on the offline machine:pip install --no-index --find-links wheels "contextsmith[semantic]"export HF_HUB_OFFLINE=1            # never try the network again

What is stored, and where. One SQLite file per repository in <repo>/.contextsmith/: symbols, search indexes, call graph, git statistics and commit messages, notes, and embedding vectors. It is git-ignored automatically and never uploaded anywhere. ContextSmith has no telemetry; the only downloads are the open embedding model from Hugging Face on first use (none without the semantic extra) and, if you run ctxsmith bench, the public benchmark.

FAQ

Does my code leave my machine? No. Parsing, search, embeddings and the MCP server all run locally. Your agent still sends the context it receives to its own model provider, as it would with any file it reads; ContextSmith just makes that context smaller and more relevant.

How big a repository can it handle? Measured on Django (2,800 files, 38,000 functions and classes) on a laptop CPU: 16 s to build the code graph, search and git index from scratch, about 3.5 minutes to embed everything the first time, 0.2 s per query, 0.5 s to check for changes, 136 MB on disk. After the first run only changed files are re-parsed and re-embedded.

Does it replace my agent's own search? No, it gives it a better starting point. The agent can still open any file; it just starts from the right functions instead of grepping.

Which models does it use? BAAI/bge-small-en-v1.5 for embeddings (ONNX, CPU, 65 MB), changeable with CTXSMITH_EMBED_MODEL. No large language model is involved: ContextSmith retrieves, your agent reasons.

What does it cost? Nothing. MIT licence, including commercial use.

Is it production-ready? It is v0.1: tested on Windows, macOS and Linux with Python 3.11–3.13, benchmarked in public, and honest about what doesn't work yet (see Results). Issues and pull requests are welcome.

Languages

Python, JavaScript, TypeScript/TSX, Java, Go and Rust, parsed with tree-sitter.

How it compares

Graphify, codebase-memory-mcp, GitNexus, Serena and Claude Context are good tools; this is where ContextSmith differs:

ContextSmith
Answers "the best context for this task in N tokens"✅ budgeted packer, never over budget
Published, reproducible benchmark with baselines and ablations✅ ctxsmith bench, held-out repositories
Lexical + semantic + git history, fused✅
Fully local, no API keys, one SQLite file✅
Team notes pinned to code, surfaced in context✅
Commercial-friendly licence✅ MIT

Roadmap

Multi-repo indexes, note staleness tracking, a file watcher, a graph view, a PR impact report, and more languages. Ideas and benchmark-backed pull requests are welcome: see CONTRIBUTING.md.

Licence

MIT

来源:README.md,提交 d33e602

工具

0
SourceWeft 曾在隔离沙箱中以无凭据方式启动该软件包一次,以列出其工具,但未能完成:服务器未在限时内响应。

版本历史

1
  1. v0.1.1最新Oct 25, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分