oh-memos-mcp 2.1.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,228 +1,287 @@
1
- # Changelog
2
-
3
- All notable changes to `oh-memos-mcp` are documented here.
4
-
5
- This project follows [Semantic Versioning](https://semver.org/).
6
-
7
- ---
8
-
9
- ## [2.1.0] - 2026-08-16
10
-
11
- ### Fixed
12
-
13
- - **Auto-discovered `.env` no longer overrides launcher environment.** A `.env`
14
- found in the working directory or package root now only fills missing values,
15
- so MCP client `env` blocks and shell exports such as `MEMOS_PROVIDER=local`
16
- stay in effect. A file selected explicitly through `MEMOS_ENV_FILE` or
17
- `--memos-env-file` remains authoritative.
18
-
19
- ### Added
20
-
21
- - **Local Lite provider.** `MEMOS_PROVIDER=local` (implied by `MEMOS_MODE=lite`)
22
- serves `memos_save`, `memos_get`, `memos_list_v2`, `memos_search`, and
23
- `memos_context_resume` from a per-cube `memories.jsonl` with deterministic
24
- lexical ranking, durable appends, and a cross-process lock. Graph, Think,
25
- Wiki, and admin tools report `LOCAL_PROVIDER_UNSUPPORTED` rather than
26
- pretending a graph backend exists.
27
-
28
- - **Skill candidate lifecycle.** `memos_review_skill_candidate` records
29
- approve/reject with reviewer audit metadata, and
30
- `memos_install_skill_candidate` installs only approved candidates into
31
- `.claude/skills/<slug>/SKILL.md` without overwriting, following symlinks, or
32
- executing anything.
33
-
34
- - **Explainable graph provenance.** `memos_graph(mode="related"|"path"|"impact")`
35
- now reports normalized evidence categories (`EXTRACTED`, `INFERRED`,
36
- `AMBIGUOUS`, or `UNKNOWN`) and includes confidence, evidence references,
37
- source file/location, extractor version and verification time when those
38
- fields exist. Legacy graph data without provenance remains readable and is
39
- reported as `UNKNOWN` rather than assigned invented evidence.
40
-
41
- - **`memos_graph(mode="import")` Graphify boundary.** Accepts up to 5 MB of
42
- Graphify/NetworkX node-link JSON through `graph_json`, validates `nodes` plus
43
- `links` (or the `edges` alias), and produces a deterministic import plan with
44
- portable stable Code Graph ids. Duplicate ids, dangling edges, unsafe source
45
- paths, invalid confidence values and oversized graphs are rejected before
46
- any persistence boundary. This mode is intentionally **dry-run only**: it
47
- never writes to Neo4j, Qdrant or a memory cube.
48
-
49
- - **`memos_canvas`** — a symbolic task canvas: short-term task state that survives
50
- context compaction. One Mermaid file per task under
51
- `{MEMOS_CUBES_DIR}/{cube_id}/canvas/`, whose nodes carry a greppable id
52
- (`000-N1`) and an optional `ref` anchoring them to evidence:
53
- `mem:<memory_id>` (a memory in the graph), `file:<path>` (any file, including
54
- the large tool results the harness already offloads), or `note:<text>`.
55
-
56
- `action`: `open` (needs `goal`) · `update` (appends a node; `node_id` edits one
57
- in place) · `show` · `list`.
58
-
59
- Canvases are deliberately **not** written to Neo4j or Qdrant. A canvas changes
60
- several times an hour, and paying an embedding round trip for a `doing→done`
61
- flip would be absurd. Durable facts still go through `memos_save`; the canvas
62
- points at them with a `mem:` ref.
63
-
64
- This is **not** a token-saving feature. The design it borrows from
65
- ([TencentDB-Agent-Memory](https://github.com/TencentCloud/TencentDB-Agent-Memory))
66
- achieves its reduction by intercepting and replacing tool output before the
67
- model sees it, which a Claude Code hook cannot do — `PreToolUse` can rewrite a
68
- tool's *input* via `updatedInput`, but no hook can rewrite its *output*. What
69
- this offers instead is task state that survives compaction, and a path from a
70
- summary back to the evidence behind it.
71
-
72
- Node ids and canvas prefixes are allocated as max+1 and **never reuse a gap**:
73
- a deleted `000-N2` may still be cited from a commit message, a memory body or
74
- another node's ref, and handing that id to a new node would silently repoint
75
- every one of those citations.
76
-
77
- - `memos_context_resume` now lists **unfinished** canvases first — headlines and
78
- counts only, a few dozen tokens — so the first thing visible after a compaction
79
- is the open work rather than a memory feed. Injecting canvas bodies here would
80
- rebuild the very context bloat the canvas exists to avoid; the model opens what
81
- it needs with `show`.
82
-
83
- - **Test infrastructure.** This package previously had none: no test script, no
84
- `*.test.ts`. Adds vitest and `npm test`, with 65 unit tests covering the
85
- parse/render round trip, node-id allocation, Mermaid label injection, path
86
- traversal refusal and atomic writes. `scripts/canvas-e2e.mjs` adds 18 checks
87
- driven over real MCP stdio rather than mocks.
88
-
89
- - `MEMOS_ENV_FILE` env var and `--memos-env-file` flag, to point the server at an
90
- explicit `.env`. Previously the file was located only by guessing from position
91
- (cwd, two levels above the package, dotenv's upward search) — which works from
92
- a checkout and never works under `npx`, where the package root sits in the npm
93
- cache and every candidate misses, loading not one variable. A path that does
94
- not exist now warns on stderr rather than falling through silently.
95
-
96
- ### Fixed
97
-
98
- - `toLocalPath()` rewrote Windows cube paths to `/mnt/...` unconditionally. That
99
- mapping only resolves inside WSL; under native Windows Node the result is not
100
- absolute, so it resolved against the current drive and every cube write landed
101
- in a phantom tree while the API kept reading the real path. Registration
102
- reported success, then `/search` and `/memories` failed 400 — the loaded cube
103
- had no memory backend.
104
-
105
- ### Security
106
-
107
- - `canvasPath` is the one place caller text becomes a filesystem path. It uses a
108
- **whitelist** (`[a-z0-9-]`) rather than a blacklist of dangerous characters,
109
- because a blacklist is always missing an entry. `.` is outside the whitelist,
110
- so `..` cannot survive it — traversal is structurally impossible rather than
111
- merely checked for — and a post-resolve containment check backs that up
112
- independently. `cube_id` is treated as untrusted too, since it is derived from
113
- a caller-supplied `project_path`.
114
-
115
- ### Documentation
116
-
117
- - The `alwaysAllow` example carried two defects. `memos_search` appeared twice,
118
- and several entries were **call forms** — `memos_admin(action=list_cubes)` and
119
- the like. `alwaysAllow` matches tool names, so those entries matched nothing:
120
- a reader would believe those calls were pre-approved and still be prompted for
121
- every one. Replaced with bare tool names, which auto-approve every action of
122
- the tool.
123
- - `memos_delete` was dropped from that example, which also set
124
- `MEMOS_ENABLE_DELETE: "true"` — together they auto-approve deleting memories
125
- with no prompt. Enabling that is a decision worth making deliberately.
126
- - The `.env` note claimed the working directory's file loads "automatically with
127
- highest priority". Under `npx` no file loads at all. Documented `MEMOS_ENV_FILE`
128
- and what actually happens.
129
-
130
- ### Notes
131
-
132
- - Tool surface grew 12488 B → 13680 B (+9.5%), past the +5% drift budget, and the
133
- baseline was re-frozen. This is the cost of a new tool rather than description
134
- drift; the description was trimmed from 1333 B to 1192 B first, moving detail
135
- into `show`'s output (the same move `memos_suggest` made with the memory-type
136
- decision tree).
137
- - `tsconfig.json` now excludes `src/**/*.test.ts`. Without it the test files
138
- compile into `dist` and ship with `npm publish`.
139
-
140
- ---
141
-
142
- ## [2.0.1] — 2026-08-02
143
-
144
- ### Fixed
145
-
146
- - MCP `serverInfo` was hardcoded in `server.ts` and reported
147
- `{name: "memos-memory", version: "1.0.1"}` — a name matching neither the
148
- package (`oh-memos-mcp`) nor the conventional server key (`oh-memos`), and a
149
- version that 2.0.0 shipped stale. Clients display this during the handshake.
150
- It is now read from `package.json` at startup, so it cannot drift again.
151
-
152
- ---
153
-
154
- ## [2.0.0] — 2026-08-02
155
-
156
- ### ⚠️ Breaking — tool surface consolidated from 18 to 10
157
-
158
- Eleven tools were merged into three dispatching tools. **There is no compatibility
159
- shim**: the MCP SDK only dispatches registered tools, so calling a removed name now
160
- returns `Unknown tool`.
161
-
162
- If your MCP client config pins tool names (e.g. Claude Code's `alwaysAllow` list),
163
- you must update it before upgrading.
164
-
165
- #### Migration
166
-
167
- | 1.x tool | 2.0 replacement |
168
- |----------|-----------------|
169
- | `memos_search_context` | `memos_search` — pass the `context` array (recent turns) |
170
- | `memos_get_graph` | `memos_graph(mode="related")` |
171
- | `memos_trace_path` | `memos_graph(mode="path")` |
172
- | `memos_impact` | `memos_graph(mode="impact")` |
173
- | `memos_export_schema` | `memos_graph(mode="schema")` |
174
- | `memos_list_cubes` | `memos_admin(action="list_cubes")` |
175
- | `memos_register_cube` | `memos_admin(action="register_cube")` |
176
- | `memos_create_user` | `memos_admin(action="create_user")` |
177
- | `memos_validate_cubes` | `memos_admin(action="validate_cubes")` |
178
- | `memos_get_stats` | `memos_admin(action="stats")` |
179
- | `memos_calendar` | `memos_admin(action="calendar")` |
180
-
181
- Unchanged: `memos_context_resume`, `memos_search`, `memos_save`, `memos_list_v2`,
182
- `memos_get`, `memos_suggest`, `memos_delete`.
183
-
184
- `alwaysAllow` for 2.0:
185
-
186
- ```json
187
- "alwaysAllow": [
188
- "memos_context_resume", "memos_search", "memos_save",
189
- "memos_list_v2", "memos_get", "memos_suggest",
190
- "memos_think", "memos_graph", "memos_admin", "memos_export_wiki"
191
- ]
192
- ```
193
-
194
- ### Added
195
-
196
- - **`memos_think`** — evidence pack for a question. Runs semantic retrieval plus a
197
- recent-72h temporal pass, deduplicates, and returns numbered evidence with graph
198
- relationships between items, contradiction/evolution candidates, staleness
199
- candidates, and gap analysis. Synthesis is deliberately left to the calling model;
200
- the server emits no prose. Results can be persisted back as `SYNTHESIS`.
201
- - **`memos_export_wiki`** — export a cube as an interlinked markdown wiki: one page
202
- per memory (YAML frontmatter, `[[wikilink]]` relations), plus `index.md` and a
203
- mermaid `graph.md`. Only files carrying the generator marker are ever replaced;
204
- foreign files in the output directory are preserved. Defaults to
205
- `<project_path>/docs/memory-wiki`.
206
- - **`SYNTHESIS`** memory type, for answers synthesized from retrieved evidence.
207
-
208
- ### Changed
209
-
210
- - Tool-surface cost dropped ~51%: `tools/list` payload 22.9 KB → 11.2 KB
211
- (≈5850 → ≈2856 tokens). Shared `project_path` / `cube_id` parameter descriptions
212
- were deduplicated; the full cube-routing rules are now stated once, on
213
- `memos_save` and `memos_search`.
214
- - Runtime error `suggestions` now name the 2.0 call forms, so a model reading a
215
- failure message is no longer told to call a tool that does not exist.
216
-
217
- ### Fixed
218
-
219
- - `memos_admin`'s `cube_id` no longer carries a `MEMOS_DEFAULT_CUBE` default.
220
- Previously, calling `register_cube` without `cube_id` would silently register the
221
- default cube instead of failing.
222
-
223
- ---
224
-
225
- ## [1.0.0] — 2026-03-04
226
-
227
- Initial npm release. 18 tools, Node-only MCP server for oh-memos — no Python
228
- required, runs via `npx`.
1
+ # Changelog
2
+
3
+ All notable changes to `oh-memos-mcp` are documented here.
4
+
5
+ This project follows [Semantic Versioning](https://semver.org/).
6
+
7
+ ---
8
+
9
+ ## [3.0.1] - 2026-08-19
10
+
11
+ ### 🩹 修复 3.0.0 打包出的多余依赖与失效仓库链接
12
+
13
+ 3.0.0 的 npm 包声明了两个与运行时无关的依赖,并且 npm 页面上的仓库链接全部指向一个不存在的仓库。
14
+ 功能没有受影响,但每个用户都要多下载约 17 MB,且 issue/homepage 链接是死链。
15
+
16
+ #### 修复
17
+
18
+ - **移除 `ci@^2.3.0` 与 `npm@^11.19.0`**。两者都不被 `dist/` 里的任何代码 import,属纯安装期膨胀:
19
+ `npm` 是完整的 npm CLI(16 MB),`ci` 是无关的第三方工具(17 KB)。安装体积从约 30 MB 回到约 13 MB。
20
+ 根因是发布前工作区里未提交的依赖漂移被打进了 tarball;仓库提交本身一直只有三个依赖。
21
+ - **`repository` / `bugs` / `homepage` 从 `github.com/xigou/oh-memos` 改为 `github.com/lsg1103275794/oh-memos`**。
22
+ 前者返回 404,导致 npm 页面上的仓库、issue 和主页链接全部失效。`mcp-server-node/README.md`
23
+ 里的 clone 命令与仓库链接同步修正。
24
+
25
+ #### 不变
26
+
27
+ 运行时行为、工具名、输入 schema、协议协商和持久化格式与 3.0.0 完全一致,仅包元数据与依赖清单变化。
28
+ 从 3.0.0 升级只需重新安装,无需任何迁移。
29
+
30
+ ## [3.0.0] - 2026-08-19
31
+
32
+ ### Breaking
33
+
34
+ - **Node.js 20 is now the minimum runtime.** Node 18 users must stay on
35
+ `oh-memos-mcp@2` (`npx -y oh-memos-mcp@2`) until they can upgrade their
36
+ runtime. The entry point exits with an actionable message on Node 18 instead
37
+ of failing with an opaque module error.
38
+ - The MCP runtime now uses the role-split `@modelcontextprotocol/server@2` and
39
+ Zod 4 instead of the monolithic v1 SDK and Zod 3.
40
+
41
+ ### Added
42
+
43
+ - **Dual-era stdio serving.** The same package accepts legacy 2025-era
44
+ initialize clients and clients pinned to MCP `2026-07-28` through
45
+ `serveStdio(..., { legacy: "serve" })`.
46
+ - Stringified `tools/call` arguments are normalized before era classification
47
+ and schema validation, preserving the existing client compatibility path.
48
+ - Protocol, lifecycle, semantic-schema and package-boundary release gates now
49
+ cover legacy/auto/modern clients, Full/Lite providers, 16/17 tools, large
50
+ requests, probe fallback and graceful process shutdown.
51
+
52
+ ### Migration
53
+
54
+ - Install with `npx -y oh-memos-mcp` (npm `latest`) or pin `oh-memos-mcp@3.0.0`.
55
+ - No memory, cube or Lite JSONL migration is required. Existing Full and Lite
56
+ data formats, tool names and input schemas remain unchanged, so Agent
57
+ configurations only need the package reference updated.
58
+ - Clients that still negotiate the 2025-era wire keep working unchanged; no
59
+ client-side protocol migration is required to adopt 3.0.
60
+
61
+ ### Rollback
62
+
63
+ - Pin Agent configurations to `npx -y oh-memos-mcp@2.1.0`. No data rollback is
64
+ necessary because this release does not change persisted formats.
65
+ - `2.x` remains installable from npm; this release does not unpublish or
66
+ deprecate it.
67
+
68
+ ## [2.1.0] - 2026-08-16
69
+
70
+ ### Fixed
71
+
72
+ - **Auto-discovered `.env` no longer overrides launcher environment.** A `.env`
73
+ found in the working directory or package root now only fills missing values,
74
+ so MCP client `env` blocks and shell exports such as `MEMOS_PROVIDER=local`
75
+ stay in effect. A file selected explicitly through `MEMOS_ENV_FILE` or
76
+ `--memos-env-file` remains authoritative.
77
+
78
+ ### Added
79
+
80
+ - **Local Lite provider.** `MEMOS_PROVIDER=local` (implied by `MEMOS_MODE=lite`)
81
+ serves `memos_save`, `memos_get`, `memos_list_v2`, `memos_search`, and
82
+ `memos_context_resume` from a per-cube `memories.jsonl` with deterministic
83
+ lexical ranking, durable appends, and a cross-process lock. Graph, Think,
84
+ Wiki, and admin tools report `LOCAL_PROVIDER_UNSUPPORTED` rather than
85
+ pretending a graph backend exists.
86
+
87
+ - **Skill candidate lifecycle.** `memos_review_skill_candidate` records
88
+ approve/reject with reviewer audit metadata, and
89
+ `memos_install_skill_candidate` installs only approved candidates into
90
+ `.claude/skills/<slug>/SKILL.md` without overwriting, following symlinks, or
91
+ executing anything.
92
+
93
+ - **Explainable graph provenance.** `memos_graph(mode="related"|"path"|"impact")`
94
+ now reports normalized evidence categories (`EXTRACTED`, `INFERRED`,
95
+ `AMBIGUOUS`, or `UNKNOWN`) and includes confidence, evidence references,
96
+ source file/location, extractor version and verification time when those
97
+ fields exist. Legacy graph data without provenance remains readable and is
98
+ reported as `UNKNOWN` rather than assigned invented evidence.
99
+
100
+ - **`memos_graph(mode="import")` Graphify boundary.** Accepts up to 5 MB of
101
+ Graphify/NetworkX node-link JSON through `graph_json`, validates `nodes` plus
102
+ `links` (or the `edges` alias), and produces a deterministic import plan with
103
+ portable stable Code Graph ids. Duplicate ids, dangling edges, unsafe source
104
+ paths, invalid confidence values and oversized graphs are rejected before
105
+ any persistence boundary. This mode is intentionally **dry-run only**: it
106
+ never writes to Neo4j, Qdrant or a memory cube.
107
+
108
+ - **`memos_canvas`** — a symbolic task canvas: short-term task state that survives
109
+ context compaction. One Mermaid file per task under
110
+ `{MEMOS_CUBES_DIR}/{cube_id}/canvas/`, whose nodes carry a greppable id
111
+ (`000-N1`) and an optional `ref` anchoring them to evidence:
112
+ `mem:<memory_id>` (a memory in the graph), `file:<path>` (any file, including
113
+ the large tool results the harness already offloads), or `note:<text>`.
114
+
115
+ `action`: `open` (needs `goal`) · `update` (appends a node; `node_id` edits one
116
+ in place) · `show` · `list`.
117
+
118
+ Canvases are deliberately **not** written to Neo4j or Qdrant. A canvas changes
119
+ several times an hour, and paying an embedding round trip for a `doing→done`
120
+ flip would be absurd. Durable facts still go through `memos_save`; the canvas
121
+ points at them with a `mem:` ref.
122
+
123
+ This is **not** a token-saving feature. The design it borrows from
124
+ ([TencentDB-Agent-Memory](https://github.com/TencentCloud/TencentDB-Agent-Memory))
125
+ achieves its reduction by intercepting and replacing tool output before the
126
+ model sees it, which a Claude Code hook cannot do — `PreToolUse` can rewrite a
127
+ tool's *input* via `updatedInput`, but no hook can rewrite its *output*. What
128
+ this offers instead is task state that survives compaction, and a path from a
129
+ summary back to the evidence behind it.
130
+
131
+ Node ids and canvas prefixes are allocated as max+1 and **never reuse a gap**:
132
+ a deleted `000-N2` may still be cited from a commit message, a memory body or
133
+ another node's ref, and handing that id to a new node would silently repoint
134
+ every one of those citations.
135
+
136
+ - `memos_context_resume` now lists **unfinished** canvases first — headlines and
137
+ counts only, a few dozen tokens — so the first thing visible after a compaction
138
+ is the open work rather than a memory feed. Injecting canvas bodies here would
139
+ rebuild the very context bloat the canvas exists to avoid; the model opens what
140
+ it needs with `show`.
141
+
142
+ - **Test infrastructure.** This package previously had none: no test script, no
143
+ `*.test.ts`. Adds vitest and `npm test`, with 65 unit tests covering the
144
+ parse/render round trip, node-id allocation, Mermaid label injection, path
145
+ traversal refusal and atomic writes. `scripts/canvas-e2e.mjs` adds 18 checks
146
+ driven over real MCP stdio rather than mocks.
147
+
148
+ - `MEMOS_ENV_FILE` env var and `--memos-env-file` flag, to point the server at an
149
+ explicit `.env`. Previously the file was located only by guessing from position
150
+ (cwd, two levels above the package, dotenv's upward search) — which works from
151
+ a checkout and never works under `npx`, where the package root sits in the npm
152
+ cache and every candidate misses, loading not one variable. A path that does
153
+ not exist now warns on stderr rather than falling through silently.
154
+
155
+ ### Fixed
156
+
157
+ - `toLocalPath()` rewrote Windows cube paths to `/mnt/...` unconditionally. That
158
+ mapping only resolves inside WSL; under native Windows Node the result is not
159
+ absolute, so it resolved against the current drive and every cube write landed
160
+ in a phantom tree while the API kept reading the real path. Registration
161
+ reported success, then `/search` and `/memories` failed 400 — the loaded cube
162
+ had no memory backend.
163
+
164
+ ### Security
165
+
166
+ - `canvasPath` is the one place caller text becomes a filesystem path. It uses a
167
+ **whitelist** (`[a-z0-9-]`) rather than a blacklist of dangerous characters,
168
+ because a blacklist is always missing an entry. `.` is outside the whitelist,
169
+ so `..` cannot survive it — traversal is structurally impossible rather than
170
+ merely checked for — and a post-resolve containment check backs that up
171
+ independently. `cube_id` is treated as untrusted too, since it is derived from
172
+ a caller-supplied `project_path`.
173
+
174
+ ### Documentation
175
+
176
+ - The `alwaysAllow` example carried two defects. `memos_search` appeared twice,
177
+ and several entries were **call forms** — `memos_admin(action=list_cubes)` and
178
+ the like. `alwaysAllow` matches tool names, so those entries matched nothing:
179
+ a reader would believe those calls were pre-approved and still be prompted for
180
+ every one. Replaced with bare tool names, which auto-approve every action of
181
+ the tool.
182
+ - `memos_delete` was dropped from that example, which also set
183
+ `MEMOS_ENABLE_DELETE: "true"` — together they auto-approve deleting memories
184
+ with no prompt. Enabling that is a decision worth making deliberately.
185
+ - The `.env` note claimed the working directory's file loads "automatically with
186
+ highest priority". Under `npx` no file loads at all. Documented `MEMOS_ENV_FILE`
187
+ and what actually happens.
188
+
189
+ ### Notes
190
+
191
+ - Tool surface grew 12488 B → 13680 B (+9.5%), past the +5% drift budget, and the
192
+ baseline was re-frozen. This is the cost of a new tool rather than description
193
+ drift; the description was trimmed from 1333 B to 1192 B first, moving detail
194
+ into `show`'s output (the same move `memos_suggest` made with the memory-type
195
+ decision tree).
196
+ - `tsconfig.json` now excludes `src/**/*.test.ts`. Without it the test files
197
+ compile into `dist` and ship with `npm publish`.
198
+
199
+ ---
200
+
201
+ ## [2.0.1] — 2026-08-02
202
+
203
+ ### Fixed
204
+
205
+ - MCP `serverInfo` was hardcoded in `server.ts` and reported
206
+ `{name: "memos-memory", version: "1.0.1"}` — a name matching neither the
207
+ package (`oh-memos-mcp`) nor the conventional server key (`oh-memos`), and a
208
+ version that 2.0.0 shipped stale. Clients display this during the handshake.
209
+ It is now read from `package.json` at startup, so it cannot drift again.
210
+
211
+ ---
212
+
213
+ ## [2.0.0] — 2026-08-02
214
+
215
+ ### ⚠️ Breaking — tool surface consolidated from 18 to 10
216
+
217
+ Eleven tools were merged into three dispatching tools. **There is no compatibility
218
+ shim**: the MCP SDK only dispatches registered tools, so calling a removed name now
219
+ returns `Unknown tool`.
220
+
221
+ If your MCP client config pins tool names (e.g. Claude Code's `alwaysAllow` list),
222
+ you must update it before upgrading.
223
+
224
+ #### Migration
225
+
226
+ | 1.x tool | 2.0 replacement |
227
+ |----------|-----------------|
228
+ | `memos_search_context` | `memos_search` — pass the `context` array (recent turns) |
229
+ | `memos_get_graph` | `memos_graph(mode="related")` |
230
+ | `memos_trace_path` | `memos_graph(mode="path")` |
231
+ | `memos_impact` | `memos_graph(mode="impact")` |
232
+ | `memos_export_schema` | `memos_graph(mode="schema")` |
233
+ | `memos_list_cubes` | `memos_admin(action="list_cubes")` |
234
+ | `memos_register_cube` | `memos_admin(action="register_cube")` |
235
+ | `memos_create_user` | `memos_admin(action="create_user")` |
236
+ | `memos_validate_cubes` | `memos_admin(action="validate_cubes")` |
237
+ | `memos_get_stats` | `memos_admin(action="stats")` |
238
+ | `memos_calendar` | `memos_admin(action="calendar")` |
239
+
240
+ Unchanged: `memos_context_resume`, `memos_search`, `memos_save`, `memos_list_v2`,
241
+ `memos_get`, `memos_suggest`, `memos_delete`.
242
+
243
+ `alwaysAllow` for 2.0:
244
+
245
+ ```json
246
+ "alwaysAllow": [
247
+ "memos_context_resume", "memos_search", "memos_save",
248
+ "memos_list_v2", "memos_get", "memos_suggest",
249
+ "memos_think", "memos_graph", "memos_admin", "memos_export_wiki"
250
+ ]
251
+ ```
252
+
253
+ ### Added
254
+
255
+ - **`memos_think`** — evidence pack for a question. Runs semantic retrieval plus a
256
+ recent-72h temporal pass, deduplicates, and returns numbered evidence with graph
257
+ relationships between items, contradiction/evolution candidates, staleness
258
+ candidates, and gap analysis. Synthesis is deliberately left to the calling model;
259
+ the server emits no prose. Results can be persisted back as `SYNTHESIS`.
260
+ - **`memos_export_wiki`** — export a cube as an interlinked markdown wiki: one page
261
+ per memory (YAML frontmatter, `[[wikilink]]` relations), plus `index.md` and a
262
+ mermaid `graph.md`. Only files carrying the generator marker are ever replaced;
263
+ foreign files in the output directory are preserved. Defaults to
264
+ `<project_path>/docs/memory-wiki`.
265
+ - **`SYNTHESIS`** memory type, for answers synthesized from retrieved evidence.
266
+
267
+ ### Changed
268
+
269
+ - Tool-surface cost dropped ~51%: `tools/list` payload 22.9 KB → 11.2 KB
270
+ (≈5850 → ≈2856 tokens). Shared `project_path` / `cube_id` parameter descriptions
271
+ were deduplicated; the full cube-routing rules are now stated once, on
272
+ `memos_save` and `memos_search`.
273
+ - Runtime error `suggestions` now name the 2.0 call forms, so a model reading a
274
+ failure message is no longer told to call a tool that does not exist.
275
+
276
+ ### Fixed
277
+
278
+ - `memos_admin`'s `cube_id` no longer carries a `MEMOS_DEFAULT_CUBE` default.
279
+ Previously, calling `register_cube` without `cube_id` would silently register the
280
+ default cube instead of failing.
281
+
282
+ ---
283
+
284
+ ## [1.0.0] — 2026-03-04
285
+
286
+ Initial npm release. 18 tools, Node-only MCP server for oh-memos — no Python
287
+ required, runs via `npx`.