OpenLore
Local code graph that gives coding agents task context and checks changes before they land
Local semantic code search, dependency graphs and impact analysis over your own repositories
By Giancarlo Erra (individual) TypeScript Local · stdio Developer toolsDatabases
79 popularity score ★ 3.4k ↓ 3.6k/wk
Opens the app, which asks before it adds the server.
claude mcp add socraticode -- npx -y --prefer-online socraticode@latest{
"mcpServers": {
"socraticode": {
"command": "npx",
"args": [
"-y",
"--prefer-online",
"socraticode@latest"
]
}
}
}{
"mcpServers": {
"socraticode": {
"command": "npx",
"args": [
"-y",
"--prefer-online",
"socraticode@latest"
]
}
}
}{
"servers": {
"socraticode": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"--prefer-online",
"socraticode@latest"
]
}
}
}[mcp_servers.socraticode]
command = "npx"
args = ["-y", "--prefer-online", "socraticode@latest"]gemini mcp add --scope user socraticode npx -- -y --prefer-online socraticode@latestOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
git clone https://github.com/giancarloerra/socraticode.git
cd socraticode
npm install
npm run buildclaude mcp add socraticode -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'{
"mcpServers": {
"socraticode": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
]
}
}
}{
"mcpServers": {
"socraticode": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
]
}
}
}{
"servers": {
"socraticode": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
]
}
}
}[mcp_servers.socraticode]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]gemini mcp add --scope user socraticode node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'EMBEDDING_PROVIDER |
Optional: Embedding backend: ollama, openai, google, lmstudio or litellm. litellm also needs LITELLM_API_KEY. |
|---|---|
EMBEDDING_MODEL |
Optional: Embedding model name, with a default per provider. lmstudio and litellm need it set, along with EMBEDDING_DIMENSIONS. |
OPENAI_API_KEY secret |
Optional: OpenAI key, needed only when EMBEDDING_PROVIDER=openai. |
GOOGLE_API_KEY secret |
Optional: Google key, needed only when EMBEDDING_PROVIDER=google. |
SOCRATICODE_WATCHER |
Optional: Index refresh policy: auto, manual, off or git. |
| Set together: ollama | |
OLLAMA_MODE |
Optional: auto (native Ollama if found, else Docker), docker, or external. |
OLLAMA_URL |
Optional: Address of the Ollama API. Defaults to localhost port 11434, or 11435 in docker mode. |
OLLAMA_HOST |
Optional: Base address for managed Ollama readiness checks. With OLLAMA_API_KEY and no OLLAMA_URL it is also used for embeddings. |
OLLAMA_API_KEY secret |
Optional: Key for an authenticated Ollama proxy, sent as a bearer token. Remote addresses must be https. |
| Set together: qdrant | |
QDRANT_MODE |
Optional: managed (local Docker container) or external. |
QDRANT_URL |
Optional: Address of a remote or Qdrant Cloud instance in external mode. |
QDRANT_API_KEY secret |
Optional: Key for an authenticated Qdrant deployment such as Qdrant Cloud. |
SocratiCode builds a searchable index of a codebase on your own machine and exposes it to an assistant over stdio. It splits source files into chunks along their syntax tree, embeds them, and stores them in a Qdrant vector database, so a query runs both a meaning-based search and a BM25 keyword search and merges the two result lists. Indexing runs in the background in batches with checkpoints, so an interrupted run picks up where it stopped, and a file watcher (or, optionally, a refresh on git branch changes) keeps the index current.
On top of the search index it builds two graphs. The first maps which files import which, finds circular dependencies and can draw the result as a Mermaid diagram or a standalone HTML page that opens in the browser. The second maps which functions call which, so the assistant can ask what would be affected by changing a symbol, trace execution forward from an entry point, or list a symbol's callers and callees. Full support covers about twenty languages, including TypeScript, Python, Java, Go, Rust, C#, PHP and Swift; other text formats are indexed for search only.
It can also index 'context artifacts' you list in a .socraticodecontextartifacts.json file, such as database schemas, API specs or infrastructure configs, and search them alongside the code. Several projects can be linked for cross-project search, and git worktrees or branches can share or separate an index.
By default it starts its own Qdrant container and uses Ollama for embeddings, so nothing leaves the machine. OpenAI, Google Gemini, LM Studio or a LiteLLM proxy can be used for embeddings instead, and an external or Qdrant Cloud instance can replace the local database. Besides the plain MCP server, its makers ship plugins for Claude Code, OpenAI Codex, VS Code and Cursor that bundle the same engine. A hosted team version, SocratiCode Cloud, is in private beta and separate from this server.
| Runtime | Node.js 18.17+Docker |
|---|---|
| Runs on | macOS, Windows, Linux |
| Also |
|
Node.js 18.17 or newer with npx on the PATH, and an MCP host that runs local stdio servers. In the default setup Docker must be running: it hosts the managed Qdrant database and, unless a native Ollama install is found, the Ollama embedding container. First start downloads the images and an embedding model (around five minutes). Docker is optional only with an external Qdrant plus native Ollama or a cloud embedding provider, which then needs its own API key. On Alpine Linux ARM64, run apk add --no-cache gcompat first so the bundled Swift parser can load.
The call graph comes from static analysis with no type inference: calls made through dynamic dispatch, reflection, eval, macros or framework dependency injection do not show up, so 'zero callers' can be wrong on DI-heavy code. Docker on macOS and Windows has no GPU access, so the default embedding container is slow on medium or large repositories; its makers suggest native Ollama or OpenAI embeddings there. Files over 5 MB are skipped by default. Changing the embedding provider or model does not apply to an existing index until it is removed and rebuilt. External Qdrant must be v1.15.2 or later for hybrid search.
Suits developers working on large or many-language repositories who want an assistant to search by meaning and check the impact of a change before refactoring, while keeping code on their own machine. It is a heavier install than grep-style tools: it needs Docker or an external Qdrant and an embedding model, plus an initial indexing pass. For small repositories or lookups of exact names, its own docs say plain grep can be as good. Teams wanting a shared, hosted index would look at the makers' separate SocratiCode Cloud instead. It is a community project, not tied to any vendor, and its AGPL-3.0 licence matters if you modify it and offer it as a network service.
15 only read, 7 change things, 4 can delete or overwrite. A ? marks an optional parameter.
codebase_index changesprojectPath?: stringextraExtensions?: stringcodebase_stop changesprojectPath?: stringcodebase_update changesprojectPath?: stringextraExtensions?: stringcodebase_remove deletesprojectPath: stringcodebase_prune deletesapply?: booleanidentity?: stringconfirmationToken?: stringacknowledgeNoRemoteWriters?: booleancodebase_watch changesprojectPath?: stringaction: enumcodebase_searchquery: stringprojectPath?: stringlimit?: numberfileFilter?: stringlanguageFilter?: stringminScore?: numberincludeLinked?: booleancodebase_statusprojectPath?: stringcodebase_graph_build changesprojectPath?: stringextraExtensions?: stringcodebase_graph_queryprojectPath?: stringfilePath: stringcodebase_graph_statsprojectPath?: stringcodebase_graph_circularprojectPath?: stringcodebase_graph_visualize changesprojectPath?: stringmode?: enumopen?: booleancodebase_graph_statusprojectPath?: stringcodebase_graph_remove deletesprojectPath: stringcodebase_impactprojectPath?: stringtarget?: stringfile?: stringsymbolId?: stringdepth?: numberlimit?: integercodebase_flowprojectPath?: stringentrypoint?: stringfile?: stringdepth?: numberlimit?: integercodebase_symbolprojectPath?: stringname: stringfile?: stringlimit?: integercodebase_symbolsprojectPath?: stringfile?: stringquery?: stringlimit?: numbercodebase_healthcodebase_list_projectscodebase_aboutcodebase_contextprojectPath?: stringcodebase_context_searchquery: stringprojectPath?: stringartifactName?: stringlimit?: numberminScore?: numbercodebase_context_index changesprojectPath?: stringcodebase_context_remove deletesprojectPath: string