c2b
Provides tools for searching and retrieving context from an Obsidian knowledge vault merged with code project graphs, enabling recall of human-written notes linked to specific files.
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., "@c2bcontext for payments.ts before I edit it"
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.
ASM — Agent Shared Memory
ASM gives local coding agents one shared, offline memory. It combines mapped source-code graphs, an optional Obsidian knowledge layer, and append-only implementation records behind one local Model Context Protocol (MCP) server.
Claude Code, Codex, Cursor, Kimi Code, Grok Build, Gemini CLI, and any other local stdio MCP host can query the same graph and write back to the same memory. The 3D interface is optional; recall and write-back continue to work when it is closed.
Why ASM
ASM keeps three useful forms of memory together:
Immediate work memory — structured records are appended to
~/.asm/memory.jsonlas soon as an agent documents a completed change.Durable human memory — when an Obsidian vault is configured, the same record is appended to
wiki/main/daily/YYYY-MM-DD.md.Queryable context graph —
brain.jsonjoins files, dependencies, skills, infrastructure, vault concepts, and recent agent work.
The operating rule is simple: recall before reading or editing, inspect the current files, then record concrete outcomes after changing them. ASM is context, not a replacement for source control or verification.
Related MCP server: obsidian-emergent-mcp
Architecture
configured projects ──> Graphify ──┐
├──> merge.py ──> brain.json ──> local stdio MCP
optional Obsidian OKF graph ───────┘ ├────> lifecycle hooks
└────> optional local UI
agent memory_record calls ──> memory.jsonl + optional Obsidian daily noteNo hosted database or cloud memory service is required. The MCP server communicates over stdio and the optional UI binds to loopback by default.
Agent support
Agent host | Shared MCP | Shared skill | Native live activity | Installer target |
Claude Code | Yes | Yes | Yes | user-scoped MCP and |
Codex | Yes | Yes | Yes | user-scoped MCP and |
Cursor | Yes | Yes | Yes |
|
Kimi Code | Yes | Yes | Yes |
|
Grok Build | Yes | Yes | Yes | native |
Gemini CLI | Yes | Client-dependent | Not installed automatically |
|
Other stdio MCP hosts | Yes | If the host supports Agent Skills | If the host can invoke JSON lifecycle hooks | portable config at |
Grok, Kimi, Claude, and other names can describe either a model or an agent host. A model selected inside Cursor uses Cursor's local MCP and hook environment. A raw model API cannot launch a process on your computer; it needs an MCP-capable host or adapter.
Grok Build's native hooks provide live file activity and the one-retry stop gate. Its SessionStart and UserPromptSubmit hooks are passive: they can observe events but cannot inject context into the active prompt. Grok therefore receives the recall protocol through the ASM MCP server instructions and the shared skill, not through lifecycle context injection.
Requirements
macOS, Linux or Windows 10/11
Python 3.11 or newer
Graphify:
uv tool install graphifyyNode.js 22 or newer (the refresh, the installer, the hooks and the background jobs); Node.js 24 for the complete frontend build and test workflow
At least one local MCP-capable coding agent
Optional: an Obsidian vault with the documented OKF structure. Copy
tools/okf-build.mjsinto<vault>/okf/once; every refresh then rebuilds the vault's catalog with it
Quick start
git clone https://github.com/dizeldz20-ux/agent-shared-memory.git
cd agent-shared-memory
cp sources.example.json sources.json
# Edit sources.json: add projects and set vault to null for code-only mode.
uv tool install graphifyy
cd frontend
npm ci
npm run build
cd ..
chmod +x refresh.sh start-asm.sh install-agent-integrations.sh
./install-agent-integrations.shOn Windows, in PowerShell or cmd:
git clone https://github.com/dizeldz20-ux/agent-shared-memory.git
cd agent-shared-memory
copy sources.example.json sources.json
# Edit sources.json: add projects and set vault to null for code-only mode.
uv tool install graphifyy
npm.cmd --prefix jobs ci
npm.cmd --prefix jobs run asm:installType npm.cmd, not npm: in PowerShell a bare npm runs npm.ps1, which Windows' default execution policy refuses to run. The refresh and the installer are one TypeScript implementation (jobs/src/refresh, jobs/src/install) on every platform; refresh.sh, refresh.ps1 and install-agent-integrations.sh only build jobs/ and hand it their arguments.
The installer:
rebuilds the graph and deploys the runtime to
~/.asm;installs one portable
agent-shared-memoryskill under~/.agents/skillsfor compatible agents and retains only Claude Code's client-specific compatibility copy;registers the same
asmstdio MCP command with installed native CLIs;safely merges MCP entries for Gemini CLI, Cursor, current Kimi Code, and legacy Kimi CLI, with native lifecycle hooks for Cursor and current Kimi Code;
configures Grok Build's native global activity and stop hooks without claiming unsupported session or prompt context injection;
writes a portable MCP configuration to
~/.asm/client-configs/mcp.json;preserves unrelated settings and refuses to overwrite malformed JSON.
Restart open agent sessions after installation. Review the local hook command once in clients that expose a hook-trust screen.
Configure mapped sources
sources.json is deliberately ignored by Git because it contains machine-specific paths. Add explicit sources, auto-discover sibling project directories, or combine both:
{
"vault": null,
"layers": { "agents": "Projects", "asm": "ASM" },
"sources": [
{ "layer": "asm", "raw": "asm-self", "base": ".", "prefix": "" }
],
"discoverSources": [
{
"root": "../projects",
"defaultLayer": "agents",
"exclude": ["archive"]
}
]
}Discovery is deterministic, explicit entries win, and one missing source does not prevent the remaining sources from being merged.
Shared agent protocol
Every integrated agent receives the same contract through the shared skill, server instructions, or both:
Call
brain_searchbefore planning work in a mapped domain.Call
brain_contextbefore the first read or edit of a mapped target file.Use
brain_neighborswhen a change may affect several components.Inspect and verify the current code normally.
After changing files, call
memory_recordwith the result, affected files, decisions, verification, and open threads.Never store credentials, private keys, tokens, raw transcripts, or secret-bearing tool output.
Clients with an installed Stop hook also get a one-retry memory gate: a session with a recognized editor, delete, or conservative file-mutating shell operation is prompted once to write its handoff before stopping. Read-only tools and recognized read-only shell commands are not blocked, and a missing MCP server cannot create an infinite loop. This is a workflow guardrail, not a complete operating-system audit. Passive lifecycle events are not treated as context injection.
MCP tools
Tool | Purpose |
| Search graph nodes and immediate shared memories. |
| Inspect one graph node or |
| Get dependencies, related vault pages, and recent memory for a file. |
| Traverse a bounded blast-radius neighborhood. |
| Find the shortest relationship path between two nodes. |
| Read recent cross-agent implementation records. |
| Append a structured handoff to local memory and, when configured, the vault. |
For a client not handled by the installer, copy the asm entry from ~/.asm/client-configs/mcp.json. The portable shape is:
{
"mcpServers": {
"asm": {
"command": "/absolute/path/to/uv",
"args": [
"run",
"--directory",
"/absolute/path/to/.asm",
"python",
"mcp_server.py"
]
}
}
}Refresh the brain
./refresh.sh # every source
./refresh.sh --changed # only sources with files newer than their last extract
./refresh.sh --brain-only # the graph files only, no codeOn Windows: npm.cmd --prefix jobs run asm:refresh -- --changed, or .\refresh.ps1 --changed where PowerShell scripts may run.
The refresh rebuilds the optional vault OKF graph, extracts each code source independently, merges the graph, atomically deploys runtime files, and hot-reloads the UI only if it is already running. It does not start the UI. --changed makes a refresh cheap enough to run after every real change instead of once a week.
The daily background job runs the same refresh with --changed --brain-only, from the deployed runtime, so it never ships code from a checkout that is being edited.
Optional live UI
./start-asm.shOpen http://127.0.0.1:8930. Connectome provides the interactive 3D neural view; Map and Cortex are 2D projections of the same graph and live routes. File-access activity is buffered locally while the UI is closed and replayed when it starts again.
The server expects a production frontend in frontend/dist. Build it with npm run build. To refresh the tracked, sanitized public demo separately, run npm run demo:data; the normal brain refresh does not rewrite demo assets.
Runtime layout
~/.asm/
├── brain.json
├── brain.index.json
├── brain.pages.json # vault page bodies as stemmed word sets — the searchable text
├── asm_text.py # the one tokenizer mcp_server.py and merge.py share
├── memory.jsonl
├── usage.jsonl # node opens (brain_node / brain_context) — recall feedback
├── skill-map.json # derived skill routing map (rebuilt from every installed SKILL.md)
├── skill-map.overrides.json # your curated routing rules (private; seeded from hook/skill-map.overrides.example.json)
├── skill-usage.jsonl # skill hints and loads — routing precision feedback
├── events.jsonl
├── pending.jsonl
├── sessions/ # per-session mutation markers, recall ledgers, and skill state (<id>.skills.json)
├── asm-paths.json
├── mcp_server.py
├── client-configs/
│ └── mcp.json
└── hooks/
├── asm-session-start.js
├── asm-prompt-recall.js
├── asm-activity-hook.js
├── asm-memory-gate.js
└── asm-skill-router.js # Claude Code only: SKILL.state-style skill routing (see docs/implementation-notes.md)Privacy and security
Keep
sources.json, generated runtime data, credentials, and local event logs out of Git.brain.jsoncontains graph metadata and local file paths. Obsidian note bodies are not copied into it, butbrain.pages.jsonbeside it holds every vault page body reduced to a stemmed word set — recoverable vocabulary, not readable prose, and still local-only. The graph belongs on the local machine unless deliberately sanitized.Live activity records agent name, tool name, phase, and file paths. It does not send prompts, source contents, tool inputs, or tool output to the UI event stream.
The optional Codex rollout fallback derives tool names and paths without publishing prompt text or command output. Disable it with
ASM_CODEX_ROLLOUT_FALLBACK=0.Keep the UI bound to
127.0.0.1; do not expose the local runtime through a public tunnel without adding authentication and reviewing the data boundary.Treat all text passed to
memory_recordas durable. Review it before recording and never include secrets.
Development checks
uv run python -m unittest discover -s tests
bash -n refresh.sh install-agent-integrations.sh start-asm.sh
npm --prefix jobs ci
npm --prefix jobs run typecheck
npm --prefix jobs test
cd frontend
npm ci
npm run test:unit
npm run build:preview
npm run test:e2eSee implementation notes for graph/runtime invariants and vault structure for the optional Obsidian contract.
License
Available Tools
7 toolsbrain_contextA
THE tool to call before touching a file: given an absolute or relative file path, returns what the brain knows — the matching node, its code neighbors, linked vault knowledge pages (gotchas/decisions about it), and recent cross-agent access events.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It describes the return content, which is helpful, but it does not state that the operation is read-only, whether it has side effects, or any authorization requirements. For a tool with zero annotation coverage, this is a significant gap.
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 sentence with zero waste, front-loading the primary usage directive and then listing the returned information. Colons and dashes provide clear structure without verbosity.
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 one-parameter read tool with no output schema, the description adequately explains what the tool does and what it returns. It is nearly complete, but it could add a note that the operation is safe or read-only to fully reassure an agent given the lack of annotations.
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. It says 'given an absolute or relative file path', which clarifies the parameter's expected value beyond the schema's bare 'File Path' title. However, it adds little else (e.g., no constraints on existence or format), so it only partially compensates.
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 specific verb ('returns what the brain knows') and resource ('given a ... file path'), and enumerates the returned content (matching node, code neighbors, linked vault pages, access events). It does not explicitly contrast with sibling tools like brain_search or brain_node, but the purpose is clear enough for an agent to distinguish it.
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?
It explicitly says 'THE tool to call before touching a file', giving a clear context for when to use it. However, it does not name alternatives or state when not to use it, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_neighborsB
Neighbors of a node up to depth hops (BFS, max 50 results).
Includes cross-layer links between vault knowledge and code.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| node_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose two useful traits: BFS traversal order and a hard 50-result cap (truncation behavior). It omits error/edge-case behavior (missing node, depth limits) and whether the cap silently truncates or errors.
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 with zero filler, and the core operation is front-loaded ahead of the supplementary cross-layer note. Not padded, though slightly terse for a 0%-coverage schema.
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 description covers traversal semantics and the result cap. For a simple two-parameter read tool this is nearly complete, with only usage routing and node_id semantics missing.
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 coverage is 0%, so the description must compensate. It clarifies that `depth` means hop count, adding real meaning beyond the bare integer schema, but says nothing about `node_id` format/naming or acceptable depth ranges, leaving the required parameter 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 operation (retrieve neighbors of a node) with the traversal method (BFS) and result cap (max 50). The resource is clear, but it does not distinguish itself from siblings like brain_path or brain_context, which may also traverse graph structure.
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 explicit when-to-use guidance or alternatives are given. An agent must infer that this is for local neighborhood exploration rather than path-finding (brain_path) or global search (brain_search), but the description never says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_nodeB
Get full details of a brain node by id (e.g. 'vault:api-agent-allowlist', 'api:src/server/routes.py').
| Name | Required | Description | Default |
|---|---|---|---|
| node_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. 'Get' implies a read, but it says nothing about behavior on a missing id, permission requirements, lookup cost, or how large 'full details' is. For a zero-annotation tool this is a significant gap.
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 the verb, resource, keying constraint, and format examples; no filler.
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?
A one-parameter read tool with no output schema, so the description should at least sketch what 'full details' returns. It names the resource and id format but leaves the return shape and error behavior unstated, which is a modest but real gap.
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 coverage is 0% and node_id has no schema description, so the description's two example ids ('vault:api-agent-allowlist', 'api:src/server/routes.py') are genuinely useful for inferring the id format. It still doesn't explain the namespace/prefix scheme or what happens with a malformed id, so it only partially compensates.
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 full details') and resource ('brain node') scoped to a lookup by id, which clearly separates it from the sibling brain_search. It does not, however, explicitly contrast itself against brain_neighbors or brain_path, which also operate on nodes.
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 phrase 'by id' implies you must already know the node id, but the description never states when to use this instead of brain_search (e.g. 'use brain_search when you don't have an id'). No prerequisites 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.
brain_pathB
Shortest path between two brain nodes (BFS over all edge types).
| Name | Required | Description | Default |
|---|---|---|---|
| to_id | Yes | ||
| from_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, but 'BFS over all edge types' is a genuinely useful disclosure — it tells the agent paths are unweighted and that every relationship type is traversable. It omits what happens when no path exists, whether traversal is directed, and any cost or depth limits.
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 front-loaded sentence with the resource, the operation, and the algorithm; nothing wasted.
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. Still, for a pathfinding tool with zero parameter documentation and no annotations, the absence of no-path/error behavior and directedness leaves real gaps.
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 coverage is 0% and the properties are bare strings, so the description is the only source of meaning. 'Two brain nodes' implies from_id/to_id are node identifiers, but no format, ID source, or error behavior for invalid IDs is given.
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+resource ('shortest path between two brain nodes') and even names the algorithm, so an agent knows exactly what it computes. It does not differentiate itself from siblings like brain_neighbors or brain_context, which could also traverse graph relationships.
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 this is preferable to brain_neighbors, brain_search, or brain_context. The algorithm note hints at the use case (unweighted reachability) but the agent must infer all routing decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brain_searchC
Search ASM across vault pages, mapped code, and immediate shared-memory records.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries full behavioral burden, yet it says nothing about ranking, result limits, permissions, or behavior on empty/no-match queries. It only names the corpora searched, which is a scoping statement rather than a behavioral trait.
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 tight sentence with no filler, and the scope (the three corpora) is front-loaded after the verb. It is efficient, though the unexplained "ASM" term adds ambiguity rather than value.
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 with no annotations and no usage context, the description leaves the search semantics and the read-only nature implicit; adequate for a one-parameter search, but with clear gaps.
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 single query parameter has 0% schema description coverage and the description does not compensate — it never explains whether the query is free text, a keyword list, a regex, or a structured expression. Meaning beyond the schema is absent.
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+resource ("Search ASM") and enumerates three target corpora, which hints at scope. However, "ASM" is unexplained jargon and the description does nothing to differentiate this tool from siblings like memory_recent or brain_context, leaving the agent to guess at the distinction.
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 provided, no exclusions, and no alternatives named despite six closely related sibling tools. The agent cannot tell from the text when brain_search should be preferred over memory_recent or brain_context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_recentA
Newest shared records from any agent, in brief form: summary, files, open threads with
their ids, and a details preview. Words in query filter the records; any word may match.
Open a full record with brain_node('memory:').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the cross-agent scope ('from any agent'), the brief return shape, and the OR-style matching semantics ('any word may match'). It omits ordering guarantee beyond 'newest' and pagination behavior.
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?
Three tight sentences, front-loaded with the resource and scope, then filtering semantics, then the escalation path. The return-fields list is slightly enumerative but each item carries information.
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 structure needn't be spelled out, yet the description still gives a useful preview and routes to brain_node for full records. The only real gap is `limit` semantics, which is minor for a read-only list 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 coverage is 0%, so the description must compensate. It explains `query` well (word-based, any-word matching) but says nothing about `limit`, leaving one of two parameters undocumented. Partial compensation.
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+resource ('Newest shared records from any agent, in brief form') and distinguishes itself from the full-record path by naming brain_node for the detail view. It does not explicitly separate itself from close siblings like memory_record or brain_search, so it stops 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?
Implied use case is clear (list the newest brief records, optionally filtered), and it points to brain_node('memory:<id>') as the alternative when a full record is needed. No explicit when-not guidance or comparison against brain_search/memory_record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_recordA
Persist a completed unit of work into immediate ASM memory and the Obsidian daily log.
Call after changing files. summary is one line, at most 500 characters, naming what
actually changed; the narrative, verification and context go in details. Record
concrete outcomes and unresolved work; never include secrets, credentials, raw private
transcripts, or claims that were not verified.
supersedes names earlier memory ids this record replaces (a corrected fact, a thread
now closed); they stop surfacing in search and recall but stay readable by id.
Credentials and card numbers are redacted mechanically; redactions lists what kinds.
The response lists thread_ids (<record-id>#<n>) for the open threads it stored.
resolves closes what this work finished: a thread id <record-id>#<n>, a record id
(all its threads), or a plan page vault:<id> (marked done). corrects files stale
claims for the curator: [{"target": "vault:" | "mem:" | "idx::",
"claimed": ..., "truth": ..., "evidence": [...]}]. Both are recorded in the lifecycle ledger.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | agent | |
| files | No | ||
| details | No | ||
| summary | Yes | ||
| corrects | No | ||
| resolves | No | ||
| decisions | No | ||
| session_id | Yes | ||
| supersedes | No | ||
| open_threads | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and largely delivers: it explains that `supersedes` targets stop surfacing in search/recall but remain readable by id, that credentials/card numbers are mechanically redacted, that `resolves`/`corrects` are written to a lifecycle ledger, and what the response contains (`thread_ids`). It omits permissions, reversibility, and any failure/conflict behavior, so not a 5.
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?
Front-loaded with the core action before the detail, and each sentence carries distinct information about a distinct parameter or behavior. It is dense and somewhat long, but there is little filler; backticked parameter names aid scanning.
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 10-parameter mutation tool with no annotations and no output schema, the description explains response `thread_ids` reasonably well, but five parameters (files, decisions, open_threads, agent, session_id) receive no guidance at all, and there is no mention of permissions or conflict behavior. Adequate but with clear gaps.
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. It richly documents `summary` (one line, ≤500 chars), `details`, `supersedes`, `resolves` (including the `<record-id>#<n>`, record-id, and `vault:<id>` forms), and `corrects` (with a target/claimed/truth/evidence shape), but leaves `agent`, `files`, `session_id`, `decisions`, and `open_threads` entirely undocumented — half the parameters.
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 — persist a completed unit of work into ASM memory and the Obsidian daily log — and the trigger ('Call after changing files'). Clearly distinguished from the read-side siblings (brain_search, memory_recent) without needing to open any schema.
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?
Gives explicit context for use ('call after changing files') plus content rules: record concrete outcomes and unresolved work, never secrets/credentials/raw transcripts/unverified claims. It stops short of naming alternatives or exclusions (e.g., when to prefer memory_recent or brain_search), so it is clear but not fully routing.
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.
7 tool updates
v0.1.0- First observed
brain_context - First observed
brain_neighbors - First observed
brain_node - First observed
brain_path - First observed
brain_search - First observed
memory_recent - First observed
memory_record
TDQS
Scored across 7 tools
The six brain_* query tools are semantically distinct (search vs. node lookup vs. neighbors vs. path vs. file context), and the two memory_* tools handle read vs. write. brain_context and brain_neighbors overlap somewhat (both pull neighbors), but descriptions clarify the intended use.
All seven tools follow a strict prefix_noun/verb pattern with two clear families: brain_* (graph queries) and memory_* (shared-memory read/write). snake_case is used consistently throughout.
Seven tools is well-scoped for an ASM/knowledge-graph memory server, covering structured query (search, node, neighbors, path, context) and memory lifecycle (recent, record) without excess.
The surface covers read-side graph exploration and memory write/read, but lacks any update/edit/delete for records (only 'supersedes'/'resolves'/'corrects' fields on write) and no explicit lifecycle-management tools. A create+read pattern without standalone mutation tools is a notable gap.
Maintenance
Related MCP Connectors
Persistent memory for Claude Code and Cursor. Stop re-explaining your project every session.
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Search and reason over your Obsidian-style Markdown vault, right from ChatGPT.
Work on your own computers from Claude or ChatGPT: run commands, edit and search files.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables Claude to read, write, search, and manage Obsidian vault notes with Git-backed sync support for multi-device access and extensible AI workflows.6,347 npm-
- AlicenseNot gradedqualityDmaintenanceProvides Claude Code with deep access to an Obsidian vault through 28 tools for structural analysis, semantic retrieval, and git-backed timeseries tracking. It transforms your vault into a live knowledge base that Claude can search, navigate, and reason about using its knowledge graph.2MIT
- AlicenseAqualityCmaintenanceEnables Claude Code read/write access to an Obsidian vault, including creating, editing, searching, and browsing notes.8MIT
- AlicenseNot gradedqualityDmaintenanceObsidian-backed knowledge graph with semantic search, entity extraction, and cross-session memory. 11 MCP tools. Works with Claude Code, Cursor, Windsurf, and any MCP-compatible editor.101 npm1MIT