MCP server for semantic codebase navigation. Builds an AST index of symbols, imports, and exports, providing high-level tools for an AI agent.
- Symbol search — finds functions, classes, interfaces, methods, etc. by name with wildcard (
*,?) and OR (|) support - Symbol details — shows source code, signature, documentation, and file imports
- Module overview — directory structure, key symbols, subdirectories, top imports
- Usage search — finds all references to a symbol in the project
- Module dependencies — imports, exports, and files that use the given module
- Reindexing — full or incremental (by mtime)
- Watch mode — automatic index updates when files change
| Language | Parser | Symbols | Imports | Exports |
|---|---|---|---|---|
| TypeScript / JavaScript | TypeScript Compiler API | ✅ | ✅ | ✅ |
| C# | Regex-based (lightweight) | ✅ | ✅ (using) | ✅ (public) |
The architecture makes it easy to add new languages via the ILanguageParser interface.
- Node.js 18+
- PostgreSQL 14+
npm install
npm run buildEnvironment variables:
| Variable | Description | Default |
|---|---|---|
PROJECT_ROOT |
Project root directory | process.cwd() |
PGHOST |
PostgreSQL host | localhost |
PGPORT |
PostgreSQL port | 5432 |
PGDATABASE |
Database name | codebase_index |
PGUSER |
PostgreSQL user | postgres |
PGPASSWORD |
PostgreSQL password | postgres |
Add to kimi-mcp.json:
{
"mcpServers": {
"codebase": {
"command": "node",
"args": ["<path-to-mcp-codebase>/dist/index.js"],
"env": {
"PROJECT_ROOT": "<path-to-your-codebase>",
"PGHOST": "localhost",
"PGPORT": "5432",
"PGDATABASE": "codebase_index",
"PGUSER": "postgres",
"PGPASSWORD": "your_password"
}
}
}
}Search symbols by name with filtering.
{
"query": "UserService|useAuth|*Controller",
"kind": "class|function",
"language": "typescript",
"file_path": "src/services",
"limit": 20
}Full information about a symbol.
{ "symbol_id": 123 }
// or
{ "name": "UserService", "file_path": "src/services/UserService.ts" }Directory overview.
{ "path": "src/services", "depth": 1 }Find symbol usages.
{ "name": "UserService", "file_path": "src/services/UserService.ts" }File dependency graph.
{ "path": "src/services/UserService.ts" }Force reindexing.
{ "full": false }src/
├── index.ts # MCP server
├── config.ts # Configuration
├── db/
│ ├── connection.ts # PostgreSQL pool
│ ├── schema.ts # DDL and migrations
│ └── repositories.ts # Database queries
├── indexer/
│ ├── file-crawler.ts # File traversal
│ ├── indexer.ts # Indexing orchestration
│ └── watcher.ts # Watch mode (chokidar)
├── parsers/
│ ├── interface.ts # ILanguageParser
│ ├── typescript.ts # TS/JS parser
│ └── csharp.ts # C# parser
├── tools/
│ ├── search-symbols.ts
│ ├── symbol-details.ts
│ ├── explore-module.ts
│ ├── find-usages.ts
│ ├── module-deps.ts
│ └── reindex.ts
└── utils/
├── gitignore.ts
└── paths.ts
On the lowcodeplatform project (~71K files, ~730 source files excluding node_modules/dist):
- Full indexing: ~1.3 sec
- Symbols in the index: ~5000
- Symbol search: < 50 ms
- Create a class implementing
ILanguageParser - Register it in
src/indexer/indexer.ts - Add the extension to
config.languageMap
Example:
export class PythonParser implements ILanguageParser {
readonly supportedExtensions = ['.py'];
readonly languageId = 'python';
parse(filePath: string, content: string): ParseResult | null { ... }
}