MCP server for local codebase indexing, semantic search, and code dependency graphs.
"There is only one good, knowledge, and one evil, ignorance." — Socrates
Give any AI instant automated knowledge of your entire codebase (and infrastructure) — at scale, zero configuration, fully private, completely free.
If SocratiCode has been useful to you, please ⭐ star this repo — it helps others discover it — and share it with your dev team and fellow developers!
One thing, done well: deep codebase intelligence — zero setup, no bloat, fully automatic. SocratiCode gives AI assistants deep semantic understanding of your codebase — hybrid search, polyglot code dependency graphs, and searchable context artifacts (database schemas, API specs, infra configs, architecture docs). Zero configuration — add it to any MCP host, or install the Claude Code plugin for built-in workflow skills. It manages everything automatically.
Production-ready, battle-tested on enterprise-level large repositories (up to and over ~40 million lines of code). Batched, automatic resumable indexing checkpoints progress — pauses, crashes, restarts, and interruptions don't lose work. The file watcher keeps the index automatically updated at every file change and across sessions. Multi-agent ready — multiple AI agents can work on the same codebase simultaneously, sharing a single index with automatic coordination and zero configuration.
Private and local by default — Docker handles everything, no API keys required, no data leaves your machine. Cloud ready for embeddings (OpenAI, Google Gemini) and Qdrant, and a full suite of configuration options are all available when you need them.
The first Qdrant‑based MCP/Claude Plugin/Skill that pairs auto‑managed, zero‑config local Docker deployment with AST‑aware code chunking, hybrid semantic + BM25 (RRF‑fused) code search, polyglot dependency graphs with circular‑dependency visualization, and searchable infra/API/database artifacts in a single focused, zero-config and easy to use code intelligence engine.
Benchmarked on VS Code (2.45M lines): SocratiCode uses 61% less context, 84% fewer tool calls, and is 37x faster than grep‑based exploration — tested live with Claude Opus 4.6. See the full benchmark →
Only Docker (running) required.
One-click install — Claude Code, VS Code and Cursor,:
All MCP hosts — add the following to your mcpServers (Claude Desktop, Windsurf, Cline, Roo Code) or servers (VS Code project-local .vscode/mcp.json) config:
"socraticode": {
"command": "npx",
"args": ["-y", "socraticode"]
}Claude Code — install the plugin (recommended, includes workflow skills for best results):
From your shell:
claude plugin marketplace add giancarloerra/socraticode
claude plugin install socraticode@socraticodeOr from within Claude Code:
/plugin marketplace add giancarloerra/socraticode
/plugin install socraticode@socraticodeAuto-updates: After installing, enable automatic updates by opening
/plugin→ Marketplaces → selectsocraticode→ Enable auto-update.
Or as MCP only (without skills):
claude mcp add socraticode -- npx -y socraticodeUpdating:
npxcaches the package after the first run. To get the latest version, clear the cache and restart your MCP host:rm -rf ~/.npm/_npx && claude mcp restart socraticode. Alternatively, usenpx -y socraticode@latestin your config to always check for updates on startup (slightly slower).
OpenAI Codex CLI — add to ~/.codex/config.toml:
[mcp_servers.socraticode]
command = "npx"
args = ["-y", "socraticode"]Restart your host. On first use SocratiCode automatically pulls Docker images, starts its own Qdrant and Ollama containers, and downloads the embedding model — one-time setup, ~5 minutes depending on your connection. After that, it starts in seconds.
First time on a project — ask your AI: "Index this codebase". Indexing runs in the background; ask "What is the codebase index status?" to monitor progress. Depending on codebase size and whether you're using GPU-accelerated Ollama or cloud embeddings, first-time indexing can take anywhere from a few seconds to a few minutes (it takes under 10 minutes to first-index +3 million lines of code on a Macbook Pro M4). Once complete it doesn't need to be run again, you can search, explore the dependency graph, and query context artifacts.
Every time after that — just use the tools (search, graph, etc.). On server startup SocratiCode automatically detects previously indexed projects, restarts the file watcher, and runs an incremental update to catch any changes made while the server was down. If indexing was interrupted, it resumes automatically from the last checkpoint. You can also explicitly start or restart the watcher with codebase_watch { action: "start" }.
macOS / Windows on large codebases: Docker containers can't use the GPU. For medium-to-large repos, install native Ollama (auto-detected, no config change needed) for Metal/CUDA acceleration, or use OpenAI embeddings for speed without a local install. Full details.
Recommended: For best results, add the Agent Instructions to your AI assistant's system prompt or project instructions file (
CLAUDE.md,AGENTS.md, etc.). The key principle — search before reading — helps your AI use SocratiCode's tools effectively and avoid unnecessary file reads.
Claude Code users: If you installed the SocratiCode plugin, the Agent Instructions are included automatically as skills — no need to add them to your
CLAUDE.md. The plugin also bundles the MCP server, so you don't need a separateclaude mcp add.
Advanced: cloud embeddings (OpenAI / Google), external Qdrant, remote Ollama, native Ollama, and dozens of tuning options are all available. See Configuration below.
I built SocratiCode because I regularly work on existing, large, and complex codebases across different languages and need to quickly understand them and act. Existing solutions were either too limited, insufficiently tested for production use, or bloated with unnecessary complexity. I wanted a single focused tool that does deep codebase intelligence well — zero setup, no bloat, fully automatic — and gets out of the way.
QDRANT_MODE, QDRANT_URL, and QDRANT_API_KEY environment variables.OLLAMA_MODE, OLLAMA_URL, EMBEDDING_MODEL and EMBEDDING_DIMENSIONS environment variables.text-embedding-3-small) or Google Generative AI (gemini-embedding-001) for cloud-based embeddings. Just set EMBEDDING_PROVIDER and your API key..gitignore files (root + nested), plus an optional .socraticodeignore for additional exclusions. Includes sensible built-in defaults. .gitignore processing can be disabled via RESPECT_GITIGNORE=false. Dot-directories (e.g. .agent) can be included via INCLUDE_DOT_FILES=true..tpl, .blade) can be included via EXTRA_EXTENSIONS env var or extraExtensions tool parameter. Works for both indexing and code graph.codebase_index completes, after codebase_update, and on the first codebase_search, codebase_status, or graph query. You can also start it manually with codebase_watch { action: "start" } if needed.codebase_graph_build manually unless you want to force a rebuild.proper-lockfile) prevents multiple MCP instances from simultaneously indexing or watching the same project. Stale locks from crashed processes are automatically reclaimed. When another MCP process is already watching a project, codebase_status reports "active (watched by another process)" instead of incorrectly showing "inactive."codebase_index while indexing is already running, it returns the current progress instead of starting a second operation.codebase_stop. The current batch finishes and checkpoints, preserving all progress. Re-run codebase_index to resume from where it left off.SOCRATICODE_LOG_LEVEL.| Dependency | Purpose | Install |
|---|---|---|
| Docker | Runs Qdrant (vector DB) and by default Ollama (embeddings) | docker.com |
| Node.js 18+ | Runs the MCP server | nodejs.org |
Docker must be running when you use the server in the default managed mode.
The Qdrant container is managed automatically. If you set QDRANT_MODE=external and point QDRANT_URL at a remote or cloud Qdrant instance, Docker is only needed for Ollama (embeddings) in that case.
The Ollama container (embeddings) is also managed automatically in the default auto mode. SocratiCode first checks if Ollama is already running natively — if so it uses it. Otherwise it manages a Docker container for you. First-time download of the docker images or embedding models may take a few minutes, depending on your internet speed, and is required only at first launch.
Docker containers on macOS and Windows cannot access the GPU (no Metal or CUDA passthrough). For small projects this is fine, but for medium-to-large codebases the CPU-only container is noticeably slower.
For best performance, install native Ollama: download and run the installer from ollama.com/download. Once Ollama is running, SocratiCode will automatically detect and use it — no extra configuration needed (first-time download of the embedding model, if not present, might take a few minutes). This gives you Metal GPU acceleration on macOS and CUDA on Windows/Linux.
If you prefer speed without a local install, see OpenAI Embeddings and Google Generative AI Embeddings below for cloud-based options. OpenAI is very fast with no local setup required. Google’s free tier is functional but rate-limited. See Environment Variables for configuration details.
All tools default projectPath to the current working directory, so you never need to specify a path for the active project.
User: "Index this project"
→ codebase_index {}
⚡ Indexing started in the background — call codebase_status to check progress
→ codebase_status {}
⚠ Full index in progress — Phase: generating embeddings (batch 1/1)
Progress: 247/1847 chunks embedded (13%) — Elapsed: 12s
→ codebase_status {}
✓ Indexing complete: 342 files, 1,847 chunks (took 115.2s)
File watcher: active (auto-updating on changes)
User: "Search for how authentication is handled"
→ codebase_search { query: "authentication handling" }
Runs dense semantic search + BM25 keyword search in parallel, fuses results with RRF
Returns top 10 results ranked by combined relevance
User: "What files depend on the auth middleware?"
→ codebase_graph_query { filePath: "src/middleware/auth.ts" }
Returns imports and dependents
(graph was auto-built after indexing — no manual build needed)
User: "Show me the dependency graph"
→ codebase_graph_visualize {}
Returns a Mermaid diagram color-coded by language
User: "Are there any circular dependencies?"
→ codebase_graph_circular {}
Found 2 cycles: src/a.ts → src/b.ts → src/a.tsClaude Code plugin users: These instructions are included automatically as skills in the SocratiCode plugin. You don't need to copy them into
CLAUDE.md. The section below is for non-Claude Code hosts (VS Code, Cursor, Claude Desktop, etc.).
For best results, add instructions like the following to your AI assistant's system prompt, CLAUDE.md, AGENTS.md, or equivalent instructions file. The core principle: search before reading. The index gives you a map of the codebase in milliseconds; raw file reading is expensive and context-consuming.
## Codebase Search (SocratiCode)
This project is indexed with SocratiCode. Always use its MCP tools to explore the codebase
before reading any files directly.
### Workflow
1. **Start most explorations with `codebase_search`.**
Hybrid semantic + keyword search (vector + BM25, RRF-fused) runs in a single call.
- Use broad, conceptual queries for orientation: "how is authentication handled",
"database connection setup", "error handling patterns".
- Use precise queries for symbol lookups: exact function names, constants, type names.
- Prefer search results to infer which files to read — do not speculatively open files.
- **When to use grep instead**: If you already know the exact identifier, error string,
or regex pattern, grep/ripgrep is faster and more precise — no semantic gap to bridge.
Use `codebase_search` when you're exploring, asking conceptual questions, or don't
know which files to look in.
2. **Follow the graph before following imports.**
Use `codebase_graph_query` to see what a file imports and what depends on it before
diving into its contents. This prevents unnecessary reading of transitive dependencies.
3. **Read files only after narrowing down via search.**
Once search results clearly point to 1–3 files, read only the relevant sections.
Never read a file just to find out if it's relevant — search first.
4. **Use `codebase_graph_circular` when debugging unexpected behavior.**
Circular dependencies cause subtle runtime issues; check for them proactively.
5. **Check `codebase_status` if search returns no results.**
The project may not be indexed yet. Run `codebase_index` if needed, then wait for
`codebase_status` to confirm completion before searching.
6. **Leverage context artifacts for non-code knowledge.**
Projects can define a `.socraticodecontextartifacts.json` config to expose database
schemas, API specs, infrastructure configs, architecture docs, and other project
knowledge that lives outside source code. These artifacts are auto-indexed alongside
code during `codebase_index` and `codebase_update`.
- Run `codebase_context` early to see what artifacts are available.
- Use `codebase_context_search` to find specific schemas, endpoints, or configs
before asking about database structure or API contracts.
- If `codebase_status` shows artifacts are stale, run `codebase_context_index` to
refresh them.
### When to use each tool
| Goal | Tool |
|------|------|
| Understand what a codebase does / where a feature lives | `codebase_search` (broad query) |
| Find a specific function, constant, or type | `codebase_search` (exact name) or grep if you know already the exact string |
| Find exact error messages, log strings, or regex patterns | grep / ripgrep |
| See what a file imports or what depends on it | `codebase_graph_query` |
| Spot architectural problems | `codebase_graph_circular`, `codebase_graph_stats` |
| Visualise module structure | `codebase_graph_visualize` |
| Verify index is up to date | `codebase_status` |
| Discover what project knowledge (schemas, specs, configs) is available | `codebase_context` |
| Find database tables, API endpoints, infra configs | `codebase_context_search` |Why semantic search first? A single
codebase_searchcall returns ranked, deduplicated snippets from across the entire codebase in milliseconds. This gives you a broad map at negligible token cost — far cheaper than opening files speculatively. Once you know which files matter, targeted reading is both faster and more accurate. That said, grep remains the right tool when you have an exact string or pattern — use whichever fits the query.
Keep the connection alive during indexing. Indexing runs in the background — the MCP server continues working even when not actively responding to tool calls. However, some MCP hosts might disconnect an idle MCP connection after a period of inactivity, which might cut off the background process. Instruct your AI to call
codebase_statusroughly every 60 seconds after startingcodebase_indexuntil it completes. This keeps the host connection active and provides real-time progress.
The SocratiCode plugin bundles both the MCP server and workflow skills that teach Claude how to use the tools effectively. One install gives you everything:
From your shell:
claude plugin marketplace add giancarloerra/socraticode
claude plugin install socraticode@socraticodeOr from within Claude Code:
/plugin marketplace add giancarloerra/socraticode
/plugin install socraticode@socraticodeThe plugin includes:
If you previously installed SocratiCode as a standalone MCP (
claude mcp add socraticode), remove it after installing the plugin to avoid duplicates:claude mcp remove socraticode
Auto-updates: Third-party plugins don't auto-update by default. To enable automatic updates, open /plugin → Marketplaces → select socraticode → Enable auto-update. To update manually:
From your shell:
claude plugin marketplace update socraticode
claude plugin update socraticode@socraticodeOr from within Claude Code:
/plugin marketplace update socraticode
/plugin update socraticode@socraticodeConfiguring environment variables: SocratiCode works with zero config for most users (local Ollama + managed Qdrant). If you need cloud embeddings, a remote Qdrant, or other customization:
Claude Code settings (recommended) — add to ~/.claude/settings.json:
{
"env": {
"EMBEDDING_PROVIDER": "openai",
"OPENAI_API_KEY": "sk-..."
}
}This works in all environments — CLI, VS Code, and JetBrains.
Shell profile — set vars in ~/.zshrc or ~/.bashrc:
export EMBEDDING_PROVIDER=openai
export OPENAI_API_KEY=sk-...Works when Claude Code is launched from a terminal. Note: IDE-launched sessions (e.g. VS Code opened from Finder/Dock) may not inherit shell profile variables — use option 1 instead.
Restart Claude Code after changing variables. See Environment Variables for all options.
Requires Node.js 18+ and Docker (running). Already covered in Quick Start above, add the following to your mcpServers (Claude Desktop, Windsurf, Cline, Roo Code) or servers (VS Code project-local .vscode/mcp.json) config:
"socraticode": {
"command": "npx",
"args": ["-y", "socraticode"]
}git clone https://github.com/giancarloerra/socraticode.git
cd socraticode
npm install
npm run buildThen use node /absolute/path/to/socraticode/dist/index.js in place of npx -y socraticode in the config examples below.
All
envoptions below apply equally to thenpxinstall. Just add the"env"block to the npx config shown above.
Add to your MCP settings - mcpServers (Claude Desktop, Windsurf, Cline, Roo Code) or servers (VS Code project-local .vscode/mcp.json):
Using npx? Your config is already in Quick Start. Add any
"env"block from the examples below as needed.
{
"mcpServers": {
"socraticode": {
"command": "node",
"args": ["/absolute/path/to/socraticode/dist/index.js"]
}
}
}Tip: The default
OLLAMA_MODE=autodetects native Ollama (port 11434) on startup and uses it if available, otherwise falls back to a managed Docker container. To make your config self-documenting, add an"env"block with explicit values. See Environment Variables for all options.
If you have Ollama installed natively, set OLLAMA_MODE=external and point to your instance:
{
"mcpServers": {
"socraticode": {
"command": "node",
"args": ["/absolute/path/to/socraticode/dist/index.js"],
"env": {
"OLLAMA_MODE": "external",
"OLLAMA_URL": "http://localhost:11434"
}
}
}
}The embedding model is pulled automatically on first use. To pre-download: ollama pull nomic-embed-text
{
"mcpServers": {
"socraticode": {
"command": "node",
"args": ["/absolute/path/to/socraticode/dist/index.js"],
"env": {
"OLLAMA_MODE": "external",
"OLLAMA_URL": "http://gpu-server.local:11434"
}
}
}
}Use OpenAI's cloud embedding API instead of local Ollama. Requires an API key.
{
"mcpServers": {
"socraticode": {
"command": "node",
"args": ["/absolute/path/to/socraticode/dist/index.js"],
"env": {
"EMBEDDING_PROVIDER": "openai",
"OPENAI_API_KEY": "sk-..."
}
}
}
}Defaults:
EMBEDDING_MODEL=text-embedding-3-small,EMBEDDING_DIMENSIONS=1536. For higher quality, usetext-embedding-3-largewithEMBEDDING_DIMENSIONS=3072.
Use Google's Gemini embedding API. Requires an API key.
{
"mcpServers": {
"socraticode": {
"command": "node",
"args": ["/absolute/path/to/socraticode/dist/index.js"],
"env": {
"EMBEDDING_PROVIDER": "google",
"GOOGLE_API_KEY": "AIza..."
}
}
}
}Defaults:
EMBEDDING_MODEL=gemini-embedding-001,EMBEDDING_DIMENSIONS=3072.
If you use git worktrees — or any workflow where the same repository lives in multiple directories — each path would normally get its own Qdrant index. This means redundant embedding and storage for what is essentially the same codebase.
Set SOCRATICODE_PROJECT_ID to share a single index across all directories of the same project.
Some MCP hosts (like Claude Code) resolve the project root by following git worktree links. Since worktrees point back to the main repository's .git directory, the host automatically maps all worktrees to the same project config. This means you only need to configure the MCP server once for the main checkout — all worktrees inherit it automatically.
For Claude Code, add the server with local scope from your main checkout:
cd /path/to/main-checkout
claude mcp add -e SOCRATICODE_PROJECT_ID=my-project --scope local socraticode -- npx -y socraticodeAll worktrees created from this repo will automatically connect to socraticode with the shared project ID. No per-worktree setup needed.
Note: This only works for git worktrees. Separate
git clones of the same repo have independent.gitdirectories and won't share the config.
.mcp.json)For MCP hosts that don't resolve git worktree paths, add a .mcp.json at the root of each worktree (and your main checkout):
{
"mcpServers": {
"socraticode": {
"command": "npx",
"args": ["-y", "socraticode"],
"env": {
"SOCRATICODE_PROJECT_ID": "my-project"
}
}
}
}Add .mcp.json to your .gitignore if you don't want it tracked.
With this config, agents running in /repo/main, /repo/worktree-feat-a, and /repo/worktree-fix-b all share the same codebase_my-project, codegraph_my-project, and context_my-project Qdrant collections.
How it works in practice:
Once connected, 21 tools are available to your AI assistant:
| Tool | Description |
|---|---|
codebase_index | Start indexing a codebase in the background (poll codebase_status for progress) |
codebase_stop | Gracefully stop an in-progress indexing operation (current batch finishes and checkpoints; resume with codebase_index) |
codebase_update | Incremental update — only re-indexes changed files |
codebase_remove | Remove a project's index (safely stops watcher, cancels in-flight indexing/update, waits for graph build) |
codebase_watch | Start/stop file watching — on start, catches up missed changes then watches for future ones |
| Tool | Description |
|---|---|
codebase_search | Hybrid semantic + keyword search (dense + BM25, RRF-fused) with optional file path and language filters |
codebase_status | Check index status and chunk count |
| Tool | Description |
|---|---|
codebase_graph_build | Build a polyglot dependency graph (runs in background — poll with codebase_graph_status) |
codebase_graph_query | Query imports and dependents for a specific file |
codebase_graph_stats | Get graph statistics (most connected files, orphans, language breakdown) |
codebase_graph_circular | Detect circular dependencies |
codebase_graph_visualize | Generate a Mermaid diagram of the dependency graph |
codebase_graph_status | Check graph build progress or persisted graph metadata |
codebase_graph_remove | Remove a project's persisted code graph (waits for in-flight graph build to finish first) |
| Tool | Description |
|---|---|
codebase_health | Check Docker, Qdrant, and embedding provider status |
codebase_list_projects | List all indexed projects with paths and metadata |
codebase_about | Display info about SocratiCode |
| Tool | Description |
|---|---|
codebase_context | List all context artifacts defined in .socraticodecontextartifacts.json with names, descriptions, and index status |
codebase_context_search | Semantic search across context artifacts (auto-indexes on first use, auto-detects staleness) |
codebase_context_index | Index or re-index all artifacts from .socraticodecontextartifacts.json |
codebase_context_remove | Remove all indexed context artifacts for a project (blocked while indexing is in progress) |
SocratiCode supports languages at three levels:
JavaScript, TypeScript, TSX, Python, Java, Kotlin, Scala, C, C++, C#, Go, Rust, Ruby, PHP, Swift, Bash/Shell, HTML, CSS/SCSS, Svelte, Vue
Svelte and Vue: imports extracted from <script> blocks (re-parsed as TypeScript) and CSS @import/@require from <style> blocks (any combination of lang, scoped, module, global attributes). Path aliases from tsconfig.json/jsconfig.json compilerOptions.paths are resolved (including extends chains). SCSS partial resolution (_ prefix convention) is supported.
Dart (import/export/part), Lua (require/dofile/loadfile), SASS, LESS (CSS @import extraction)
JSON, YAML, TOML, XML, INI/CFG, Markdown/MDX, RST, SQL, R, Dockerfile, TXT, and any file matching a supported extension or special filename (Dockerfile, Makefile, Gemfile, Rakefile, etc.)
54 file extensions + 8 special filenames supported out of the box.
The indexer combines three layers of ignore rules:
node_modules, .git, dist, build, lock files, IDE folders, etc..gitignore — All .gitignore files in the project (root and nested subdirectories). Set RESPECT_GITIGNORE=false to skip .gitignore processing entirely..socraticodeignore — Optional file for indexer-specific exclusions. Same syntax as .gitignore.Give the AI awareness of project knowledge beyond source code — database schemas, API specs, infrastructure configs, architecture docs, and more.
Create a .socraticodecontextartifacts.json file in your project root (see .socraticodecontextartifacts.json.example for a starter template):
{
"artifacts": [
{
"name": "database-schema",
"path": "./docs/schema.sql",
"description": "Complete PostgreSQL schema — all tables, indexes, constraints, foreign keys. Use to understand what data the app stores and how tables relate."
},
{
"name": "api-spec",
"path": "./docs/openapi.yaml",
"description": "OpenAPI 3.0 spec for the REST API. All endpoints, request/response schemas, auth requirements."
},
{
"name": "k8s-manifests",
"path": "./deploy/k8s/",
"description": "Kubernetes deployment manifests. Shows how services are deployed, scaled, and networked."
}
]
}Each artifact has:
name — Unique identifier (used to filter searches)path — Path to a file or directory (relative to project root, or absolute). Directories are read recursively.description — Tells the AI what this artifact is and how to use itArtifacts are chunked and embedded into Qdrant using the same hybrid dense + BM25 search as code. On first search, artifacts are auto-indexed. On subsequent searches, staleness is auto-detected via content hashing — changed files are re-indexed transparently.
codebase_context — lists all defined artifacts and their index statuscodebase_context_search — semantic search across all artifacts (or filter by name)codebase_context_index — force re-index (usually not needed, auto-indexing handles it)codebase_context_remove — remove all indexed artifacts| Category | Examples |
|---|---|
| Database | SQL schema dumps (pg_dump --schema-only), Prisma schemas, Rails schema.rb, Django model dumps, migration files |
| API Contracts | OpenAPI/Swagger specs, GraphQL schemas, Protobuf definitions, AsyncAPI specs (Kafka, RabbitMQ) |
| Infrastructure | Terraform/Pulumi configs, Kubernetes manifests, Docker Compose files, CI/CD pipeline configs |
| Architecture | Architecture Decision Records (ADRs), service topology docs, data flow diagrams, domain glossaries |
| Operations | Monitoring/alerting rules, RBAC/permission matrices, auth flow documentation, feature flag configs |
| External | Third-party API docs, compliance requirements (SOC2, HIPAA, GDPR), SLA definitions |
Tip: For database schemas, every major database can export its entire schema to a single file:
pg_dump --schema-only(PostgreSQL),mysqldump --no-data(MySQL),sqlite3 db.sqlite .schema(SQLite). ORM schemas (Prisma, Rails, Django) are often already in your repo.
| Variable | Default | Description |
|---|---|---|
EMBEDDING_PROVIDER | ollama | Embedding backend: ollama (local, default), openai, or google |
EMBEDDING_MODEL | (per provider) | Model name. Defaults: nomic-embed-text (ollama), text-embedding-3-small (openai), gemini-embedding-001 (google) |
EMBEDDING_DIMENSIONS | (per provider) | Vector dimensions. Defaults: 768 (ollama), 1536 (openai), 3072 (google) |
EMBEDDING_CONTEXT_LENGTH | (auto-detected) | Model context window in tokens. Auto-detected for known models. Set manually for custom models. |
EMBEDDING_PROVIDER=ollama)| Variable | Default | Description |
|---|---|---|
OLLAMA_MODE | auto | auto = use native Ollama on port 11434 if available, otherwise manage a Docker container (recommended). docker = always use managed Docker container on port 11435. external = user-managed Ollama instance (native, remote, etc.) |
OLLAMA_URL | http://localhost:11434 (auto/external) / http://localhost:11435 (docker) | Full Ollama API endpoint |
OLLAMA_PORT | 11435 | Ollama container port (Docker mode). Ignored when OLLAMA_URL is set explicitly. |
OLLAMA_HOST | http://localhost:{OLLAMA_PORT} | Ollama base URL (alternative to OLLAMA_URL) |
OLLAMA_API_KEY | (none) | Optional API key for authenticated Ollama proxies |
| Variable | Default | Description |
|---|---|---|
OPENAI_API_KEY | (none) | Required when EMBEDDING_PROVIDER=openai. Get from platform.openai.com |
GOOGLE_API_KEY | (none) | Required when EMBEDDING_PROVIDER=google. Get from aistudio.google.com |
| Variable | Default | Description |
|---|---|---|
QDRANT_MODE | managed | managed = Docker-managed local Qdrant (default). external = user-provided remote or cloud Qdrant (no Docker management). |
QDRANT_URL | (none) | Full URL of a remote/cloud Qdrant instance (e.g. https://xyz.aws.cloud.qdrant.io:6333). When set, takes precedence over QDRANT_HOST + QDRANT_PORT. Port is auto-inferred from the URL: explicit port if present (e.g. :8443), otherwise 443 for https:// or 6333 for http://. Required (or set QDRANT_HOST) when QDRANT_MODE=external. |
QDRANT_PORT | 16333 | Qdrant REST API port (managed mode, or external without QDRANT_URL) |
QDRANT_GRPC_PORT | 16334 | Qdrant gRPC port (managed mode only) |
QDRANT_HOST | localhost | Qdrant hostname (alternative to QDRANT_URL for non-HTTPS external instances) |
QDRANT_API_KEY | (none) | Qdrant API key (required for Qdrant Cloud and other authenticated deployments) |
| Variable | Default | Description |
|---|---|---|
RESPECT_GITIGNORE | true | Set to false to skip .gitignore processing. Built-in defaults and .socraticodeignore still apply. |
INCLUDE_DOT_FILES | false | Set to true to include dot-directories (e.g. .agent, .config) in indexing. By default, directories and files starting with . are excluded. Useful for projects where important code lives in dot-directories. |
EXTRA_EXTENSIONS | (none) | Comma-separated list of additional file extensions to scan (e.g. .tpl,.blade,.hbs). Applies to both indexing and code graph. Files with extra extensions are indexed as plaintext and appear as leaf nodes in the code graph. Can also be passed per-operation via the extraExtensions tool parameter. |
MAX_FILE_SIZE_MB | 5 | Maximum file size in MB. Files larger than this are skipped during indexing. Increase for repos with large generated or data files you want indexed. |
SEARCH_DEFAULT_LIMIT | 10 | Default number of results returned by codebase_search (1-50). Each result is a ranked code chunk with file path, line range, and content. Higher values give broader coverage but produce more output. Can still be overridden per-query via the limit tool parameter. |
SEARCH_MIN_SCORE | 0.10 | Minimum RRF (Reciprocal Rank Fusion) score threshold (0-1). Results below this score are filtered out. Helps remove low-relevance noise from search results. Set to 0 to disable filtering (returns all results up to limit). Can be overridden per-query via the minScore tool parameter. Works together with limit: results are first filtered by score, then capped at limit. |
SOCRATICODE_PROJECT_ID | (none) | Override the auto-generated project ID. When set, all paths resolve to the same Qdrant collections, allowing multiple directories (e.g. git worktrees of the same repo) to share a single index. Must match [a-zA-Z0-9_-]+. |
SOCRATICODE_LOG_LEVEL | info | Log verbosity: debug, info, warn, error |
SOCRATICODE_LOG_FILE | (none) | Absolute path to a log file. When set, all log entries are appended to this file (a session separator is written on each server start). Useful for debugging when the MCP host doesn't surface log notifications. |
Important: If you change
EMBEDDING_PROVIDER,EMBEDDING_MODEL, orEMBEDDING_DIMENSIONSafter indexing, you must re-index your projects (codebase_removethencodebase_index) since existing vectors have different dimensions.
SocratiCode manages Docker containers and persistent volumes:
| Resource | Name | Purpose | When |
|---|---|---|---|
| Container | socraticode-qdrant | Qdrant vector database (pinned v1.17.0) | managed mode only |
| Container | socraticode-ollama | Ollama embedding server | docker mode only |
| Volume | socraticode_qdrant_data | Persistent vector storage | managed mode only |
| Volume | socraticode_ollama_data | Persistent model storage | docker mode only |
In QDRANT_MODE=external mode, the Qdrant container and volume are not created or started — SocratiCode connects directly to the configured remote endpoint. Server-side BM25 inference (used for hybrid search) requires Qdrant v1.15.2 or later. The managed container runs v1.17.0. If you bring your own Qdrant instance, ensure it meets this minimum.
All containers use --restart unless-stopped for automatic recovery.
Why non-standard ports? SocratiCode intentionally