@romandp/context-memory-mcp 1.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.
Files changed (91) hide show
  1. package/README.md +454 -0
  2. package/bin/mcp-memory.js +306 -0
  3. package/dist/config/paths.d.ts +10 -0
  4. package/dist/config/paths.d.ts.map +1 -0
  5. package/dist/config/paths.js +41 -0
  6. package/dist/config/paths.js.map +1 -0
  7. package/dist/db/init.d.ts +6 -0
  8. package/dist/db/init.d.ts.map +1 -0
  9. package/dist/db/init.js +37 -0
  10. package/dist/db/init.js.map +1 -0
  11. package/dist/db/migrations/runner.d.ts +9 -0
  12. package/dist/db/migrations/runner.d.ts.map +1 -0
  13. package/dist/db/migrations/runner.js +285 -0
  14. package/dist/db/migrations/runner.js.map +1 -0
  15. package/dist/db/schema.d.ts +51 -0
  16. package/dist/db/schema.d.ts.map +1 -0
  17. package/dist/db/schema.js +496 -0
  18. package/dist/db/schema.js.map +1 -0
  19. package/dist/http/routes.d.ts +3 -0
  20. package/dist/http/routes.d.ts.map +1 -0
  21. package/dist/http/routes.js +968 -0
  22. package/dist/http/routes.js.map +1 -0
  23. package/dist/http/server.d.ts +5 -0
  24. package/dist/http/server.d.ts.map +1 -0
  25. package/dist/http/server.js +45 -0
  26. package/dist/http/server.js.map +1 -0
  27. package/dist/http/swagger.d.ts +2 -0
  28. package/dist/http/swagger.d.ts.map +1 -0
  29. package/dist/http/swagger.js +101 -0
  30. package/dist/http/swagger.js.map +1 -0
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +139 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/memory/budget.d.ts +22 -0
  36. package/dist/memory/budget.d.ts.map +1 -0
  37. package/dist/memory/budget.js +51 -0
  38. package/dist/memory/budget.js.map +1 -0
  39. package/dist/memory/facts.d.ts +3 -0
  40. package/dist/memory/facts.d.ts.map +1 -0
  41. package/dist/memory/facts.js +63 -0
  42. package/dist/memory/facts.js.map +1 -0
  43. package/dist/memory/rebuild.d.ts +4 -0
  44. package/dist/memory/rebuild.d.ts.map +1 -0
  45. package/dist/memory/rebuild.js +31 -0
  46. package/dist/memory/rebuild.js.map +1 -0
  47. package/dist/memory/response.d.ts +11 -0
  48. package/dist/memory/response.d.ts.map +1 -0
  49. package/dist/memory/response.js +20 -0
  50. package/dist/memory/response.js.map +1 -0
  51. package/dist/memory/summary.d.ts +3 -0
  52. package/dist/memory/summary.d.ts.map +1 -0
  53. package/dist/memory/summary.js +67 -0
  54. package/dist/memory/summary.js.map +1 -0
  55. package/dist/memory/toon.d.ts +20 -0
  56. package/dist/memory/toon.d.ts.map +1 -0
  57. package/dist/memory/toon.js +102 -0
  58. package/dist/memory/toon.js.map +1 -0
  59. package/dist/memory/view.d.ts +4 -0
  60. package/dist/memory/view.d.ts.map +1 -0
  61. package/dist/memory/view.js +7 -0
  62. package/dist/memory/view.js.map +1 -0
  63. package/dist/server/setup.d.ts +9 -0
  64. package/dist/server/setup.d.ts.map +1 -0
  65. package/dist/server/setup.js +291 -0
  66. package/dist/server/setup.js.map +1 -0
  67. package/dist/tools/audit.d.ts +2 -0
  68. package/dist/tools/audit.d.ts.map +1 -0
  69. package/dist/tools/audit.js +22 -0
  70. package/dist/tools/audit.js.map +1 -0
  71. package/dist/tools/context.d.ts +5 -0
  72. package/dist/tools/context.d.ts.map +1 -0
  73. package/dist/tools/context.js +104 -0
  74. package/dist/tools/context.js.map +1 -0
  75. package/dist/tools/entry.d.ts +9 -0
  76. package/dist/tools/entry.d.ts.map +1 -0
  77. package/dist/tools/entry.js +214 -0
  78. package/dist/tools/entry.js.map +1 -0
  79. package/dist/tools/project.d.ts +4 -0
  80. package/dist/tools/project.d.ts.map +1 -0
  81. package/dist/tools/project.js +54 -0
  82. package/dist/tools/project.js.map +1 -0
  83. package/dist/tools/task.d.ts +4 -0
  84. package/dist/tools/task.d.ts.map +1 -0
  85. package/dist/tools/task.js +49 -0
  86. package/dist/tools/task.js.map +1 -0
  87. package/dist/types/context.d.ts +139 -0
  88. package/dist/types/context.d.ts.map +1 -0
  89. package/dist/types/context.js +2 -0
  90. package/dist/types/context.js.map +1 -0
  91. package/package.json +68 -0
