kl_searchLABSCO SUMMARY
Refusal is a feature here, and it is checkable.
The demonstration in the README asks a two-part question the corpus can only half answer, and the half it cannot support comes back refused rather than invented. That behaviour is only useful if you can act on it, which is what the status field is for: an agent can be gated on "supported" and made to stop otherwise. The other thing to weigh is operational — one datastore, no Redis, no separate vector database, no graph service.
What it is
A knowledge and memory service for agents, running headless over MCP with Postgres and pgvector as the only datastore — vectors, full-text, the knowledge graph and the job queue all live there. Retrieval runs in tiers: chunks, then typed fact cards, then graph traversal.
What you get
kl_searchfor passage search andkl_ask_globalfor a synthesised answer where every claim carries a numbered citation, plus a status you can branch on — supported, partial, unsupported, conflicted or needs_reviewkl_get_materialfetches a source by id andkl_graph_neighborswalks to related materialkl_ingestadds text, chunking, embedding, distilling it into cards and extracting graph relations;kl_forgetremoves a material and everything derived from itkl_signalemits a programmatic signal on a prior answer, which is what drives the judge-gated loop that promotes validated knowledge back into the corpus- A separate memory layer:
mem_recallreads beliefs with semantic search or time-travel to a past point,mem_writerecords one,mem_forgetretracts your own - Every tool is scoped — read, write, admin and signal are separate permissions on a token
- Answers carry a why-trace: the phases, their timings, the model used and a telemetry id
Requirements
Docker with Compose v2.23+ for the quickstart, which pulls the published images, generates secrets, starts Postgres, server and worker, and prints the MCP configuration. The endpoint is http://localhost:3000/mcp with a bearer header. Embeddings run locally by default — a multilingual model downloads on first use and needs no key — so only synthesis needs a chat model, either an OpenAI key or any OpenAI-compatible endpoint such as a local Ollama or vLLM. From source it needs Node >=22.18 or Bun >=1.3 and Postgres with pgvector.
Setup effort
One command plus a key — OPENAI_API_KEY=<YOUR_OPENAI_API_KEY> sh -c "$(curl -fsSL https://raw.githubusercontent.com/Moai-Team-LLC/AgenticMind/main/quickstart.sh)"
USE CASES
Answering from trusted sources only
Get a synthesised answer where each claim is keyed to a numbered source you can open, and an unsupported claim is refused rather than filled in.
Gating an agent on whether it actually knows
Branch on the returned status instead of parsing confidence out of prose.
Auditing an answer after the fact
Replay the trace — what was retrieved, what was ranked, which model ran — from the telemetry id.
Keeping agent memory separate from team knowledge
Write private beliefs to the memory layer and promote only what clears the gate into the shared corpus.
10 tools
Listed in project docs. Your client may show a different list.
kl_ask_globalkl_get_materialkl_graph_neighborskl_ingestkl_forgetkl_signalmem_recallmem_writemem_forgetBEFORE YOU INSTALL
What to know first
Tools you get
10 tools named in the project's documentation. Tools are scope-gated: a token with only knowledge:read can call four of the ten, and kl_forget needs knowledge:admin. needs_review is an answer status value, not a tool.
Requires
OPENAI_API_KEY in your environment
Where it runs
All 3 documented clients run the server on your machine.
INSTALLATION
Connect your client
Server setup
Setup
mkdir agenticmind && cd agenticmind
curl -fsSL https://raw.githubusercontent.com/Moai-Team-LLC/AgenticMind/main/deploy/docker-compose.yml -o docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/Moai-Team-LLC/AgenticMind/main/deploy/.env.example -o .env.example
curl -fsSL https://raw.githubusercontent.com/Moai-Team-LLC/AgenticMind/main/deploy/gen-secrets.sh -o gen-secrets.sh && chmod +x gen-secrets.sh
./gen-secrets.sh # writes DB password + MCP_API_KEY into .env
# set OPENAI_API_KEY in .env, then:
docker compose up -dOr run the install script
OPENAI_API_KEY=<YOUR_OPENAI_API_KEY> sh -c "$(curl -fsSL https://raw.githubusercontent.com/Moai-Team-LLC/AgenticMind/main/quickstart.sh)"MCP Clients
Claude Code
{
"mcpServers": {
"agenticmind": {
"type": "http",
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer ${MCP_API_KEY}"
}
}
}
}Using ${MCP_API_KEY} keeps the secret out of the committed file — set it in your environment (gen-secrets.sh wrote its value into .env).
Cursor
{
"mcpServers": {
"agenticmind": {
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer <YOUR_MCP_API_KEY>"
}
}
}
}<YOUR_MCP_API_KEY> is your static MCP_API_KEY (gen-secrets.sh writes it into .env) or a minted token.
Claude Desktop
Claude Desktop launches MCP servers over stdio, so bridge the HTTP server with mcp-remote. Edit claude_desktop_config.json:
{
"mcpServers": {
"agenticmind": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:3000/mcp",
"--header",
"Authorization: Bearer <YOUR_MCP_API_KEY>"
]
}
}
}