@prmichaelsen/remember-mcp 2.7.2 → 2.7.5

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
@@ -5,6 +5,54 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.7.4] - 2026-02-17
9
+
10
+ ### Changed
11
+
12
+ - **Enhanced Vectorization**: Added `title` and `summary` to vectorized source properties
13
+ - User memory schema: Now vectorizes `content`, `title`, `summary`, and `observation`
14
+ - Space memory schema: Now vectorizes `content`, `title`, `summary`, and `observation`
15
+ - Improves semantic search by including titles and summaries in vector embeddings
16
+ - Note: `title` and `summary` are optional fields, handled gracefully by vectorizer
17
+
18
+ ### Technical Details
19
+
20
+ - Modified: `src/weaviate/schema.ts` (line 49)
21
+ - Modified: `src/weaviate/space-schema.ts` (line 101)
22
+ - Changed `sourceProperties` from `['content', 'observation']` to `['content', 'title', 'summary', 'observation']`
23
+ - Applies to all new collections created after this version
24
+ - Existing collections retain their original vectorizer configuration
25
+
26
+ ---
27
+
28
+ ## [2.7.3] - 2026-02-17
29
+
30
+ ### Fixed
31
+
32
+ - **CRITICAL: Fixed `remember_update_memory` "Memory not found" error**
33
+ - Changed `handleUpdateMemory()` to use `fetchMemoryWithAllProperties()` wrapper
34
+ - Previously used direct `collection.query.fetchObjectById()` call without fallback
35
+ - Direct call failed when querying memories with certain property configurations (e.g., `parent_id: ""`)
36
+ - Wrapper provides graceful fallback for schema evolution and property incompatibilities
37
+ - Matches pattern used in other working tools like `handlePublish()`
38
+
39
+ ### Root Cause
40
+
41
+ - `handleUpdateMemory()` bypassed the `fetchMemoryWithAllProperties()` abstraction layer
42
+ - Direct `fetchObjectById()` without property specification can fail on edge case property values
43
+ - Error was caught and converted to misleading "Memory not found" message
44
+ - Wrapper's try-catch with fallback handles these cases gracefully
45
+ - This fix ensures consistent behavior across all memory operations
46
+
47
+ ### Technical Details
48
+
49
+ - Modified: `src/tools/update-memory.ts` (lines 8, 140)
50
+ - Added import: `fetchMemoryWithAllProperties` from `weaviate/client.js`
51
+ - Replaced: `collection.query.fetchObjectById(id)` → `fetchMemoryWithAllProperties(collection, id)`
52
+ - Verified working in local testing with memories containing `parent_id: ""`
53
+
54
+ ---
55
+
8
56
  ## [2.7.2] - 2026-02-17
9
57
 
10
58
  ### Fixed
