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