Universal code-indexer MCP server for AI coding agents. Claude · Cursor · Codex CLI · Gemini CLI · GitHub Copilot · Windsurf · Kilo Code · Zed · OpenCode · Any agent that speaks MCP. Pre-index your codebase once. Let AI agents find any symbol in ~200 tokens instead of reading whole files at ~7,500 tokens. That is a 97% reduction — per lookup, every lookup. The part no other code indexer does: Don'
Add this skill
npx mdskills install husnainpk/symdexUniversal code indexer with semantic search, dramatically reduces token usage for AI agents
1# SymDex23<p align="center">4 <a href="https://pypi.org/project/symdex/"><img src="https://img.shields.io/pypi/v/symdex?color=blue&label=PyPI" alt="PyPI version"></a>5 <a href="https://pypi.org/project/symdex/"><img src="https://img.shields.io/pypi/pyversions/symdex" alt="Python versions"></a>6 <a href="https://github.com/husnainpk/symdex/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="License"></a>7</p>89<p align="center">10 <strong>Universal code-indexer MCP server for AI coding agents.</strong><br>11 Claude · Cursor · Codex CLI · Gemini CLI · GitHub Copilot · Windsurf · Kilo Code · Zed · OpenCode · Any agent that speaks MCP.12</p>1314<p align="center">15 Pre-index your codebase once. Let AI agents find any symbol in ~200 tokens instead of reading whole files at ~7,500 tokens.<br>16 <strong>That is a 97% reduction — per lookup, every lookup.</strong>17</p>1819<p align="center">20 <strong>The part no other code indexer does:</strong><br>21 Don't know the function name? <code>semantic_search("validate email addresses")</code> finds it anyway.<br>22 No grep. No file reading. No guessing. One query, exact location.23</p>2425```bash26pip install symdex27```2829---3031## What You Get3233| | Feature | One line |34|---|---|---|35| **Find** | Symbol search | Locate any function, class, or method by name — returns exact byte offsets, no file reading |36| **Find** | Semantic search | Don't know the name? Search by what it does — `semantic_search("validate email")` finds it |37| **Understand** | Call graph | Who calls this function? What does it call? Pre-built at index time, instant at query time |38| **Understand** | HTTP route indexing | What routes does this API expose? `search_routes` answers without opening a single file |39| **Stay current** | Auto-watch | `symdex watch` — save a file, index updates automatically. Delete a file, it disappears from the index. No manual steps. |40| **Scale** | Cross-repo registry | One SymDex, many projects. Search across all indexed repos simultaneously |41| **Clean up** | Stale index GC | `symdex gc` — running parallel agents in git worktrees? One command removes orphaned databases |42| **Access** | Full CLI | Every capability available from the terminal, no agent required |43| **Access** | 16 MCP tools | Every capability available to any MCP-compatible AI agent |44| **Language support** | 14 languages | Python · JS · TS · Go · Rust · Java · PHP · C# · C · C++ · Elixir · Ruby · Vue + more via tree-sitter |4546---4748## The Problem4950Every time an AI coding agent needs to find a function, it reads the entire file that might contain it:5152```53Agent thought: "I need to find the validate_email function."54Agent action: Read auth/utils.py → 7,500 tokens consumed55Agent action: Read auth/validators.py → 6,200 tokens consumed56Agent action: Read core/helpers.py → 8,100 tokens consumed57Agent finds it on the third try. → 21,800 tokens wasted58```5960This is the equivalent of reading an entire book from page one every time you want to find a single paragraph — when the book has an index sitting right there.6162On a large codebase, a single development session can burn hundreds of thousands of tokens this way. That is real money, real slowness, and real context-window pressure.6364**SymDex is the index.**6566---6768## Three Things No Other Tool Does6970Most code navigation tools solve one problem. SymDex solves three.7172### 1. Find code by meaning, not just name7374Every other tool — LSP, grep, symbol search — requires you to know what you are looking for. SymDex does not.7576```bash77# You don't know what the function is called. You know what it does.78symdex semantic "check that a user's email address is properly formatted" --repo myproject79```8081```82┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓83┃ Name ┃ Kind ┃ Score ┃ File ┃84┡━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩85│ validate_email │ function │ 0.91 │ auth/utils.py │86│ is_valid_address │ function │ 0.74 │ core/validators.py │87└──────────────────┴──────────┴───────────────────┴────────────────────────┘88```8990Vector embeddings of every symbol's signature and docstring. Fully local — no API calls, nothing leaves your machine.9192### 2. Know your full API surface without reading any file9394SymDex extracts HTTP routes from your source during indexing. No more opening route files to understand what an API exposes.9596```bash97symdex routes myproject -m POST98# → POST /users → create_user (api/views.py)99# → POST /auth/login → login_user (auth/views.py)100```101102Supports Flask, FastAPI, Django, and Express. Agents can call `search_routes` directly via MCP.103104### 3. Stay current automatically105106```bash107symdex watch ./myproject # index now, then reindex on every save108```109110Save a file — SymDex reindexes it. Delete a file — SymDex removes it from the index. The agent always sees the current state of your code without you doing anything.111112---113114## How It Works115116```117┌─────────────────────────────────────────────────────────────────┐118│ STEP 1 — Index once (you run this, takes seconds to minutes) │119│ │120│ symdex index ./myproject │121│ │ │122│ ▼ │123│ tree-sitter parses every source file │124│ │ │125│ ▼ │126│ Every function, class, method extracted │127│ with name · kind · file · exact byte offsets · docstring │128│ │ │129│ ▼ │130│ Stored in SQLite database + vector embeddings (sqlite-vec) │131└─────────────────────────────────────────────────────────────────┘132133┌─────────────────────────────────────────────────────────────────┐134│ STEP 2 — Agent queries SymDex instead of reading files │135│ │136│ Without SymDex: │137│ Agent → read auth/utils.py (full) → 7,500 tokens │138│ │139│ With SymDex: │140│ Agent → search_symbols("validate_email") │141│ → { file: "auth/utils.py", start_byte: 1024, │142│ end_byte: 1340 } → ~200 tokens │143│ Agent → read bytes 1024–1340 only → done │144└─────────────────────────────────────────────────────────────────┘145```146147SymDex does not read files for the agent. It tells the agent **exactly where to look** — file path and byte offset — so the agent reads only the bytes it needs. Nothing more.148149---150151## Real-World Example152153**Setup — index the project once:**154```bash155symdex index ./myproject --name myproject156symdex serve # start the MCP server157```158159**Agent calls `search_symbols` to locate a function:**160```json161// Tool call162{ "tool": "search_symbols", "query": "validate_email", "repo": "myproject" }163164// Response (~200 tokens)165{166 "symbols": [167 {168 "name": "validate_email",169 "kind": "function",170 "file": "auth/utils.py",171 "start_byte": 1024,172 "end_byte": 1340,173 "signature": "def validate_email(email: str) -> bool"174 }175 ]176}177```178179**Agent calls `get_symbol` to read only that function:**180```json181// Tool call — reads bytes 1024 to 1340 only182{ "tool": "get_symbol", "file": "auth/utils.py", "start_byte": 1024, "end_byte": 1340, "repo": "myproject" }183184// Response — the exact function source, nothing else185{186 "source": "def validate_email(email: str) -> bool:\n \"\"\"Validate email format.\"\"\"\n pattern = r'^[\\w.-]+@[\\w.-]+\\.\\w+$'\n return bool(re.match(pattern, email))"187}188```189190**Agent calls `get_callers` to understand impact before changing it:**191```json192{ "tool": "get_callers", "name": "validate_email", "repo": "myproject" }193194{195 "callers": [196 { "name": "register_user", "file": "auth/views.py", "kind": "function" },197 { "name": "update_profile", "file": "users/views.py", "kind": "function" }198 ]199}200```201202**Agent uses `semantic_search` when it doesn't know the exact name:**203```json204{ "tool": "semantic_search", "query": "check if user email address is valid", "repo": "myproject" }205206// Finds by meaning, not by name207{208 "symbols": [209 { "name": "validate_email", "score": 0.91, "file": "auth/utils.py" },210 { "name": "is_valid_address", "score": 0.74, "file": "core/validators.py" }211 ]212}213```214215Total tokens for this entire session: **~800 tokens.** Without SymDex, finding and reading these three functions would cost **~25,000 tokens.**216217---218219## SymDex vs. Everything Else220221Here is how SymDex compares to the tools people reach for:222223| Capability | LSP (pylsp, tsserver) | CodeGraphContext | Serena | **SymDex** |224|---|---|---|---|---|225| Find symbol by name | Yes | Yes | Yes | **Yes** |226| Search by meaning / intent | No | No | No | **Yes — semantic_search** |227| HTTP route indexing | No | No | No | **Yes — search_routes** |228| Auto-watch, live reindex | No | No | No | **Yes — symdex watch** |229| Call graph | Partial | Yes | Yes | **Yes** |230| Cross-repo search | No | No | No | **Yes** |231| Works without an editor | No | No | No | **Yes — terminal-native** |232| Zero-config storage | No | No (graph DB) | No | **Yes — one SQLite file** |233| pip install and done | No | No | No | **Yes** |234| Requires language server per language | Yes | No | Yes | **No** |235| Works offline (no API calls) | Yes | Yes | Yes | **Yes** |236237### vs. LSP (Language Server Protocol)238239LSP servers (pylsp, typescript-language-server, rust-analyzer) are excellent for editors. They require a running editor process, a language server installed and running per language, and they operate on live files in real time.240241SymDex is terminal-native and editor-free. An agent running in a terminal (Claude Code, Codex CLI, OpenCode) gets the same symbol lookup capability with zero editor dependency. And LSP cannot do semantic search — if you don't know the function name, LSP cannot help.242243### vs. CodeGraphContext244245CodeGraphContext builds a graph database over your code. The tradeoff: you need to choose and run a graph database backend (KùzuDB, Neo4j). SymDex uses SQLite — one file per repo, zero configuration. No backend, no server, no Docker.246247CodeGraphContext has no semantic search and no HTTP route indexing. SymDex has both.248249### vs. Serena250251Serena wraps real language servers and gets true type-aware analysis — it can resolve which concrete implementation is called through an interface, track generics, follow pointer dispatch. That is genuinely powerful for large, strongly-typed codebases.252253The tradeoff: Serena requires language servers installed per language and queries hit live files rather than a pre-built index. SymDex is faster per query (pre-indexed), works offline, and adds semantic search and route indexing — capabilities no language server provides.254255---256257## For AI Agents258259> **If you are an AI agent reading this:** Follow these rules to use SymDex correctly.260261**Rule 1 — Index before anything else.**262Call `index_folder` with the project path at the start of every session. Without this, the index is empty and all searches return nothing.263264```json265{ "tool": "index_folder", "path": "/path/to/project", "name": "myproject" }266```267268**Rule 2 — Never read a full file to find a function.**269Always call `search_symbols` first. Use the returned `start_byte` and `end_byte` to read only the relevant bytes via `get_symbol`.270271**Rule 3 — Use the right tool for the right query.**272273| What you want | Tool to call |274|---|---|275| Find a function by name | `search_symbols` |276| Read a function's source | `get_symbol` (use byte offsets from search) |277| Find by meaning / description | `semantic_search` |278| See all symbols in a file | `get_file_outline` |279| Understand project structure | `get_repo_outline` |280| Find who calls a function | `get_callers` |281| Find what a function calls | `get_callees` |282| Search for a string in code | `search_text` |283| List all HTTP routes | `search_routes` |284285**Rule 4 — Re-index after code changes.**286Call `index_folder` again (or `invalidate_cache` for a specific file) after modifying source files so the index reflects the latest state.287288---289290## SymDex vs. Conventional File Reading291292| Capability | Conventional (read files) | SymDex |293|-----------|--------------------------|--------|294| Find a function by name | Read entire file(s) | Byte-offset lookup — read only those bytes |295| Token cost per lookup | ~7,500 tokens (one file) | ~200 tokens |296| Token cost across a session | Compounds per lookup | Fixed per lookup — does not compound |297| **Search by meaning** | **Not possible** | **Semantic embedding search — finds by intent** |298| "Who calls this function?" | Read every file manually | Pre-built call graph — instant answer |299| "What does this function call?" | Read function body manually | Pre-built call graph — instant answer |300| **"What API routes does this repo expose?"** | **Read every route file** | **`search_routes` — instant, no file reading** |301| Search across multiple projects | Not possible | Cross-repo registry — one SymDex, many projects |302| Keep index current after edits | Manual re-run | `symdex watch` — auto-reindex on save |303| Context window pressure | High — full files accumulate | Low — precise snippets only |304| Works with any AI agent | Agent-specific plugins | Any MCP-compatible agent — one config |305| Requires editor / language server | Often yes | No — standalone, terminal-native |306| Command-line access | Not available | Full CLI included |307| Re-index on changes | Full re-read every time | SHA-256 change detection — only re-indexes changed files |308309---310311## Features312313### Semantic Search314Find code by what it does, not what it is called. SymDex embeds every symbol's signature and docstring into a vector and finds the closest matches by meaning — not by keyword. Powered by `sentence-transformers` running fully locally, no API calls required.315316```bash317symdex semantic "parse and validate an authentication token" --repo myproject318```319320### Symbol Search321Find any function, class, method, or variable by name across your entire indexed codebase. Returns file path and exact byte offsets. No file reading required.322323### Call Graph324Understand the impact of any change before you make it.325326```bash327symdex callers process_payment --repo myproject # Who calls this? (impact analysis)328symdex callees process_payment --repo myproject # What does this call? (dependency trace)329```330331Call relationships are extracted during indexing and stored as a graph. No file reading at query time.332333### Auto-Watch — Live Index334335Run `symdex watch` once. Every time you save a file, SymDex automatically re-indexes only the changed file. Delete a file — SymDex removes it from the index. The agent always sees the current state of your code.336337```bash338symdex watch ./myproject # Index now, then watch for changes339symdex watch ./myproject --interval 3 # Check every 3 seconds (default: 5)340```341342Works as a background process alongside your development workflow. The index stays current without any agent interruption.343344### HTTP Route Indexing345346SymDex automatically extracts HTTP API routes during indexing and makes them searchable. No more reading route files to understand an API surface.347348**Supported frameworks:** Flask · FastAPI · Django · Express349350```bash351symdex routes myproject # All routes in the repo352symdex routes myproject -m POST # Only POST routes353symdex routes myproject -p /users # Routes matching a path pattern354```355356Via MCP tool (agents can call this directly):357```json358{ "tool": "search_routes", "repo": "myproject", "method": "GET" }359// → [{ "method": "GET", "path": "/users", "handler": "list_users", "file": "api/views.py" }, ...]360```361362### Cross-Repo Registry363Index multiple projects and search across all of them from one place.364365```bash366symdex index ./frontend --name frontend367symdex index ./backend --name backend368symdex search "validate_token" # searches both repos simultaneously369```370371Each repo gets its own SQLite database. The registry tracks all of them.372373### Change Detection374SymDex stores a SHA-256 hash of every indexed file. Re-indexing only processes files that have actually changed. On large codebases this makes incremental updates take seconds, not minutes.375376### Full CLI377Every MCP tool is also available as a CLI command. Use SymDex without an AI agent — in scripts, in CI, or just to explore your codebase.378379### HTTP + stdio Transport380Run SymDex as a local stdio server (default, for desktop agents) or as an HTTP server for remote access.381382```bash383symdex serve # stdio — for Claude, Cursor, Copilot, Gemini CLI, Codex CLI, etc.384symdex serve --port 8080 # HTTP — for remote agents or services385```386387---388389## Supported Languages390391SymDex parses source files using [tree-sitter](https://tree-sitter.github.io/tree-sitter/) — a fast, robust, incremental parser used by major editors including Neovim, Helix, and GitHub.392393| Language | File Extensions |394|----------|----------------|395| Python | `.py` |396| JavaScript | `.js` `.mjs` |397| TypeScript | `.ts` `.tsx` |398| Go | `.go` |399| Rust | `.rs` |400| Java | `.java` |401| PHP | `.php` |402| C# | `.cs` |403| C | `.c` `.h` |404| C++ | `.cpp` `.cc` `.h` |405| Elixir | `.ex` `.exs` |406| Ruby | `.rb` |407| Vue | `.vue` |408409**13 languages.** More can be added by installing additional tree-sitter grammar packages.410411---412413## Supported Platforms414415SymDex speaks the **Model Context Protocol (MCP)** — the open standard for connecting AI agents to external tools. If a platform supports MCP, SymDex works with it — no custom integration required.416417| Platform | By | How to Connect |418|----------|----|---------------|419| Claude Desktop | Anthropic | Add to `claude_desktop_config.json` |420| Claude Code | Anthropic | `claude mcp add symdex -- symdex serve` |421| Codex CLI | OpenAI | Add to MCP settings |422| Codex App | OpenAI | Add to MCP settings |423| Gemini CLI | Google | Add to MCP settings |424| Cursor | Anysphere | Add to `.cursor/mcp.json` |425| Windsurf | Codeium | Add to MCP settings |426| GitHub Copilot (agent mode) | Microsoft | Add to `.vscode/mcp.json` |427| Continue.dev | Continue | Add to `config.json` |428| Cline | Cline | Add to MCP settings |429| Kilo Code | Kilo Code | Add to VS Code `settings.json` under `kilocode.mcpServers` |430| Zed | Zed Industries | Add to MCP settings |431| OpenCode | OpenCode | Add to `opencode.json` |432| Any custom MCP client | — | stdio or HTTP transport |433434### Configuration (same pattern for all platforms)435436```json437{438 "mcpServers": {439 "symdex": {440 "command": "symdex",441 "args": ["serve"]442 }443 }444}445```446447For HTTP mode (remote agents):448449```json450{451 "mcpServers": {452 "symdex": {453 "url": "http://localhost:8080/mcp"454 }455 }456}457```458459---460461## Installation462463Available on [PyPI](https://pypi.org/project/symdex/):464465```bash466pip install symdex467```468469Requires Python 3.11 or higher.470471---472473## Quickstart474475### 1. Index your project476477```bash478symdex index ./myproject --name myproject479```480481SymDex walks the directory, parses every supported source file, and writes the index to a local SQLite database. Run this once. Re-run it when your code changes (only modified files are re-processed).482483### 2. Search for a symbol484485```bash486symdex search "validate_email" --repo myproject487```488489```490┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┓491┃ Repo ┃ Kind ┃ Name ┃ File ┃ Start ┃492┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━┩493│ myproject │ function │ validate_email │ auth/utils.py │ 1024 │494└────────────────┴──────────┴────────────────┴─────────────────────────────────────────┴───────┘495```496497### 3. Start the MCP server498499```bash500symdex serve501```502503Point your agent at it using the config above. The agent can now use all 16 MCP tools.504505---506507## MCP Tool Reference508509These are the tools your AI agent can call once SymDex is running as an MCP server.510511| Tool | Description |512|------|-------------|513| `index_folder` | Index a local folder — run once per project |514| `index_repo` | Index a named, registered repo |515| `search_symbols` | Find function or class by name — returns byte offsets |516| `get_symbol` | Retrieve one symbol's full source by byte offset |517| `get_symbols` | Bulk symbol retrieval by a list of offsets |518| `get_file_outline` | All symbols in a file — no file content transferred |519| `get_repo_outline` | Directory structure and symbol statistics for a repo |520| `get_file_tree` | Directory tree — structure only, no content |521| `search_text` | Text or regex search — returns matching lines only |522| `list_repos` | List all indexed repos in the registry |523| `invalidate_cache` | Force re-index on next request |524| `semantic_search` | Find symbols by meaning using embedding similarity |525| `get_callers` | Find all functions that call a named function |526| `get_callees` | Find all functions called by a named function |527| `search_routes` | Find HTTP routes indexed from a repo (Flask/FastAPI/Django/Express) — filter by method or path |528| `gc_stale_indexes` | Remove databases for repos whose directories no longer exist on disk |529530---531532## CLI Reference533534```bash535# Indexing536symdex index ./myproject # Index a folder537symdex index ./myproject --name myproj # Index with a custom name538symdex invalidate --repo myproj # Force re-index a repo539symdex invalidate --repo myproj --file auth.py # Force re-index one file540541# Symbol search542symdex search "validate email" --repo myproj # Search by name543symdex search "validate email" # Search across all repos544symdex find MyClass --repo myproj # Exact name lookup545546# Semantic search547symdex semantic "authentication token parsing" --repo myproj548549# File and repo inspection550symdex outline myproj/auth/utils.py --repo myproj # All symbols in a file551symdex repos # List all indexed repos552symdex text "TODO" --repo myproj # Text search553554# Call graph555symdex callers process_payment --repo myproj # Who calls this function556symdex callees process_payment --repo myproj # What this function calls557558# Watch (auto-reindex on file changes)559symdex watch ./myproject # Auto-reindex on file changes560symdex watch ./myproject --interval 10 # Custom poll interval (seconds)561562# Routes563symdex routes myproject # List all indexed HTTP routes564symdex routes myproject -m GET # Filter by HTTP method565566# Maintenance567symdex gc # Remove stale indexes for deleted/moved repos568569# Server570symdex serve # Start MCP server (stdio)571symdex serve --port 8080 # Start MCP server (HTTP)572```573574---575576## Architecture577578<details>579<summary>Click to expand — internals for the technically curious</summary>580581### Storage582583Each indexed repo gets its own SQLite database file stored in `~/.symdex/`. A shared registry database tracks all repos.584585```sql586-- Every extracted symbol587symbols (588 id INTEGER PRIMARY KEY,589 repo TEXT NOT NULL,590 file TEXT NOT NULL,591 name TEXT NOT NULL,592 kind TEXT NOT NULL, -- function | class | method | constant | variable593 start_byte INTEGER NOT NULL,594 end_byte INTEGER NOT NULL,595 signature TEXT,596 docstring TEXT,597 embedding BLOB -- float32 vector stored via sqlite-vec598)599600-- Call graph edges601edges (602 caller_id INTEGER REFERENCES symbols(id),603 callee_name TEXT NOT NULL,604 callee_file TEXT605)606607-- Change detection608files (609 repo TEXT NOT NULL,610 path TEXT NOT NULL,611 hash TEXT NOT NULL, -- SHA-256 of file contents612 indexed_at DATETIME NOT NULL,613 PRIMARY KEY (repo, path)614)615616-- Cross-repo registry617repos (618 name TEXT PRIMARY KEY,619 root_path TEXT NOT NULL,620 db_path TEXT NOT NULL,621 last_indexed DATETIME622)623624-- HTTP routes (Flask, FastAPI, Django, Express)625routes (626 repo TEXT NOT NULL,627 file TEXT NOT NULL,628 method TEXT NOT NULL, -- GET | POST | PUT | DELETE | PATCH | ANY629 path TEXT NOT NULL, -- /users/{id}630 handler TEXT, -- function name631 start_byte INTEGER NOT NULL,632 end_byte INTEGER NOT NULL633)634```635636### Parsing637638Source files are parsed using [tree-sitter](https://tree-sitter.github.io/tree-sitter/). tree-sitter produces a concrete syntax tree for each file. SymDex walks the tree and extracts nodes matching known symbol types per language (e.g. `function_definition` for Python, `function_declaration` for Go, `method_definition` for JavaScript).639640### Semantic Embeddings641642When a symbol has a docstring or signature, SymDex generates a vector embedding using `sentence-transformers` (model: `all-MiniLM-L6-v2` by default). Embeddings are stored as raw `float32` blobs and queried using `sqlite-vec` — a SQLite extension for vector similarity search. Everything runs locally. No embedding API calls.643644### MCP Server645646Built on [FastMCP](https://github.com/jlowin/fastmcp). Supports both stdio transport (for desktop agents) and streamable HTTP transport (for remote access).647648### Project Layout649650```651symdex/652├── cli.py — Typer CLI (all user-facing commands)653├── core/654│ ├── parser.py — tree-sitter symbol extraction (13 languages + Vue)655│ ├── storage.py — SQLite read/write, vector storage, route storage656│ ├── indexer.py — orchestrates parse → store pipeline657│ ├── watcher.py — file-system watcher (watchdog), auto-reindex658│ ├── route_extractor.py — regex-based HTTP route detection659│ └── schema.sql — database schema (symbols, edges, files, repos, routes)660├── mcp/661│ ├── server.py — FastMCP server definition662│ └── tools.py — 16 MCP tool implementations663├── search/664│ ├── symbol_search.py — name-based FTS search665│ ├── text_search.py — regex/text search666│ └── semantic.py — embedding similarity search667└── graph/668 ├── call_graph.py — call edge extraction and query669 └── registry.py — cross-repo registry and multi-DB search670```671672</details>673674---675676## FAQ677678**Do I need to re-index every time I change my code?**679No. Run `symdex watch ./myproject` once and the index stays current automatically — every file save triggers a reindex of that file, every delete removes it from the index. If you prefer manual control, run `symdex index` again at any point — SHA-256 hashing means only files that actually changed are reprocessed.680681**Does semantic search send my code to an API?**682No. Embeddings are generated locally using `sentence-transformers`. Nothing leaves your machine.683684**Can I use SymDex without an AI agent?**685Yes. The full CLI gives you direct access to every search capability — symbol search, semantic search, call graph, file outlines — without any agent involved.686687**Does it work with monorepos?**688Yes. Index each sub-project separately with a unique `--name`, then search across all of them using `symdex search` without a `--repo` flag.689690**Does it handle pointers, generics, and type-resolution?**691SymDex extracts symbols, signatures, and docstrings from parsed syntax trees. It does not perform full type inference or resolve generics at the type system level — that requires a language server per language (pylsp, rust-analyzer, etc.). SymDex's semantic search compensates: if you don't know the exact name of a generic method, `semantic_search` finds it by meaning.692693**What happens if a language is not supported?**694SymDex skips files with unrecognised extensions. Supported and unsupported files can coexist in the same project — only the supported ones are indexed.695696**Is the index portable?**697Yes. The SQLite `.db` files can be copied to another machine. As long as SymDex is installed there, the index works. The only caveat is that absolute file paths in the index will point to the original machine.698699---700701## License702703MIT — see [LICENSE](LICENSE)704705## Contributing706707Issues and pull requests are welcome at [github.com/husnainpk/SymDex](https://github.com/husnainpk/SymDex).708
Full transparency — inspect the skill content before installing.