package/README.md ADDED
@@ -0,0 +1,454 @@
1
+ # MCP Memory Server
2
+
3
+ Servidor de memoria persistente para asistentes de IA vía **Model Context Protocol (MCP)**. Almacena y organiza planes SDD (Software Design Document) con la estructura **Proyecto → Entradas → Tareas**, todo en una base de datos **SQLite** local.
4
+
5
+ Expone tanto un transporte **MCP sobre STDIO** como una **API REST HTTP**.
6
+
7
+ ---
8
+
9
+ ## Arquitectura
10
+
11
+ ```
12
+ ┌──────────────────────────────────┐
13
+ Cliente │ MCP Memory Server │
14
+ MCP ◄────► │ ┌──────────┐ ┌──────────────┐ │
15
+ (stdio) │ │ MCP over │ │ Express REST │ │
16
+ │ │ STDIO │ │ :3001 │ │
17
+ │ └────┬─────┘ └──────┬───────┘ │
18
+ │ └──────┬────────┘ │
19
+ │ ▼ │
20
+ │ ┌─────────────────┐ │
21
+ │ │ better-sqlite3 │ │
22
+ │ │ (WAL mode) │ │
23
+ │ └────────┬────────┘ │
24
+ └─────────────┼─────────────────────┘
25
+
26
+ ~/.local/share/mcp-memory/memory.db
27
+ ```
28
+
29
+ ### Estructura de datos
30
+
31
+ ```
32
+ projects
33
+ ├── id, name, description, status
34
+
35
+ ├── sdd_entries
36
+ │ ├── id, project_id
37
+ │ ├── section (plan | design | tasks | general)
38
+ │ ├── title, content, status, parent_id
39
+ │ └── metadata (JSON)
40
+
41
+ ├── tasks
42
+ │ ├── id, project_id, sdd_entry_id
43
+ │ ├── title, description
44
+ │ └── status, priority
45
+
46
+ ├── design_decisions
47
+ │ ├── id, entry_id
48
+ │ ├── decision, rationale
49
+ │ └── alternatives_considered
50
+
51
+ ├── entry_relationships
52
+ │ ├── id, source_entry_id, target_entry_id
53
+ │ └── relationship_type (depends_on|implements|related_to|supersedes)
54
+
55
+ ├── classifications (polymorphic)
56
+ │ ├── classifiable_type (project | entry | task)
57
+ │ └── tag, confidence
58
+
59
+ ├── audit_log
60
+ │ ├── id, entity_type, entity_id
61
+ │ ├── action (created | updated | deleted)
62
+ │ └── changes (JSON), project_id, timestamp
63
+
64
+ └── fts_entries (FTS5 virtual table)
65
+ ├── entry_id, section, title, content
66
+ └── auto-sincronizada via triggers
67
+
68
+ _migrations (tracking de cambios de schema)
69
+ ```
70
+
71
+ ### Tecnologías
72
+
73
+ | Capa | Tecnología |
74
+ |------|-----------|
75
+ | Lenguaje | TypeScript (ESM) |
76
+ | MCP SDK | `@modelcontextprotocol/sdk` |
77
+ | HTTP Server | Express 5 |
78
+ | Base de datos | SQLite vía `better-sqlite3` (WAL mode) |
79
+ | Validación | Zod |
80
+ | Tests | Vitest + Supertest |
81
+
82
+ ---
83
+
84
+ ## Instalación
85
+
86
+ ### Requisitos
87
+
88
+ - Node.js ≥ 18
89
+ - npm ≥ 9
90
+
91
+ ### Instalación global desde release/npm
92
+
93
+ ```bash
94
+ # Instalar última release publicada
95
+ npm install -g @romandp/context-memory-mcp
96
+
97
+ # Ver rutas resueltas y versión
98
+ mcp-memory paths
99
+ mcp-memory version
100
+
101
+ # Iniciar servidor
102
+ mcp-memory start
103
+
104
+ # Ver estado
105
+ mcp-memory status
106
+ ```
107
+
108
+ ### Uso sin instalación global
109
+
110
+ ```bash
111
+ npx -y @romandp/context-memory-mcp@latest stdio
112
+ ```
113
+
114
+ ### Upgrade / rollback
115
+
116
+ ```bash
117
+ # Actualizar a última release
118
+ npm install -g @romandp/context-memory-mcp@latest
119
+
120
+ # Instalar versión concreta
121
+ npm install -g @romandp/context-memory-mcp@1.0.0
122
+ ```
123
+
124
+ ### Releases
125
+
126
+ - Cada tag `v*` publica paquete npm y crea GitHub Release mediante `.github/workflows/release.yml`
127
+ - El workflow requiere secreto `NPM_TOKEN`
128
+ - El artefacto `.tgz` de la release permite probar instalación sin clonar repo
129
+
130
+ ### Desarrollo local
131
+
132
+ ```bash
133
+ git clone <repo>
134
+ cd context-memory-mcp
135
+ npm install
136
+ npm run build
137
+ node bin/mcp-memory.js start
138
+ ```
139
+
140
+ ### Migrar base de datos antigua
141
+
142
+ ```bash
143
+ mcp-memory migrate-db --from /ruta/antigua/memory.db
144
+ ```
145
+
146
+ ---
147
+
148
+ ## Uso
149
+
150
+ ### CLI
151
+
152
+ ```bash
153
+ mcp-memory start # Inicia en background
154
+ mcp-memory stop # Detiene el servidor
155
+ mcp-memory status # Muestra estado (PID, health)
156
+ mcp-memory restart # Reinicia
157
+ mcp-memory logs # Tail de logs
158
+ mcp-memory info # Información del proyecto
159
+ mcp-memory paths # Muestra rutas resueltas
160
+ mcp-memory version # Muestra versión instalada
161
+ mcp-memory rebuild-memory # Regenera summaries/facts compactos
162
+ mcp-memory migrate-db --from /ruta/db.sqlite
163
+ ```
164
+
165
+ O via npm:
166
+
167
+ ```bash
168
+ npm run start:bg # start en background
169
+ npm run stop # stop
170
+ npm run status # status
171
+ npm start # start en foreground
172
+ ```
173
+
174
+ ### API REST
175
+
176
+ El servidor HTTP corre en `http://localhost:3001` (configurable con `HTTP_PORT`).
177
+
178
+ Documentación interactiva disponible en: `http://localhost:3001/api-docs`
179
+
180
+ > Todos los endpoints de listado soportan paginación con `?page=1&limit=50` (max 200).
181
+ > La respuesta incluye `pagination: { page, limit, total, totalPages }`.
182
+
183
+ #### Proyectos
184
+
185
+ ```
186
+ GET /api/projects → Listar proyectos (?page=&limit=)
187
+ POST /api/projects → Crear proyecto { name, description? }
188
+ GET /api/projects/:id → Proyecto con entries + tasks + clasificaciones
189
+ PUT /api/projects/:id → Actualizar proyecto { name?, status?, description? }
190
+ DELETE /api/projects/:id → Eliminar proyecto (cascade)
191
+ ```
192
+
193
+ #### Entradas SDD
194
+
195
+ ```
196
+ GET /api/projects/:pid/entries → Listar entradas (?section=&page=&limit=)
197
+ POST /api/projects/:pid/entries → Crear entrada { section, title, content? }
198
+ GET /api/projects/:pid/entries/search?q=texto → Buscar entradas en el proyecto (FTS5, ?page=&limit=)
199
+ GET /api/projects/:pid/entries/:eid → Obtener entrada + clasificaciones
200
+ PUT /api/projects/:pid/entries/:eid → Actualizar entrada
201
+ DELETE /api/projects/:pid/entries/:eid → Eliminar entrada
202
+ ```
203
+
204
+ #### Búsqueda global
205
+
206
+ ```
207
+ GET /api/entries/search?q=texto → Buscar entradas en todos los proyectos (FTS5, ?page=&limit=)
208
+ GET /api/entries/search?q=texto&view=compact → Resultados compactos optimizados para LLM
209
+ ```
210
+
211
+ ### TOON y vistas compactas
212
+
213
+ Parámetros nuevos en rutas/tools compatibles:
214
+
215
+ - `view=full|summary|compact`
216
+ - `format=json|toon-r|toon-d`
217
+ - `max_items=<n>`
218
+ - `max_chars=<n>`
219
+ - `cursor=<last_id>`
220
+
221
+ Uso recomendado para agentes/LLM:
222
+
223
+ ```bash
224
+ curl "http://localhost:3001/api/entries/<eid>/context?view=compact&format=toon-r"
225
+ curl "http://localhost:3001/api/entries/search?q=release&view=compact&format=toon-d"
226
+ curl "http://localhost:3001/api/entries/batch?ids=e1,e2,e3&max_items=2"
227
+ ```
228
+
229
+ Semántica:
230
+
231
+ - `full`: contrato legacy completo
232
+ - `summary`: respuesta resumida sin contenido largo
233
+ - `compact`: respuesta basada en summaries/facts derivadas
234
+ - `toon-r`: TOON legible para debug
235
+ - `toon-d`: TOON denso para mínimo tamaño
236
+ - `max_items`: corta arrays compactos y marca `truncated`
237
+ - `max_chars`: limita volumen aproximado de texto compacto
238
+ - `cursor`: continúa desde último `id` devuelto en respuesta previa
239
+ - `metrics`: cada respuesta compacta JSON incluye `bytes`, `chars`, `estimated_tokens`
240
+
241
+ Implementación actual:
242
+
243
+ - `summary_short` y `summary_dense` derivadas por entry
244
+ - `memory_facts` derivadas desde entries, decisiones y relaciones
245
+ - FTS5 compacta sobre `fts_entry_summaries` para búsquedas TOON/compact
246
+ - Fallback automático al índice legacy si faltan datos derivados
247
+
248
+ #### Contexto enriquecido
249
+
250
+ ```
251
+ GET /api/entries/:eid/context → Entry + decisions + relationships
252
+ GET /api/entries/:eid/summary → Summary derivada compacta
253
+ GET /api/entries/:eid/compact → Contexto compacto/TOON
254
+ GET /api/entries/batch?ids=e1,e2 → Batch compacto por IDs
255
+ POST /api/entries/:eid/decisions → Registrar decisión de diseño { decision, rationale, alternatives_considered? }
256
+ POST /api/entries/:eid/relationships → Relacionar entries { target_entry_id, relationship_type }
257
+ GET /api/facts → Facts derivadas (?project_id=&entry_id=&kind=&page=&limit=&max_items=&max_chars=&cursor=)
258
+ ```
259
+
260
+ #### Tareas
261
+
262
+ ```
263
+ GET /api/projects/:pid/tasks → Listar tareas (?entry_id=&page=&limit=)
264
+ POST /api/projects/:pid/tasks → Crear tarea { title, priority?, sdd_entry_id? }
265
+ PUT /api/projects/:pid/tasks/:tid → Actualizar tarea { status? }
266
+ DELETE /api/projects/:pid/tasks/:tid → Eliminar tarea
267
+ ```
268
+
269
+ #### Auditoría
270
+
271
+ ```
272
+ GET /api/audit → Historial de cambios (?entity_type=&entity_id=&project_id=&page=&limit=)
273
+ ```
274
+
275
+ #### Clasificaciones
276
+
277
+ ```
278
+ POST /api/classify → Añadir clasificación { classifiable_type, classifiable_id, tag, confidence }
279
+ GET /api/db/download → Descargar el fichero SQLite
280
+ ```
281
+
282
+ ### MCP Tools
283
+
284
+ El servidor expone estas herramientas vía MCP (STDIO):
285
+
286
+ | Tool | Descripción |
287
+ |------|-------------|
288
+ | `project-create` | Crear proyecto |
289
+ | `project-list` | Listar proyectos (con paginación opcional) |
290
+ | `project-get` | Proyecto completo con entries y tasks |
291
+ | `entry-create` | Crear entrada SDD (plan/design/tasks/general) |
292
+ | `entry-get` | Listar entradas de un proyecto (con paginación opcional) |
293
+ | `entry-search` | Buscar entradas por texto (FTS5, con paginación opcional) |
294
+ | `entry-search-global` | Buscar entradas en todos los proyectos (FTS5, sin project_id) |
295
+ | `entry-update` | Actualizar entrada (title, content, status, section, parent_id) |
296
+ | `entry-delete` | Eliminar entrada |
297
+ | `entry-add-decision` | Registrar decisión de diseño |
298
+ | `entry-add-relationship` | Relacionar dos entradas |
299
+ | `entry-batch-get` | Obtener varias entradas compactas por ID |
300
+ | `entry-get-context` | Obtener entrada + decisions + relationships |
301
+ | `entry-get-summary` | Obtener summary derivada compacta |
302
+ | `task-create` | Crear tarea |
303
+ | `task-list` | Listar tareas de un proyecto (con paginación opcional) |
304
+ | `task-update` | Actualizar estado de tarea |
305
+ | `memory-facts-get` | Consultar facts derivadas |
306
+ | `audit-get` | Consultar historial de cambios (filtros: entity_type, entity_id, project_id) |
307
+
308
+ ---
309
+
310
+ ## Configuración
311
+
312
+ Variables de entorno (fichero `.env`):
313
+
314
+ ```env
315
+ HTTP_PORT=3001 # Puerto del servidor REST
316
+ DB_PATH=/ruta/memory.db # Override directo de base de datos
317
+ MCP_MEMORY_HOME=/ruta/base
318
+ LOG_PATH=/ruta/server.log
319
+ PID_PATH=/ruta/server.pid
320
+ ```
321
+
322
+ Rutas por defecto sin overrides:
323
+
324
+ - Linux: `~/.local/share/mcp-memory/memory.db` y `~/.local/state/mcp-memory/`
325
+ - macOS: `~/Library/Application Support/mcp-memory/`
326
+ - Windows: `%LOCALAPPDATA%\mcp-memory\`
327
+
328
+ ---
329
+
330
+ ## Configuración para opencode
331
+
332
+ Para conectar este servidor MCP desde **opencode**, añade la siguiente configuración en tu `opencode.json` (global en `~/.config/opencode/opencode.jsonc` o local en la raíz del proyecto):
333
+
334
+ ```json
335
+ {
336
+ "mcp": {
337
+ "context-memory-mcp": {
338
+ "type": "local",
339
+ "command": ["mcp-memory", "stdio"],
340
+ "enabled": true,
341
+ "env": {}
342
+ }
343
+ }
344
+ }
345
+ ```
346
+
347
+ > Requiere tener paquete instalado globalmente con `npm install -g @romandp/context-memory-mcp`, o usar un wrapper `npx` propio.
348
+
349
+ Ejemplo sin instalación global permanente:
350
+
351
+ ```json
352
+ {
353
+ "mcp": {
354
+ "context-memory-mcp": {
355
+ "type": "local",
356
+ "command": ["npx", "-y", "@romandp/context-memory-mcp@latest", "stdio"],
357
+ "enabled": true,
358
+ "env": {}
359
+ }
360
+ }
361
+ }
362
+ ```
363
+
364
+ > **Nota:** Después de guardar los cambios, reinicia opencode para que la configuración surta efecto.
365
+
366
+ ### Herramientas MCP disponibles
367
+
368
+ Una vez conectado, opencode tendrá acceso a estas herramientas:
369
+
370
+ | Tool | Descripción |
371
+ |------|-------------|
372
+ | `project-create` | Crear un proyecto nuevo |
373
+ | `project-list` | Listar todos los proyectos |
374
+ | `project-get` | Obtener un proyecto completo con entradas y tareas |
375
+ | `entry-create` | Crear una entrada SDD (plan/design/tasks/general) |
376
+ | `entry-get` | Obtener entradas de un proyecto |
377
+ | `entry-search` | Buscar entradas por texto (FTS5) |
378
+ | `entry-search-global` | Buscar entradas en todos los proyectos |
379
+ | `entry-update` | Actualizar una entrada (title, content, status, section, parent_id) |
380
+ | `entry-delete` | Eliminar una entrada |
381
+ | `entry-add-decision` | Registrar decisión de diseño |
382
+ | `entry-add-relationship` | Relacionar dos entradas |
383
+ | `entry-batch-get` | Obtener varias entradas compactas por ID |
384
+ | `entry-get-context` | Obtener entrada + decisions + relationships |
385
+ | `entry-get-summary` | Obtener summary derivada compacta |
386
+ | `task-create` | Crear una tarea |
387
+ | `task-list` | Listar tareas de un proyecto |
388
+ | `task-update` | Actualizar estado de una tarea |
389
+ | `memory-facts-get` | Consultar facts derivadas |
390
+ | `audit-get` | Consultar historial de cambios de entradas y tareas |
391
+
392
+ ---
393
+
394
+ ## Tests y calidad
395
+
396
+ ```bash
397
+ npm test # Ejecutar tests (Vitest, 137 tests)
398
+ npm run test:watch # Modo watch
399
+ npm run lint # ESLint
400
+ npm run lint:fix # ESLint con auto-fix
401
+ npm run format # Prettier (check)
402
+ npm run format:fix # Prettier (formatear)
403
+ npm run type-check # TypeScript strict check
404
+ ```
405
+
406
+ ---
407
+
408
+ ## Migraciones
409
+
410
+ El schema de la base de datos se gestiona mediante migraciones numeradas en `src/db/migrations/runner.ts`:
411
+
412
+ | Migración | Descripción |
413
+ |-----------|-------------|
414
+ | `001_initial_schema` | Tablas base: projects, sdd_entries, tasks, classifications |
415
+ | `002_add_fts5` | Búsqueda de texto completo (FTS5) con sincronización automática |
416
+ | `003_add_audit_log` | Auditoría de cambios con triggers en entries y tasks |
417
+ | `004_add_context_tables` | Tablas de contexto enriquecido: file_changes (legacy), design_decisions, entry_relationships |
418
+ | `005_add_compact_memory` | Summaries derivadas y memory facts para views compactas / TOON |
419
+ | `006_add_compact_memory_fts` | Índice FTS5 sobre summaries/keywords para búsqueda compacta |
420
+
421
+ Las migraciones se aplican automáticamente al iniciar el servidor.
422
+ La tabla `_migrations` registra cuáles se han ejecutado.
423
+
424
+ > Nota: `file_changes` puede seguir existiendo en bases de datos antiguas para preservar historial, pero ya no forma parte del modelo activo ni de la API/MCP pública.
425
+
426
+ ---
427
+
428
+ ## Acceso a la base de datos
429
+
430
+ Primero obtén ruta real:
431
+
432
+ ```bash
433
+ mcp-memory paths
434
+ ```
435
+
436
+ En Linux/WSL, consulta SQLite así:
437
+
438
+ ```bash
439
+ sqlite3 ~/.local/share/mcp-memory/memory.db "SELECT * FROM projects;"
440
+ ```
441
+
442
+ Para abrirla en DBeaver desde Windows, haz una copia:
443
+
444
+ ```bash
445
+ cp ~/.local/share/mcp-memory/memory.db /tmp/memory-view.db
446
+ ```
447
+
448
+ Y abre `\\wsl.localhost\Ubuntu-24.04\tmp\memory-view.db` en DBeaver.
449
+
450
+ O descárgala vía HTTP:
451
+
452
+ ```bash
453
+ curl -o memory-view.db http://localhost:3001/api/db/download
454
+ ```