CodeSift -- Token-efficient code intelligence for AI agents
CodeSift indexes your codebase with tree-sitter AST parsing and gives AI agents 150 MCP tools (55 core + 95 discoverable) via CLI or MCP server. It uses 61-95% fewer tokens than raw grep/Read workflows on typical code navigation tasks.
Works with: Claude Code, Cursor, Codex, Gemini CLI, Zed, Aider, Continue — any MCP client.
MCP server for code intelligence — 146 tools for symbol search, call graph, semantic search, route tracing, community detection, LSP bridge, secret detection, conversation search, and Hono framework intelligence
2026-11-14
Stars
—
Tools
—
Uptime
—
Install
Bulletproof one-liner (clears stale cache, installs latest, auto-configures all platforms):
npm cache clean --force && npm i -g codesift-mcp@latest
npm cache clean --force clears stale registry metadata that can cause ETARGET errors. The postinstall script then runs codesift setup all automatically.
Restart your AI client (close + reopen) so the new MCP server is picked up. New terminal sessions in your IDE work fine — no need to quit the IDE itself.
Windows: close every MCP client before upgrading (Claude Code, Codex, Cursor, …). A running
CodeSift server holds native .node files open (onnxruntime-node, @huggingface/transformers),
Windows will not let npm replace an open file, and the upgrade fails with EBUSY / EPERM.
To configure individual platforms manually:
codesift setup claude # Claude Code — config + rules + hooks + CLAUDE.md
codesift setup codex # Codex CLI — config + AGENTS.md rules
codesift setup cursor # Cursor IDE — config + .cursor/rules
codesift setup gemini # Gemini CLI — config + GEMINI.md rules
codesift setup antigravity # Google Antigravity — config only
codesift setup all # All platforms at once
Verify installed version:
codesift --version
What setup installs (all by default):
Component
What it does
Opt-out
MCP config
Registers codesift-mcp server
(required)
Rules file
Tool mapping, hints, ALWAYS/NEVER rules for your AI agent
--no-rules
Hooks (where supported)
Auto-index after Edit/Write, redirect large Read/Bash flows to CodeSift
--no-hooks
Additionally, every MCP client receives ~800 tokens of compact guidance automatically via the MCP instructions field — zero setup needed.
Update
npm update -g codesift-mcp
codesift setup all # Updates rules files to latest version
codesift setup all --force # Force-update even if you modified rules
setup writes the absolute codesift-mcp bin path when available. This avoids
per-session npx cache drift and stale dist/server.js paths. Re-run setup
after updating to refresh rules files and repair old MCP config entries.
Quick start
# Index a project
codesift index /path/to/project
# Search for a function
codesift symbols local/my-project "createUser" --kind function --include-source
# Semantic search (requires embedding provider)
codesift retrieve local/my-project \
--queries '[{"type":"semantic","query":"how does caching work?"}]'
# Build the project wiki — agents read it on every new session
codesift wiki-generate
Wiki tip:setup --hooks (on by default) wires a SessionStart hook that injects a
project overview into every new agent session, plus a PostToolUse hook that auto-refreshes
it. Both are silent no-ops until you run codesift wiki-generate once in the repo — skip it
and the wiki never reaches your agent. This is the #1 reason wiki adoption stays at zero.
Benchmark results
Combo benchmark (real-world tool sequences)
772 real tasks from usage.jsonl — exact query sequences agents used across 33+ repos. Native (grep/find/read) vs CodeSift.
Sequence
Runs
Tok native
Tok Sift
Delta
Wins
pat→st→pat→st (4-gram)
37
377,258
36,758
-90%
28/37
pat→st→pat
39
186,436
20,500
-89%
31/39
st→pat→st→pat
35
307,490
35,905
-88%
25/35
ss→st
78
202,837
36,408
-82%
35/78
st→pat→st
40
250,240
44,424
-82%
27/40
st→tree→st
28
262,703
61,093
-77%
22/28
tree→st
57
380,324
133,578
-65%
44/57
AGGREGATE
772
5,130,240
1,994,825
-61%
542/772
Per-tool (single-tool benchmark)
Tool
Tok native
Tok Sift
Delta
search_text vs rg
1,015,245
49,718
-95%
search_symbols vs rg
192,486
34,186
-82%
get_file_outline vs Read
91,796
58,229
-37%
Performance features
Feature
Description
Impact
mtime-based incremental indexing
Skip files with unchanged mtime on reindex
5.6x faster reindex (57s → 10s on 778-file repo)
index_file
Re-index a single file without full repo walk
9ms when the file is unchanged (short-circuit); a changed file costs one row write, not a whole-index rewrite
SQLite index
Normalized per-repo DB in WAL mode; incremental writes touch one file's rows (details)
10.8x faster single-file re-index, ~17800x faster warm index load
detail_level on search_symbols
compact (~15 tok/result), standard, full
compact is 63% fewer tokens than standard
token_budget on search_symbols
Pack results to token limit instead of guessing top_k
Generate wiki pages + Lens HTML from code topology (communities, hubs, surprises, hotspots)
codesift wiki-generate --focus src/tools
Scope wiki to a specific directory
codesift wiki-generate --no-lens
Skip Lens HTML generation
codesift wiki-lint <wiki-dir>
Check wiki for broken links, orphan pages, stale content
Output goes to .codesift/wiki/ in the repo root. Includes markdown pages with [[wikilinks]], backlinks, community summaries, and a self-contained codesift-lens.html with D3 chord diagram and force-directed graph.
Cross-repo
Command
Description
codesift cross-search <query>
Search symbols across ALL indexed repositories
codesift cross-refs <name>
Find references across ALL indexed repositories
Diff
Command
Description
codesift diff <repo> --since <ref>
Structural diff between git refs
codesift changed <repo> --since <ref>
List changed symbols between refs
Batch & utility
Command
Description
codesift retrieve <repo> --queries <json>
Batch multiple queries in one call
codesift stats
Show usage statistics
codesift generate-claude-md <repo>
Generate CLAUDE.md project summary
codesift list-patterns
List all built-in anti-pattern names
MCP tools (146 total — 55 core + 95 discoverable)
When running as an MCP server, CodeSift exposes 51 core tools directly. The remaining 95 niche tools are discoverable via discover_tools and describe_tools, or via plan_turn which routes a natural-language task to the best-fit tools and auto-reveals any hidden ones.
generate_report (standalone HTML with complexity, dead code, hotspots, communities), generate_wiki (markdown wiki pages + Lens HTML from code topology — communities, hubs, surprises, hotspots, framework pages)
Tool discovery
discover_tools (keyword search across hidden tools), describe_tools (full schema on demand, optional reveal)
Discovery
plan_turn(query=...) — route natural-language task description to best-fit tools, symbols, and files; returns ranked recommendations with confidence scores, reveal_required hints, and gap analysis
Meta
index_status (check if repo is indexed: file/symbol counts, language breakdown, text_stub languages), analyze_project (stack + conventions detection), get_extractor_versions (parser language support)
Search past Claude Code conversation history — the decisions, rationale, and debugging sessions that shaped your code.
# Index conversations for current project (auto-detected from cwd)
# Also runs automatically at startup via auto-discovery
index_conversations()
# Index a specific project's conversations
index_conversations(project_path="/Users/me/.claude/projects/-Users-me-DEV-my-project")
# Search past conversations
search_conversations(query="auth middleware bug", limit=5)
# Find conversations that discussed a specific code symbol
find_conversations_for_symbol(symbol_name="processPayment", repo="local/my-project")
# In codebase_retrieval batch queries
codebase_retrieval(repo, queries=[
{"type": "semantic", "query": "how does auth work"},
{"type": "conversation", "query": "why we chose Redis over Postgres cache"}
])
Compaction-aware: skips summary injections, indexes last summary as meta-doc
Cross-reference: link code symbols to the conversations that discussed them
Secret scanning
Detect hardcoded secrets (API keys, JWT tokens, passwords, connection strings) in your indexed codebase. Uses ~1,100 detection rules from TruffleHog via @sanity-labs/secret-scan, with CodeSift's tree-sitter AST for false-positive reduction.
# Scan entire repo for secrets
scan_secrets(repo="local/my-project")
# Filter by severity
scan_secrets(repo="local/my-project", severity="critical")
# Only high-confidence findings, including test files
scan_secrets(repo="local/my-project", min_confidence="high", exclude_tests=false)
# Scope to specific directory
scan_secrets(repo="local/my-project", file_pattern="src/config/**")
Features:
Eager scanning on file change — results are cached and instant on query
AST-aware confidence: test files, docs, placeholder variables auto-demoted to low
Masked output — secrets shown as sk-p***hijk, raw values never in cache or logs
Inline allowlist — add // codesift:allow-secret to suppress a finding
Severity mapping: cloud keys (AWS, GCP) = critical, API keys (OpenAI, GitHub) = high
Inline warnings in index_file responses when secrets detected
Wiki & Lens — auto-generated architecture documentation
Generate browsable wiki pages and an interactive HTML dashboard from your codebase's topology — zero manual writing.
# Generate wiki for current repo
codesift wiki-generate
# Scope to a directory
codesift wiki-generate --focus src/tools
# Check wiki integrity
codesift wiki-lint .codesift/wiki
What it generates (in .codesift/wiki/):
Community pages — one per Louvain community (module), with members, cohesion score, cross-boundary edges
Hubs page — top symbols by fan-in (load-bearing code)
Kotlin: runBlocking inside suspend function — deadlock risk
globalscope-launch
Kotlin: GlobalScope.launch/async — lifecycle leak
data-class-mutable
Kotlin: data class with var property — breaks hashCode contract
lateinit-no-check
Kotlin: lateinit var without isInitialized check
empty-when-branch
Kotlin: empty when branch — swallowed case
mutable-shared-state
Kotlin: mutable var inside object/companion — thread-unsafe
React (14 + 6 below)
useEffect-no-cleanup
useEffect without cleanup return — memory leak
hook-in-condition
Hook inside if/for/while/switch — Rule of Hooks violation
useEffect-async
async function directly in useEffect
useEffect-object-dep
Object/array literal in dep array — infinite re-render
missing-display-name
React.memo/forwardRef without displayName
index-as-key
Array index used as React key — incorrect reconciliation
inline-handler
Arrow function in JSX event handler — memoization killer
conditional-render-hook
Hook called after early return — Rule of Hooks violation
dangerously-set-html
dangerouslySetInnerHTML — XSS risk
direct-dom-access
document.getElementById/querySelector — use useRef
unstable-default-value
= []/= {} default in params — new ref every render
jsx-falsy-and
{count && <Comp/>} renders "0" when count is 0
nested-component-def
Component inside component — remounts every render
usecallback-no-deps
useCallback/useMemo without dep array — useless memoization
React 19 (4)
react19-use-without-suspense
use(promise) call — verify Suspense boundary
react19-server-action-not-async
Non-async function in "use server" file
react19-form-action-non-function
<form action="url"> instead of action={fn}
react19-useoptimistic-no-transition
useOptimistic without useTransition pair
RSC (2)
rsc-non-serializable-prop
Function passed as prop across RSC boundary
rsc-date-prop
Date object in JSX prop — loses prototype across boundary
PHP (7)
sql-injection-php
User input flowing into SQL query
xss-php
Unescaped user input echoed to output
eval-php / exec-php
eval/shell execution — injection risk
unserialize-php
unserialize() on user input
unescaped-yii-view
Yii2 view without Html::encode()
raw-query-yii
Yii2 createCommand with string interpolation
Custom regex is also supported: codesift patterns local/project "Promise<.*any>".
Performance anti-patterns (find_perf_hotspots)
A separate tool scans for performance-specific issues with balanced-brace loop body extraction (not just regex):
Pattern
What it finds
Severity
unbounded-query
findMany/find without take/limit
high
sync-in-handler
readFileSync/execSync in route/handler/controller files
high
n-plus-one
DB/fetch call inside for/while loop body
high
unbounded-parallel
Promise.all(arr.map(...)) without concurrency control
medium
missing-pagination
API response from unbounded list query
medium
expensive-recompute
Same method called 2+ times in loop body (excludes common methods)
low
# Scan all patterns
find_perf_hotspots(repo)
# Only N+1 and unbounded queries
find_perf_hotspots(repo, patterns="n-plus-one,unbounded-query")
# Scope to API directory
find_perf_hotspots(repo, file_pattern="src/api")
MCP server setup
CodeSift runs as an MCP server, exposing 146 tools to AI agents (55 core + 95 discoverable). The fastest setup method is codesift setup <platform> which handles everything automatically. Manual configuration is also supported:
This configures Codex, Claude Code, Cursor, Gemini CLI, and Antigravity in one command. Safe to run multiple times — skips platforms that are already configured.
Semantic search
Semantic search uses embeddings to answer concept queries like "how does authentication work?" that keyword search misses.
Setup
Zero config — semantic search works out of the box. CodeSift defaults to local on-device embeddings (nomic-ai/nomic-embed-text-v1.5 via @huggingface/transformers v3, INT8 ONNX, ~140MB downloaded on first use, cached after). No API key, no internet after first run, no data leaves your machine. The provider applies the model's task-aware prefixes (search_document: / search_query:) automatically, so retrieval quality matches remote providers.
To opt into a remote provider for higher quality, set one of these:
To disable local embeddings entirely (BM25-only), set CODESIFT_DISABLE_LOCAL_EMBEDDINGS=true. To pin a different local model, set CODESIFT_LOCAL_MODEL=<owner>/<model> (e.g. Xenova/bge-small-en-v1.5).
Semantic and hybrid queries exclude test files by default to maximize token efficiency. To include test files, set "exclude_tests": false in the sub-query or pass --exclude-tests=false on the CLI.
Configuration
All configuration is via environment variables.
Variable
Description
Default
CODESIFT_DATA_DIR
Storage directory for indexes
~/.codesift
CODESIFT_INDEX_BACKEND
Index storage format: sqlite | json (see Index storage)
auto-detect (sqlite on Node >= 22.5)
CODESIFT_WATCH_DEBOUNCE_MS
File watcher debounce interval
500
CODESIFT_DEFAULT_TOKEN_BUDGET
Default token budget for retrieval
8000
CODESIFT_DEFAULT_TOP_K
Default max results for search
50
CODESIFT_EMBEDDING_BATCH_SIZE
Symbols per embedding API call
128
CODESIFT_SECRET_SCAN
Enable/disable secret scanning
true (set false to disable)
CODESIFT_TELEMETRY
Telemetry level: off | anon | full
anon (opt-out)
CODESIFT_TELEMETRY_URL
Collector endpoint (push happens only when set)
unset (no push)
Index storage
Each repo's index is a SQLite database (~/.codesift/<hash>.index.db) with normalized
files and symbols tables, using Node's built-in node:sqlite in WAL mode. There is no
native dependency to compile — npx codesift-mcp cannot fail on a build step.
Why it matters: the index used to be one JSON document per repo, so re-indexing a single
edited file re-parsed and re-serialised the whole thing (262 MB on our largest repo). The
codesift postindex-file hook runs as a fresh process per edit, so it could never amortise
that cost.
Measured on a 4,000-file / 32,000-symbol index:
operation
how often
JSON
SQLite
re-index one edited file
every Write/Edit
534 ms
49.6 ms (10.8× faster)
read one file's mtime
first touch of every file
205.8 ms
0.08 ms (~2500× faster)
load index, warm
every tool call after the first
149.7 ms
0.008 ms (~17800× faster)
load index, cold
once per process
167.8 ms
517.8 ms (3.1× slower)
full re-save
once per repo, on reindex
639 ms
1329 ms (2.1× slower)
The two regressions are deliberate: rebuilding symbol objects from rows costs more than one
large JSON.parse, and both affected operations are rare. Everything frequent gets cheaper.
Migration is automatic. An existing <hash>.index.json is imported on first access. The
JSON file is never deleted, so it stays available as a rollback target.
Backends.CODESIFT_INDEX_BACKEND=json pins the legacy format; =sqlite demands the new
one and fails loudly if unavailable; unset auto-detects. node:sqlite requires Node >=
22.5 — on older runtimes CodeSift transparently keeps using JSON, so the supported Node
floor stays at 20.
Storage faults are not "no index". A locked, corrupt, or permission-denied store raises a
distinct error instead of reading as an unindexed repo — otherwise tools answer "no results"
with full confidence over a database that is merely busy, and the obvious next step (rebuild)
is the wrong one. index_status reports it as unreadable: {code, message}; SQLITE_BUSY is
worth a retry, SQLITE_CORRUPT needs index_folder. A missing, empty, or malformed index is
still ordinary absence.
CodeSift sends anonymous, aggregate usage stats so the tool can be improved based on how it's actually used. It is opt-out and sends only the fields below — never your queries, file paths, repo/file/symbol names, code, hostname, username, or IP.
Exactly what is sent (allowlist): a random per-install id (not derived from your machine); bucketed environment (OS, arch, RAM bucket, cores, Node & CodeSift version, repo-size bucket, top-3 file extensions); and per-tool-per-day aggregates (call count, latency p50/p95/max, error rate, empty-result rate, cache-hit rate) plus response-hint emission counts.
If zuvo is also installed, anonymous per-skill rollups are included as well: which skill ran, its friction category, whether the audit/adversarial gates produced a verdict or were skipped, and median effort — as daily medians and counts, never sums, so total workload does not leak. A retro line's four identifying fields (project, branch, commit sha, free-text note) are never read at all — they are omitted from the field map rather than read and scrubbed, so anonymity survives a format change instead of depending on one. The key is absent entirely when no zuvo is installed, so "absent" and "ran but produced nothing" stay distinguishable. With no zuvo on the machine, nothing in this paragraph applies.
The allowlist is enforced in code — see src/storage/telemetry/sanitizer.ts — and the first-run notice is held to it by a test that fails if the payload can emit a dimension the notice does not name.
See the exact payload that would be sent from your machine:
codesift telemetry show
Opt out (any one of):
export CODESIFT_TELEMETRY=off # or the DO_NOT_TRACK=1 standard
codesift telemetry off # persists in ~/.codesift/config.json
full is opt-in only (sends full local usage entries incl. queries/paths — intended for your own fleet). Push only happens when CODESIFT_TELEMETRY_URL is configured.
How it works
Indexing -- Tree-sitter WASM grammars parse source files into ASTs. Symbol extraction produces functions, classes, methods, types, constants, etc. with signatures, docstrings, and source code. Filesystem mtime is stored per file for incremental skip on reindex.
BM25F search -- Symbols are tokenized (camelCase/snake_case splitting) and indexed with field-weighted BM25 scoring. Name matches rank 5x higher than body matches. Symbols in frequently-imported files get a log-scaled centrality bonus as tiebreaker.
Semantic search (optional) -- Source code is chunked and embedded via the configured provider. Queries are embedded at search time and ranked by cosine similarity. Multi-sub-query decomposition with Reciprocal Rank Fusion (RRF, k=60).
Hybrid search -- Combines semantic embedding similarity with BM25 text matches via RRF, getting the best of both keyword and concept search.
File watcher -- chokidar watches indexed folders for changes. Modified files are re-parsed and the index is updated incrementally.
Agent onboarding -- MCP instructions field sends ~800 tokens of guidance (tool discovery, hints, ALWAYS/NEVER rules) to every client automatically. codesift setup installs full rules files per platform + Claude Code hooks for enforcement.
LSP bridge (optional) -- When a language server is installed (typescript-language-server, pylsp, gopls, rust-analyzer, kotlin-language-server, solargraph, intelephense), CodeSift uses it for type-safe find_references, precise go_to_definition, get_type_info via hover, and cross-file rename_symbol. Falls back to tree-sitter/grep when LSP is unavailable. Lazy start + 5 min idle kill — zero overhead when not used.
Glob pattern support
File pattern parameters (file_pattern) support full glob syntax via picomatch:
*.ts — match by extension at any depth
*.{ts,tsx} — brace expansion
src/**/*.service.ts — directory globbing
[!.]*.ts — character classes
service — plain substring match (no glob chars)
React workflow with CodeSift
CodeSift auto-loads 6 React tools when a React project is detected (package.json with react + .tsx/.jsx files). Zero config.
Day 1 — new React codebase (1 command, ~5s)
react_quickstart
One call returns: component/hook counts, stack (state mgmt, routing, UI lib, form lib, build tool), critical pattern violations, top hooks used, and suggested next queries. Replaces 5+ manual exploration calls.
Daily development
analyze_renders("MyComponent") # re-render risk for a specific component
trace_component_tree("App") # JSX composition hierarchy
analyze_hooks(component_name="Foo") # hook inventory + Rule of Hooks check
trace_call_chain("useAuth", filter_react_hooks=true) # hook dependency graph, stdlib filtered
find_references("UserContext") # where this context is consumed
analyze_context_graph # all createContext → Provider → useContext flows
PR review
review_diff # 10-check composite (React patterns auto-skipped on non-.tsx diffs)
changed_symbols(since="HEAD~3") # what changed structurally
search_patterns("hook-in-condition") # Rule of Hooks violations in changed files
impact_analysis(since="HEAD~3") # blast radius of your changes
CI gates (via audit_scan REACT gate + audit_compiler_readiness)
audit_scan # includes REACT gate: hook-in-condition, useEffect-async,
# dangerously-set-html, index-as-key, nested-component-def
audit_compiler_readiness # React Compiler (v1.0) adoption score — flags bailout
# patterns before migration, counts redundant memo to remove
Set CI to fail on: any dangerously-set-html, any Rule of Hooks violation, any useEffect-missing-cleanup in new code.
React/JSX/TSX has first-class support across 8 waves: component and hook SymbolKind values, JSX-aware call graph (all graph tools see <Component> usage as call edges), 43 React anti-patterns with engine-level comment/string preprocessing. Tier 8 (May 2026) added preprocess: "strip-comments-strings" declarative field on BUILTIN_PATTERNS entries — single-pass 7-state-machine source stripper at src/utils/source-stripper.ts strips comments, string/template/regex literals before regex match (closes the false-positive class where comment-embedded mentions spoofed detection). Tier 7 (May 2026) fixed 3 pre-existing CRITICAL bugs (useOptimistic lookahead trivial bypass, useEffect-setstate-loop array-arg false positive, react19-server-action-not-async missing arrow/default-export forms) and added cross-file findSuspenseAncestor + findLazyComponentsWithoutSuspense walkers reusing reverse JSX adjacency from Tier 5. Tier 6 (May 2026) — derived-state-reducer (useReducer sync action), derived-state-custom-setter (custom setter naming), stale-closure-toggle (setX(!X)), stale-closure-broken-functional (setX(prev => X+1) wrong reference), context-provider-value-via-variable (intermediate-var inline), context-provider-value-inline-destructured ({Provider} form), react-lazy-no-suspense-same-file (single-file heuristic), rsc-non-serializable-prop-deep (Map/Set/Class across RSC boundary), error-boundary-incomplete (partial lifecycle) + full severity migration on all 29 prior patterns; multiline hook-in-condition, bug-free nested-component-def, and Tier 5 (May 2026) patterns — derived-state (useState(props.X) + useEffect sync), stale-closure-setstate (setX(X+1) non-functional update), context-provider-value-inline (inline object/array forces consumer re-render), jsx-no-target-blank (tabnabbing security with postFilter validator), button-no-type (implicit submit foot-gun, lookahead-bounded for HTML only). trace_component_tree (BFS JSX composition tree), analyze_hooks (hook inventory + Rule of Hooks violation detection), analyze_renders (re-render risk + prop_chain_depth render-tree depth metric with explicit "NOT prop-drilling depth" disclaimer in suggestion text — semantic prop-flow tracking is Tier 6 scope), buildContextGraph (createContext → Provider → useContext consumer mapping), React complexity metrics, enriched get_context_bundle, filter_react_hooks option on trace_call_chain, audit_scan REACT gate, React-aware review_diff, generate_report React section, route entry point detection, shadcn/ui + Tailwind + form library detection, @/ alias resolution, RSC boundary detection, build tool detection (Vite, CRA, webpack, Parcel, esbuild, Rspack, Rsbuild, Turbopack), severity-aware react_quickstart bucketing into critical_issues / warnings / style_issues, and declarative postFilter field on BUILTIN_PATTERNS entries. Auto-loaded on React projects (package.json + .tsx files).
Astro has deep framework intelligence — the first and only static code intelligence for Astro in the MCP ecosystem. 4 dedicated tools: astro_analyze_islands (detect all client:*/server:defer directives, group by framework, track server islands), astro_hydration_audit (12 anti-pattern detectors AH01-AH12 with A/B/C/D scoring — catches client:load on Astro components, islands in loops, missing framework hints, below-fold eager hydration, and more), astro_route_map (file-based routing analysis with dynamic params, route conflicts, rendering mode per page, endpoint method detection), astro_config_analyze (tree-sitter AST walker for astro.config.mjs — extracts output mode, adapter, integrations, i18n, redirects with config_resolution honesty field). Also: 6 Astro anti-patterns in search_patterns, Astro-aware trace_route, analyze_project returns full astro_conventions, .astro extension normalization in import graph, framework detection for dead-code analysis, .mdx file indexing. Template parser (parseAstroTemplate) extracts islands, slots, component usages, and directives from HTML template section with balanced-brace tracking, conditional/loop detection, and landmark section awareness.
Kotlin support includes full tree-sitter parsing with a dedicated extractor for functions, classes (data/sealed/enum/abstract/annotation), interfaces, objects (singleton + companion), properties (val/var/const), type aliases, extension functions, suspend functions, generics, KDoc comments, and JUnit test detection (@Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll). Route tracing supports Ktor DSL and Spring Boot Kotlin. Six Kotlin anti-patterns are built-in.
| PHP/Yii2 support | src/parser/extractors/php.ts (+ PHPDoc @property/@method synthesis), src/tools/php-tools.ts (6 tools: resolve_php_namespace, trace_php_event, find_php_views, resolve_php_service, php_security_scan, php_project_audit), src/tools/project-tools.ts (Yii2Conventions), src/tools/route-tools.ts (findYii2Handlers, findLaravelHandlers), src/tools/pattern-tools.ts (8 PHP anti-patterns), src/tools/graph-tools.ts (PHP method call detection), src/utils/import-graph.ts (PHP require/include + PSR-4 cross-file edges via resolvePhpNamespace), src/utils/walk.ts (BACKUP_FILE_PATTERNS auto-exclusion), src/parser/parser-manager.ts (error recovery try/catch), src/lsp/lsp-servers.ts (Intelephense), scripts/download-wasm.ts ([email protected]) |
Development
git clone https://github.com/greglas75/codesift.git
cd codesift-mcp
npm install
npm run download-wasm # Download tree-sitter WASM grammars
npm run build # TypeScript compilation
npm test # Run tests (Vitest, 2900+ tests)
npm run test:coverage # Coverage report
npm run lint # Type check (tsc --noEmit)
Publishing a new version
After making changes, follow these steps to publish to npm:
# 1. Ensure clean working tree
git status # No uncommitted changes
# 2. Build and verify
npm run build # Must succeed with 0 errors
npm test # Must pass (flaky ast-query tests may fail in full suite — OK if they pass individually)
# 3. Bump version (choose one)
npm version patch # 0.2.0 → 0.2.1 (bug fixes)
npm version minor # 0.2.0 → 0.3.0 (new features)
npm version major # 0.2.0 → 1.0.0 (breaking changes)
# This creates a git commit + tag automatically
# 4. Publish to npm
npm publish --ignore-scripts
# npm will open browser for WebAuthn/Keychain authentication
# Press Enter, confirm in browser, done
# 5. Push to GitHub (commit + tag)
git push && git push --tags
What gets published
The files field in package.json controls what ships:
Each editor session (Claude Code/Cursor/Codex window) can spawn its own
stdio codesift server process, and each loads per-repo embeddings into its own
RAM. On big repos (GB-scale embedding files) several windows can exhaust memory on
smaller machines. Controls:
# Prefer one shared daemon for many editor windows.
codesift serve
codesift setup all --http
# Clean up stale helper MCP processes left by closed sessions.
codesift cleanup-processes
codesift cleanup-processes --dry-run
Env var
Effect
Default
CODESIFT_DISABLE_LOCAL_EMBEDDINGS=1
Lite mode — never load embeddings into RAM (semantic search off; search_text + search_symbols + tree-sitter still work). Footprint drops to hundreds of MB. Best for 16GB machines.
off
CODESIFT_MAX_EMBEDDING_MEM_MB
Cap resident embedding RAM; least-recently-used repos are evicted (and lazily reloaded) above the budget.
1024
Set these in the env block of your MCP client config (e.g.
mcpServers.codesift.env). The shared HTTP daemon (codesift serve) loads
embeddings once for all windows and avoids per-session duplication.
MCP server for code intelligence — 146 tools for symbol search, call graph, semantic search, route tracing, community detection, LSP bridge, secret detection, conversation search, and Hono framework i
MCP server for code intelligence — 146 tools for symbol search, call graph, semantic search, route tracing, community detection, LSP bridge, secret detection, conversation search, and Hono framework intelligence
Tools
Tools
No tool list yet. Remote servers get one after the first health check.
FAQ
Questions
How do I install Codesift?
Copy the stdio config for Cursor, Claude Desktop, Claude Code, or VS Code on this page. It uses the publisher's install, not a PlugMCP proxy.
No required environment variable is listed on this record.
What transport does Codesift use?
Codesift runs locally over stdio.
When was Codesift last checked?
Last checked 2026-11-14. MCP server for code intelligence — 146 tools for symbol search, call graph, semantic search, route tracing, community detection, LSP bridge, secret detection, conversation search, and Hono framework intelligence