Continuum
Continuum is a local-first persistent memory and git/context server for AI agents — it stores memories in local SQLite, retrieves them, manages projects, and exposes read-only git info.
Memory CRUD: save (
memory_save), search (memory_search, lexical/FTS), fetch by id (memory_get), update (memory_update), delete with confirm (memory_delete), list recent (memory_recent)Project management: list (
project_list), register a local path (project_register), get by id (project_get), assemble context with git status + recent memories (project_context)Read-only git inspection:
git_status(with protected-branch detection),git_diff(staged/unstaged, truncated if large),git_log,branch_listMemory metadata: types (DECISION/FACT/etc.), scope, confidence, importance, summary, source, project association
Safety: destructive delete requires
confirm=true; git operations are read-only (no push/force-push exposed)No cloud/telemetry: all data stays in local
~/.continuumSQLite; embeddings via optional local Ollama
Provides read-only tools for interacting with local Git repositories, including checking status and protected branch, viewing diffs (truncated), listing recent commits, and listing local branches.
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., "@Continuumremember that we decided to use SQLite for local memory"
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.
Continuum
OS de engenharia com IA, local-first — memória persistente para agentes via MCP.
One memory. Every agent. Continuous engineering.
English summary · Privacidade · Licença MIT
O que é
O Continuum guarda decisões, contexto de projeto e estado útil para agentes de IA (Cursor e outros) num banco SQLite local. Expõe:
CLI
continuum(init, doctor, projetos, memória, git read-only)Servidor MCP stdio para o agente chamar ferramentas de memória e git
Tudo roda na sua máquina. Sem cloud Continuum, sem telemetria.
Related MCP server: AgentMemory Offline
Local-first e privacidade
Sem banco na nuvem — dados em
~/.continuum/(override:CONTINUUM_HOME)Zero telemetria — o Continuum não phone-home
Offline por padrão — nada sai da máquina sem ação explícita sua
Cursor / LLM — o modelo e a conta do Cursor (ou outro host) são separados do Continuum; o Continuum só oferece ferramentas MCP locais
Detalhes: PRIVACY.md.
~/.continuum/
config.toml
continuum.db
logs/
cache/
backups/Estado do projeto
Já funciona (MVP + roadmap A–G + polish):
SQLite local + CRUD de memória + busca lexical (FTS5)
Embeddings locais via Ollama + vector store SQLite (BLOB) + busca híbrida
Indexador de repositório (
continuum index/continuum project index)Context assembler (
project_contextcom seções compactas)Knowledge graph em SQLite (entities / relationships) + CLI/MCP + UI com filtros
Política de branch/commit (Conventional Commits, quality gates; sem force push)
GitHub PRs (token via
GITHUB_TOKEN/ keyring; merge só com--approve)Handoff de sessão + auto-detect DECISION/CONSTRAINT + supersede em conflito
Explorer web (
apps/webVue+Vite +continuum serveem:8787)App desktop Windows (
continuum desktop/ atalho com ícone)Projetos + CLI e MCP stdio + logging JSON local
Adiado: Neo4j, sync multi-dispositivo (ver abaixo), merge automático em main.
Publicação PyPI está preparada (uv build / uv publish) e exige token.
Requisitos
Python 3.12+
uv (desenvolvimento / clone)
Git no
PATH(ferramentas git)
Instalação
Usuário final (quando publicado no PyPI)
pip install continuum
# ou
uv tool install continuumDepois o comando continuum fica no PATH.
Desenvolvimento / clone (agora)
git clone https://github.com/matheusxdev/continuum.git
cd continuum
uv sync --extra devInstalação editável a partir do git (sem clonar manualmente):
uv pip install "git+https://github.com/matheusxdev/continuum.git"
# ou
pip install "git+https://github.com/matheusxdev/continuum.git"Embeddings com Ollama (recomendado)
Instale e inicie o Ollama.
Puxe um modelo de embedding:
ollama pull nomic-embed-textEm
~/.continuum/config.toml:
embedding_provider = "ollama"
embedding_model = "nomic-embed-text"
ollama_base_url = "http://127.0.0.1:11434"Confirme:
continuum doctor(Ollama + Embedding model OK).memory_savepassa a gerar embeddings;memory search --mode hybrid|semanticusa o vetor. Se o Ollama estiver offline, a busca degrada para lexical sem falhar.
Quick start
uv run continuum init
uv run continuum doctor
uv run continuum project add .
uv run continuum memory save "Decidimos continuar com Vue + Vite" --type DECISION
uv run continuum memory search "Vue"
uv run continuum index
uv run continuum git status
uv run continuum project contextCom o pacote já no PATH (pip install / uv tool install):
continuum init
continuum doctor
continuum project add .
continuum mcpCursor — configuração MCP
Recomendado (pacote instalado no PATH)
{
"mcpServers": {
"continuum": {
"command": "continuum",
"args": ["mcp"]
}
}
}Desenvolvimento com uv (caminho do clone)
Substitua o diretório pelo caminho absoluto do repositório na sua máquina:
Windows
{
"mcpServers": {
"continuum": {
"command": "uv",
"args": ["run", "--directory", "C:/path/to/continuum", "continuum", "mcp"]
}
}
}macOS / Linux
{
"mcpServers": {
"continuum": {
"command": "uv",
"args": ["run", "--directory", "/path/to/continuum", "continuum", "mcp"]
}
}
}Há um exemplo em .cursor/mcp.json no repositório (forma PATH).
Ferramentas MCP
Tool | Modo | Descrição |
| mutating | Persistir memória |
| read-only | Busca híbrida (lexical + semântica) |
| read-only | Só vetor (Ollama) |
| — | CRUD |
| mutating | Marcar memória como SUPERSEDED |
| — | Projetos + contexto em seções |
| — | Git seguro (sem force push) |
| read-only | Knowledge graph |
| mutating | GitHub PRs (merge exige |
| read-only | Resumo de handoff |
Explorer web (mínimo)
cd apps/web && npm install && npm run build
uv run continuum serve # http://127.0.0.1:8787
# ou só o front em dev:
cd apps/web && npm run dev # proxy /api → :8787App desktop (Windows)
Janela dedicada (WebView2) com a mesma UI de http://127.0.0.1:8787 — sem depender de uma aba do navegador, e pode ir para a barra de tarefas.
# 1) Build da UI (se ainda não tiver apps/web/dist)
cd apps/web; npm install; npm run build; cd ../..
# 2) Dependência pywebview + abrir
uv sync --extra desktop
uv run continuum desktop
# ou:
.\scripts\continuum-desktop.ps1O comando sobe continuum serve em segundo plano só se a porta 8787 estiver livre. Ao fechar a janela, encerra apenas o servidor que ele mesmo iniciou.
Fixar na barra de tarefas
# Gera assets/continuum.ico (se faltar) e cria Continuum.lnk na Área de trabalho
.\scripts\continuum-desktop.ps1 -InstallShortcut
# Também no Menu Iniciar:
.\scripts\continuum-desktop.ps1 -InstallShortcut -StartMenuAlsoDepois abra o atalho uma vez e, na barra de tarefas, botão direito → Fixar na barra de tarefas.
Ícone: assets/continuum.ico.
Requisito: WebView2 Runtime (já presente na maioria dos Windows 10/11).
Indexar repositório
Indexa README / markdown / código (respeita denylist: .env, node_modules, .git, secrets), grava chunks como memórias PROJECT_CONTEXT e gera embeddings quando Ollama está ativo. Incremental por hash.
uv run continuum index
uv run continuum project index
uv run continuum index --force # reindexar tudoSync multi-dispositivo (adiado)
Sync entre máquinas não entra no escopo atual: quebraria o modelo local-first (sem cloud Continuum, sem telemetria). Continuidade entre PCs fica para um desenho futuro explícito (export/import opt-in ou sync peer-to-peer), nunca automático. Use backup de ~/.continuum/ se precisar mover dados.
Layout do código
src/continuum/
apps/cli/ CLI (Typer)
apps/mcp/ MCP stdio
apps/desktop/ Shell pywebview (Windows)
apps/webapi/ API local do explorer
core/memory/ Memória + hybrid search
core/embeddings/ Ollama / null providers
core/vector/ SQLite BLOB vector store
core/graph/ Knowledge graph
core/context/ Context assembler
core/indexer/ Repository indexer
core/git/ Git + commit policy + quality gates
core/github/ GitHub PRs
core/handoff/ Handoff + auto-type + supersede
database/ Schema + migrations
config/ Paths, settings, logging
apps/web/ Vue + Vite explorer
assets/ continuum.ico
scripts/ Launchers (desktop.ps1 / .bat / generate_ico)
docs/ ADRsTestes e build
uv sync --extra dev
uv run pytest
uv buildArtefatos em dist/ (wheel + sdist).
Publicar no PyPI (quando tiver token)
Não publique sem UV_PUBLISH_TOKEN / credenciais configuradas.
uv build
uv publishAlternativa com Twine:
uv build
uv run twine upload dist/*Crie um token em https://pypi.org/manage/account/token/ e use TestPyPI primeiro se preferir:
uv publish --publish-url https://test.pypi.org/legacy/Spec / roadmap
CONTINUUM_SPEC.md — especificação original
CONTINUUM_COMPLETA.md — visão completa / roadmap
English summary
Continuum is a local-first AI Engineering OS: persistent agent memory over local SQLite (~/.continuum), with a Typer CLI and MCP stdio server for Cursor and other hosts. No Continuum cloud DB, no telemetry. The Cursor/LLM provider is separate from Continuum itself.
Install (when on PyPI): pip install continuum
Dev now: git clone → uv sync --extra dev → uv run continuum init
See PRIVACY.md for privacy guarantees. MIT licensed.
Available Tools
14 toolsbranch_listBRead-onlyIdempotent
List local git branches and mark protected ones.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful behavioral detail that protected branches are flagged in the output, but it never explains what 'protected' means or whether the marking depends on configuration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero waste; the verb and resource come first and the extra output detail follows immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the operation is simple. However, the lone parameter is undocumented and there is no guidance on repository context, leaving gaps an agent must guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: the single 'path' parameter has only a title and a null default, with no explanation. The description does not compensate at all — it never clarifies that 'path' selects the repository directory, leaving the one parameter effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List local git branches') plus an output behavior ('mark protected ones'), which distinguishes it from git_status, git_diff, and git_log. It does not explicitly name a sibling or scope boundary, so it falls just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives such as git_status or git_log. The agent must infer from the name alone that this is the branch-enumeration tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_diffARead-onlyIdempotent
Git diff (unstaged by default; set staged=true for index). Large diffs are truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| staged | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered. The description adds a genuinely useful behavioral trait the annotations cannot convey: 'Large diffs are truncated,' which warns the agent that output may be incomplete and should be scoped with path. No auth or rate-limit context, but truncation disclosure is meaningful added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the default-mode scoping front-loaded and the truncation caveat last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers default mode, the staged variant, and the truncation risk, which is nearly everything an agent needs — the only real gap is any explanation of the `path` parameter's purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must carry parameter meaning. It explains `staged` well (default false, true selects the index), but says nothing about `path`, leaving half of the parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific tool and resource (git diff) plus its default operating mode, which lets an agent distinguish it from git_status/git_log without reading the schema. However, it never explicitly contrasts itself with those siblings, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'unstaged by default; set staged=true for index' gives a clear condition for choosing each mode, which is real usage guidance. It offers no exclusions or named alternatives (e.g., when to prefer git_status or git_log instead), so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_logCRead-onlyIdempotent
Recent commit log.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds only the vague scope word 'recent' and discloses nothing about pagination, default limits, or output shape that would go beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single three-word phrase, which is front-loaded but under-specified rather than concise. It omits necessary information for an agent to determine scope and parameter usage, so the brevity does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple git log tool, the description omits essential context about the path and limit parameters and when to use this versus related git tools. Annotations and an output schema cover safety and return values, but the remaining gaps leave the definition incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for two undocumented parameters (path, limit), but it says nothing about either. The word 'recent' loosely hints at a limit, but there is no useful semantics regarding what path means or how limit is applied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear resource (commit log) and a scope (recent), so an agent can tell this returns recent commits. It does not differentiate itself from sibling git tools like git_status or git_diff, which is why it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool instead of alternatives such as git_status or git_diff. The implied use case is viewing commit history, but no conditions or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_statusBRead-onlyIdempotent
Git status with protected-branch detection (main/master/production).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the protected-branch detection behavior, but is ambiguous about what that means in practice — does it merely report or does it warn/block? That ambiguity is worth noting for an agent interpreting output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the core purpose front-loaded and no padding. It is appropriately sized, though the brevity comes at the cost of usage context rather than being efficiently informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and annotations cover the safety profile. However, the undocumented path parameter and the vague protected-branch behavior leave real gaps for an agent calling this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (path) with 0% schema description coverage, and the description says nothing about it — whether it is a repo directory, a file filter, or relative to cwd. The description fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Git status') plus the distinguishing feature (protected-branch detection), which separates it from siblings git_diff and git_log. It is clear what the tool reports, though it doesn't explicitly contrast itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites (e.g., must be in a git repo), and no indication of when to prefer git_diff, git_log, or branch_list instead. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_deleteADestructiveIdempotent
Delete a memory. Requires confirm=true (high-risk).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: a confirm=true gate that is not encoded as a required parameter in the schema, telling the agent a second flag must be set for this high-risk action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the gating requirement. Nothing is wasted and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the annotations carry the safety profile. The description supplies the key missing operational detail (confirm gate). Only minor gaps remain, such as what happens if confirm is omitted or false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and only titles are present, so the description must compensate. It usefully explains the confirm flag (must be true, because high-risk), but says nothing about memory_id beyond what the name implies, leaving half the parameters essentially undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (a memory), which clearly distinguishes it from siblings like memory_save, memory_update, and memory_search. No explicit sibling contrast, but the operation is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete prerequisite ('Requires confirm=true') and flags the operation as high-risk, which implies when it should be used. It does not, however, contrast with alternatives (e.g., memory_update for editing) or state when deletion is inappropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_getCRead-onlyIdempotent
Get a memory by id.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond this – no note on what happens if the id is missing, no error behavior, no return context. With an output schema present, return format is partially covered, but the description still contributes little.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence that is front-loaded and waste-free. Appropriate for a simple lookup tool, though it could include a bit more without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema and strong annotations, the description is minimally adequate. However, it lacks any guidance on error behavior (e.g., invalid id) or how the id is obtained, leaving gaps that an agent might need to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should ideally clarify the memory_id format or source. It merely says 'by id' without explaining whether the id comes from memory_save or memory_search, so it adds minimal value over the schema's bare type declaration. Baseline 3 given one required param and output schema, but opportunity missed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (get) and resource (memory) with the lookup key (id), distinguishing it from memory_save/update/delete/search/recent. It does not explicitly name how it differs from sibling tools, keeping it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of alternatives like memory_search for retrieval by query, and no prerequisites. The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_recentBRead-onlyIdempotent
List recent memories for the current or given project.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| project_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered without the description. The description adds one genuinely useful behavior: omitting project_id falls back to the current project. It says nothing about ordering, limit behavior, or how many results come back, but with annotations in place a 3 is fair.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the resource is front-loaded. It is efficient, though bordering on under-specified rather than truly economical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for a listing tool with an undocumented limit parameter and no statement of ordering or default result count, the description leaves the agent guessing on operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It partially does so for project_id by implying 'current project' as the default, but the limit parameter (default 10) is never mentioned or explained, leaving half the inputs undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (recent memories) with the scope qualifier 'current or given project'. That is enough for an agent to tell it apart from memory_search or memory_get conceptually, but it never names or contrasts those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool instead of memory_search, nor any prerequisite or exclusion. The word 'recent' hints at a time-ordered browse, but the choice between this and search is left entirely to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_saveC
Save a persistent memory (decision, fact, preference, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | PROJECT | |
| source | No | mcp | |
| content | Yes | ||
| summary | No | ||
| confidence | No | ||
| importance | No | ||
| project_id | No | ||
| memory_type | No | FACT |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, non-destructive write. The description adds one genuine piece of context beyond that: the memory is 'persistent', implying durability across sessions. It says nothing about what persistence means operationally, whether repeated saves duplicate, or where the record lands, so it is only a modest addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler or redundancy. It is efficient, though its brevity is part of why the surrounding semantics are missing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An 8-parameter mutation tool with 0% schema coverage needs far more than one line. The presence of an output schema relieves it of explaining return values, but the storage semantics, parameter meanings, and save-vs-update routing are all absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 8 parameters, so the description must carry the load. The enumeration 'decision, fact, preference' loosely maps to the content/memory_type fields, but scope, source, summary, confidence, importance, and project_id are completely unexplained in either the schema or the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save a persistent memory') and enumerates the kinds of content it stores (decision, fact, preference). It is distinguishable from memory_search/memory_get/memory_delete by verb, though it never explicitly contrasts itself with memory_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given. With a sibling named memory_update, the key ambiguity for an agent — whether to save a new memory or update an existing one, and how duplicates are handled — is left entirely unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchBRead-onlyIdempotent
Search memories with lexical/FTS retrieval.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| project_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds one genuinely useful behavioral fact — retrieval is lexical/FTS, i.e. keyword matching rather than semantic similarity — but says nothing about ranking, result count defaults, or project scoping.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler, which is efficient and easy to parse. It is arguably too terse for its job, but the brevity itself is not the problem.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. However, for a 3-parameter search tool with 0% schema coverage, the description omits pagination/limit semantics and project scoping, leaving the agent to guess how to narrow results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 3 parameters, so the description must compensate and largely does not. The 'lexical/FTS' phrase hints that the query string is a keyword expression rather than natural language, but limit (default 10) and project_id (nullable scoping filter) are entirely undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search), resource (memories), and retrieval method (lexical/FTS), so the agent knows this is keyword search rather than semantic lookup. It does not, however, distinguish itself from sibling memory_recent or explain how it differs from memory_get, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no statement of prerequisites, and no reference to alternatives such as memory_recent or memory_get. The agent must infer from the name alone that this is the keyword-search path versus those siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_updateB
Update fields of an existing memory.
| Name | Required | Description | Default |
|---|---|---|---|
| content | No | ||
| summary | No | ||
| memory_id | Yes | ||
| confidence | No | ||
| importance | No | ||
| memory_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the agent knows this is a non-destructive update. The description does not add behavioral context such as whether omitted fields remain unchanged, whether the update is partial or full replacement, or what happens to confidence/importance defaults. It only minimally restates the mutation nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It is appropriately sized for a simple update tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, zero schema description coverage, and no output schema reference in the description, the definition is incomplete. It should clarify which fields are optional, how partial updates behave, and any constraints on values (e.g., memory_type options or confidence range), none of which are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain any parameter semantics. It mentions 'fields' but never enumerates or clarifies the six parameters (content, summary, confidence, importance, memory_type, memory_id). With no schema-level descriptions and no compensating text, the agent is left to infer parameter meaning from names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb+resource: 'Update fields of an existing memory.' It distinguishes itself from memory_save (create) and memory_get (read). However, it is generic as to which fields may be updated, so the purpose is clear but not fully specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus siblings such as memory_save or memory_delete, nor any prerequisites or exclusions. The agent must infer that this should be used only for modifying an existing memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_contextCRead-onlyIdempotent
Return registered project context, git status, and recent memories.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| project_id | No | ||
| recent_limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the useful fact that three distinct data sources are combined into one response, but says nothing about selector precedence (path vs project_id) or behavior when neither is supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler, but it is under-specified rather than efficiently concise. The brevity comes at the cost of the usage and parameter detail an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, but for a 3-param tool with 0% schema coverage and two alternative selectors, the description should clarify how path and project_id interact and what recent_limit does. That guidance is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description mentions none of the three parameters. 'path', 'project_id', and 'recent_limit' (which controls how many memories come back, directly relevant to the 'recent memories' claim) are left entirely undefined in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and enumerates the resources returned: registered project context, git status, and recent memories. This distinguishes it as a composite/aggregate tool relative to siblings like git_status, project_get, and memory_recent, though it never explicitly says it aggregates them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this composite tool versus calling the individual siblings (git_status, project_get, memory_recent) directly, and no mention of prerequisites or which selector is needed. Usage must be inferred entirely from the name and listed outputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_getBRead-onlyIdempotent
Get a project by id.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond that—no note on missing-ID errors, auth requirements, or lookup scope. With annotations covering safety, the description contributes almost nothing extra.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no wasted words, front-loading the action and resource. It is appropriately sized, though almost too terse to be maximally useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read of a single entity, an output schema exists so return values need not be described, and annotations cover the safety profile. The remaining gap is the absence of error/behavior guidance, which is minor for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only one parameter (project_id) and its purpose is self-evident from its name. The phrase 'by id' confirms that project_id is the lookup key, matching the schema without adding format or constraint details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('project') with the lookup key ('by id'), which distinguishes it implicitly from project_list and project_register. It is clear but does not explicitly differentiate itself from the sibling project tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides no guidance on when to use this tool versus project_list, project_context, or project_register, and no prerequisites or exclusions. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_listBRead-onlyIdempotent
List registered Continuum projects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is fully covered. The description adds nothing beyond that — no note on ordering, whether all projects or a page is returned, or how it relates to project_get's single-project lookup. With an output schema present, return-shape disclosure is not required, but the description contributes zero behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single clause with no filler, front-loaded with the verb. For a zero-argument list tool this is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, complete annotations, and no parameters, the definition supplies nearly everything an agent needs. The only gap is relational context within the project_* family.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so the baseline is 4. Schema coverage is 100% and there is nothing for the description to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (registered Continuum projects), so the agent knows exactly what it returns. It does not differentiate itself from siblings like project_get or project_register, which also operate on projects, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus project_get, project_register, or project_context. The 'registered' qualifier hints at scope but the agent must infer that this is the enumeration entry point for the project family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
project_registerCIdempotent
Register a local path as a Continuum project.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: it does not say what happens on a duplicate registration, whether the name is auto-derived, or what errors can occur for an invalid path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; every word earns its place. It is appropriately terse, though it borders on under-specification rather than being a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be described, but for a mutation tool with two fully undocumented optional parameters and no annotation coverage of duplicate/invalid-path behavior, the description leaves core call semantics unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, and the description says nothing about 'name' or 'path' — not their format, not defaults, not whether both are optional and what happens if omitted. With two undocumented parameters, the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('register') and resource ('a local path as a Continuum project'), so the core action is unambiguous. It does not differentiate itself from siblings like project_list/project_get/project_context, but the singular act of registering vs. listing/getting is inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus project_get or project_list, no prerequisites (e.g., does the path need to be a git repo or contain certain files?), and no mention of what happens if the path is already registered. The agent must infer all usage conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
branch_list - First observed
git_diff - First observed
git_log - First observed
git_status - First observed
memory_delete - First observed
memory_get - First observed
memory_recent - First observed
memory_save - First observed
memory_search - First observed
memory_update - First observed
project_context - First observed
project_get - First observed
project_list - First observed
project_register
TDQS
Scored across 14 tools
Each tool targets a distinct resource+action: the memory_* family cleanly separates save/search/get/update/delete/recent, project_get vs project_context differ by scope, and git_status/git_diff/git_log/branch_list cover orthogonal git queries. No two tools appear to do the same thing, so an agent can select confidently.
Most tools follow a consistent resource_verb snake_case pattern (memory_save, project_register, git_status). The lone deviation is branch_list, which drops the git_ prefix used by its sibling git tools, but overall readability remains high.
14 tools split evenly across three coherent domains (memory, project, git) is well-scoped for a context/memory server. Each tool earns its place without redundancy.
Memory CRUD is fully covered (save/get/update/delete/search/recent) plus project lifecycle and git inspection. Minor gaps: no project update/unregister/delete or branch checkout/creation, but core workflows are workable.
Maintenance
Related MCP Connectors
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Shared, governed long-term memory for AI agents across tools and sessions via MCP and REST.
Cross-tool persistent memory and context for AI assistants over MCP.
1- memnodeOAuthdev.memnode
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceLocal-first, auditable memory for AI agents. Provides durable context for MCP hosts with SQLite storage, CLI, and MCP tools for memory management.2Apache 2.0
- AlicenseNot gradedqualityCmaintenanceProvides local, project-aware memory for coding agents via MCP tools, lifecycle hooks, and a REST service, with no outbound network access.5,178 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceGives coding agents a local, SQLite-backed memory of a codebase, enabling them to query symbol impact, change history, and task scope through MCP while recording what actually changed after edits.MIT
- AlicenseBqualityCmaintenanceProvides local, explicitly scoped memory for coding agents via MCP, storing durable project knowledge in a per-repository SQLite database with tools to record, search, and retrieve context.5MIT