How to Integrate with MCP (Model Context Protocol)
Use SochDB as persistent memory and a queryable knowledge fabric for Claude, Cursor, Goose, and other MCP clients.
Problem
You want to give your LLM agent (Claude Desktop, Cursor, Goose, etc.) persistent memory and structured retrieval using SochDB.
Solution
SochDB ships a standalone MCP server, sochdb-mcp. It is a framework-free Model Context Protocol server that speaks JSON-RPC over stdio and makes direct embedded Rust calls into an on-disk SochDB database — there is no separate network database to run. It implements MCP protocol version 2024-11-05 and advertises tools and resources capabilities (no prompts).
This page covers installing and configuring the MCP server. For end-to-end patterns of driving a coding agent against SochDB (memory loops, agentic code search, context packing), see the Coding Agents guide.
1. Build the SochDB MCP server
The binary is part of the Rust workspace (the core engine, including sochdb-mcp, is AGPL-3.0-or-later).
# Build from source
cargo build --release --package sochdb-mcp
# The binary lands at target/release/sochdb-mcp.
# Optionally copy it onto your PATH:
cp target/release/sochdb-mcp /usr/local/bin/
The server takes a single flag, --db <path>, pointing at the on-disk data directory (default ./sochdb_data). It opens an embedded connection for real persistence:
sochdb-mcp --db ./data
Logs go to stderr only — stdout is reserved for the JSON-RPC protocol stream. For verbose logging set RUST_LOG=sochdb_mcp=debug.
You can smoke-test it without a client by piping a request:
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' | sochdb-mcp --db ./test_data
2. Configure Claude Desktop
Add the server to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or the equivalent on your platform. Use an absolute path to the binary and to the data directory — MCP clients do not expand ~ or resolve relative paths reliably.
{
"mcpServers": {
"sochdb": {
"command": "/usr/local/bin/sochdb-mcp",
"args": ["--db", "/Users/you/.sochdb/claude_memory"],
"env": {
"RUST_LOG": "info"
}
}
}
}
Restart Claude Desktop after editing the config.
3. Configure Cursor
Add the server to .cursor/mcp.json (project-local) or your global Cursor MCP settings:
{
"mcpServers": {
"sochdb": {
"command": "/usr/local/bin/sochdb-mcp",
"args": ["--db", "/Users/you/.sochdb/cursor_memory"]
}
}
}
4. Configure Goose
Goose uses a flat per-server entry. Add to your Goose config:
{
"name": "sochdb",
"type": "stdio",
"command": "/usr/local/bin/sochdb-mcp",
"args": ["--db", "/Users/you/.sochdb/goose_memory"],
"timeout": 300,
"env": {}
}
The example configs bundled in the repo (sochdb-mcp/mcp-claude-desktop.json, mcp-cursor.json, mcp-goose.json) hardcode build-machine paths under /Users/sushanth/sochdb/.... You must replace both the command path (the sochdb-mcp binary) and the --db path with absolute paths on your own machine.
Available MCP tools
Tool names use underscores (for example sochdb_query, memory_search_episodes). Older dot-named catalogs in the repo's mcp.json and README (such as sochdb.query) are stale — the names below are what the server actually exposes.
Core database tools
sochdb_get
Get the value at a path.
Tool: sochdb_get
Arguments:
path: "users/alice/preferences"
sochdb_put
Set the value at a path. Commits and double-fsyncs for durability.
Tool: sochdb_put
Arguments:
path: "users/alice/preferences"
value: '{"theme": "dark", "language": "en"}'
sochdb_delete
Delete the value at a path.
Tool: sochdb_delete
Arguments:
path: "users/alice/old_data"
sochdb_query
Execute a SochQL query. Uses a hardened parser that enforces prefix-bounded scans and table-name validation for multi-tenant safety.
query— the SochQL statement.format—toonorjson(defaulttoon).limit— default100.
Tool: sochdb_query
Arguments:
query: "SELECT id,name FROM users WHERE score > 80"
format: "toon"
limit: 100
sochdb_context_query
Fetch AI-optimized context with token budgeting; sections are packed in priority order.
sections[]— each section hasname,priority, andkind(one ofliteral,get,last,search), plus the relevant fields (text/path/table/query/top_k/where).token_budget— default4096.format—toon,json, ormarkdown(defaulttoon).truncation—tail_drop,head_drop, orproportional.
Tool: sochdb_context_query
Arguments:
sections:
- name: "user_prefs"
kind: "get"
path: "users/alice/preferences"
priority: 1
- name: "history"
kind: "last"
table: "messages"
top_k: 10
priority: 2
token_budget: 4096
format: "toon"
truncation: "tail_drop"
sochdb_list_tables
List all tables with semantic metadata.
include_metadata— defaulttrue.
Tool: sochdb_list_tables
Arguments:
include_metadata: true
sochdb_describe
Get the detailed schema for a table.
Tool: sochdb_describe
Arguments:
table: "users"
Memory tools
These operate on SochDB's episode / entity / event memory schema.
memory_search_episodes— search over episodes. Args:query,k(default5),episode_type(one ofconversation,task,workflow,debug,agent_interaction),entity_id.memory_get_episode_timeline— event timeline for an episode. Args:episode_id,max_events(default50),role(one ofuser,assistant,system,tool,external),include_metrics(defaultfalse).memory_search_entities— search entities. Args:query,k(default10),kind(one ofuser,project,document,service,agent,organization).memory_get_entity_facts— facts about an entity. Args:entity_id,include_episodes(defaulttrue),max_episodes(default5).memory_build_context— one-shot optimized LLM context packing. Args:goal,token_budget(default4096),session_id,episode_id,entity_ids[],include_schema(defaultfalse).
Log tools
logs_tail— last N rows from a log table (most recent first). Args:table,limit(default20),where,columns[].logs_timeline— events in a time range for an entity. Args:entity_id,from_ts/to_ts(microseconds since epoch),limit(default100),table(defaultevents).
Agentic search tools
These three tools turn an in-memory document corpus into a code-search surface backed by a trigram index for sublinear lookups.
sochdb_grep— indexed grep over the corpus with line-anchored hits. Args:pattern,scope(adoc_idprefix filter),limit(default50).sochdb_peek— read a line range from a document. Args:doc_id,start_line,end_line.sochdb_expand— expand by plus or minus N lines around a hit. Args:doc_id,line,window(default5).
Vector/semantic search in the MCP server is gated behind both the semantic-search Cargo feature (off by default) and the runtime env var SOCHDB_SEMANTIC_SEARCH=1. Even when both are enabled, the vector path is not yet wired to the backend — the server generates embeddings but the actual vector search is disabled in code pending backend support, so memory_search_* currently falls back to a keyword/text scan.
MCP resources & views
In addition to tools, the server exposes SochDB tables and predefined views as MCP resources:
resources/listlists tables assochdb://tables/<name>with semantic-metadata annotations (role, primary key, cluster key, timestamp column, whether it is backed by a vector index, and embedding dimension).resources/readsupports bothsochdb://tables/<name>andsochdb://views/<name>.- Predefined views:
conversation_view,tool_calls_view,error_view,episode_summary_view,entity_directory_view. - Resource output is
text/x-toonby default, orapplication/jsonwhenformat=json.
Example: agent with persistent memory
Here is how an agent might use SochDB across a session.
Storing a preference
User: Remember that I prefer dark mode.
Claude uses tool: sochdb_put
path: "user/preferences/theme"
value: "dark"
Claude: Noted — I'll remember you prefer dark mode for future sessions.
Recalling information
User: What theme do I prefer?
Claude uses tool: sochdb_get
path: "user/preferences/theme"
result: "dark"
Claude: You prefer dark mode.
Building context
User: Summarize what we discussed yesterday.
Claude uses tool: sochdb_context_query
sections:
- name: "history"
kind: "last"
table: "conversations"
top_k: 20
priority: 1
token_budget: 2000
Claude: Based on our conversation yesterday, we discussed...
Troubleshooting
MCP server not starting
Run it directly with verbose logging — remember logs go to stderr:
RUST_LOG=sochdb_mcp=debug sochdb-mcp --db ./test_db
Permission denied
Ensure the database directory is writable:
mkdir -p ~/.sochdb
chmod 755 ~/.sochdb
Client not seeing tools
- Restart the client (Claude Desktop / Cursor / Goose) after editing its config.
- Validate the config JSON syntax.
- Confirm the
commandpath and the--dbpath are absolute and correct.
Debug logging via the config
{
"mcpServers": {
"sochdb": {
"command": "/usr/local/bin/sochdb-mcp",
"args": ["--db", "/Users/you/.sochdb/debug"],
"env": {
"RUST_LOG": "sochdb_mcp=debug",
"RUST_BACKTRACE": "1"
}
}
}
}
Discussion
Security considerations
- The MCP server runs locally with embedded database access under your user permissions — there is no auth layer in stdio mode.
- Data is stored unencrypted on disk by default.
- The
sochdb_queryparser enforces prefix-bounded scans and table-name validation, which limits cross-tenant access within a shared database.
Performance tips
- Prefer one
sochdb_context_queryover manysochdb_getcalls — it packs everything in a single token-budgeted response. - Bound result sets with the
limitargument onsochdb_query,logs_tail, and friends. - Use
sochdb_grep+sochdb_peek/sochdb_expandfor code-style retrieval instead of scanning whole documents.
See Also
- Coding Agents Guide — End-to-end agent + memory patterns
- Context Query Guide — Token-budgeted context assembly
- Vector Search Guide — Embedding workflows
- Logging Guide — Observability setup
- Getting Started — Quick start guide