Get started
From nothing to a
searchable memory.
Five steps. Two dependencies. No database server, no vector service, and no model to download.
In development. Not on PyPI yet, so
pip install hadano-ai-cabinet does not work today. These steps
describe the flow the release will follow.
The machine-readable form is in /facts.json
(installable: false).
01 / Install
Install the package.
Python 3.11 or newer. The base install pulls in exactly two runtime
dependencies: mcp, and the pydantic that
mcp requires anyway. Everything the index needs comes with
Python.
pip install hadano-ai-cabinet
Check that the module resolves before going further. If this prints a JSON object, the install is good.
python -c "import hadano; print(hadano.__version__, hadano.TOOL_NAMES)"
02 / Register
Tell your AI client about it.
Hadano speaks MCP over stdio. Add this to your client's MCP configuration. Nothing listens on a port, and nothing starts until your client launches it.
{
"mcpServers": {
"hadano": {
"type": "stdio",
"command": "python",
"args": ["-m", "hadano.server"],
"env": { "HADANO_DB": "~/hadano.db" }
}
}
}
Where that file lives
| client | configuration |
|---|---|
| Claude Code | claude mcp add, or the mcpServers block in your settings |
| Claude Desktop | claude_desktop_config.json |
| Cursor | .cursor/mcp.json |
| anything else | whatever that client calls its MCP server list |
The database file is created on first use. Point
HADANO_DB at an absolute path — if you leave it out, the
file lands in whatever the working directory happens to be, which is rarely what
you want.
Two details save the most time here. Each client has its own config file — an entry added for Claude Desktop does not appear in Claude Code, and the other way round. And reload differs: Claude Desktop picks the entry up after an app restart, while Claude Code picks it up on the next new chat. To check the wiring, ask the assistant about the database status — a working setup answers with the file path and document count.
03 / Store
Put something in it.
Ask your assistant to save something. It calls store_document for
you — there is no separate command to learn.
# what you say Save my deployment runbook to Hadano, tagged ops. # what the client sends store_document( title = "Deployment runbook", content = "...", tags = ["ops"] ) # what comes back { "id": "8abacdf04d1a49b28f84347cb1d94180", "chunks": 2, "sha256": "aea22d7f...", "request_id": "4f1c..." }
The document is split into overlapping chunks of 800 codepoints, indexed for full-text search, and hashed. The split is deterministic: the same text always produces the same chunks. Every call also returns a request ID and lands in the audit log.
04 / Search
Find it again.
Search runs in two stages, and the first one is enough most of the time.
search_documents is keyword matching over a character-trigram index,
ranked by BM25 —
deterministic, and it works on Japanese and other CJK text without a morphological
analyzer.
# stage 1 — find the document search_documents(query = "rollback", top_k = 5) { "documents": [ { "doc_id": "8abacdf0...", "title": "Deployment runbook", "score": 0.0325, "matched_chunks": [ { "chunk_id": 2, "seq": 1, "text": "..." } ] } ] }
If you want more than the matching document — things connected to it —
take up to three chunk_id values from stage 1 and pass them as seeds to
stage 2. That cap is deliberate. It is what keeps cost bounded and keeps every
result traceable to a source document.
# stage 2 — expand from what stage 1 actually matched search_knowledge(seed_chunk_ids = [2], top_k = 10) { "related_chunks": [], "related_edges": [ { "src": "runbook", "rel": "cites", "dst": "rollback-policy", "source": "graph" } ], "truncated": false }
05 / Keep a copy
It is one file. Copy it.
The whole knowledge base is hadano.db. Moving it to another machine
is a file copy, and copying the file is a backup. Close the client first for a
sure copy; the server releases the file between calls, so a copy usually succeeds
even mid-session.
# a backup is a file copy
copy hadano.db backups\hadano-2026-08-28.db
Snapshot and JSONL export commands are being rebuilt for the current storage engine and will return here when they land.
Optional / Vector search
Not in this version.
Stage 2 was designed to expand by meaning as well as by relations. That half was built against the storage layer that has since been replaced, and it has not been reconnected. There is nothing to turn on right now.
Setting HADANO_EMBEDDINGS=local is refused when the server starts,
with the reason, rather than accepted and quietly ignored. Asking a search for vector
expansion returns an error rather than an empty answer that looks like a real one.
It was never on by default, and the reason has not changed: 25 more packages, a 240 MB model download, and resident memory going from 22 MB to 604 MB on the layer where it was measured.
Keyword and graph search are unaffected. Stage 1 never touched a vector, so nothing about it changes when this comes back.
Next
Where to go from here.
| you want | go to |
|---|---|
| Every tool, parameter, limit, and error code | not published yet - the API surface is still changing, and this site lists only what has been verified |
| Why search works in two stages | mechanism |
| Whether this fits your case at all | where this fits |
| Measured latency and memory | measured |