DecisionsSearch
It is an MCP server that gives AI agents persistent, typed, project-scoped memory backed by a knowledge graph and vector search, plus autonomous CI/CD error investigation.
Store durable memory: create/upsert typed memories (business rules, architectural decisions, design/code patterns, PR records, episodes, procedures) with project partitioning and deduplication checks.
Search semantically and structurally: hybrid retrieval via
memory.query, point-in-time queries withmemory.query_at, context packing withmemory.context, and duplicate discovery withmemory.find_duplicates.Manage PR memory: create PR memories, link PRs to work items and memory items, and query linked PRs/memories.
Track memory lifecycle: propose changes via
memory.change.propose, approve/apply previews, rollback to historical revisions, deprecate memories, set weights, consolidate, reconcile, and capture post-commit knowledge.Manage the graph catalog: create/update projects, categories, domains, and typed relations; import/export the catalog as CSV.
Handle errors autonomously: ingest errors with stack traces, list them, and retrieve generated root-cause investigations.
Run scheduled system jobs: list, trigger, and inspect history of maintenance/scan jobs, including full scans of GitHub PRs and project-management cards.
Support raw ingestion and reflection: ingest unstructured text for automatic extraction/classification, reflect on completed tasks, and load relevant context before starting work.
Enables autonomous CI/CD error investigation by detecting suspect PRs, running an agent to investigate root causes, and optionally opening fix PRs.
Provides persistent graph storage for memory, enabling relationship traversal, structural queries, and linking of decisions, code patterns, and PR history.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DecisionsSearch search for the architectural decision about authentication that was recorded last month"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
DecisionsSearch π
Hybrid Memory Server for AI Agents β an MCP server with persistent shared memory (Neo4j + Qdrant) and an autonomous CI/CD error investigator that finds root causes and proposes fixes.
π§π· Leia em PortuguΓͺs
What DecisionsSearch Is
AI coding agents forget everything the moment a session ends. The next session β yours or a teammate's β re-derives the same context, re-litigates the same decisions, and repeats mistakes the team already fixed once. CI/CD pipelines have the same blind spot: errors happen, get triaged manually, and the connection between "this error" and "the PR that caused it" is lost.
DecisionsSearch is a persistent, queryable memory layer that sits between your AI agents and a knowledge graph. It gives agents three things they don't have on their own:
Durable memory across sessions β decisions, business rules, code patterns, and PR history survive after the chat window closes. Neo4j stores the relationships (what implements what, what superseded what); Qdrant enables semantic search over all of it.
A structured vocabulary for "what's worth remembering" β not a raw transcript dump, but typed categories (business rule, architectural decision, code pattern, PR record, task episode) that stay useful months later.
Autonomous error investigation β point your CI/CD at DecisionsSearch's webhook, and it finds the suspect PRs, runs a coding agent to investigate root cause, and can open a fix PR on its own.
Related MCP server: Memory-MCP
When To Use It
You're running Claude Code (or another MCP-aware agent) on a codebase you touch repeatedly, and you're tired of re-explaining the same architecture and rules every session.
Multiple agents/developers work on the same codebase and need a shared source of truth for why things are the way they are, not just what the code does.
You want your CI/CD to do first-pass triage on errors before a human looks at them.
Don't use it for: a one-off script, a throwaway prototype, or as a replacement for your actual documentation/wiki β DecisionsSearch complements structured docs, it doesn't replace them (see .decisionssearch/ files below).
Quick Start
Prerequisites
Python >= 3.11
uv (recommended) or pip
Docker (for Neo4j + Qdrant in full mode)
Install
git clone https://github.com/Renzo-Tognella/DecisionsSearch.git
cd DecisionsSearch
uv syncConfigure
cp .env.example .env
cp config/decisionssearch.yaml.example config/decisionssearch.yamlEdit .env with your API keys and config/decisionssearch.yaml for your setup.
Run
Full mode (Neo4j + Qdrant, recommended β richer search, graph traversal):
# Start infrastructure
docker compose up -d
# Bootstrap vector collection (idempotent β safe to re-run)
uv run python -m scripts.bootstrap_qdrant
# Start server (HTTP + MCP on port 8000)
uv run decisionssearchThe current HTTP/MCP server uses the full composition and requires Neo4j +
Qdrant. The mode field is retained for configuration compatibility; setting
mode: light does not currently activate a JSONL-only server path. JSONL is
used for landing zone, snapshots and local operational state; the benchmark
has a separate explicit local backend.
Verify
# MCP endpoint responds (406 without proper MCP headers is expected β it means the route is alive)
curl http://localhost:8000/api/health # real health path lives under /api
curl http://localhost:8000/mcp/Connecting Your Agent
Local, stdio (simplest for personal use):
{
"mcpServers": {
"decisionssearch": {
"command": "uv",
"args": ["--directory", "/path/to/DecisionsSearch", "run", "decisionssearch-mcp"]
}
}
}Local or remote, HTTP (needed if the server already runs as a persistent process, e.g. via uv run decisionssearch):
{
"mcpServers": {
"decisionssearch": { "url": "http://localhost:8000/mcp" }
}
}Drop this into a project's .mcp.json (project-scoped) or your global MCP config. MCP servers are only picked up when a session starts β after adding or changing this config, open a new agent session in that project rather than expecting the tools to appear mid-session.
Project-scoped memory
For memory tools, project is optional. When omitted, DecisionsSearch uses the
name of the Git repository root (or the current folder for a non-Git workspace)
as the project partition. New memories receive that project value, and
memory.query/memory.find_duplicates filter Qdrant and Neo4j by it before the
hybrid ranking and RRF fusion. Set DECISIONSSEARCH_PROJECT when the server is
started outside the workspace or when a deployment needs an explicit partition.
This is a logical memory partition, not an authentication boundary. The resolution order is:
DECISIONSSEARCH_PROJECT, when configured;an explicit
projectargument, useful for imports and batch jobs;the Git repository root name;
the current folder name when no Git root exists.
Omitting project is the recommended agent workflow. The resolved value is
written with the memory and is passed to every retrieval branch. A query first
filters the project in the canonical ledger, Qdrant, and Neo4j, then performs
dense, sparse, and structural retrieval, RRF fusion, and optional reranking.
How memory works
DecisionsSearch does not treat a transcript, diff, or embedding as a memory by itself. A memory is durable, typed knowledge with a project, evidence, context, and a reason to remain useful after the current task.
workspace β project tag β raw event β sanitization β extraction
β admission gates β proposal/approval β canonical ledger
β outbox β Qdrant search projectionThe write path is deliberately selective:
memory.ingest_rawstores the sanitized source in the landing zone and asks the extractor for typed candidates;the admission chain requires a project and evidence, checks duplicates or refinements, validates category-specific context, and evaluates weight;
with the canonical ledger enabled, the agent creates a proposal with a before/after preview, field diff, evidence, and
preview_hash;an operator or trusted policy approves the proposal; the apply uses expected heads (CAS) and creates an immutable revision, head, lineage, and outbox event;
the materializer publishes the active head to Qdrant idempotently. Qdrant is a derived retrieval index, never the source of truth.
The canonical model separates identity from content: MemoryFamily is the
stable logical memory, MemoryRevision is an immutable version, and
MemoryHead points to the published version for a scope and branch. Evidence,
aliases, relations, validity windows, and audit events remain queryable. Updating
a title or summary therefore creates a new revision instead of silently erasing
history.
On reads, the resolved project is applied before candidate generation. Dense embeddings find semantic similarity, sparse retrieval preserves exact technical terms, and the graph contributes structural context. These ranked lists are combined by RRF; optional spreading activation, composite scoring, and reranking then refine the candidates. A high relevance score is a retrieval signal, not proof that a claim is true.
For the complete lifecycle, data model, project isolation, and operational
limits, see docs-public/relatorio_memoria.md,
ARCHITECTURE.md, and the public PDF
docs-public/relatorio_resultados.pdf.
Public documents
docs-public/instalacao.mdβ supported installation and operation;docs-public/relatorio_memoria.mdβ memory lifecycle and project partitioning;docs-public/relatorio_resultados.mdβ reproducible evidence and current limits;docs-public/relatorio_retrieve_navegacao.mdβ retrieve pipeline, query forms and node-to-node navigation;docs-public/relatorio_ingest_memoria.mdβ memory ingestion, admission, proposal, approval and projection lifecycle;docs-public/relatorio_metodologias_tecnicas.mdβ technical rationale, trade-offs and limits of the selected methods;docs-public/instalacao.pdfanddocs-public/relatorio_resultados.pdfβ visual PDF versions.
Using DecisionsSearch Day-to-Day: The Skills Suite
Connecting the MCP server gives your agent 40+ raw tools (memory.query, memory.pr.create, graph.project.create, ...) β powerful, but not something you want to call by hand every time. skills-memory/ ships a suite of 14 agent skills that wrap those tools into a workflow:
Step | Skill | What it does |
1. Setup (once per project) |
| Q&A about your business/domain β writes |
2. Historical onboarding |
| Inventory of user-authorized files, commits and PRs β triage by class, idempotent batch creation, verified links and resumable gaps |
3. End of every PR |
| One sweep of the PR/diff and explicitly indicated sources β detects what's worth remembering (rule? decision? pattern?) β creates the right memory nodes, with your confirmation, and links them; it does not scan the whole session automatically |
4. Anytime |
| "Have we done something like this before?" β semantic search across PRs, rules, decisions, patterns, and past task episodes |
4. Anytime |
| "How did this get here?" β walks the chain of PRs, decisions, and superseded versions for a rule, an architectural choice, or a file |
5. Periodically |
| Syncs |
Install with decisionssearch-init in a fresh project; the suite ships its own README, a canonical template every skill follows, and a golden-set test file per skill (plus a consolidated cross-skill routing test) β see skills-memory/README.md.
Usage Modes
Mode 1: Personal Memory (Local)
Run DecisionsSearch locally. Your AI agent connects via MCP stdio or HTTP (see above).
The local server uses the same full composition as the shared server. For a reproducible zero-infrastructure regression, use the benchmark's explicit local backend rather than treating JSONL as a canonical memory store.
# config/decisionssearch.yaml
mode: full
data_dir: dataFull mode (Neo4j + Qdrant) provides graph traversal and hybrid vector+structural queries.
Mode 2: Shared Team Memory (Server)
Deploy DecisionsSearch on a server. All team members' agents read/write to the same knowledge base.
# On your server
uv run decisionssearch --host 0.0.0.0 --port 8000Team members point their agents to the shared MCP endpoint:
{
"mcpServers": {
"decisionssearch": { "url": "https://your-domain.example/mcp" }
}
}Everyone's agent sessions contribute memories. The daily scan job automatically ingests GitHub PRs and cards, building a shared knowledge graph of the team's decisions, patterns, and architectural history.
Mode 3: Autonomous Error Investigator
Configure in config/decisionssearch.yaml:
agent:
provider: codex # opencode | codex | claude | zai | openrouter
timeout: 600
codex:
model: gpt-4o
api_key: ${OPENAI_API_KEY}
safety:
min_confidence: 0.7
max_auto_fixes_per_hour: 3
blocked_paths:
- auth/
- security/
- .env
notifications:
slack:
enabled: true
webhook_url: ${SLACK_WEBHOOK_URL}Point your CI/CD pipeline to send errors:
# GitHub Actions example
curl -X POST https://your-domain.example/api/webhook/errors \
-H "Content-Type: application/json" \
-H "X-Signature: $(echo -n "$body" | openssl dgst -sha256 -hmac "$WEBHOOK_SECRET")" \
-d '{
"error_type": "RuntimeError",
"error_message": "Null pointer in UserService",
"stack_trace": "at UserService.java:42\nat Controller.java:15",
"service": "api",
"environment": "production"
}'DecisionsSearch will:
Ingest the error and find which files are affected
Search for PRs that recently modified those files (suspects)
Run a coding agent to investigate root cause
If confidence is high enough, create a fix PR
Notify the team via Slack
Memory Categories
Every memory node has a category that determines what fields are required and enforced by admission gates before it's accepted into the graph:
Category | Created via | Required beyond the basics | Use it for |
|
|
| What a PR changed and why |
|
|
| Durable domain truth that outlives any single PR |
|
|
| A design choice, motivation, trade-offs, and rejected alternatives |
|
| evidence and durable context | A durable coding, structure, or interaction convention |
|
| evidence of reuse | A recurring design or interaction solution |
|
|
| A reusable implementation convention, with a concrete example |
|
|
| How a feature or workflow starts, behaves, and ends |
Episode |
|
| What was tried in a specific task and what happened β not a |
Procedure |
|
| A repeatable runbook for a type of task |
Relations between MemoryItems go through two distinct, validated APIs β don't mix them up:
PR β memory (
memory.pr.link_memory):IMPLEMENTS,EVIDENCES,MODIFIES.memory β memory (
memory.link):RELATED_TO,DEPENDS_ON,REFINES,DEPRECATES,CONFLICTS_WITH,EVOLVES_FROM.
Superseding a rule or decision is memory.deprecate(memory_id, replaced_by, rationale), not a manual link β it proposes (new)-[:DEPRECATES]->(old) and applies it only after operator approval.
MCP Tools
The server exposes 40+ MCP tools. Key categories:
Category | Tools | Description |
Memory |
| Core ingestion and retrieval; project defaults to the agent workspace folder |
Relations |
| Typed relationships between memories |
Context |
| Pre-task loading, post-task extraction, and post-commit verification |
PR Memory |
| PR-to-memory linking |
Catalog |
| Graph catalog management |
Episodic |
| Task outcome memories |
Procedural |
| Reusable procedures |
Errors |
| Error pipeline |
System |
| Scheduler control |
Admin |
| Maintenance |
Configuration Reference
All config in config/decisionssearch.yaml. Environment variables via ${VAR:default} syntax.
Variable | Default | Description |
|
|
|
|
| LLM provider: openai, zai, openrouter, gemini |
| β | Generic API key for all providers |
| inherits | Optional separate embedding provider, including openrouter |
| β | OpenRouter key for chat, embeddings, reranking, and the autonomous worker |
|
| Native OpenRouter reranker model |
|
| Restricts reranking to Zero Data Retention endpoints |
|
| Restricts OpenRouter embedding requests to ZDR endpoints |
|
| Canonical ledger adapter; |
|
| Explicitly enables MCP approval/rejection/apply tools |
| unset | Optional project partition override when the process is outside the workspace |
|
| Neo4j connection |
| β | Neo4j password |
|
| Qdrant host |
|
| Qdrant port |
|
| Enables BM25 sparse retrieval alongside dense vectors on a compatible collection |
|
| none, cohere, jina, cross-encoder, openrouter, openai |
See config/decisionssearch.yaml.example for the complete reference with all options.
Architecture
Application code lives directly under src/ (src/domain, src/application,
src/infrastructure, src/interfaces, and src/bootstrap). Packaging maps
that physical layout to the stable public namespace decisionssearch.*.
See ARCHITECTURE.md for detailed technical documentation with diagrams covering:
Memory ingestion pipeline (5-gate admission)
Project resolution and project-first filtering
Canonical ledger, approval, revision, and outbox lifecycle
Hybrid search pipeline (RRF fusion + spreading activation)
Error investigation flow (agent worker + safety gates)
Graph data model
Deployment topologies
See LIMITATIONS.md for the current implementation gaps, their evidence, and the proposed path to resolve them.
Post-commit memory capture
The versioned .githooks/post-commit hook collects HEAD, changed files, the
open PR for the current branch (when gh is available), and the session from
DECISIONSSEARCH_SESSION_FILE or .decisionssearch/session.md. It sends that context to the
LLM with an explicit instruction to check for durable knowledge before creating
memory. no_memory is a valid result, so trivial changes are not forced into
memory. Accepted candidates pass the admission gates and capture is idempotent
per commit + PR + session.
Install it once from the repository root:
uv run python -m scripts.install_git_hooksThe hook runs in the background and is fail-open, so an OpenRouter, GitHub, Qdrant, or Neo4j failure never blocks a commit. To test synchronously:
DECISIONSSEARCH_COMMIT_MEMORY_HOOK_SYNC=1 \
DECISIONSSEARCH_SESSION_FILE=.decisionssearch/session.md \
git commit -m "my change"Agents that already have the context can call memory.capture_commit with
session_context, commit_sha, and the PR metadata. For diagnostics, run
uv run python -m scripts.post_commit_memory_hook --repo . --dry-run.
The hook itself is intentionally non-interactive: it runs in the background and
cannot ask a person a question. Agents that should ask before writing can load
the project rule in AGENTS.md: call memory.capture_commit with
dry_run: true, show the candidates, and persist only after an explicit
affirmative answer. An opened PR is a remote event, so a local Git hook can only
inspect it after the branch has a PR; use the agent rule or a GitHub webhook/CI
job for an event-driven PR check.
Development
# Install dev dependencies
uv sync --group dev
# Run tests
uv run pytest tests/ -q --ignore=tests/e2e
# Lint
uv run ruff check .
# E2E tests (requires running infrastructure)
RUN_E2E=1 uv run pytest tests/e2e -qLicense
MIT
Available Tools
47 toolserrors.get_investigationC
Recupera detalhes da investigaΓ§Γ£o de um erro.
Inputs: error_id (required).
errors.ingestB
Ingesta um erro e dispara pipeline de investigaΓ§Γ£o automaticamente.
Inputs: error_type (required), error_message (required), service, environment, +1 more.
errors.listB
Lista erros ingeridos, opcionalmente filtrando por service ou error_type.
Inputs: limit, service, error_type. Returns: result
graph.catalog.export_csvC
Exporta catΓ‘logo do grafo como bundle CSV.
Inputs: no named parameters.
graph.catalog.import_csvC
Importa catΓ‘logo do grafo a partir de bundle CSV.
Inputs: schema_version (required), domains_csv, projects_csv, relations_csv, +1 more.
graph.category.createC
Cria uma nova categoria no catΓ‘logo do grafo.
Inputs: name (required), slug (required), project_id (required), tags, +3 more.
graph.category.updateC
Atualiza dados de uma categoria existente no catΓ‘logo.
Inputs: id (required), name (required), slug (required), project_id (required), +4 more.
graph.domain.createC
Cria um novo domΓnio no catΓ‘logo do grafo.
Inputs: name (required), slug (required), project_id (required), tags, +3 more.
graph.domain.updateC
Atualiza dados de um domΓnio existente no catΓ‘logo.
Inputs: id (required), name (required), slug (required), project_id (required), +4 more.
graph.project.createC
Cria um novo projeto no catΓ‘logo do grafo.
Inputs: name (required), slug (required), tags, status, +2 more.
graph.project.listA
Lista todos os projetos do catΓ‘logo.
Inputs: no named parameters. Returns: result
graph.project.updateC
Atualiza dados de um projeto existente no catΓ‘logo.
Inputs: id (required), name (required), slug (required), tags, +3 more.
graph.relation.createC
Cria relaΓ§Γ£o entre dois nΓ³s do catΓ‘logo do grafo.
Inputs: source_id (required), target_id (required), source_kind (required), target_kind (required), +2 more.
graph.relation.deleteC
Remove relaΓ§Γ£o entre dois nΓ³s do catΓ‘logo do grafo.
Inputs: source_id (required), target_id (required), source_kind (required), target_kind (required), +1 more.
memory.capture_commitA
Verifica memΓ³ria durΓ‘vel a partir da sessΓ£o e do commit/PR atual.
Use depois de concluir um commit ou PR quando houver contexto da sessΓ£o
para explicar intenΓ§Γ£o e impacto. O LLM pode retornar no_memory;
essa resposta Γ© correta e nΓ£o cria candidato. O resultado ainda passa
pelos gates de admissΓ£o e, em dry_run, apenas mostra propostas.
O hook nunca deve ser usado para bloquear o commit.
Inputs: commit_sha (required), diff, branch, dry_run, +16 more.
memory.change.getC
ObtΓ©m exatamente o preview que serΓ‘ aprovado.
Inputs: proposal_id (required).
memory.change.proposeC
Cria um preview server-side; nΓ£o grava uma memΓ³ria ativa.
Inputs: title (required), summary (required), category (required), reason, +4 more.
memory.change.rollbackC
Cria proposta de rollback; nunca reativa a revisΓ£o histΓ³rica diretamente.
Inputs: reason (required), family_id (required), restore_revision_id (required), expected_revision_id (required).
memory.consolidateD
Dispara consolidaΓ§Γ£o imediata ou diferida.
Inputs: mode, scope.
memory.contextA
Monta um PACOTE de contexto (regras/padrΓ΅es/decisΓ΅es) ANTES de comeΓ§ar uma task.
Use when: vai iniciar um trabalho num projeto/domΓnio e quer o conhecimento relevante prΓ©-carregado de uma vez. Do NOT use for: responder 1 pergunta pontual (memory.query); destilar pΓ³s-task (memory.reflect). Example: memory.context(project='ExampleProject', domain='cache').
Inputs: domain, project.
memory.deprecateD
Depreca memΓ³ria e opcionalmente liga DEPRECATES para substituta.
Inputs: memory_id (required), rationale, replaced_by.
memory.episode.createA
Registra um EPISΓDIO: o que foi feito numa task especΓfica e o resultado.
Use when: capturar um acontecimento ΓΊnico (o que tentei, deu certo/errado, liΓ§Γ΅es). Do NOT use for: conhecimento atemporal/regra (memory.upsert); passo-a-passo reutilizΓ‘vel (memory.procedure.create). Example: memory.episode.create( project='CORE', task_description='Migrei PLD', outcome='completed', lessons=['...']).
Inputs: task_description (required), tags, lessons, outcome, +4 more.
memory.episode.queryC
Consulta memΓ³rias episΓ³dicas por projeto, outcome ou tag.
Inputs: tag, limit, outcome, project. Returns: result
memory.feedbackC
Registra feedback de uso para telemetria.
Inputs: score (required), memory_id (required), accepted.
memory.find_duplicatesA
Lista memΓ³rias similares (>= threshold). Chame ANTES de criar p/ evitar duplicatas.
text = tΓtulo + summary da memΓ³ria que vocΓͺ pretende criar. Use o resultado para decidir entre criar nova (memory.upsert/memory.manual.create) ou refinar uma existente (search-before-write, S3). Default 0.85 calibrado para o MiniLM local (cosine fica ~0.86 em quase-idΓͺnticos); suba para ~0.92 com embeddings maiores. Omit project to use the agent workspace folder.
Inputs: text (required), type, project, threshold, +2 more. Returns: result
memory.getA
Recupera UMA memΓ³ria pelo memory_id exato (lookup direto, sem busca).
Use when: vocΓͺ jΓ‘ tem o memory_id (veio de memory.query/find_duplicates) e quer o registro completo. Do NOT use for: busca por tema (memory.query). Example: memory.get(memory_id='c3f814b1babebd35').
Inputs: memory_id (required).
memory.ingest_rawA
Ingere texto CRU e deixa o pipeline extrair/classificar/persistir sozinho.
Use when: vocΓͺ tem um blob nΓ£o-estruturado (log, mensagem, doc) e quer que o sistema decida o que virar memΓ³ria. Do NOT use for: conteΓΊdo jΓ‘ estruturado que vocΓͺ sabe classificar (memory.upsert/memory.manual.create). Mais caro (LLM de extraΓ§Γ£o). Example: memory.ingest_raw(source_kind='slack', payload='', project_hint='CORE'). Omit project_hint to derive the project from the agent workspace folder.
Inputs: payload (required), source_kind (required), domain_hint, project_hint.
memory.linkC
Cria relaΓ§Γ£o semΓ’ntica entre duas memΓ³rias.
Inputs: rel (required), to_id (required), from_id (required).
memory.linked_prsC
Lista PRs linkados a um MemoryItem.
Inputs: memory_id (required). Returns: result
memory.list_raw_eventsC
Lista eventos da landing zone para inspeΓ§Γ£o.
Inputs: limit. Returns: result
memory.manual.createA
Cria memΓ³ria estruturada com categoria explΓcita (DesignRule, BusinessRule, ArchitecturalDecision, DesignPattern).
Use when: o usuΓ‘rio dΓ‘ uma regra/decisΓ£o/padrΓ£o jΓ‘ classificΓ‘vel e vocΓͺ sabe a categoria. Do NOT use for: salvar rΓ‘pido sem categoria (memory.upsert); PR (memory.pr.create); passo-a-passo (memory.procedure.create); evento (memory.episode.create). ArchitecturalDecision exige alternatives_considered. Example: memory.manual.create(project='ExampleProject', category='DesignRule', title='Cache key', summary='pj:cache:{tenant}:{entity}'). Omit project to derive it from the agent workspace folder.
Inputs: title (required), summary (required), category (required), domain, +13 more.
memory.pr.createA
Cria memΓ³ria a partir de um Pull Request (PR + work item linkados).
Use when: persistir o que um PR mudou e por quΓͺ; ligar PR a work item. Do NOT use for: regra/decisΓ£o genΓ©rica (memory.upsert); evento sem PR (memory.episode.create). pr_url e work_item_url sΓ£o obrigatΓ³rios. Example: memory.pr.create(project='DecisionsSearch', repo='org/repo', pr_number=42, title='Add HyDE', summary='...', changed_files=[...], pr_url='...', work_item_url='...').
Inputs: repo (required), title (required), pr_url (required), summary (required), +14 more.
memory.pr.linked_memoriesC
Lista MemoryItems linkados a um PR.
Inputs: pr_memory_id (required). Returns: result
memory.pr.link_memoryB
Liga um PRMemory a um MemoryItem (IMPLEMENTS, EVIDENCES, MODIFIES).
Inputs: memory_id (required), pr_memory_id (required), rationale, relation_type.
memory.procedure.createA
Cria um PROCEDIMENTO reutilizΓ‘vel (passo-a-passo) para um tipo de tarefa.
Use when: o conhecimento Γ© uma sequΓͺncia de passos repetΓvel (runbook, how-to). Do NOT use for: regra/fato estΓ‘tico (memory.upsert); registro de um evento ΓΊnico (memory.episode.create). Example: memory.procedure.create(project='CORE', task_type='deploy', steps=['build', 'migrate', 'rollout']).
Inputs: steps (required), task_type (required), tags, project, +2 more.
memory.procedure.queryC
Consulta procedimentos armazenados por tipo de tarefa.
Inputs: limit, project, task_type. Returns: result
memory.pr.queryC
Consulta memΓ³rias de PR por projeto, repo ou arquivo alterado.
Inputs: repo, limit, project, pr_number, +2 more. Returns: result
memory.queryA
Busca semΓ’ntica + grafo de memΓ³rias de um projeto (o jeito padrΓ£o de RECUPERAR).
Use when: responder "como/por que/qual" sobre um projeto; recuperar regras, decisΓ΅es e padrΓ΅es. Do NOT use for: pegar 1 memΓ³ria por id (memory.get); ponto no tempo (memory.query_at); montar pacote de contexto pra uma task (memory.context). hyde=True forΓ§a expansΓ£o HyDE (queries curtas/vagas; +1 LLM call). Omit project to query only the project resolved from the agent workspace folder.
Inputs: hyde, type, top_k, project, +4 more. Returns: result
memory.query_atA
Consulta memΓ³rias que estavam ATIVAS num instante passado (bitemporal, ISO 8601).
Use when: auditoria / "o que valia em "; reconstruir estado histΓ³rico. Do NOT use for: estado atual (memory.query). Example: memory.query_at(project='CORE', point_in_time='2026-01-01T00:00:00Z').
Inputs: point_in_time (required), limit, project, category, +2 more. Returns: result
memory.reconcileC
Verifica consistΓͺncia entre Neo4j e Qdrant e remove vetores Γ³rfΓ£os.
Inputs: project.
memory.reflectA
Extrai conhecimento de uma task CONCLUΓDA e persiste (loop de pΓ³s-task).
Use when: terminou um trabalho e quer destilar o que foi aprendido em memΓ³ria durΓ‘vel. Do NOT use for: RECUPERAR conhecimento (memory.query); prΓ©-task (memory.context). outcome: 'completed' | 'failed' | 'partial'. Example: memory.reflect(task_description='Implementei HyDE opt-in', changes='...', project='DecisionsSearch').
Inputs: changes (required), task_description (required), outcome, project.
memory.set_weightC
Define peso manual de uma memΓ³ria e recalcula peso efetivo.
Inputs: memory_id (required), rationale (required), weight_manual (required).
memory.upsertA
Cria/atualiza memΓ³ria canΓ΄nica de forma idempotente (o jeito padrΓ£o de SALVAR).
Use when: persistir rΓ‘pido uma regra/decisΓ£o/fato tΓ©cnico; o admission decide create vs refine. Do NOT use for: PR (memory.pr.create); passo-a-passo (memory.procedure.create); evento ΓΊnico (memory.episode.create); texto cru pra extraΓ§Γ£o (memory.ingest_raw). Chame memory.find_duplicates ANTES p/ evitar duplicata. Example: memory.upsert(project='ExampleProject', category='DesignRule', title='Cache key', summary='pj:cache:{tenant}:{entity}'). Omit project to derive it from the agent workspace folder.
Inputs: title (required), summary (required), category (required), domain, +3 more.
system.jobs.historyC
Historico de execucoes de um job.
Inputs: job_name (required), limit. Returns: result
system.jobs.listB
Lista jobs agendados (consolidaΓ§Γ£o, summary, etc.).
Inputs: no named parameters. Returns: result
system.jobs.runC
Executa um job agendado imediatamente.
Inputs: job_name (required).
system.scan.fullB
Full scan of all PRs from configured GitHub repos + Shortcut cards. Imports everything, not just recent.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 47 tools
Tools are grouped by prefix (memory, graph, errors, system) with detailed descriptions including 'Do NOT use for' clauses, which greatly aids disambiguation. However, the sheer number of tools (47) and some overlapping concepts (e.g., multiple ways to create memories) mean careful reading is still required, so a perfect score is not warranted.
All tools follow a consistent hierarchical dot notation (prefix.group.action) with imperative verbs and snake_case naming. There is no mixing of conventions, and the pattern is predictable across all 47 tools.
47 tools is on the high side for a single server, potentially overwhelming for an agent. While the domain is complex and each tool appears justified, the count exceeds the typical sweet spot of 3-15 tools. The server would benefit from consolidation or better organization to reduce cognitive load.
The tool set covers a wide range of operations: CRUD for memories, graph catalog management, error handling, system jobs, and PR integration. Notable gaps include missing delete operations for projects and categories (only update exists), but the overall surface is comprehensive and supports the stated purpose.
Related MCP Connectors
Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.
Persistent memory for AI agents. EU-hosted, privacy-first, hybrid recall, contradiction detection.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Persistent memory for AI agents. Search, store, and recall across sessions.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables AI agents to store, retrieve, and connect information in a Neo4j graph database as persistent memory, with semantic relationships, natural language search, and temporal tracking across conversations.9438 npm67MIT
- AlicenseAqualityDmaintenanceProvides persistent memory for AI agents using hybrid search (vector embeddings + BM25) with neural reranking, enabling storage and retrieval of insights, debugging solutions, and patterns across coding sessions.8MIT
- AlicenseNot gradedqualityDmaintenanceProvides AI coding agents with persistent, graph-connected memory across projects, enabling cross-project context retrieval via synaptic connections and hybrid search.3 npm8MIT
- AlicenseNot gradedqualityBmaintenanceProvides persistent, searchable memory and knowledge capture for AI-assisted development, enabling agents to retain decisions, bugs, and patterns across sessions and projects.71 PyPIMIT