@@ -699,8 +699,9 @@ async function createMemoryCollection(userId) {
699
699
  // Vectorizer configuration
700
700
  vectorizers: weaviate2.configure.vectorizer.text2VecOpenAI({
701
701
  model: "text-embedding-3-small",
702
- // Vectorize both memory content and relationship observations
703
- sourceProperties: ["content", "observation"]
702
+ // Vectorize content, title, summary, and observation for semantic search
703
+ // Note: title and summary are optional fields
704
+ sourceProperties: ["content", "title", "summary", "observation"]
704
705
  }),
705
706
  properties: [
706
707
  // Discriminator
@@ -1948,7 +1949,7 @@ async function handleUpdateMemory(args, userId) {
1948
1949
  const collection = getMemoryCollection(userId);
1949
1950
  let existingMemory;
1950
1951
  try {
1951
- existingMemory = await collection.query.fetchObjectById(args.memory_id);
1952
+ existingMemory = await fetchMemoryWithAllProperties(collection, args.memory_id);
1952
1953
  } catch (fetchError) {
1953
1954
  const fetchErrorMsg = fetchError instanceof Error ? fetchError.message : String(fetchError);
1954
1955
  logger.error("Failed to fetch memory for update:", {
package/dist/server.js CHANGED
@@ -767,8 +767,9 @@ async function createMemoryCollection(userId) {
767
767
  // Vectorizer configuration
768
768
  vectorizers: weaviate2.configure.vectorizer.text2VecOpenAI({
769
769
  model: "text-embedding-3-small",
770
- // Vectorize both memory content and relationship observations
771
- sourceProperties: ["content", "observation"]
770
+ // Vectorize content, title, summary, and observation for semantic search
771
+ // Note: title and summary are optional fields
772
+ sourceProperties: ["content", "title", "summary", "observation"]
772
773
  }),
773
774
  properties: [
774
775
  // Discriminator
@@ -2016,7 +2017,7 @@ async function handleUpdateMemory(args, userId) {
2016
2017
  const collection = getMemoryCollection(userId);
2017
2018
  let existingMemory;
2018
2019
  try {
2019
- existingMemory = await collection.query.fetchObjectById(args.memory_id);
2020
+ existingMemory = await fetchMemoryWithAllProperties(collection, args.memory_id);
2020
2021
  } catch (fetchError) {
2021
2022
  const fetchErrorMsg = fetchError instanceof Error ? fetchError.message : String(fetchError);
2022
2023
  logger.error("Failed to fetch memory for update:", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prmichaelsen/remember-mcp",
3
- "version": "2.7.2",
3
+ "version": "2.7.5",
4
4
  "description": "Multi-tenant memory system MCP server with vector search and relationships",
5
5
  "main": "dist/server.js",
6
6
  "type": "module",
@@ -50,6 +50,7 @@
50
50
  "@modelcontextprotocol/sdk": "^1.0.4",
51
51
  "@prmichaelsen/firebase-admin-sdk-v8": "^2.2.0",
52
52
  "@prmichaelsen/mcp-auth": "^7.0.4",
53
+ "@prmichaelsen/remember-mcp": "^2.7.3",
53
54
  "dotenv": "^16.4.5",
54
55
  "weaviate-client": "^3.2.0"
55
56
  },
@@ -5,6 +5,7 @@
5
5
 
6
6
  import type { Memory, MemoryUpdate } from '../types/memory.js';
7
7
  import { getMemoryCollection } from '../weaviate/schema.js';
8
+ import { fetchMemoryWithAllProperties } from '../weaviate/client.js';
8
9
  import { logger } from '../utils/logger.js';
9
10
  import { handleToolError, withErrorHandling } from '../utils/error-handler.js';
10
11
  import { isValidContentType } from '../constants/content-types.js';
@@ -133,9 +134,10 @@ export async function handleUpdateMemory(
133
134
  // Get existing memory - fetch ALL properties for replace operation
134
135
  // We need the full object to use replace() instead of update()
135
136
  // (Weaviate bug: update() only persists if vectorized fields change)
137
+ // Use fetchMemoryWithAllProperties() to handle schema evolution gracefully
136
138
  let existingMemory;
137
139
  try {
138
- existingMemory = await collection.query.fetchObjectById(args.memory_id);
140
+ existingMemory = await fetchMemoryWithAllProperties(collection, args.memory_id);
139
141
  } catch (fetchError) {
140
142
  const fetchErrorMsg = fetchError instanceof Error ? fetchError.message : String(fetchError);
141
143
  logger.error('Failed to fetch memory for update:', {
@@ -45,8 +45,9 @@ export async function createMemoryCollection(userId: string): Promise<void> {
45
45
  // Vectorizer configuration
46
46
  vectorizers: weaviate.configure.vectorizer.text2VecOpenAI({
47
47
  model: 'text-embedding-3-small',
48
- // Vectorize both memory content and relationship observations
49
- sourceProperties: ['content', 'observation'],
48
+ // Vectorize content, title, summary, and observation for semantic search
49
+ // Note: title and summary are optional fields
50
+ sourceProperties: ['content', 'title', 'summary', 'observation'],
50
51
  }),
51
52
 
52
53
  properties: [
@@ -97,8 +97,9 @@ async function createSpaceCollection(
97
97
  // Vectorizer configuration
98
98
  vectorizers: weaviate.configure.vectorizer.text2VecOpenAI({
99
99
  model: 'text-embedding-3-small',
100
- // Vectorize content for semantic search
101
- sourceProperties: ['content', 'observation'],
100
+ // Vectorize content, title, summary, and observation for semantic search
101
+ // Note: title and summary are optional fields
102
+ sourceProperties: ['content', 'title', 'summary', 'observation'],
102
103
  }),
103
104
 
104
105
  properties: [